стройка инкубатора

Общий раздел для всех подразделов форума.
Аватара пользователя
DDD3
Сообщения: 30
Зарегистрирован: 01 фев 2016, 13:29

Re: стройка инкубатора

Сообщение DDD3 » 17 май 2016, 07:46

Umka писал(а):У нас есть. Думаю у вас в магазинах тоже можно купить. .
стесняюсь спросить а как он выглядит? какая то есть у него буквенно-цифровая фамилия? что бы я в город такому же деревянному в этом вопросе родственнику мог заказать

Аватара пользователя
Nemo
Команда UM
Сообщения: 4235
Зарегистрирован: 05 июн 2015, 06:48

Re: стройка инкубатора

Сообщение Nemo » 17 май 2016, 07:56

DDD3 писал(а):а как он выглядит?
BTA.jpg
BTA.jpg (3.28 КБ) 5360 просмотров
Маркировка BTA 10-600B
Обычно присутствует в стандартном ассортименте любого магазина радиодеталей.
Если есть время подождать, можем Вам выслать бесплатно пару штук.
Один фиг за нами должок по загрузчику. :lol:

Аватара пользователя
DDD3
Сообщения: 30
Зарегистрирован: 01 фев 2016, 13:29

Re: стройка инкубатора

Сообщение DDD3 » 17 май 2016, 09:22

Nemo писал(а): Один фиг за нами должок по загрузчику. :lol:
за долги не торопитесь, коплю деньги на заказ, аппетит во время еды приходит! на брудерную автоматику насобирал теперь хочу еще один инкубатор со всеми новыми наворотами что Роман описывал!

Аватара пользователя
DDD3
Сообщения: 30
Зарегистрирован: 01 фев 2016, 13:29

Re: стройка инкубатора

Сообщение DDD3 » 25 май 2016, 06:02

господа электронщики разрешите, так сказать, поинтересоваться!
ситуёвина прямо скажем SOS
симистр нашел только вот BTA 12-600B после собственноручной перепайки выявляется что ток 220V на один контакт подходит а выхода нет,
по факту изучения мат.части ац-цкого прибора BTA 12-600B можно сделать предположение что нет управляющего сигнала, так вот и вопрос где его искать? куда еще паяльником натыкать шоп оно з-заработало?!

Аватара пользователя
Umka
Команда UM
Сообщения: 6274
Зарегистрирован: 04 июн 2015, 13:45
Откуда: Суджа
Контактная информация:

Re: стройка инкубатора

Сообщение Umka » 25 май 2016, 08:34

Изображение

Аватара пользователя
DDD3
Сообщения: 30
Зарегистрирован: 01 фев 2016, 13:29

Re: стройка инкубатора

Сообщение DDD3 » 25 май 2016, 09:34

понял..... отстал....

Аватара пользователя
Umka
Команда UM
Сообщения: 6274
Зарегистрирован: 04 июн 2015, 13:45
Откуда: Суджа
Контактная информация:

Re: стройка инкубатора

Сообщение Umka » 25 май 2016, 10:14

Ну там все просто же. Микросхемка на 6 лапах это оптосимистор длу управления большим симистором. Оптическая развязка. На входе светодиод, он светит на оптический ключ и тот открывает выходной симистор. Туда мультиметорм потыкать можно, но они обычно не горят. А если и сгорел оптрон, то мы другой подарим. Поменять его не сложно. Кто ее знает, эту лампочку коротнувшую, что у этих пчел нее на уме.

Аватара пользователя
DDD3
Сообщения: 30
Зарегистрирован: 01 фев 2016, 13:29

Re: стройка инкубатора

Сообщение DDD3 » 10 ноя 2016, 15:37

Всем прЮвет!!! Пардонте за долгое отсутствие времени мало было, зима пришла пора опять браться за инкубирование.
Роман Вам персональное СПАСИБО!!!! за помощь 350 с небольшим гусят с Вашей помощью появились на свет!

Сразу к делу подскажите в таком вопросе инкубаторы и брудеры из дома убираю в отдельное помещение, бывает вырубает свет в деревне какой генератор лучше взять? в магазине нагнали жути что автоматика вылетит надо отдельно плюсом еще выпрямитель покупать так ли это и где найти инфу по вариантам генератор-выпрямитель?

Аватара пользователя
Umka
Команда UM
Сообщения: 6274
Зарегистрирован: 04 июн 2015, 13:45
Откуда: Суджа
Контактная информация:

Re: стройка инкубатора

Сообщение Umka » 11 ноя 2016, 05:18

Приветствую. Генератор по мощности надо выбирать. Я дизель взял, дороже, но надежнее. И год уже собираюсь автозапуск к нему прикрутить. Все есть, руки дошли только на прошлых выходных начать монтаж. Выпрямителем это они стабилизатор называют наверное. Его всем впаривают, но генератор стабильную переменку выдает, а импульсным блокам питания вообще пофиг на скачки напряжения и частоты. Этого моторы боятся трехфазные и однофазные в насосах котлов и т.д. Так что не ведитесь. Тут эффективные менеджеры умудряются бесперебойник в комплекте к нотбуку впарить :)
А я гусиное яйцо так и не добыл в прошлом сезоне. Придется наверное гусят покупать весною.

Аватара пользователя
DDD3
Сообщения: 30
Зарегистрирован: 01 фев 2016, 13:29

Re: стройка инкубатора

Сообщение DDD3 » 03 дек 2016, 14:45

