"Народный" инкубатор

BigVal
BigVal аватар
Offline
Зарегистрирован: 10.01.2017

Umka пишет:

Лучше бы исходник с Layout дал или в чем ты там рисуешь. По фотке же не видно половину дорожек. Все в тумане. Думаешь кто-то будет по фотке плату повторять и еще потом ошибку исправлять? 

Роман исходник выше, 15 пост темы

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Ну да, я думал та плата была позже допилена.

lean_74
Offline
Зарегистрирован: 22.12.2015

lean_74 пишет:

Нарисовал плату, правда это всего лишь 3-я моя плата в Sprint-Layout, посему сильно просьба не пинать.

https://yadi.sk/d/nCYIDGV73E2aRv

Вот  же выше дал ссылку, там в lay6

lean_74
Offline
Зарегистрирован: 22.12.2015

сейчас в корпус заталкиваю в коробочку из Леруа за 37руб., и правлю скетч под новые выводы

BigVal
BigVal аватар
Offline
Зарегистрирован: 10.01.2017

Роман добрый день, вы бы лучше выложили ссылку по поводу проводящихся сейчас испытаний нового инкубатора. А то не все наверное ходят на Forumhouse. Может кому будет интересно. (Это не реклама).

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Не вопрос. Начало тут https://www.youtube.com/watch?v=xPMhensZ3Pw

Но это совсем другой инкубатор (контроллер).

lean_74
Offline
Зарегистрирован: 22.12.2015

Umka пишет:

Не вопрос. Начало тут https://www.youtube.com/watch?v=xPMhensZ3Pw

Но это совсем другой инкубатор (контроллер).

Интерисует количество и диаметр вентиляционных отверстий, как впускных, так и выпускных., а меня сейчас три на вход, три на выход, диаметром 10мм, поставил одну небольшую ванночку, влажность без парогенератора 65,5% и не падает, он даже не включается, поставил вторую такую влажность выросла до 85,5 - парогениратор вообще вынул, за ненадобностью. И так вопрос:

1.Добавить отверстий? для лучшего воздухообмена, или их диаметр, или оставить как есть?

температуру держит отлично, на уставку выходит быстро.

lean_74
Offline
Зарегистрирован: 22.12.2015

6 день инкубации

Не дождавшись ответа от Романа загрузил 20 шт яиц, доверия к которым мало, т.к. возраст петушка 2 года, влажность регулируем площадью ванночек, просверлил еще 2 выходных отверстия, теперь три входных и пять выходных.

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

А как же я могу ответить не видя инкубатора? И даже видя не скажу наверняка. Я пошел по пути измерения CO2. Будем смотреть что покажут приборы в конце инкубации. Уже температура контрольного яйца выше прочих. 

http://zftlab.org/pages/2017021400.html

И похоже с нем вода закончилась http://esp8266.flymon.net/?macs=18FE34E0C1DF,18FE34DB15A6&graphs=hum,temp,co2,rssi,gpio&period=1h

А вот тепловизор типа http://zftlab.org/files/examples_js/ver_15a_umka.html

lean_74
Offline
Зарегистрирован: 22.12.2015

Мой снаружи 50Х50Х62 см, толщина стенок 5 см - какая то медицинская коробка с крышкой, внутри сделал две камеры одна 39Х39Х38 и другая примерно 10Х39Х39 

на седьмой день инкубации "забраковал" 6 штук - 4 не оплод, два погибшие эмбрионы, ну я не специалист, первый раз это делал.

так как у тебя Роман  сделано, я думаю, не каждый осилит. Сильно много электроники и сложность ее настройки не привлечет, а наоборот- отпугнет "потенциального покупателя". По моему, чем проще, тем лучше , по крайней мере для такого ленивого "колхозника", как я  :).

lean_74
Offline
Зарегистрирован: 22.12.2015

Вот чудо и случилось. Первые два появились на свет. Остальные еще пищат из своих яиц.

lean_74
Offline
Зарегистрирован: 22.12.2015

Из 14 оставшихся яиц, вылупилось к вечеру 5 цыплят, один уже прокрутился, но вылазить пока не хочет. еще есть два проклюнувшихся яйца, что будет назавтра - посмотрим. вывод затянутый,  потому что яЙца были очень большие, т.к. курам и петуху уже 2,5 года, куры разнеслись и иногда несут даже двухжелтковые, пытался собрать более-менее по размеру, но не сильно получилось. посему такой вот выход. плюс когда собирал на улице был мороз 30 градусов может какие яйца и поморозил. если к утру к пяти имеющимся еще 3 вылупятся, считаю для первого раза результат отличным. В воскресенье договорился взять 20 гусиных яиц от заводчиков - тут и будем проверять выводимость.

bwn
Offline
Зарегистрирован: 25.08.2014

С гусиками не торопитесь, они сложные в выводе.

lean_74
Offline
Зарегистрирован: 22.12.2015

bwn пишет:

С гусиками не торопитесь, они сложные в выводе.

Да договорился уже, как то некрасиво переобуваться. Будем завтра все мыть, а воскресенье вечером закладывать.

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

А был опыт выведения гусей? Не так все просто с ними.

lean_74
Offline
Зарегистрирован: 22.12.2015

Umka пишет:

А был опыт выведения гусей? Не так все просто с ними.

Нет опыта не было, значит будет. В 90-е , когда жрать было нечего, я держал доволно большое хозяйство, корова с теленком, поросята, кролики, куры, так что меня это не пугает, это после 2000-х стали жить лучше, всю живность перевели, будем вспоминать.

lean_74
Offline
Зарегистрирован: 22.12.2015

Сделал новую версию инкубатора на промини https://yadi.sk/d/iH2s0-ZR3GRrxh правда скачал перевернутый шаблон

#include <avr/wdt.h>
//#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal.h>
#include <EEPROM.h>
//#include "DHT.h"
#include <Si7021.h> //мой датчик влажности
#include <OneWire.h>
#include <Wire.h>
#define START_CONVERT 0
#define READ_TEMP 1



//#define DHTPIN 11     // what digital pin we're connected to
//#define DHTTYPE DHT11   // DHT 11, DHT 22
//DHT dht(DHTPIN, DHTTYPE);
SI7021 si7021; //раскоментировать, если используем датчик si7021.