Спасибо за разъяснение.
На днях буду закладывать куриные яйца. Постараюсь к весне вырастить курочек на продажу.
В ходе анализа предыдущего опыта инкубации пришел к выводу о нехватке кислорода эмбрионам на последних сроках инкубации, возник резонный вопрос о методах увеличения потока кислорода в камере инкубатора. В действующем инкубаторе по Вашей схеме с камерой подготовки воздушной смеси у меня проделаны 6 отверстий диаметром 16 мм, имеет ли смысл поставить пару маленьких вентиляторов от ноутбука перед этими отверстиями с внешней стороны для нагнетания воздуха в инкубатор? или проще будет увеличить отверстия? опять же смущает вопрос о теплопотере при увеличении.

Аватара пользователя
Umka
Команда UM
Сообщения: 6274
Зарегистрирован: 04 июн 2015, 13:45
Откуда: Суджа
Контактная информация:

Re: стройка инкубатора

Сообщение Umka » 05 дек 2016, 05:22

Я не видел чтобы в инкубаторы "турбоннаддув" ставили. Просто увеличить отверстия. Да, теплопотери, но кислород важнее.

Аватара пользователя
DDD3
Сообщения: 30
Зарегистрирован: 01 фев 2016, 13:29

Re: стройка инкубатора

Сообщение DDD3 » 06 дек 2016, 11:04

терзался сомнениями долго но от идеи установки вентиляторов отказался, пробурил 5 новых отверстий.
Кстати очень интересен вопрос о размещении в камере инкубатора ионизатора или УФ лампы, есть ли смысл? реальные результаты кто нибудь видел?

Аватара пользователя
Umka
Команда UM
Сообщения: 6274
Зарегистрирован: 04 июн 2015, 13:45
Откуда: Суджа
Контактная информация:

Re: стройка инкубатора

Сообщение Umka » 06 дек 2016, 11:45

Зачем???!!! Не проще (пардон) яйца мыть перед закладкой? Однохлористый йод в ветаптеках канистрами продается.

Аватара пользователя
DDD3
Сообщения: 30
Зарегистрирован: 01 фев 2016, 13:29

Re: стройка инкубатора

Сообщение DDD3 » 07 дек 2016, 06:59

мы протираем слабым раствором марганцовки или перекисью водорода.
Ионизаторы и люстры чижевского ставят что якобы благоприятно влияют на здоровье птенцов

Аватара пользователя
Umka
Команда UM
Сообщения: 6274
Зарегистрирован: 04 июн 2015, 13:45
Откуда: Суджа
Контактная информация:

Re: стройка инкубатора

Сообщение Umka » 07 дек 2016, 07:03

И мантры еще читать и хороводы водить вокруг инкубатора и матом не ругаться :)
От марганца толку ноль, а вот перекись помогает. Можно газацию делать. Это для дезинфекции. Озонатор скорее убьет зародыши.

Аватара пользователя
DDD3
Сообщения: 30
Зарегистрирован: 01 фев 2016, 13:29

Re: стройка инкубатора

Сообщение DDD3 » 07 дек 2016, 09:10

тут как у начинающего итак танцы с бубнами и священный огонь в честь "золотого цыпы", а оно вон еще как... хороводы.....мантры.... вон оно где удача то будет...

Аватара пользователя
DDD3
Сообщения: 30
Зарегистрирован: 01 фев 2016, 13:29

Re: стройка инкубатора

Сообщение DDD3 » 07 дек 2016, 09:13

К слову сказать в выводном я установил ультрафиолетовую лампу в сборе с увлажнителем, и не знаю писать ли к заслугам лампы но из всех вылупившихся гусят даже те которым сам помогал довылупиться не один в последствии не сдох

epx
Сообщения: 4
Зарегистрирован: 27 мар 2016, 10:33

Re: стройка инкубатора

Сообщение epx » 15 янв 2017, 10:31

Здравствуйте!
около года назад заказал плату для сборки блока инкубатора, но вот только дошли руки чтобы все собрать.
после сборки и заливки скетча автоматической инкубации на 13 пине постоянно GND грешил на ардуино но после смены пина в скетче на 12
та же картина. Получается что на нагревателе постоянно GND при нагреве до заданной температуры ничего не меняться, увлажнитель работает и на 12 и на 13 пинах.

Код: Выделить всё

//21.04.16 Добавлена функция управления поворотом в импульсном режиме. Для лотков с КШМ.

#include <PID_v1.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM2.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#include <Sensirion.h>
#include <avr/wdt.h>

int del = 80;                     // переменная ожидания между выборами меню
unsigned int interval = 300;      // интервал сколько будет длиться цикл while, после чего перейдёт к следующему меню.(кол-во итераций)

//#define EXT_HEATING                    // ИСПОЛЬЗУЕМ ДОП.НАГРЕВАТЕЛЬ ВМЕСТО УВЛАЖНИТЕЛЯ. Если нужен увлажнитель, просто закомментируйте эту строку.
#define heater_pin 13                  // нагреватель
#define humidifer_pin 12               // увлажнитель
#define fan_pin 11                     // вентилятор
#define alarm_pin 14                   // пин аварии
#define beeper_pin 9                   //пищалка по аварии
#define dataPin 5                      //SHT10
#define clockPin 6                     //SHT10 
#define turn_pin 10                    // управление поворотом
#define extend_heater_pin 8            // дополнительный нагреватель
#define button_minus_pin 2            //пин кнопки "минус"
#define button_plus_pin 3             //пин кнопки "плюс"
#define button_enter_pin 4            //пин кнопки "enter"
#define DS18B20_Pin 7                 //пин термометра
#define setSampleTime 200             //время цикла ПИД
#define voltmeter_pin 1               //вход А1 через делитель (22к/10к) подключен к питанию модуля. Измеряет до 16В.
#define T1_correction -0.0             // коррекция температуры SHT10
#define T2_correction -0.1             // коррекция температуры SHT10
#define h_histeresis 1.0              // гистерезис влажности
#define door_pin 16		              // пин открытой двери (А2)
#define relayLogic 0                  // логика работы блоков реле (прямая команда или инверсия)
#define humPause 1					  // пауза пульсирующего увлажнителя в минутах
#define humWork 2500		          // длительность работы пульсирующего увлажнителя в миллисекундах
#define turnLenght 10                 // время поворота в импульсном режиме (сек.) 

boolean humMode = 0;                 // Режим увлажнителя. Константа. 0 - постоянный режим, 1 - импульсный режим.
boolean button_minus;               // статус нажатия кнопок
boolean button_plus;
boolean button_enter;
boolean bottomView = 0;            // флаг индикации нижней строки
boolean heater_off;				   // флаг запрета нагреателя
float humidity;                    // Влажность
float temp1Ink;                    // Температура DS18B20
float temp2Ink;                    // Температура SHT10
//float dewpoint;                    // Точка росы
unsigned int rawData;
unsigned long currentTime;            // задаем переменные для тайминга поворота
unsigned long serialTime; //this will help us know when to talk with processing
unsigned long now;
unsigned long trhMillis = 0;    // период опроса датчиков
byte measActive = false;
byte measType = TEMP;
const unsigned long TRHSTEP   = 300UL;  // Период опроса датчиков

LiquidCrystal_I2C lcd(0x3f    , 20, 4);  // инициализация библиотеки дисплея
//SHT1x sht1x(dataPin, clockPin);
OneWire oneWire(DS18B20_Pin);
DallasTemperature sensors(&oneWire);
Sensirion sht = Sensirion(dataPin, clockPin);
double Setpoint, Input, Output;            //объявляем переменные для ПИД
PID myPID(&Input, &Output, &Setpoint, 20.5, 0.5, 5.5, DIRECT); //Инициализируем ПИД-библиотеку и коэффициенты
int WindowSize = 1000;                  // ширина окна терморегулятора 1 секунда.
unsigned long windowStartTime;
unsigned long alarmDelay;


////////////////////////////////////////////////////////////////////////////////////////////////////////////
void eeprom_init() {
  //byte leadT;
  float tempInk;
  float set_humidity;
  float alarmTemp;
  int turnPeriod;
  int fanTemp;
  EEPROM_read(1, tempInk);
  if (tempInk > 40 || tempInk < 30) EEPROM_write(1, 37.5);
  EEPROM_read(5, alarmTemp);
  if (alarmTemp > 10.0 || alarmTemp < 1.0) EEPROM_write(5, 2.0);
  EEPROM_read(9, fanTemp);
  if (fanTemp > 10 || fanTemp < 40) EEPROM_write(9, 39);
  EEPROM_read(11, turnPeriod);
  if (turnPeriod > 13 || turnPeriod < 0) EEPROM_write(11, 2);
  EEPROM_read(13, set_humidity);
  if (set_humidity > 100.0 || set_humidity < 20.0) EEPROM_write(13, 55.5);
  //EEPROM_read(19, leadT);
  //if (leadT != 0 || leadT != 1) EEPROM_write(19, 1);
}


void setup() {
  Serial.begin(9600);
  lcd.init();          // Старт дисплея
  lcd.backlight();     // Включаем подсветку дисплея
  windowStartTime = millis();
  byte stat;
  byte error = 0;
  float set_humidity;
  float alarmTemp;


  delay(15);
  wdt_enable (WDTO_8S); //взводим сторожевой таймер на 8 секунд.
  myPID.SetOutputLimits(0, WindowSize); //задаем лимиты ширины ПИД-импульса от 0 до 1 секунды.
  myPID.SetMode(AUTOMATIC);             //включаем ПИД-регулирование
  myPID.SetSampleTime(setSampleTime);
  pinMode(extend_heater_pin, OUTPUT);      //пин дополнительного нагревателя. Переводим в 1 чтобы не включать реле.
  digitalWrite(extend_heater_pin, !relayLogic);
  pinMode(heater_pin, OUTPUT);
  pinMode(turn_pin, OUTPUT);      // устанавливаем выводы
  digitalWrite(turn_pin, !relayLogic);
  pinMode(humidifer_pin, OUTPUT);
  digitalWrite(humidifer_pin, LOW);
  pinMode(fan_pin, OUTPUT);
  digitalWrite(fan_pin, !relayLogic);
  pinMode(alarm_pin, OUTPUT);
  digitalWrite(alarm_pin, !relayLogic);
  pinMode(button_minus_pin, INPUT_PULLUP); //подтягиваем входы кнопок к плюсу встроенными резисторами
  pinMode(button_plus_pin, INPUT_PULLUP);
  pinMode(button_enter_pin, INPUT_PULLUP);
  pinMode(door_pin, INPUT_PULLUP);
  alarmDelay = millis();
  eeprom_init();
  sensors.begin();
  sensors.setResolution(12);    // установить разрешение (точность)
  sensors.setWaitForConversion(false);  // отключить ожидание
  windowStartTime = millis();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Smart Inkubator V2.3");
  lcd.setCursor(3, 2);
  lcd.print("http://u-m.biz");
  delay(5000);
  lcd.clear();
}