//LiquidCrystal_I2C lcd(0x27, 16, 2);  // инициализация библиотеки дисплея
LiquidCrystal lcd(17, 16, 15, 14, 13, 12);// (RS, E, DB4, DB5, DB6, DB7)

//номера выводов кнопок
//#define EXT_HEATING                  // ИСПОЛЬЗУЕМ ДОП.НАГРЕВАТЕЛЬ ВМЕСТО УВЛАЖНИТЕЛЯ. Если нужен увлажнитель, просто закомментируйте эту строку.
#define heater_pin 7                  // нагреватель
#define humidifer_pin 4               // увлажнитель
//#define fan_pin 10                     // вентилятор
#define alarm_pin 9                   // пин аварии
//#define beeper_pin 17                   //пищалка по аварии

//#define turn_pin 9                     // управление поворотом вперед
//#define pin9 9                    // проверка
//#define extend_heater_pin 8         // дополнительный нагреватель
#define button_minus_pin 0            //пин кнопки "минус"
#define button_plus_pin  1            //пин кнопки "плюс"
#define button_enter_pin 10           //пин кнопки "enter"
#define DS18B20_Pin 11                 //пин термометра
//Пин 2 Вход обработки прерывания для детектора нуля и управления семистором

OneWire ds(DS18B20_Pin);

// Контакты   Bl Pi Ye  Or
int pins[] = {3, 5, 6, 8}; //Задаем пины по порядку для шаговика
int phases = 8; //  Для полушагового режима

// Для полушагового режима
bool motorPhases[8][4] = { // [phase][pin]
  // -------- pins ----------
  // Winding    A  B  A  B
  // Motor Pin  1  2  3  4
  // Color      Bl Pi Ye Or
  {             1, 1, 0, 0},
  {             0, 1, 0, 0},
  {             0, 1, 1, 0},
  {             0, 0, 1, 0},
  {             0, 0, 1, 1},
  {             0, 0, 0, 1},
  {             1, 0, 0, 1},
  {             1, 0, 0, 0}
};
int phase = 0;
int _step = 1; // Если у шага поменять знак, на -1 - изменится направление вращения шаговика.

boolean button_minus;                // статус нажатия кнопок
boolean button_plus;
boolean button_enter;
boolean value = HIGH; // переменная состояния релешки увлажнителя

unsigned long currentTime;            // задаем переменные для тайминга поворота
unsigned long loopTime;
unsigned long serialTime; //this will help us know when to talk with processing

boolean hotFlag1 = 0;              // флаг включения обогревателя основного   1-ошибка, включать нельзя
//boolean fanFlag = 0;        // флаг включения вентилятора проветривания 1-включено проветривание
unsigned long trhMillis = 0;
unsigned long humMillis = 0;

boolean flag = 0;
int clockTime = 0; // флаг того что выводим температуру или влажность
unsigned long lastMillis = millis();
int TimeTemp = 4;  //время следующего измерения температуры в секундах
int TimeTurn = 20;  //время поворота в десятых долях секунды
byte TurnNow = 0; // текущая задержка времени для переворота
const unsigned long TRHSTEP   = 300UL;  // Период опроса датчиков

//int counter=0;//для проверки вачдога

volatile uint8_t minut = 0;
//volatile uint8_t chas=0;
int chas = 0;
volatile uint8_t sec = 0;
int den = 0;
int oldden = 0;
int oldchas = 0;

int temp = 0; // температура Далласа
float temp1 = 0; // температура Далласа с десятыми
float temp2 = 0; // температура DHT, si7021
float hum = 0;

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

boolean out = 0; //управление симистором yul-i-an
int reg, er, zad; //    yul-i-an
double I, Kp = 3, Ki = 0.45, Kd = 0.6, pre_err, err; //    yul-i-an

//unsigned long alarmDelay;

float needTemp = 37.6;                  // нужная для текущего дня температура инкубации (по умолчанию)
float needHum = 60.5;                   // ---- влажность
int ventTime = 2;                       // длительность проветривания
boolean needTurn = false;               // нужен ли поворот яиц?
int bird = 0;

// make some custom characters:
byte znak_g[8] = {//г
  0b11111,
  0b10001,
  0b10000,
  0b10000,
  0b10000,
  0b10000,
  0b10000,
  0b00000
};
byte znak_b[8] = {//Б
  0b11111,
  0b10001,
  0b10000,
  0b11110,
  0b10001,
  0b10001,
  0b11110,
  0b00000
};

byte znak_p[8] = {
  0b11111,
  0b10001,
  0b10001,
  0b10001,
  0b10001,
  0b10001,
  0b10001,
  0b00000
};
byte znak_i[8] = {
  0b10001,
  0b10001,
  0b10011,
  0b10101,
  0b11001,
  0b10001,
  0b10001,
  0b00000
};

byte znak_l[8] = {
  0b00111,
  0b01001,
  0b10001,
  0b10001,
  0b10001,
  0b10001,
  0b10001,
  0b00000
};

byte light_znak[8] = {
  0b10000,
  0b10000,
  0b10000,
  0b11110,
  0b10001,
  0b10001,
  0b01110,
  0b00000
};

byte znak_u[8] = {
  0b10001,
  0b10001,
  0b10001,
  0b01111,
  0b00001,
  0b10001,
  0b01110,
  0b00000
};


byte znak_ia[8] = {
  0b01111,
  0b10001,
  0b10001,
  0b01111,
  0b00101,
  0b01001,
  0b10001,
  0b00000
};
byte znak_d[8] = {
  0b01110,
  0b01010,
  0b01010,
  0b01010,
  0b01010,
  0b11111,
  0b10001,
  0b00000
};
byte znak_ch[8] = {
  0b10001,
  0b10001,
  0b10001,
  0b01111,
  0b00001,
  0b00001,
  0b00001,
  0b00000
};
byte znak_c[8] = {
  0b10010,
  0b10010,
  0b10010,
  0b10010,
  0b10010,
  0b10010,
  0b11111,
  0b00001
};