////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
  // Input = getTemp();
  unsigned long now = millis();
  //timer.run();
  button_read();
  if (!button_enter) {
    delay(del);
    lcd.clear();
    menu();
  }
  if (!button_minus) {
    delay(del);
    lcd.clear();
    alarmDelay = millis();    // задержка аварии по нажатии кнопки Минус
  }
  if (!button_plus) {
    delay(del);
    lcd.clear();
    digitalWrite(turn_pin, !digitalRead(turn_pin));       // включаем/выключаем реле поворота по кнопке Плюс
  }
  if (!button_plus && !button_plus) {
    delay(del);
    lcd.clear();
    // bottomView = !bottomView;       // переключаем режим показа нижней строки.
  }
  //send-receive with processing if it's time
  if (millis() > serialTime)
  {
    SerialReceive();
    SerialSend();
    serialTime += 1000;
  }
  getSensors();
  thermostat();
  if (humMode == 1) humidiferPulse();
  else humidifer();
  turn();
  //turnPulse();
  fan();
  alarm();
  outpuPower();
  ext_heater();
  wdt_reset();
  //unsigned long now1 = millis();
  //Serial.println(now1-now);
}


///читаем кнопки /////////////////////////////////////////////////////////////////////////
void button_read() {//функция проверки нажатия кнопки
  button_minus = digitalRead(button_minus_pin); //запоминаем значение кнопки
  button_plus = digitalRead(button_plus_pin); //запоминаем значение кнопки
  button_enter = digitalRead(button_enter_pin); //запоминаем значение кнопки
  if (!button_minus || !button_plus || !button_enter) beeper(50);
  wdt_reset();
}


//меню////////////////////////////////////////////////////////////////////////////////////////
void menu() {
  temp_setup();
  hum_setup();
  turn_setup();
  alarm_setup();
  vent_setup();
  //data_time_setup();
}


//устанавливаем температуру в меню///////////////////////////////////////////////////////////
void temp_setup() {
  float tempInk;
  lcd.clear();
  delay(del);
  button_read();
  lcd.setCursor(2, 0);
  lcd.print("TEMP.INK SETUP");
  delay(1000);
  int x = 0;
  while (1) {
    x++;
    if (x > interval) {
      break;
    }
    button_read();
    //EEPROM_write(1, 37.5);
    EEPROM_read_mem(1, &tempInk, sizeof(tempInk));
    EEPROM_read(1, tempInk);
    if (!button_enter) {
      delay(del);
      lcd.clear(); //очищаем экран
      break;
    }
    if (!button_minus) {
      x = 0;
      EEPROM_write(1, tempInk - 0.1);
      if (tempInk < 30.0) {     //проверяем, если выше 40,
        EEPROM_write(1, 30.0);  //пишем в память 40
      }
      lcd.clear();
    }

    if (!button_plus) {
      x = 0;
      EEPROM_write(1, tempInk + 0.1);
      if (tempInk > 40.0) {     //проверяем, если выше 30,
        EEPROM_write(1, 40.0);  //пишем в память 30
      }
      lcd.clear();
    }
    lcd.setCursor(2, 0);
    lcd.print("TEMP.INK = ");
    lcd.print(tempInk, 1);
    lcd.setCursor(0, 3);
    lcd.print("minus  NEXT  plus");
    delay(del);
  }
}


//устанавливаем влажность////////////////////////////////////////////////////////////////////////
void hum_setup() {
  float set_humidity;
  lcd.clear();
  delay(del);
  button_read();
  lcd.setCursor(3, 0);
  lcd.print("HUMIDITY SETUP");
  delay(1000);
  int x = 0;
  while (1) {
    x++;
    if (x > interval) {
      break;
    }
    button_read();
    //EEPROM_write(13, 65.0);
    //EEPROM_read_mem(13, &set_humidity, sizeof(set_humidity));
    EEPROM_read(13, set_humidity);
    if (!button_enter) {
      delay(del);
      lcd.clear(); //очищаем экран
      break;
    }
    if (!button_minus) {
      x = 0;
      EEPROM_write(13, set_humidity - 0.5);
      if (set_humidity < 20) {     //проверяем, если выше 40,
        EEPROM_write(13, 20.0);  //пишем в память 40
      }
      lcd.clear();
    }

    if (!button_plus) {
      x = 0;
      EEPROM_write(13, set_humidity + 0.5);
      if (set_humidity > 100) {     //проверяем, если выше 40,
        EEPROM_write(13, 100.0);  //пишем в память 40
      }
      lcd.clear();
    }
    lcd.setCursor(2, 0);
    lcd.print("Humidity = ");
    lcd.print(set_humidity, 1);
    lcd.setCursor(0, 3);
    lcd.print("minus  NEXT  plus");
    delay(del);
  }
}


//устанавливаем поворот/////////////////////////////////////////////////////////////////////////
void turn_setup() {
  int turnPeriod;
  lcd.clear();
  delay(del);
  button_read();
  lcd.setCursor(4, 0);
  lcd.print("TURN SETUP");
  delay(1000);
  int x = 0;
  while (1) {
    x++;
    if (x > interval) {
      break;
    }
    button_read();
    EEPROM_read(11, turnPeriod);
    if (!button_enter) {
      delay(del);
      lcd.clear(); //очищаем экран
      break;
    }
    if (!button_minus) {
      x = 0;
      EEPROM_write(11, turnPeriod - 1);
      if (turnPeriod < 0) {     //проверяем, если выше 13,
        EEPROM_write(11, 0);  //пишем в память 13
      }
      lcd.clear();
    }
    if (!button_plus) {
      x = 0;
      EEPROM_write(11, turnPeriod + 1);
      if (turnPeriod > 13) {     //проверяем, если ниже 0,
        EEPROM_write(11, 13);  //пишем в память 0
      }
      lcd.clear();
    }
    EEPROM_read(11, turnPeriod);
    lcd.setCursor(2, 0);
    lcd.print("PERIOD = ");
    if (turnPeriod < 13)lcd.print(turnPeriod);
    if (turnPeriod > 12) lcd.print("RND");
    lcd.print(" Hour");
    lcd.setCursor(0, 3);
    lcd.print("minus  NEXT  plus");
    delay(del);
  }
}


//устанавливаем сигнализацию/////////////////////////////////////////////////////////////////////
void alarm_setup() {
  float alarmTemp;
  lcd.clear();
  delay(del);
  button_read();
  lcd.setCursor(4, 0);
  lcd.print("ALARM SETUP");
  delay(1000);
  int x = 0;
  while (1) {
    x++;
    if (x > interval) {
      break;
    }
    button_read();
    EEPROM_read_mem(5, &alarmTemp, sizeof(alarmTemp));
    EEPROM_read(5, alarmTemp);
    if (!button_enter) {
      delay(del);
      lcd.clear(); //очищаем экран
      break;
    }
    if (!button_minus) {
      x = 0;
      EEPROM_write(5, alarmTemp - 0.1);
      if (alarmTemp < 1.0) {     //проверяем, если ниже 1,
        EEPROM_write(5, 1.0);  //пишем в память 1
      }
      lcd.clear();
    }
    if (!button_plus) {
      x = 0;
      EEPROM_write(5, alarmTemp + 0.1);
      if (alarmTemp > 10.0) {     //проверяем, если выше +-10,
        EEPROM_write(5, 10.0);  //пишем в память 10
      }
      lcd.clear();
    }
    lcd.setCursor(2, 0);
    lcd.print("T.Alarm + - ");
    lcd.print(alarmTemp, 1);
    lcd.print((char)223);
    lcd.print("C");
    lcd.setCursor(0, 3);
    lcd.print("minus  NEXT  plus");
    delay(del);
  }
}


//устанавливаем вентиляцию/////////////////////////////////////////////////////////////////
void vent_setup() {
  int fanTemp;
  lcd.clear();
  delay(del);
  button_read();
  lcd.setCursor(4, 0);
  lcd.print("FAN SETUP");
  delay(1000);
  int x = 0;
  while (1) {
    x++;
    if (x > interval) {
      break;
    }
    button_read();
    EEPROM_read(9, fanTemp);
    if (!button_enter) {
      delay(del);
      lcd.clear(); //очищаем экран
      break;
    }
    if (!button_minus) {
      x = 0;
      EEPROM_write(9, fanTemp - 1);
      if (fanTemp < 20) {     //проверяем, если выше 40,
        EEPROM_write(9, 20);  //пишем в память 40
      }
      lcd.clear();
    }
    if (!button_plus) {
      x = 0;
      EEPROM_write(9, fanTemp + 1);
      if (fanTemp > 40) {     //проверяем, если выше 40,
        EEPROM_write(9, 40);  //пишем в память 40
      }
      lcd.clear();
    }
    lcd.setCursor(4, 0);
    lcd.print("T.Fan = ");
    lcd.print(fanTemp);
    lcd.print((char)223);
    lcd.print("C");
    lcd.setCursor(0, 3);
    lcd.print("minus  NEXT  plus");
    delay(del);
  }
}


///опрашиваем датчики //////////////////////////////////////////////////////////////////////////
void getSensors() {
  unsigned long curMillis = millis();          // Получаем текущее время работы
  if (curMillis - trhMillis >= TRHSTEP) {    // время для нового измерения?
    sensors.requestTemperatures();
    temp1Ink = sensors.getTempCByIndex(0) + T1_correction;
    if (temp1Ink == -127.0) temp1Ink = 85.0;
  }
  if (curMillis - trhMillis >= TRHSTEP * 4) {    // время для нового измерения?
    measActive = true;
    measType = TEMP;
    sht.meas(TEMP, &rawData, NONBLOCK);        // измеряем температуру.
    trhMillis = curMillis;
  }
  if (measActive && sht.measRdy()) {           // проверяем статус измерения
    if (measType == TEMP) {                    // обрабатываем температуру или влажность?
      measType = HUMI;
      temp2Ink = sht.calcTemp(rawData);     // Конвертируем сырые данные с сенсора
      temp2Ink = temp2Ink + T2_correction; // Корректируем показания текрмометра
      sht.meas(HUMI, &rawData, NONBLOCK);      // измеряем влажность
    }
    else {
      measActive = false;
      humidity = sht.calcHumi(rawData, temp2Ink); // конвертируем данные с сенсора
      if (humidity == 0.1) humidity = 99.9;
      //     dewpoint = sht.calcDewpoint(humidity, temp2Ink);
    }
  }
  // logData();
}