//расчет мощности по ПИД закону регулирования
//_------------------------------------------------------------
#define kP 6//коэффициент пропорциональности 6
#define p_min 0.0//минимум П составляющей - не < 0
#define p_max 100.0//максимум П составляющей - не > 100 
#define kI 0.100//коэффициент интегрирования 0.025
#define i_min 0.0//минимум И составляющей
#define i_max 30.0//максимум И составляющей
#define kd 0//коэффициент диференциирования
#define d_ctl 7.0//зона пропорциональности ust-d_ctl
#define out_min 0//минимальный выходной %
#define out_max 100//максимальный выходной % 
//возвращает необходимую мощность
uint8_t PIctl(float temp, float ust) {

  uint8_t out = 0; //uint8_t
  static float i = 0;
  static float ed = 0; ///
  float e, p;
  float d;///
  e = (ust - temp); //ошибка регулирования
  p = (temp < ust - d_ctl) ? p_max : (temp > ust) ? p_min : (kP * e); //П составляющая
  i = (i < i_min) ? i_min : (i > i_max) ? i_max : i + (kI * e); //И составляющая
  d = kd * (e - ed); //Д составляющая
  ed = e; ///
  out = (p + i + d < out_min) ? out_min : (p + i + d > out_max) ? out_max : p + i + d;
  //вывод для настройки
  //     Serial.print(" e  ");
  //      Serial.print(e);
  //      Serial.print("  p ");
  //      Serial.print(p);
  //      Serial.print("  i ");
  //      Serial.print(i);
  //      Serial.print("  out ");
  //      Serial.println(out);
  return out;
}
//---------------------------------------------------------------



void readSet() {
  den = EEPROM_int_read(100);
  chas = EEPROM_int_read(102);
  int bird;                  // выбор птицы
  int r_array[6][4][5] = {
    {{2, 382, 600, 0, 1}, {12, 376, 600, 3, 1}, {15, 374, 480, 10, 1}, {18, 370, 855, 10, 0}},
    {{2, 378, 550, 0, 1}, {7, 378, 500, 3, 1}, {14, 378, 500, 10, 1}, {16, 375, 700, 0, 0}},
    {{7, 382, 700, 0, 1}, {14, 378, 600, 0, 1}, {25, 378, 600, 10, 1}, {28, 375, 855, 0, 0}},
    {{2, 380, 600, 0, 1}, {7, 378, 550, 0, 1}, {29, 375, 450, 10, 1}, {30, 370, 750, 0, 0}},
    {{7, 378, 700, 0, 1}, {14, 378, 600, 0, 1}, {27, 378, 600, 15, 1}, {30, 375, 855, 0, 0}},
    {{8, 377, 650, 0, 1}, {14, 377, 500, 0, 1}, {25, 375, 650, 10, 1}, {28, 375, 655, 10, 0}},
  };
//ковалев
//    {{2, 382, 650, 0, 1}, {12, 377, 540, 5, 1}, {18, 374, 480, 20, 1}, {20, 371, 855, 10, 0}},  // chick
//    {{2, 382, 600, 0, 1}, {12, 376, 600, 3, 1}, {15, 374, 480, 10, 1}, {18, 370, 855, 10, 0}},  // quail
//    {{7, 381, 700, 0, 1}, {13, 376, 600, 3, 1}, {25, 373, 560, 20, 1}, {30, 370, 855, 10, 0}},  // duck
//    {{15, 380, 610, 5, 1}, {26, 375, 520, 20, 1}, {27, 374, 690, 10, 0}, {35, 370, 800, 0, 0}}, // muskus
//    {{3, 379, 630, 0, 0}, {13, 378, 540, 3, 1}, {26, 375, 560, 20, 1}, {30, 372, 590, 10, 0}},  // goose
//    {{6, 379, 560, 0, 1}, {12, 376, 530, 3, 1}, {26, 373, 520, 20, 1}, {30, 370, 855, 10, 0}},  // turkey

  //Serial.println("readset=");

  bird =  EEPROM_int_read(110);
  for (int d = 4; d >= 0; d--) {
    if (den <= r_array[bird][d][0]) { //у Ковалева < ,а у меня <=  
      needTemp = float(r_array[bird][d][1]) / 10; //
      needHum = float(r_array[bird][d][2]) / 10; //
      ventTime = r_array[bird][d][3];
      needTurn = r_array[bird][d][4];
    }
  }
  //TimeTurn=  EEPROM_int_read(98);
//    EEPROM.write(10, TurnNow);
//int turnPeriod = EEPROM_int_read(104);
TurnNow = EEPROM.read(120);
//int intTurnNow=TurnNow;
//if ((intTurnNow<0) || (intTurnNow>turnPeriod) ){
//  TurnNow=0;
//  EEPROM.write(120, TurnNow);
//}
  if (den > 36 || den < 0) {
    den = 0; //
  }
  if (chas > 24) {
    chas = 0; //
  }
  if (minut > 60) {
    minut = 0; //
  }

}

void setup() {
  wdt_disable(); // запретили как можно скорее собаку, что-бы не уйти в бесконечный ребут
//  Serial.begin(9600);
  //   readSet();
  lcd.begin(16,2);
//  lcd.backlight();     // Включаем подсветку дисплея
  lcd.clear();

  // create a new character
  //  lcd.createChar(5, znak_g);//г
  lcd.createChar(5, znak_b);//Б
  lcd.createChar(1, znak_i);//И
  lcd.createChar(2, znak_p);//П
  lcd.createChar(3, znak_l);//Л
  lcd.createChar(4, light_znak);  // мягкий хнак
  lcd.createChar(7, znak_d);  //Д
  lcd.createChar(8, znak_c); //Ц
  lcd.createChar(6, znak_u);//У

  lcd.setCursor(0, 0);

  lcd.print("   HAPO");
  lcd.write(7);
  lcd.print("H");
  lcd.write(4);
  lcd.print("|");
  lcd.write(1);
  lcd.setCursor(0, 1);
  lcd.print("   ");
  lcd.write(1);
  lcd.print("HK");
  lcd.write(6);
  lcd.write(5);
  lcd.print("ATOP");



  Wire.begin();        // старт I2C

  //   dht.begin();
  si7021.begin(); // Runs : Wire.begin() + reset() // старт датчика влажности
  delay(3000);// подождем пока датчик запуститься, и завтавка погорит
  si7021.setHumidityRes(12); // Humidity = 12-bit / Temperature = 14-bit //максимальное разрешение


  lcd.createChar(5, znak_g);//г
  readSet();  // читаем настройки из еепром



  // настройкa часов
  TCCR1A = (1 << WGM11); //режим14 FAST PWM
  TCCR1B = (1 << CS12) | (1 << WGM13) | (1 << WGM12); //делить частоту CPU на 256
  ICR1 = 62499; // (16000000MHz /div256) -1 = 1 раз в секунду
  TIMSK1 = (1 << TOIE1); //разрешить прерывание

  tempProcess(START_CONVERT);//конвентируем dallas

  attachInterrupt(0, zero_crosss_int, RISING);//внешнее прерывание на D2

  //pinMode(extend_heater_pin, OUTPUT);      //пин дополнительного нагревателя. Переводим в 1 чтобы не включать реле.
  //digitalWrite(extend_heater_pin, HIGH);
  pinMode(heater_pin, OUTPUT);
//  pinMode(turn_pin, OUTPUT);      // устанавливаем выводы
  //  pinMode(pin9, INPUT);      // устанавливаем выводы
//  digitalWrite(turn_pin, LOW);
  //digitalWrite(turn_pin2, HIGH);
  pinMode(humidifer_pin, OUTPUT);
  digitalWrite(humidifer_pin, LOW);
//  pinMode(fan_pin, OUTPUT);
//  digitalWrite(fan_pin, LOW);
  pinMode(alarm_pin, OUTPUT);
  digitalWrite(alarm_pin, HIGH);
  pinMode(button_minus_pin, INPUT_PULLUP); //подтягиваем входы кнопок к плюсу встроенными резисторами
  pinMode(button_plus_pin, INPUT_PULLUP);
  pinMode(button_enter_pin, INPUT_PULLUP);
  
  for (int i = 0; i < 4; i++) pinMode(pins[i], OUTPUT);//настраиваем выводы для шаговика
  for (int i = 0; i < 4; i++) digitalWrite(pins[i], LOW);
  
  
//  alarmDelay = millis();

  wdt_enable(WDTO_8S); // активировали таймер, каждые 8 секунд его нужно сбрасывать

}