//используем терморегулятор/////////////////////////////////////////////////
void thermostat() {
  static unsigned long beeperTime;
  now = millis();
  float tempPoint;
  float set_humidity;
  if (!digitalRead(door_pin)) {
    heater_off = true;
    myPID.SetMode(MANUAL);
    Output = 300;

    if (millis() > beeperTime)
    {
      beeper(150);
      beeperTime += 5000;
    }
    lcd.clear();
    lcd.setCursor(3, 2);
    lcd.print("Door Opened");
    delay(250);
    lcd.clear();
  }
  else {
    heater_off = false;
    myPID.SetMode(AUTOMATIC);
  }
  EEPROM_read_mem(1, &tempPoint, sizeof(tempPoint));
  EEPROM_read(1, tempPoint);
  EEPROM_read_mem(13, &set_humidity, sizeof(set_humidity));
  EEPROM_read(13, set_humidity);
  Setpoint = tempPoint;
  myPID.Compute();
  if (now - windowStartTime > WindowSize) { //время для перещелкивания периода окна
    windowStartTime = windowStartTime + WindowSize;
    //voltmeter();                        //запускаем функцию измерения напряжения
    if (temp1Ink == 85) Input = temp2Ink; // если не работает ds18b20
    else Input = temp1Ink;			      // то берем температуру по sht
    lcd.setCursor(1, 0);                 // устанавливаем курсор в 0-ом столбце, 0 строка (начинается с 0)
    lcd.print("T1= ");
    lcd.print(temp1Ink, 1);              // печать температуры на дисплей
    lcd.print((char)223);
    lcd.print("  (");
    lcd.print(Setpoint, 1);
    lcd.print(")");
    lcd.setCursor(1, 1);
    lcd.print("T2= ");
    lcd.print(temp2Ink, 1);            // печать температуры на дисплей
    lcd.print((char)223);
    lcd.setCursor(11, 1);
    lcd.print(" (*");
    lcd.print(temp1Ink - temp2Ink, 1);
    lcd.print(") ");
    //lcd.print((char)223);
    //lcd.print("  (");
    //lcd.print(Setpoint, 1);
    //lcd.print(")");
    lcd.setCursor(1, 2);                 // устанавливаем курсор в 2-ом столбце, 3 строка (начинается с 0)
    lcd.print(" H= ");
    lcd.print(humidity, 1);           // печать влажности на дисплей
    lcd.print("%");
    lcd.print("  (");
    lcd.print(set_humidity, 1);
    lcd.print(")");
  }
  if (Output > (now - windowStartTime) && temp1Ink < 39.9 && heater_off == false) digitalWrite(heater_pin, HIGH);
  else digitalWrite(heater_pin, LOW);
  // analogWrite(heater_pin, Output/4); // ШИМ при работе нагревателя от постоянного напряжения. Пин 13 не поддерживает ШИМ
}


//управляем влажностью/////////////////////////////////////////////////////////////////////////
void humidifer() {
  //float humidity;
  float set_humidity;
  //  if (curMillis - humMillis >= humStep) {
  //    humMillis = curMillis;
  //    //humidity = sht1x.readHumidity();
  //  }
  //EEPROM_read_mem(13, &set_humidity, sizeof(set_humidity));
  EEPROM_read(13, set_humidity);
  if (set_humidity > humidity) digitalWrite(humidifer_pin, HIGH); //сравниваем измеренную влажность с заданной
  if (set_humidity < humidity + h_histeresis) digitalWrite(humidifer_pin, LOW);
}

//////!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
void humidiferPulse() {
  float set_humidity;
  unsigned long currentTime;
  unsigned long waitPause;
  static unsigned long startTime;
  //int humPause = 1;                     // минут пауза
  //EEPROM_read(8, humPause);
  waitPause = humPause * 60000UL;
  //int humWork = 2500;                   // миллисекунд работа
  EEPROM_read_mem(13, &set_humidity, sizeof(set_humidity));
  EEPROM_read(13, set_humidity);
  currentTime = millis();
  //Serial.println(currentTime - startTime);
  //Serial.println(humWork);
  //Serial.println(humPause);
  if (currentTime - startTime < humWork) {
    if (set_humidity > humidity) digitalWrite(humidifer_pin, HIGH); //сравниваем измеренную влажность с заданной
  }
  else digitalWrite(humidifer_pin, LOW);
  if (currentTime - startTime > waitPause) {
    startTime = currentTime;
  }
}


//управляем поворотом//////////////////////////////////////////////////////////////////////////
void turn() {
  int turnPeriod;                //период поворота лотков в часах
  int turnCommand;
  boolean turnFlag = 0;          // флаг поворота для случайного периода
  static unsigned long loopTime;
  EEPROM_read(11, turnPeriod);
  if (turnPeriod == 0) return;           //если нулевой период поворота, то не поворачиваем яйца.
  if (turnPeriod < 13) turnCommand = turnPeriod;
  else if (turnPeriod > 12 && turnFlag == 0) { //если произошел поворот (сброшен флаг) и значение в памяти 13, то
    turnCommand = random(1, 6);        //берем случайное значение часов 1-6
    turnFlag = 1;                     //защелкиваем флаг вычисления случайных значений до следующего поворота
  }
  currentTime = millis() / 1000;
  lcd.setCursor(10, 3);
  lcd.print("P");
  //Serial.println(currentTime);
  //Serial.println(loopTime + turnCommand * 3600UL);
  if (currentTime > (loopTime + turnCommand * 3600UL)) {  // 3600000 сравниваем текущий таймер с переменной loopTime + период поворота в часах.
    digitalWrite(turn_pin, !digitalRead(turn_pin));       // включаем/выключаем реле поворота
    loopTime = currentTime;    // в loopTime записываем новое значение
    turnFlag = 0;    //сбрасываем флаг поворота
  }
  lcd.print((loopTime - currentTime + turnCommand * 3600UL) / 60UL);
  lcd.print(" ");
}