ISR (TIMER1_OVF_vect) {
  sec++ ; //инкремент переменной каждую секунду
  if (sec > 59) {
    sec = 0;
    minut++;
  }
  if (minut > 59) {
    minut = 0;  // при записи каждый час хватит памяти на 11 лет
    chas++;
  }
  if (chas > 23) {
    chas = 0;  //readSet(); но нам главное знать день инкубации
    den++;
  }
  if (den > 36) {
    den = 0;  // частный случай для нас не принципиальный, у нас день инкубации
  }
}

void loop() {
  wdt_reset(); // говорим собаке что "В Багдаде все спокойно", начинается очередной отсчет 8-х секунд.
//  Serial.print("pin9=");
//  Serial.println(digitalRead(alarm_pin));
//  Serial.print("chas=");
//  Serial.println(chas);
//  Serial.print("oldchas=");
//  Serial.println(oldchas);
//  Serial.print("oldden=");
//  Serial.println(oldden);
//  Serial.print("button_plus=");
//  Serial.println(button_plus);
//  Serial.println("   ");

  if (oldchas != chas) { // раз в час сохраняем время
    EEPROM_int_write(102, chas);
    oldchas = chas;
    turn(needTurn);
    wdt_reset();
  }
  if (oldden != den) { // раз в день читаем настройки заново
    EEPROM_int_write(100, den);
    readSet();
    oldden = den;
  }
  button_read();
  if (!button_enter) {
    delay(del); //
    lcd.clear();
    menu();
  }
  if (!button_plus) {
    delay(del);
//   lcd.clear();
//   alarmDelay = millis();    // задержка аварии по нажатии кнопки Минус
  }
  if (!button_minus) {
                                                                                                                                                             delay(del);
    lcd.clear();
  //  digitalWrite(turn_pin, !digitalRead(turn_pin));       // включаем/выключаем реле поворота по кнопке Плюс
      lcd.setCursor(3, 0);
      lcd.write(2);
      lcd.print("EPEBOPOT");  // перепелка

   //  _step=- _step;
     for (int k = 0; k <127; k++) {// 4076 на полный оборот передаточное число 63.68395:1
        phase += _step;
        if (phase > 7) phase = 0;
        if (phase < 0) phase = 7;
      
        for (int i = 0; i < 4; i++) {
          digitalWrite(pins[i], ((motorPhases[phase][i] == 1) ? HIGH : LOW));
        }
        // Пауза на вращение на один полушаг
         delayMicroseconds(8000);
         wdt_reset();
     }
  }else //отключаем пины шаговика, чтобы не грелся понапрасну  
    for (int i = 0; i < 4; i++) {// тут проверочку сделать, чтобы все время не отключать, уже отключенный, поворот
    digitalWrite(pins[i], LOW);
  }

  lcd.setCursor(0, 0);
  if (millis() > serialTime)
  {
    getSensors(); // получаем данные с датчиков

    PID();//расчитываем ПИД yul-i-an
    serialTime += 1200;//1200
// err=needTemp-temp1;
// Serial.print("needTemp=");
// Serial.println(needTemp);
// Serial.print("temp1=");
// Serial.println(temp1);
// Serial.print("err=");
// Serial.println(err);
// Serial.print("zad=");
// Serial.println(zad);
//     Serial.print("fanFlag=");
//     Serial.println(fanFlag);
//     Serial.print("hotFlag1=");
//     Serial.println(hotFlag1);
//     Serial.print("needTemp=");
//     Serial.println(needTemp);
//      Serial.println("");
  }

  if (flag == 0)
  {
    lastMillis = millis();
    clockTime = !clockTime;
    flag = 1;
  }

  if (millis() - lastMillis >= TimeTemp * 1000) {
    flag = 0;
  }
  if (clockTime == 1) {
    lcd.setCursor(0, 0); // выводим часы и день инкубации
    if (chas < 10) lcd.print(" ");
    lcd.print(chas, DEC);
    lcd.print(":");
    if (minut < 10)lcd.print(0);
    lcd.print(minut, DEC);
    lcd.print(" ");
    lcd.write(7);
    lcd.print("EH");
    lcd.write(4);
    lcd.print(" ");
    lcd.print(den, DEC);
    lcd.print("     ");
    lcd.setCursor(0, 1);
    lcd.print("P=");
    lcd.print(zad);              // печать температуры на дисплей temp%10
//    lcd.print((char)223);
    lcd.print("% ");
    printbird(bird);
  }
  else {

    lcd.setCursor(0, 0);                 // устанавливаем курсор в 0-ом столбце, 0 строка (начинается с 0)
    lcd.print("T1=");
    lcd.print(temp / 10, 1);            // печать температуры на дисплей temp
    lcd.print(".");
    lcd.print(temp % 10, 1);            // печать температуры на дисплей temp%10

    lcd.print((char)223);
    lcd.print(" (");
    lcd.print(needTemp, 1);
    lcd.print((char)223);
    lcd.print(")   ");
    lcd.setCursor(0, 1);
    lcd.print("H =");
    lcd.print(hum, 1);           // печать влажности на дисплей
    lcd.print("%");
    lcd.print(" (");
    lcd.print(needHum, 1);
    lcd.print("%) ");

  }

  getSensors(); // получаем данные с датчиков
  humidifer(needHum);
  //  turn(needTurn); // переворот перенесли при смене каждого часа
  fan(ventTime);
  alarm(needTemp);

//  if (fanFlag) { //если флаг вентилятора включен выключем тены до температуры 32 градуса и включаем вентилятор
//    digitalWrite(fan_pin, LOW); //
//    if (temp1 >= 32)
//    { hotFlag1 = 1;
//    } else  {
//      hotFlag1 = 0; //
//    }

//  } else {
//    //       digitalWrite(extend_heater_pin, HIGH); //поверить!!!!
////    digitalWrite(fan_pin, HIGH); //
//    hotFlag1 = 0;
//  }

}


//регулятор ПИД
void PID() {
  err = needTemp - temp1;
  if (hotFlag1 == 0) I = I + err; //если проветривание или авария не включаем

  //   zad=Kp*err+(Ki*I*0.25)+(Kd*(err-pre_err)/0.25);
  zad = PIctl(temp1, needTemp); //расчет мощности
  pre_err = err;
  if (temp1 >= 39.5) //это при перегреве
  {
    zad = 0;
    I = 0;
  }
  if (zad < 0) {
    zad = 0;
    I = 0;
  }
  if (zad > 100) {
    zad = 100;
  }
  //   Serial.print("reg=");
  //   Serial.println(reg);

}
//Внешнее прерывание детектора нуля
void zero_crosss_int()
{
  ResOut();//Вызов функции управления симистором по алгоритму Брезенхема
}

//управление симистором
void ResOut() {
  delayMicroseconds(1230);//для попадания в ноль
  reg = zad + er;
  if (reg < 50) {
    out = 0;
    //    PORTD &= ~_BV(PD6); // установить "0" на линии 6 порта D
    //    PORTD &= ~(1 << 6);
    er = reg ;

  }
  else {
    out = 1;
    //    PORTD |= _BV(PD6);
    // PORTD |= (1 << 6);
    er = reg - 100;
  }
  if (hotFlag1 == 0) {
    digitalWrite(heater_pin, out); //если проветривание или авария не включаем

  }
  else {
    digitalWrite(heater_pin, LOW);

  }
}


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() {
  startInk();
  time_setup_chas();
  time_setup_minut();
  bird_setup();
  turn_setup();
  //  turn_time_setup();
//  alarm_setup();
//  vent_setup();
}

// записываем в память день начала инкубации
void startInk() {
  String str_menu = "START INK";
  int perem_menu = den;
  int adress_errom = 100;
  int perem_max = 36;
  String str_perem = "Day";
  den = setup_menu(str_menu, perem_menu, adress_errom, perem_max, str_perem);
}
//устанавливаем часы
void time_setup_chas() {
  String str_menu = "SETUP HOUR";
  int perem_menu = chas;
  int adress_errom = 102;
  int perem_max = 23;
  String str_perem = "Hour";
  chas = setup_menu(str_menu, perem_menu, adress_errom, perem_max, str_perem);
}
//устанавливаем минуты
void time_setup_minut() {
  String str_menu = "SETUP minute";
  int perem_menu = minut;
  int adress_errom = 0;
  int perem_max = 59;
  String str_perem = "minute";
  minut = setup_menu(str_menu, perem_menu, adress_errom, perem_max, str_perem);
}

//выбираем птицу /////////////////////////////////////////////////////////

void bird_setup() {
  String str_menu = "SETUP bird";
  int perem_menu = bird;
  int adress_errom = 110;
  int perem_max = 5;
  String str_perem = "bird";
  bird = setup_menu(str_menu, perem_menu, adress_errom, perem_max, str_perem);
}


//устанавливаем поворот
void turn_setup() {
  int turnPeriod = EEPROM_int_read(104);              //период поворота лотков в часах

  String str_menu = "TURN SETUP";
  int perem_menu = turnPeriod;
  int adress_errom = 104;
  int perem_max = 12;
  String str_perem = "TURN Hour";
  turnPeriod = setup_menu(str_menu, perem_menu, adress_errom, perem_max, str_perem);
}

////устанавливаем время переворота
//void turn_time_setup() {
//int TimeTurn=EEPROM_int_read(98);                //период поворота лотков в часах
//
//String str_menu= "TURN TIME";
//int perem_menu=TimeTurn;
//int adress_errom=98;
//int perem_max=99;
//String str_perem="TURN time";
//TimeTurn= setup_menu(str_menu,perem_menu,adress_errom,perem_max,str_perem);
//}


//устанавливаем сигнализацию
//void alarm_setup() {
//  int  alarmTemp = EEPROM_int_read(106);
//  String str_menu = "ALARM SETUP";
//  int perem_menu = alarmTemp;
//  int adress_errom = 106;
//  int perem_max = 10;
//  String str_perem = "T.Alarm +- C";
//  alarmTemp = setup_menu(str_menu, perem_menu, adress_errom, perem_max, str_perem);
//}

//устанавливаем вентиляцию
//void vent_setup() {
//  int fanTemp = EEPROM_int_read(108);
//  String str_menu = "A.FAN SETUP";
//  int perem_menu = fanTemp;
//  int adress_errom = 108;
//  int perem_max = 40;
//  String str_perem = "T.Fan C";
//  fanTemp = setup_menu(str_menu, perem_menu, adress_errom, perem_max, str_perem);
//}