void turnPulse() {
  int turnPeriod;
  static unsigned long loopTimePulse;
  EEPROM_read(11, turnPeriod);
  if (turnPeriod == 0) return;
  currentTime = millis() / 1000;
  if (currentTime > (loopTimePulse + turnPeriod * 3600UL)) {  // 3600000 сравниваем текущий таймер с переменной loopTime + период поворота в часах.
    digitalWrite(turn_pin, HIGH);       // включаем/выключаем реле поворота
  }
  if (currentTime > ((loopTimePulse + turnLenght) + turnPeriod * 3600UL)) {
    digitalWrite(turn_pin, LOW);       // включаем/выключаем реле поворота
    loopTimePulse = currentTime;    // в loopTime записываем новое значение
  }


}


//управляем авариями/////////////////////////////////////////////////////////////////////////////
void alarm() {
  float temp1Ink = sensors.getTempCByIndex(0);
  float alarmTemp;
  float setTemp;
  EEPROM_read(5, alarmTemp);
  EEPROM_read_mem(1, &setTemp, sizeof(setTemp));
  EEPROM_read(1, setTemp);
  lcd.setCursor(0, 3);
  lcd.print("A");
  lcd.print(setTemp + alarmTemp, 1);
  if ((millis() - alarmDelay) > 1800000) {
    if (temp1Ink > (setTemp + alarmTemp) || temp1Ink < (setTemp - alarmTemp)) {
      beeper(10);
      digitalWrite(alarm_pin, relayLogic); //если измеренная температура выше заданной на величину аварии
    }
    else digitalWrite(alarm_pin, !relayLogic); //то включаем аварийный сигнал.
  }
}


///пищим пищалкой ////////////////////////////////////////////////////////////////////////////
void beeper(int duration) {
  tone(beeper_pin, 2000, duration);
}


//управляем вентиляторами//////////////////////////////////////////////////////////////////////
void fan() {
  //float tempInk = sht1x.readTemperatureC();
  int fanTemp;
  EEPROM_read(9, fanTemp);
  lcd.setCursor(6, 3);
  lcd.print("F");
  lcd.print(fanTemp);
  if (temp1Ink > fanTemp) digitalWrite(fan_pin, relayLogic); //если измеренная температура выше заданной на величину аварии
  if (temp1Ink < fanTemp + 1 || !digitalRead(door_pin)) digitalWrite(fan_pin, !relayLogic); //то включаем вентиляцию сигнал.
}


// вольтметр/////////////////////////////////////////////////////////////////////////////////////////
/* void voltmeter() {
  float outputValue = 0;
  outputValue = float(analogRead(voltmeter_pin)) / 63, 9;
  //if(outputValue < 4.5) beeper(50);
  //Serial.print("Voltage = " );
  //Serial.println(outputValue);
  lcd.setCursor(14, 3);
  lcd.print("V");
  lcd.print(outputValue, 1); */
//}


// Печать мощности нагрвателя///////////////////////////////////////////////////////////////////////
void outpuPower() {
  lcd.setCursor(15, 3);
  lcd.print("W");
  lcd.print(Output, 0);
  lcd.print(" ");
}


// управление дополнительным нагревателем на 8 ножке через блок реле.///////////
void ext_heater() {
  float tempInk = sensors.getTempCByIndex(0);
  float setTemp;
  EEPROM_read_mem(1, &setTemp, sizeof(setTemp));
  EEPROM_read(1, setTemp);
  if (tempInk < (setTemp - 3)) {
    digitalWrite(extend_heater_pin, relayLogic);
  }
  else digitalWrite(extend_heater_pin, !relayLogic);
#ifdef EXT_HEATING
  //digitalWrite(humidifer_pin, HIGH);
#endif
}


/********************************************
 * Обмен данными с Processing!
 ********************************************/
union {                // This Data structure lets
  byte asBytes[24];    // us take the byte array
  float asFloat[6];    // sent from processing and
}                      // easily convert it to a
foo;                   // float array

///////////////////////////////////////////////////////////////////////////////////////////////////
void SerialReceive() {
  // read the bytes sent from Processing
  int index = 0;
  byte Auto_Man = -1;
  byte Direct_Reverse = -1;
  while (Serial.available() && index < 26) {

    if (index == 0) Auto_Man = Serial.read();
    else if (index == 1) Direct_Reverse = Serial.read();
    else foo.asBytes[index - 2] = Serial.read();
    index++;
  }

  // if the information we got was in the correct format,
  // read it into the system
  if (index == 26  && (Auto_Man == 0 || Auto_Man == 1) && (Direct_Reverse == 0 || Direct_Reverse == 1))
  {
    Setpoint = double(foo.asFloat[0]);
    //Input=double(foo.asFloat[1]);       // * the user has the ability to send the
    //   value of "Input"  in most cases (as
    //   in this one) this is not needed.
    if (Auto_Man == 0)                    // * only change the output if we are in
    { //   manual mode.  otherwise we'll get an
      Output = double(foo.asFloat[2]);    //   output blip, then the controller will
    }                                     //   overwrite.

    double p, i, d;                       // * read in and set the controller tunings
    p = double(foo.asFloat[3]);           //
    i = double(foo.asFloat[4]);           //
    d = double(foo.asFloat[5]);           //
    myPID.SetTunings(p, i, d);            //

    if (Auto_Man == 0) myPID.SetMode(MANUAL); // * set the controller mode
    else myPID.SetMode(AUTOMATIC);             //

    if (Direct_Reverse == 0) myPID.SetControllerDirection(DIRECT); // * set the controller Direction
    else myPID.SetControllerDirection(REVERSE);          //
  }
  Serial.flush();                         // * clear any random data from the serial buffer
}