int setup_menu(String str_menu, int perem_menu, int adress_errom, int perem_max, String str_perem) {
  lcd.clear();
  delay(del);
  button_read();
  lcd.setCursor(0, 0);
  lcd.print(str_menu);
  lcd.print("         ");
  delay(1000);
  int x = 0;
  while (1) {
    x++;
    if (x > interval) break;
    button_read();
    if (adress_errom != 0) perem_menu = EEPROM_int_read(adress_errom);
    if (!button_enter) {
      delay(del);
      lcd.clear(); //очищаем экран
      break;
    }
    if (!button_minus) {
      perem_menu--;
      if (perem_menu < 0) perem_menu = perem_max;
      if (adress_errom != 0) EEPROM_int_write(adress_errom, perem_menu);
      lcd.clear();
      readSet();
    }

    if (!button_plus) {
      perem_menu++;
      if (perem_menu > perem_max) perem_menu = 0;
      if (adress_errom != 0) EEPROM_int_write(adress_errom, perem_menu);
      lcd.clear();
      readSet();
    }
    if (adress_errom != 0) perem_menu = EEPROM_int_read(adress_errom);

    lcd.setCursor(0, 0);
    if (str_perem == "bird") {
      lcd.print("BIRD ");
      printbird(perem_menu);

      lcd.print("           ");

    } else {
      lcd.print(str_perem);
      lcd.print("= ");
      lcd.print(perem_menu);
      lcd.print("           ");
    }
    lcd.setCursor(0, 1);
    lcd.print("START NEXT +1");
    delay(del);
  }
  return perem_menu;
}

void printbird(int nbird) {
  switch (nbird) {
    case 0:
      lcd.print("K");  // курица
      lcd.write(6);
      lcd.print("P");  // курица
      lcd.write(1);
      lcd.write(8);
      lcd.print("A    ");  // курица
      break;
    case 1:
      lcd.write(2);
      lcd.print("EPE");  // перепелка
      lcd.write(2);
      lcd.print("E");  // перепелка
      lcd.write(3);
      lcd.print("KA ");  // перепелка
      break;
    case 2:
      lcd.write(6);
      lcd.print("TKA      ");   // утка
      break;
    case 3:
      lcd.write(1);
      lcd.print("H");  // индоутка
      lcd.write(7);
      lcd.print("O");  // индоутка
      lcd.write(6);
      lcd.print("TKA  ");   // утка
      break;
    case 4:
      lcd.write(5);
      lcd.write(6);
      lcd.print("C");  // гусь
      lcd.write(4);
      lcd.print("      ");  // гусь
      break;
    case 5:
      lcd.write(1);
      lcd.print("H"); // индюк
      lcd.write(7);
      lcd.print("|OK    "); // индюк

      break;
  }

}


void getSensors() {
  unsigned long curMillis = millis();          // Получаем текущее время работы
  if (curMillis - trhMillis >= TRHSTEP) {    // время для нового измерения?
    temp = tempProcess(READ_TEMP); //читаем темпратуру с далласа
    temp1 = float(temp) / 10;
    tempProcess(START_CONVERT); // сразу запрос на конвертацию
  }

  // Demonstrate non-blocking calls
  if (curMillis - trhMillis >= TRHSTEP * 4) {    // время для нового измерения?

    //    hum = dht.readHumidity(); //получение темпрературы и влажности с DHT11
    //    temp2 = dht.readTemperature();
    temp2 = si7021.readTemp(); //получение темпрературы и влажности с si7021
    hum = si7021.readHumidity();

    trhMillis = curMillis;
  }

}

//управляем влажностью
void humidifer(float set_humidity) {
  //float humidity;

  unsigned long curMillis = millis();

  if (curMillis >= humMillis + 2000) {
// Serial.print("curMillis=");
// Serial.println(curMillis);
// Serial.print("humMillis=");
// Serial.println(humMillis);
// Serial.print("hum=");
// Serial.println(hum);
// Serial.print("set_humidity=");
// Serial.println(set_humidity);
// Serial.print("value=");
// Serial.println(value);
//  Serial.print("pin9=");
//  Serial.println(digitalRead(alarm_pin));
//  Serial.print("pin4=");
//  Serial.println(digitalRead(humidifer_pin));

    humMillis = curMillis;

    //   if (set_humidity >= hum) digitalWrite(humidifer_pin, HIGH); //сравниваем измеренную влажность с заданной
    //  else if (set_humidity -5 < hum) digitalWrite(humidifer_pin, LOW); //если влажность низкая, включаем увлажнитель
    if ((hum >= set_humidity + 2) || (hum <= set_humidity - 2)) {
      if ((hum <= set_humidity - 2) && (value == LOW)) {
        value = HIGH;
      }
      if ((hum >= set_humidity + 2) && (value == HIGH)) {
        value = LOW;
      }
      digitalWrite(humidifer_pin, value);

    }
  }


}

//управляем поворотом
void turn(boolean needTurn) {
  wdt_disable(); // запретили как можно скорее собаку, что-бы не уйти в бесконечный ребут

  //TurnNow
  int turnPeriod = EEPROM_int_read(104);              //период поворота лотков в часах
// int turnCommand;
  if (turnPeriod == 0) return; //если нулевой период поворота, то не поворачиваем яйца.
  TurnNow++;
  int intTurnNow=TurnNow;
  if ((intTurnNow <= turnPeriod) && (intTurnNow >= 0)){
  EEPROM.write(120, TurnNow);
  }else {
    TurnNow=0;
  EEPROM.write(120, TurnNow);  
    }
  
// int turnCommand = TurnNow;
// currentTime = millis();
// Serial.print("turnPeriod=");
// Serial.println(turnPeriod);
// Serial.print("TurnNow=");
// Serial.println(TurnNow);
// Serial.print("intTurnNow=");
// Serial.println(intTurnNow);
// Serial.print("needTurn=");
// Serial.println(needTurn);
  // Serial.print("loopTime=");
  // Serial.println(loopTime);
  // Serial.println("   ");

  if ((needTurn == true) && (turnPeriod==intTurnNow)) {
    
    lcd.clear();
      lcd.setCursor(3, 0);
      lcd.write(2);
      lcd.print("EPEBOPOT");  // 
   
     _step=- _step;
     for (int k = 0; k <2038; k++) {//4076 на полный оборот передаточное число 63.68395:1
        phase += _step;
        if (phase > 7) phase = 0;
        if (phase < 0) phase = 7;
      
        for (int i = 0; i < 4; i++) {
          digitalWrite(pins[i], ((motorPhases[phase][i] == 1) ? HIGH : LOW));
        }
        // Пауза на вращение на один полушаг
         delayMicroseconds(10000);// максимум 20000 мин 1000
       //  wdt_reset();
     }
        for (int i = 0; i < 4; i++) {//чтобы шаговик не грелся лишнего
          digitalWrite(pins[i], LOW);
        }

//   loopTime = currentTime;    // в loopTime записываем новое значение
    //    }
    //  }
  }
    wdt_enable(WDTO_8S); // активировали таймер, каждые 8 секунд его нужно сбрасывать

}

//управляем авариями
void alarm(float needTemp) {
  int alarmTemp = EEPROM_int_read(106);
  if (temp1 > 39.5) { //|| temp1 < (needTemp - alarmTemp)
//    beeper(10);
    digitalWrite(alarm_pin, LOW); //если измеренная температура выше заданной на величину аварии
  }
  else digitalWrite(alarm_pin, HIGH); //то включаем аварийный сигнал.

}

//void beeper(int duration) {
//  tone(beeper_pin, 2000, duration);
//}


//управляем вентиляторами
void fan(int fanTime) {
  int fanTemp = EEPROM_int_read(108);
  if ((chas == 7 && minut < fanTime) || (chas == 19 && minut < fanTime) || (temp1 > 39.5)) { //fanTemp=395
    // digitalWrite( fan_pin, LOW);
//    fanFlag = 1;

    //если наступило время проветривания или измеренная температура выше заданной на величину авариито включаем продувку.
    //    digitalWrite(extend_heater_pin, HIGH);  // при этом отключаем обогрев
    //    digitalWrite(heater_pin, LOW);
    hotFlag1 = 1;
    //   hotFlag2 = 1;
  }
  else {
//    fanFlag = 0;
    hotFlag1 = 0;
  }

  //digitalWrite(fan_pin, HIGH); //иначе выключаем.

  //    hotFlag1 = 1;
  //    hotFlag2 = 1;
  //

}

// вольтметр
//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(14, 3);
//  lcd.print("W");
//  lcd.print(Output, 0);
//  lcd.print(" ");
//}


//==============================
int tempProcess(boolean ch) {
  int t = 0;
  if (!ch) {
    ds.reset();
    ds.write(0xCC);
    ds.write(0x44);
  }
  else {
    ds.reset();
    ds.write(0xCC);
    ds.write(0xBE);
    t = ds.read();
    t = t | (ds.read() << 8);
    //return  t>>4;//целые *C, десятые отброшены
    //return  (t+8)>>4;//целые *С с округлением
    return  (t * 10) >> 4; //целое в десятых *C (214=>21,4*C)
  }
}
// чтение
int EEPROM_int_read(int addr) {
  byte raw[2];
  for (byte i = 0; i < 2; i++) raw[i] = EEPROM.read(addr + i);
  int &num = (int&)raw;
  return num;
}

// запись
void EEPROM_int_write(int addr, int num) {
  byte raw[2];
  (int&)raw = num;
  for (byte i = 0; i < 2; i++) EEPROM.write(addr + i, raw[i]);
}
//пример int
//// запись
//EEPROM_int_write(12, 1000); // адрес 12 (+2 байта)
//EEPROM_int_write(14, 2000); // адрес 14 (+2 байта)
//EEPROM_int_write(16, 3000); // адрес 16 (+2 байта)
//// чтение
//int d = EEPROM_int_read(12);
//int e = EEPROM_int_read(14);
//int f = EEPROM_int_read(16);

 

Spiker
Offline
Зарегистрирован: 18.06.2016

Здравствуйте, где  скачать библиотеку ?

#include <avr/wdt.h>

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Эту не надо качать - системная!

Spiker
Offline
Зарегистрирован: 18.06.2016

Umka пишет:

Эту не надо качать - системная!

Спасибо .

Лёвчег
Offline
Зарегистрирован: 07.02.2016

Замечательный проект! Спасибо за работу. Единственное чего нехватает, так это номинала элементов. В остальном 5+!

 

Лёвчег
Offline
Зарегистрирован: 07.02.2016

Всё, разобрался. Толька не совсем понял чё за микруха к шаговику идет. Если ULN2003APG, тогда 4 и 5 нужно местами поменять. Верно?

И ещё вопрос. Почему DHT11 (22) и DS18B20 на одном 11 пине?

Лёвчег
Offline
Зарегистрирован: 07.02.2016

В общем я так понимаю, мне никто не ответит...

Но всё же. Уважаемые, подскажите, почкму дисплей по I2C не хочет работать? Показывает кубики. Хотел освободить пины которые задействованы на дисплей, но чёт бред выходит.

bwn
Offline
Зарегистрирован: 25.08.2014

Лёвчег пишет:

В общем я так понимаю, мне никто не ответит...

Но всё же. Уважаемые, подскажите, почкму дисплей по I2C не хочет работать? Показывает кубики. Хотел освободить пины которые задействованы на дисплей, но чёт бред выходит.

Сканер I2C, что показывает? Пока не получите адреса всех подключенных внешних устройств через их протоколы, нахрена скетч основной заливать? Или считаете себя джедаем проводов?

Лёвчег
Offline
Зарегистрирован: 07.02.2016

У дисплея стандартный (0x27, 16, 2). Много где именно его ставил.

Скеч без изменений не устраивает из-за того что я не вкуриваю как поставить DHT11 и DS18B20, так как они оба на 11 пин подключаются. Этож бред? А больше свободных пинов нема.

Или я в чём то ошибаюсь?

bwn
Offline
Зарегистрирован: 25.08.2014

Действительно на одном пине. Логика - DHT измеритель влажности и температуры, ДС-ка  не нужна.
По дисплею, если действительно работает, попробуйте со своей библиотекой (их хренова гора) запустить только отображение информации из скетча ТС (закомментить все лишнее), возможно используются другие методы, тогда сравнивать с примерами из вашей библы и корректировать в скетче.

bwn
Offline
Зарегистрирован: 25.08.2014

bwn пишет:

Действительно на одном пине. Логика - DHT измеритель влажности и температуры, ДС-ка  не нужна.
По дисплею, если действительно работает, попробуйте со своей библиотекой (их хренова гора) запустить только отображение информации из скетча ТС (закомментить все лишнее), возможно используются другие методы, тогда сравнивать с примерами из вашей библы и корректировать в скетче.

P/S DHT, не лучшее решение для инкубатора. Весьма брехливый показометр, а на инкубационных значениях влажности тем более. Лучше потратьте денег и посмотрите на что то вроде SHT** или как у ТС.