///////////////////////////////////////////////////////////////////////////////////////////////
void SerialSend() {
  //Serial.print(millis() / 1000);
  Serial.print("PID ");
  Serial.print(Setpoint);
  Serial.print(" ");
  Serial.print(Input);
  Serial.print(" ");
  Serial.print(Output);
  Serial.print(" ");
  Serial.print(myPID.GetKp());
  Serial.print(" ");
  Serial.print(myPID.GetKi());
  Serial.print(" ");
  Serial.print(myPID.GetKd());
  Serial.print(" ");
  if (myPID.GetMode() == AUTOMATIC) Serial.print("Automatic");
  else Serial.print("Manual");
  Serial.print(" ");
  if (myPID.GetDirection() == DIRECT) Serial.println("Direct");
  else Serial.println("Reverse");

  delay(5);
  Serial.print("~Mink/set ");
  Serial.print(Setpoint);
  Serial.print("^~Mink/outpwr ");
  Serial.print(Output / 10);
  Serial.print("^~Mink/t1 ");
  Serial.print(temp1Ink);
  Serial.print("^~Mink/t2 ");
  Serial.print(temp2Ink);
  Serial.print("^~Mink/hum ");
  Serial.print(humidity);
  Serial.print("^~Mink/alarm ");
  Serial.print(digitalRead(alarm_pin));
  Serial.print("^~Mink/extheat ");
  Serial.print(digitalRead(extend_heater_pin));
  Serial.print("^~Mink/fan ");
  Serial.print(digitalRead(fan_pin));
  Serial.print("^~Mink/door ");
  Serial.println(!digitalRead(door_pin));
}

также шил скетч SmartInkubatorV2_perepel_.ino который в папке SimpleSmartInkubator\SimpleSmartInkubator_AUTO\SmartInkubatorV2_perepel_
результат тот же
подскажите пожалуйста в чем проблема, что нужно изменить в скетче
заранее спасибо

epx
Сообщения: 4
Зарегистрирован: 27 мар 2016, 10:33

Re: стройка инкубатора

Сообщение epx » 15 янв 2017, 13:00

но в скетче что выше на 13 пине +5В

Аватара пользователя
Umka
Команда UM
Сообщения: 6274
Зарегистрирован: 04 июн 2015, 13:45
Откуда: Суджа
Контактная информация:

Re: стройка инкубатора

Сообщение Umka » 16 янв 2017, 05:16

Совершенно нормальный скетч, он у всех работает. Проверяйте настройки ПИД и условия отключения нагревателя.

Alex13
Сообщения: 66
Зарегистрирован: 16 янв 2017, 13:52

Re: стройка инкубатора

Сообщение Alex13 » 16 янв 2017, 14:00

Здравствуйте! Я могу ошибаться но в скетче для инкубатора в коде есть слабое место. При выходе в меню останавливается ПИД регулятор в случайном состоянии пина 13. Есть шанс что пока будет включено меню на тэны будет подаватся полная мощность.

Аватара пользователя
Umka
Команда UM
Сообщения: 6274
Зарегистрирован: 04 июн 2015, 13:45
Откуда: Суджа
Контактная информация:

Re: стройка инкубатора

Сообщение Umka » 16 янв 2017, 14:27

Не было такого.

Alex13
Сообщения: 66
Зарегистрирован: 16 янв 2017, 13:52

Re: стройка инкубатора

Сообщение Alex13 » 16 янв 2017, 15:44

Последний скачанный скетч. Пои нажатии средней кнопки происходит вход в меню установки температуры и выход программы из цикла loop(). Процесс терморегулирования останавливается. И если в это время на 13 пине была единица, она там и остаётся пока не будет осуществлён выход из меню настроек. Непонятно почему у меня именно так?

alexgo
Сообщения: 4
Зарегистрирован: 23 янв 2017, 14:46

Re: стройка инкубатора

Сообщение alexgo » 24 янв 2017, 19:20

Здравствуйте! интересуюсь автоматикой для инкубатора,посмотрел несколько обзоров автоматики и появилось несколько вопросов, на одном из видео на дисплее блока отображается информация под какую птицу настраивать автоматику а на другом видео просто отображается температура и влажность, скажите это разные блоки автоматики?
на витрине увидел только один вид
P.S. автоматика нужна для модернизации старого инкубатора на 64 яйца,инкубатор с переворотом,всякие смс и интернет не нужны пока

Аватара пользователя
Umka
Команда UM
Сообщения: 6274
Зарегистрирован: 04 июн 2015, 13:45
Откуда: Суджа
Контактная информация:

Re: стройка инкубатора

Сообщение Umka » 25 янв 2017, 05:39

Это разные программы.
Alex13 поправим.

Ответить