Лёвчег
Offline
Зарегистрирован: 07.02.2016

Других нету в наличие, а ждать долго. 

Спасибо за разъяснения! В таком случае не вижу смысла подключать дисплей по I2C. 

Ещё раз спасибо!!!

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Сезон вроде закончился, а вы тут шумите!

bwn
Offline
Зарегистрирован: 25.08.2014

Umka пишет:
Сезон вроде закончился, а вы тут шумите!

Та ладно, у меня круглогодичный с интервалом в три недели (перепелки).

bwn
Offline
Зарегистрирован: 25.08.2014

Лёвчег пишет:

Других нету в наличие, а ждать долго. 

Спасибо за разъяснения! В таком случае не вижу смысла подключать дисплей по I2C. 

Ещё раз спасибо!!!

SHT10, брал здесь. Не реклама, хотя регулярно к ним ныряю.

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Дорого же.
У нас htu21 и то дешевле http://u-m.biz/shop/index.php?route=product/product&path=63&product_id=88

bwn
Offline
Зарегистрирован: 25.08.2014

Umka пишет:
Дорого же. У нас htu21 и то дешевле http://u-m.biz/shop/index.php?route=product/product&path=63&product_id=88

У меня SHT в корейцах стоят, так что для меня вариантов не было. 

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Так это клон sht21, он лучше sht10. Плюс плата со стабом уже и согласование уровней, а не голый датчик без платы. Впрочем кому и dht11 датчик :)

bwn
Offline
Зарегистрирован: 25.08.2014

Там же место штатное + плата-переходник. Не стал влезать в конструкцию, работает и хорошо.

Лёвчег
Offline
Зарегистрирован: 07.02.2016

Нихрена у них цены!!! Не, я думаю, что +-5% влажности так сильно погоду не сделают. Так что по мне лучше связка DHT и DS.

bwn
Offline
Зарегистрирован: 25.08.2014

Тогда зачем связка, калибруйте температуру и влажность DHT в требуемом диапазоне и пользуйтесь им.

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Сломается ваш dht в инкубаторе. Проходили. Да и показывает он погоду на соседней улице. Запаритесь калибровать.

Лёвчег
Offline
Зарегистрирован: 07.02.2016

bwn пишет:

Тогда зачем связка, калибруйте температуру и влажность DHT в требуемом диапазоне и пользуйтесь им.

Я сказал только про влажность. А вот на счет температуры, знающие люди говорят, что каждая десятка важна.

 

 

Лёвчег
Offline
Зарегистрирован: 07.02.2016

Umka пишет:
Сломается ваш dht в инкубаторе. Проходили. Да и показывает он погоду на соседней улице. Запаритесь калибровать.

Ну и пускай. Главное если получится хотябы 2-3 выводка сделать, и на этом хорошо. Пока нормальные запчастили жду из "поднебесной".

lean_74
Offline
Зарегистрирован: 22.12.2015

Лёвчег пишет:

Ну и пускай. Главное если получится хотябы 2-3 выводка сделать, и на этом хорошо. Пока нормальные запчастили жду из "поднебесной".

Всем привет, отсутсвовал по случаю поступления моего сына в Питере в мед.университет на бютжет, можете поздравлять. извиняюсь за оффтоп.

Лёвчег, советую прислушаться к советам Романа (Umka) и не использовать DTH11, я просто их сдуру купил пять штук, надо же было куда-то использовать, потом все равно заменил все на Si7021.

Лёвчег
Offline
Зарегистрирован: 07.02.2016

lean_74 пишет:

Всем привет, отсутсвовал по случаю поступления моего сына в Питере в мед.университет на бютжет, можете поздравлять. извиняюсь за оффтоп.

Примите мои поздравления за сына! Удачи ему в учёбе!!!

lean_74 пишет:

Лёвчег, советую прислушаться к советам Романа (Umka) и не использовать DTH11, я просто их сдуру купил пять штук, надо же было куда-то использовать, потом все равно заменил все на Si7021.

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

А инкубатор срочно собрать нужно. Родственники обещают к концу недели 5 десятков перепилинных яиц подогнать за так.

lean_74
Offline
Зарегистрирован: 22.12.2015

Лёвчег пишет:

Примите мои поздравления за сына! Удачи ему в учёбе!!!

Спасибо!

Лёвчег пишет:

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

А инкубатор срочно собрать нужно. Родственники обещают к концу недели 5 десятков перепилинных яиц подогнать за так.

Практика показывает, в этом деле торопиться не стоит, нужно собрать и "погонять" инкубатор, проверить температуру и влажность, если надо откалибровать, У меня Далласы на 0,7 градуса из одной партии врут. 

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

С возвращением lean_74

 

lean_74
Offline
Зарегистрирован: 22.12.2015

Umka пишет:

С возвращением lean_74

Рома, привет! С телефона не совсем удобно, завтра на форуме пообщаемся.

Лёвчег
Offline
Зарегистрирован: 07.02.2016

[/quote]

Практика показывает, в этом деле торопиться не стоит, нужно собрать и "погонять" инкубатор, проверить температуру и влажность, если надо откалибровать, У меня Далласы на 0,7 градуса из одной партии врут. 

[/quote]

 

Как калибровать? Точных измерителей нет. Остаётся надеяться)

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Лёвчег пишет:

Как калибровать? Точных измерителей нет. Остаётся надеяться)

Ректально :) Вполне точный вариант. Ради науки так сказать...

А вообще 0,3 туда-сюда это вообще не важно. Поверьте. Я уже много десятков тысяч вывел.

bwn
Offline
Зарегистрирован: 25.08.2014

Umka пишет:

Лёвчег пишет:

Как калибровать? Точных измерителей нет. Остаётся надеяться)

Ректально :) Вполне точный вариант. Ради науки так сказать...

Та ладно, запугаешь человека.)))) Левчег, подмышку его, подмышку.

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Ну там же смайлик. 

А я вот очередные 300 яиц достал в выводной шкаф. Наклюнутых много. Электрики в начале месяца активно светом баловались. По 20 часов не было. Дизель выручал. Ну, посмотрим что вылупится. 

Лёвчег
Offline
Зарегистрирован: 07.02.2016

bwn пишет:

Левчег, подмышку его, подмышку.

Гениально!!! Спасибо)