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

AleksandrM
Offline
Зарегистрирован: 20.07.2017

Можно ли посмотреть фото ящика инкубатора? Я понимаю он используеться для проветривания и охлаждения?

Интересует место установки вентилятора.

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

Кому вопрос?

AleksandrM
Offline
Зарегистрирован: 20.07.2017

К спецам в вопросе инкубации

 

Кто знает как правильно сделать

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

AleksandrM пишет:

К спецам в вопросе инкубации

Кто знает как правильно сделать

В блиц норме установлен так

https://incubatorus.ru/wp-content/uploads/2016/04/Blits-norma-1.jpg

 

 

AleksandrM
Offline
Зарегистрирован: 20.07.2017

Подскажите кто знает .Приобрел датчик АМ2320 он после нескольких минут работы перестает отзываться. после включения-отключения питания все повторяеться. Как с этим бороться?

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

1. Выкинуть китайский датчик.

2. Приобрести нормальный SHT30/31/35

3. Profit!

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

Здравствуйте! 

Был бы признателен, если кинете схему. А то чувствую накашмарю!

spotok
Offline
Зарегистрирован: 26.03.2018

Привет. Нельзя-ли присоединить 3-4 штуки  DS18B20, для контроля температуры по отдалённым местам, индикация несколько секунд, например. по нажатию кнопки. Очень хорошо для  контроля разбега температур.

И ёще, продувка (вентиляция), должна включаться, например, на 8 секунд через 10 минут и так круглосуточно, эти времена нужно иметь возможность настраивать в небольших пределах. Например: 5-30 сек. через 5-30 мин.

Orange_Ko
Offline
Зарегистрирован: 28.08.2015

AleksandrM пишет:

Может не правильная библиотека? Пришлось править

 #include <Si7021.h> на #include <SI7021.h>

Если так то где взять правильную?

https://github.com/prajaybasu/SI7021

StDenits
Offline
Зарегистрирован: 05.06.2018

@yul-i-an, @others

Можете кое-что пояснить по коду последней версии алгоритма? 

Зачем у вас

>ed = e;

если

>static float ed = 0;

Тоже самое про i.

Не могу нигде найти нормальной реализации ПИД + Брезенхэм: или всё закручено, что не разберёшь и автор - напыщенный сноб, или где-то вкралась ошибка(-и) и результат работы алгоритма - сомнителен.

Тут - вобще сборная солянка, не знаю; как оно работает.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

ed=e это сохранение ошибки для расчета в следующем цикле
static float ed, i объявляем переменные со значениями по умолчанию.
Про брезенхема - http://arduino.ru/forum/programmirovanie/algoritm-ravnomernogo-raspredel...

StDenits
Offline
Зарегистрирован: 05.06.2018

@yul-i-an

Извиняюсь, возможно протупил. Алгоритм не пробовал, пока.

geniusalexey
Offline
Зарегистрирован: 05.04.2019

@yul-i-an

У меня в инкубаторе используется термокабель в качестве источника тепла, он инерционный, но работает отлично. Пытался установить коэффициент Д для того что бы небыло перерегулирования, но из-за того что система инерционна не работает функция ed = e, так как практически не происходит изменения за секунду, ставил Д 0,1, 1, 10, 100, график нагрева не меняется, идет перерегулирование. Если следить за измением 5 секунд, например высчитывать среднеарифметическое за послендние 5 показаний то должно сработать. Есть вариант вызывать функцию пид реже чем раз в 1,2сек, но нехочется терять быстродействие системы

Здесь Д=0 в коде, но видно что изменений практически нет за 1 цикл. 

Изменил вызов функции на 3 сек, потребовалось установить коэфф. Д = 200 чтобы убрать перерегулирование. 

Везде Р=15, I=0, слева направо пид 1сек, далее ПИД раз в 3 сек,  Д=1, Д=10, Д=30, Д=100, Д=200

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

geniusalexey пишет:

@yul-i-an

У меня в инкубаторе используется термокабель в качестве источника тепла, он инерционный, но работает отлично. Пытался установить коэффициент Д для того что бы небыло перерегулирования, но из-за того что система инерционна не работает функция ed = e, так как практически не происходит изменения за секунду, ставил Д 0,1, 1, 10, 100, график нагрева не меняется, идет перерегулирование. Если следить за измением 5 секунд, например высчитывать среднеарифметическое за послендние 5 показаний то должно сработать. Есть вариант вызывать функцию пид реже чем раз в 1,2сек, но нехочется терять быстродействие системы

В этом посте примерный подход к настройе регулятора.

Д - это как ускоритель и замедлитель при резких внешних возмущениях

stranik9
Offline
Зарегистрирован: 19.08.2019

Доброго всем времени! что то тема заглохла,

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

спросите зачем, да просто он у меня валяется без дела типа  Нокиа 5110

кто чем сможет, помогите.

с уважением Валерий

Украина, Николаев

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Просто в коде заменяете команды вывода на экран и соответственно объявить библиотеку для экрана на который осуществляется вывод.

Посмотрите примеры вывода на оба дисплея и проведите анологии между командами.

stranik9
Offline
Зарегистрирован: 19.08.2019

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

с ув. Валерий

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

Для ламп там все по умолчанию настроено, а про лак- это Вы серьезно?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

stranik9 пишет:

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

Лучше матом покрой, и то лучше работать будет, чем лакированный. 

stranik9
Offline
Зарегистрирован: 19.08.2019

матом то мы завсегда могем, я же имел ввиду не всю платку, а места пайки

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Где тут хоть слово про места пайки? 

stranik9 пишет:

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

с ув. Валерий

stranik9
Offline
Зарегистрирован: 19.08.2019

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

с ув.

conder
Offline
Зарегистрирован: 20.01.2014

День добрый, мне так и не удалось оживить полностью , скеч "lean_74" народный инкубатор" этот франкенштейн не заработал. Меню все включается, открывается и правится, температура и влажность показывает, pin6 heater нагреватель не включается, pin 13 fan постоянно под тянут на +5 вольт.

В чем ошибка я не могу найти , так как только пытаюсь освоить программирование .

001#include <avr/wdt.h>
002#include <LiquidCrystal_I2C.h>
003#include <EEPROM.h>
004#include "DHT.h"//мой датчик влажности
005//include <Si7021.h>
006#include <OneWire.h>
007#include <Wire.h>
008OneWire ds(7);
009#define START_CONVERT 0
010#define READ_TEMP 1
011 
012 
013 
014#define DHTPIN 11     // what digital pin we're connected to
015#define DHTTYPE DHT11   // DHT 11, DHT 22
016DHT dht(DHTPIN, DHTTYPE);
017//SI7021 si7021; //раскоментировать, если используем датчик si7021.
018 
019LiquidCrystal_I2C lcd(0x3F, 16, 2);  // инициализация библиотеки дисплея
020 
021//номера выводов кнопок
022//#define EXT_HEATING                  // ИСПОЛЬЗУЕМ ДОП.НАГРЕВАТЕЛЬ ВМЕСТО УВЛАЖНИТЕЛЯ. Если нужен увлажнитель, просто закомментируйте эту строку.
023#define heater_pin 6                  // нагреватель
024#define humidifer_pin 12               // увлажнитель
025#define fan_pin 13                     // вентилятор
026#define alarm_pin 10                   // пин аварии
027#define beeper_pin 14                   //пищалка по аварии
028 
029#define turn_pin 8                     // управление поворотом вперед
030//#define pin9 9                    // проверка
031//#define extend_heater_pin 8         // дополнительный нагреватель
032#define button_minus_pin 3            //пин кнопки "минус"
033#define button_plus_pin 4             //пин кнопки "плюс"
034#define button_enter_pin 5           //пин кнопки "enter"
035#define DS18B20_Pin 7                 //пин термометра
036//Пин 2 Вход обработки прерывания для детектора нуля и управления семистором
037#define voltmeter_pin 15               //вход А1 через делитель (22к/10к) подключен к питанию модуля. Измеряет до 16В.
038 
039 
040boolean button_minus;                // статус нажатия кнопок
041boolean button_plus;
042boolean button_enter;
043 
044unsigned long currentTime;            // задаем переменные для тайминга поворота
045unsigned long loopTime;
046unsigned long serialTime; //this will help us know when to talk with processing
047 
048boolean hotFlag1 = 0;              // флаг включения обогревателя основного   1-ошибка, включать нельзя
049boolean fanFlag = 0;        // флаг включения вентилятора проветривания 1-включено проветривание
050unsigned long trhMillis = 0;
051 
052boolean flag = 0;
053int clockTime = 0; // флаг того что выводим температуру или влажность
054unsigned long lastMillis = millis();
055int TimeTemp = 4;  //время следующего измерения температуры в секундах
056int TimeTurn = 20;  //время поворота в десятых долях секунды
057 
058const unsigned long TRHSTEP   = 300UL;  // Период опроса датчиков
059 
060//int counter=0;//для проверки вачдога
061 
062volatile uint8_t minut=0;
063//volatile uint8_t chas=0;
064int chas=0;
065volatile uint8_t sec=0;
066int den=0;
067int oldden=0;
068int oldchas=0;
069 
070int temp=0; // температура Далласа
071float temp1=0; // температура Далласа с десятыми
072float temp2=0; // температура DHT, si7021
073float hum=0;
074 
075int del = 80;                     // переменная ожидания между выборами меню
076unsigned int interval = 200;      // интервал сколько будет длиться цикл while, после чего перейдёт к следующему меню.(кол-во итераций)
077 
078boolean out=0;//управление симистором yul-i-an
079int reg,er,zad;//    yul-i-an
080double I,Kp=3,Ki=0.45,Kd=0.6,pre_err,err; //    yul-i-an
081 
082unsigned long alarmDelay;
083 
084float needTemp = 37.6;                  // нужная для текущего дня температура инкубации (по умолчанию)
085float needHum = 60.5;                   // ---- влажность
086int ventTime = 2;                       // длительность проветривания
087boolean needTurn = false;               // нужен ли поворот яиц?
088int bird=0;
089 
090// make some custom characters:
091byte znak_g[8] = {//г
092  0b11111,
093  0b10001,
094  0b10000,
095  0b10000,
096  0b10000,
097  0b10000,
098  0b10000,
099  0b00000
100};
101byte znak_b[8] = {//Б
102  0b11111,
103  0b10001,
104  0b10000,
105  0b11110,
106  0b10001,
107  0b10001,
108  0b11110,
109  0b00000
110};
111 
112byte znak_p[8] = {
113  0b11111,
114  0b10001,
115  0b10001,
116  0b10001,
117  0b10001,
118  0b10001,
119  0b10001,
120  0b00000
121};
122byte znak_i[8] = {
123  0b10001,
124  0b10001,
125  0b10011,
126  0b10101,
127  0b11001,
128  0b10001,
129  0b10001,
130  0b00000
131};
132 
133byte znak_l[8] = {
134  0b00111,
135  0b01001,
136  0b10001,
137  0b10001,
138  0b10001,
139  0b10001,
140  0b10001,
141  0b00000
142};
143 
144byte light_znak[8] = {
145  0b10000,
146  0b10000,
147  0b10000,
148  0b11110,
149  0b10001,
150  0b10001,
151  0b01110,
152  0b00000
153};
154 
155byte znak_u[8] = {
156  0b10001,
157  0b10001,
158  0b10001,
159  0b01111,
160  0b00001,
161  0b10001,
162  0b01110,
163  0b00000
164};
165 
166 
167byte znak_ia[8] = {
168  0b01111,
169  0b10001,
170  0b10001,
171  0b01111,
172  0b00101,
173  0b01001,
174  0b10001,
175  0b00000
176};
177byte znak_d[8] = {
178  0b01110,
179  0b01010,
180  0b01010,
181  0b01010,
182  0b01010,
183  0b11111,
184  0b10001,
185  0b00000
186};
187byte znak_ch[8] = {
188  0b10001,
189  0b10001,
190  0b10001,
191  0b01111,
192  0b00001,
193  0b00001,
194  0b00001,
195  0b00000
196};
197byte znak_c[8] = {
198  0b10010,
199  0b10010,
200  0b10010,
201  0b10010,
202  0b10010,
203  0b10010,
204  0b11111,
205  0b00001
206};
207 
208//расчет мощности по ПИД закону регулирования
209//_------------------------------------------------------------
210#define kP 6//коэффициент пропорциональности 6
211#define p_min 0.0//минимум П составляющей - не < 0
212#define p_max 100.0//максимум П составляющей - не > 100
213#define kI 0.100//коэффициент интегрирования 0.025
214#define i_min 0.0//минимум И составляющей
215#define i_max 30.0//максимум И составляющей
216#define kd 0//коэффициент диференциирования
217#define d_ctl 7.0//зона пропорциональности ust-d_ctl
218#define out_min 0//минимальный выходной %
219#define out_max 100//максимальный выходной %
220//возвращает необходимую мощность
221uint8_t PIctl(float temp, float ust) {
222 
223  uint8_t out = 0; //uint8_t
224  static float i = 0;
225  static float ed=0;///
226  float e, p;
227  float d;///
228  e = (ust - temp); //ошибка регулирования
229  p=(temp<ust-d_ctl)?p_max:(temp>ust)?p_min:(kP*e);//П составляющая
230  i=(i<i_min)?i_min:(i>i_max)?i_max:i+(kI*e);//И составляющая
231  d=kd*(e-ed);//Д составляющая
232  ed=e;///
233  out=(p+i+d<out_min)?out_min:(p+i+d>out_max)?out_max:p+i+d;
234  //вывод для настройки
235     Serial.print(" e  ");
236      Serial.print(e);
237      Serial.print("  p ");
238      Serial.print(p);
239      Serial.print("  i ");
240      Serial.print(i);
241      Serial.print("  out ");
242      Serial.println(out);
243  return out;
244}
245//---------------------------------------------------------------
246 
247 
248 
249void readSet(){
250 den=EEPROM_int_read(100);
251 chas=EEPROM_int_read(102);
252  int bird;                  // выбор птицы
253  int r_array[6][4][5] = {
254  {{2, 382, 600, 0, 1}, {12, 376, 600, 3, 1}, {15, 374, 480, 10, 1}, {18, 370, 855, 10, 0}},
255  {{2, 378, 550, 0, 1}, {7, 378, 500, 3, 1}, {14, 378, 500, 10, 1}, {16, 375, 700, 0, 0}},
256  {{7, 382, 700, 0, 1}, {14, 378, 600, 0, 1}, {25, 378, 600, 10, 1}, {28, 375, 855, 0, 0}},
257  {{2, 380, 600, 0, 1}, {7, 378, 550, 0, 1}, {29, 375, 450, 10, 1}, {30, 370, 750, 0, 0}},
258  {{7, 378, 700, 0, 1}, {14, 378, 600, 0, 1}, {27, 378, 600, 15, 1}, {30, 375, 855, 0, 0}},
259  {{8, 377, 650, 0, 1}, {14, 377, 500, 0, 1}, {25, 375, 650, 10, 1}, {28, 375, 655, 10, 0}},
260  };
261//Serial.println("readset=");
262 
263bird=  EEPROM_int_read(110);
264  for (int d=4; d>=0; d--){
265  if(den <= r_array[bird][d][0]){
266  needTemp = float(r_array[bird][d][1])/10;//
267  needHum = float(r_array[bird][d][2])/10; //
268  ventTime = r_array[bird][d][3];
269  needTurn = r_array[bird][d][4];
270  }
271  }
272 
273  if (den>36 || den<0){
274    den=0; //
275  }
276  if (chas>24){
277    chas=0; //
278  }
279  if (minut>60){
280    minut=0; //
281  }
282  
283}
284  
285void setup(){
286   wdt_disable(); // запретили как можно скорее собаку, что-бы не уйти в бесконечный ребут
287   Serial.begin(9600);
288//   readSet();
289    lcd.begin();
290    lcd.backlight();     // Включаем подсветку дисплея
291    lcd.clear();
292     
293  // create a new character
294//  lcd.createChar(5, znak_g);//г
295  lcd.createChar(5, znak_b);//Б
296  lcd.createChar(1, znak_i);//И
297  lcd.createChar(2, znak_p);//П
298  lcd.createChar(3, znak_l);//Л 
299  lcd.createChar(4, light_znak);  // мягкий хнак
300  lcd.createChar(7, znak_d);  //Д
301  lcd.createChar(8, znak_c); //Ц
302  lcd.createChar(6, znak_u);//У
303    
304  lcd.setCursor(0, 0);
305 
306  lcd.print("   HAPO");
307  lcd.write(7);
308  lcd.print("H");
309  lcd.write(4);
310  lcd.print("|");
311  lcd.write(1);
312  lcd.setCursor(0, 1);
313  lcd.print("   ");
314  lcd.write(1);
315  lcd.print("HK");
316  lcd.write(6);
317  lcd.write(5);
318  lcd.print("ATOP");
319 
320 
321  
322  Wire.begin();        // старт I2C
323  
324   dht.begin();
325  //si7021.begin(); // Runs : Wire.begin() + reset() // старт датчика влажности
326  delay(3000);// подождем пока датчик запуститься, и завтавка погорит
327//  si7021.setHumidityRes(12); // Humidity = 12-bit / Temperature = 14-bit //максимальное разрешение
328    
329 
330lcd.createChar(5, znak_g);//г
331  readSet();  // читаем настройки из еепром
332  
333 
334 
335// настройкa часов
336TCCR1A=(1<<WGM11); //режим14 FAST PWM
337TCCR1B=(1<<CS12)|(1<<WGM13)|(1<<WGM12); //делить частоту CPU на 256
338ICR1=62499;  // (16000000MHz /div256) -1 = 1 раз в секунду
339TIMSK1=(1<<TOIE1); //разрешить прерывание
340 
341  tempProcess(START_CONVERT);//конвентируем dallas
342 
343  attachInterrupt(0, zero_crosss_int, RISING);//внешнее прерывание на D2
344  
345  //pinMode(extend_heater_pin, OUTPUT);      //пин дополнительного нагревателя. Переводим в 1 чтобы не включать реле.
346  //digitalWrite(extend_heater_pin, HIGH);
347  pinMode(heater_pin, OUTPUT);
348  pinMode(turn_pin, OUTPUT);      // устанавливаем выводы
349//  pinMode(pin9, INPUT);      // устанавливаем выводы
350  digitalWrite(turn_pin, HIGH);
351  //digitalWrite(turn_pin2, HIGH);
352  pinMode(humidifer_pin, OUTPUT);
353  pinMode(fan_pin, OUTPUT);
354  digitalWrite(fan_pin, HIGH);
355  pinMode(alarm_pin, OUTPUT);
356  digitalWrite(alarm_pin, HIGH);
357  pinMode(button_minus_pin, INPUT_PULLUP); //подтягиваем входы кнопок к плюсу встроенными резисторами
358  pinMode(button_plus_pin, INPUT_PULLUP);
359  pinMode(button_enter_pin, INPUT_PULLUP);
360  alarmDelay = millis();
361 
362  wdt_enable(WDTO_8S); // активировали таймер, каждые 8 секунд его нужно сбрасывать
363 
364}
365 
366ISR (TIMER1_OVF_vect) {
367sec++ ; //инкремент переменной каждую секунду
368if (sec>59){sec=0; minut++;}
369if (minut>59){minut=0; chas++;} // при записи каждый час хватит памяти на 11 лет
370if (chas>23){chas=0;den++;}//readSet(); но нам главное знать день инкубации
371if (den>36){den=0; } // частный случай для нас не принципиальный, у нас день инкубации
372}
373 
374void loop(){
375 wdt_reset(); // говорим собаке что "В Багдаде все спокойно", начинается очередной отсчет 8-х секунд.
376// Serial.print("pin9=");
377// Serial.println(digitalRead(pin9));
378// Serial.println("   ");
379 
380 if (oldchas!=chas){ // раз в час сохраняем время
381 EEPROM_int_write(102, chas);
382 oldchas=chas;
383 }
384 if (oldden!=den){ // раз в день читаем настройки заново
385 EEPROM_int_write(100, den);
386 readSet();
387 oldden=den;
388 }
389   button_read();
390  if (!button_enter) {
391    delay(del); //
392    lcd.clear();
393    menu();
394  }
395  if (!button_minus) {
396    delay(del);
397    lcd.clear();
398    alarmDelay = millis();    // задержка аварии по нажатии кнопки Минус
399  }
400  if (!button_plus) {
401    delay(del);
402    lcd.clear();
403    digitalWrite(turn_pin, !digitalRead(turn_pin));       // включаем/выключаем реле поворота по кнопке Плюс
404  }
405 
406  lcd.setCursor(0, 0);
407  if (millis() > serialTime)
408  {
409    PID();//расчитываем ПИД yul-i-an
410    serialTime += 1200;
411 // err=needTemp-temp1
412 Serial.print("needTemp=");
413 Serial.println(needTemp);
414 Serial.print("temp1=");
415 Serial.println(temp1);
416 Serial.print("err=");
417 Serial.println(err);
418 Serial.print("zad=");
419 Serial.println(zad);
420// Serial.print("serialTime=");
421// Serial.println(serialTime);
422// Serial.print("hotFlag1=");
423// Serial.println(hotFlag1);
424  }
425 
426    if (flag == 0)
427  {
428     lastMillis = millis();
429    clockTime=!clockTime;
430    flag = 1;
431  }
432 
433  if (millis() - lastMillis >=TimeTemp*1000) {
434    flag = 0;
435}
436  if (clockTime == 1){
437  lcd.setCursor(0, 0); // выводим часы и день инкубации
438  if (chas < 10) lcd.print(" ");
439  lcd.print(chas, DEC);
440  lcd.print(":");
441  if (minut < 10)lcd.print(0);
442  lcd.print(minut, DEC);
443  lcd.print(" ");
444   lcd.write(7);
445    lcd.print("EH");
446   lcd.write(4);  
447  lcd.print(" ");
448  lcd.print(den, DEC);
449  lcd.print("     ");
450    lcd.setCursor(0, 1);
451//    lcd.print("      ");
452   lcd.print(temp2, 1);              // печать температуры на дисплей temp%10
453   lcd.print((char)223);
454   lcd.print(" ");
455    printbird(bird);
456  }
457  else {
458    lcd.setCursor(0, 0);                 // устанавливаем курсор в 0-ом столбце, 0 строка (начинается с 0)
459    lcd.print("T1=");
460    lcd.print(temp/10, 1);              // печать температуры на дисплей temp
461    lcd.print(".");
462    lcd.print(temp%10, 1);              // печать температуры на дисплей temp%10
463     
464    lcd.print((char)223);
465    lcd.print(" (");
466    lcd.print(needTemp, 1);
467    lcd.print((char)223);
468    lcd.print(")   ");
469    lcd.setCursor(0, 1);                
470    lcd.print("H =");
471    lcd.print(hum, 1);           // печать влажности на дисплей
472    lcd.print("%");
473    lcd.print(" (");
474    lcd.print(needHum, 1);
475    lcd.print("%) ");
476  //  lcd.setCursor(15, 3);
477  //  lcd.print("   ");
478 
479    }
480 
481  getSensors(); // получаем данные с датчиков
482  humidifer(needHum);
483  turn(needTurn);
484  fan(ventTime);
485  alarm(needTemp);
486}
487 
488 
489//регулятор ПИД
490 void PID(){
491   err=needTemp-temp1;
492    if (hotFlag1 ==0) I=I+err;//если проветривание или авария не включаем
493  
494//   zad=Kp*err+(Ki*I*0.25)+(Kd*(err-pre_err)/0.25);
495   zad = PIctl(temp1, needTemp); //расчет мощности
496   pre_err=err;
497   if (temp1>=39.5) //это при перегреве
498   {
499   zad=0;
500    I=0;
501   }
502  if (zad<0){ zad=0;I=0;}
503  if (zad>100){zad=100;}
504//   Serial.print("reg=");
505//   Serial.println(reg);
506 
507 }
508 //Внешнее прерывание детектора нуля
509 void zero_crosss_int()
510{
511      ResOut();//Вызов функции управления симистором по алгоритму Брезенхема
512}
513 
514//управление симистором
515void ResOut(){
516  delayMicroseconds(1230);//для попадания в ноль
517  reg = zad + er;
518  if (reg < 50){
519    out=0;
520    er = reg ;
521  
522  }
523  else {
524    out=1;
525 
526    er=reg-100;
527    }
528 if (hotFlag1 ==0){
529 digitalWrite(heater_pin,out); //если проветривание или авария не включаем
530 }
531 else {
532 digitalWrite(heater_pin,LOW);
533    
534  }
535 }
536  
537 //Авто настройка коэффициентов ПИД
538void AutoPIDSet(){
539  //тут будет автонастройка
540}
541 
542 
543void button_read() {//функция проверки нажатия кнопки
544  button_minus = digitalRead(button_minus_pin); //запоминаем значение кнопки
545  button_plus = digitalRead(button_plus_pin); //запоминаем значение кнопки
546  button_enter = digitalRead(button_enter_pin); //запоминаем значение кнопки
547  if (!button_minus || !button_plus || !button_enter) beeper(50);
548  wdt_reset();
549}
550 
551 
552//меню
553void menu() {
554  startInk();
555  time_setup_chas();
556  time_setup_minut();
557  bird_setup(); 
558  turn_setup();
559  alarm_setup();
560  vent_setup();
561}
562 
563// записываем в память день начала инкубации
564void startInk() {
565String str_menu= "START INK";
566int perem_menu=den;
567int adress_errom=100;
568int perem_max=36;
569String str_perem="Day";
570den= setup_menu(str_menu,perem_menu,adress_errom,perem_max,str_perem);
571}
572//устанавливаем часы
573void time_setup_chas() {
574String str_menu= "SETUP HOUR";
575int perem_menu=chas;
576int adress_errom=102;
577int perem_max=23;
578String str_perem="Hour";
579chas= setup_menu(str_menu,perem_menu,adress_errom,perem_max,str_perem);
580}
581//устанавливаем минуты
582void time_setup_minut() {
583String str_menu= "SETUP minute";
584int perem_menu=minut;
585int adress_errom=0;
586int perem_max=59;
587String str_perem="minute";
588minut= setup_menu(str_menu,perem_menu,adress_errom,perem_max,str_perem);
589}
590 
591//выбираем птицу /////////////////////////////////////////////////////////
592 
593void bird_setup() {
594String str_menu= "SETUP bird";
595int perem_menu=bird;
596int adress_errom=110;
597int perem_max=5;
598String str_perem="bird";
599bird= setup_menu(str_menu,perem_menu,adress_errom,perem_max,str_perem);
600}
601 
602 
603//устанавливаем поворот
604void turn_setup() {
605int turnPeriod=EEPROM_int_read(104);                //период поворота лотков в часах
606  
607String str_menu= "TURN SETUP";
608int perem_menu=turnPeriod;
609int adress_errom=104;
610int perem_max=12;
611String str_perem="TURN Hour";
612turnPeriod= setup_menu(str_menu,perem_menu,adress_errom,perem_max,str_perem);
613}
614 
615 
616//устанавливаем сигнализацию
617void alarm_setup() {
618 int  alarmTemp=EEPROM_int_read(106);
619String str_menu= "ALARM SETUP";
620int perem_menu=alarmTemp;
621int adress_errom=106;
622int perem_max=10;
623String str_perem="T.Alarm +- C";
624alarmTemp= setup_menu(str_menu,perem_menu,adress_errom,perem_max,str_perem);
625}
626 
627//устанавливаем вентиляцию
628void vent_setup() {
629int fanTemp=EEPROM_int_read(108);
630String str_menu= "A.FAN SETUP";
631int perem_menu=fanTemp;
632int adress_errom=108;
633int perem_max=40;
634String str_perem="T.Fan C";
635fanTemp= setup_menu(str_menu,perem_menu,adress_errom,perem_max,str_perem);
636}
637 
638int setup_menu(String str_menu,int perem_menu,int adress_errom,int perem_max,String str_perem) {
639  lcd.clear();
640  delay(del);
641  button_read();
642  lcd.setCursor(0, 0);
643  lcd.print(str_menu);
644  lcd.print("         ");
645  delay(1000);
646  int x = 0;
647  while (1) {
648    x++;
649    if (x > interval) break;
650    button_read();
651     if (adress_errom!=0) perem_menu=EEPROM_int_read(adress_errom);
652    if (!button_enter) {
653      delay(del);
654      lcd.clear(); //очищаем экран
655      break;
656    }
657    if (!button_minus) {
658      perem_menu--;
659  if (perem_menu<0) perem_menu=perem_max;
660      if (adress_errom!=0) EEPROM_int_write(adress_errom, perem_menu);
661      lcd.clear();
662      readSet();
663    }
664 
665    if (!button_plus) {
666      perem_menu++;
667      if (perem_menu>perem_max) perem_menu=0;
668      if (adress_errom!=0) EEPROM_int_write(adress_errom, perem_menu);
669      lcd.clear();
670      readSet();
671    }
672    if (adress_errom!=0) perem_menu= EEPROM_int_read(adress_errom);
673     
674    lcd.setCursor(0, 0);
675    if (str_perem=="bird"){
676    lcd.print("BIRD ");
677    printbird(perem_menu);
678  
679    lcd.print("           ");
680     
681      }else{
682    lcd.print(str_perem);
683    lcd.print("= ");
684    lcd.print(perem_menu);
685    lcd.print("           ");
686      }
687    lcd.setCursor(0, 1);
688    lcd.print("START NEXT +1");
689    delay(del);
690  }
691 return perem_menu;
692}
693 
694void printbird(int nbird){
695    switch (nbird) {
696      case 0:
697        lcd.print("K");  // курица
698        lcd.write(6);
699        lcd.print("P");  // курица
700        lcd.write(1);
701        lcd.write(8);
702        lcd.print("A    ");  // курица
703        break;
704      case 1:
705        lcd.write(2);
706        lcd.print("EPE");  // перепелка
707        lcd.write(2);
708        lcd.print("E");  // перепелка
709        lcd.write(3);
710        lcd.print("KA ");  // перепелка
711        break;
712      case 2:
713        lcd.write(6);
714        lcd.print("TKA      ");   // утка
715        break;
716      case 3:
717        lcd.write(1);
718        lcd.print("H");  // индоутка
719        lcd.write(7);
720        lcd.print("O");  // индоутка
721        lcd.write(6);
722        lcd.print("TKA  ");   // утка
723        break;
724      case 4:
725         lcd.write(5);
726         lcd.write(6);
727         lcd.print("C");  // гусь
728         lcd.write(4);
729         lcd.print("      ");  // гусь
730        break;
731      case 5:
732        lcd.write(1);
733        lcd.print("H"); // индюк
734        lcd.write(7);
735        lcd.print("|OK    "); // индюк
736         
737        break;
738    }
739 
740}
741 
742 
743void getSensors() {
744  unsigned long curMillis = millis();          // Получаем текущее время работы
745  if (curMillis - trhMillis >= TRHSTEP) {    // время для нового измерения?
746  temp= tempProcess(READ_TEMP);//читаем темпратуру с далласа
747  temp1=float(temp)/10;
748  tempProcess(START_CONVERT); // сразу запрос на конвертацию
749  }
750 
751  // Demonstrate non-blocking calls
752  if (curMillis - trhMillis >= TRHSTEP * 4) {    // время для нового измерения?
753     
754    hum = dht.readHumidity(); //получение темпрературы и влажности с DHT11
755    temp2 = dht.readTemperature();
756//   temp2=si7021.readTemp(); //получение темпрературы и влажности с si7021
757//   hum = si7021.readHumidity();
758     
759    trhMillis = curMillis;
760  }
761 
762}
763 
764//управляем влажностью
765void humidifer(float set_humidity) {
766  //float humidity;
767  unsigned long humMillis = 0;
768  unsigned long curMillis = millis();
769   if (set_humidity > hum) digitalWrite(humidifer_pin, HIGH); //сравниваем измеренную влажность с заданной
770  else if (set_humidity -5 < hum) digitalWrite(humidifer_pin, LOW); //если влажность низкая, включаем увлажнитель
771 
772}
773 
774//управляем поворотом
775void turn(boolean needTurn) {
776  int turnPeriod=EEPROM_int_read(104);                //период поворота лотков в часах
777  int turnCommand;
778  if (turnPeriod == 0) return;           //если нулевой период поворота, то не поворачиваем яйца.
779    turnCommand = turnPeriod;
780  currentTime = millis();
781  if (needTurn == true) {
782    if (currentTime >= (loopTime + turnCommand * 3600000)) {  // 3600000 сравниваем текущий таймер с переменной loopTime + период поворота в часах.
783 //     if (turnFlagUp){
784       digitalWrite(turn_pin,LOW);
785       delay(TimeTurn*100); //время поворота
786       digitalWrite(turn_pin,HIGH);
787      loopTime = currentTime;    // в loopTime записываем новое значение
788    }
789  }
790}
791 
792//управляем авариями
793void alarm(float needTemp) {
794  int alarmTemp=EEPROM_int_read(106);
795    if (temp1> (needTemp + alarmTemp) || temp1 < (needTemp - alarmTemp)) {
796      beeper(10);
797      digitalWrite(alarm_pin, LOW); //если измеренная температура выше заданной на величину аварии
798    }
799    else digitalWrite(alarm_pin, HIGH); //то включаем аварийный сигнал.
800 
801}
802 
803void beeper(int duration) {
804  tone(beeper_pin, 2000, duration);
805}
806 
807 
808//управляем вентиляторами
809void fan(int fanTime) {
810   int fanTemp=EEPROM_int_read(108);
811  if ((chas == 7 && minut < fanTime) || (chas == 19 && minut < fanTime) || (temp1 > 39.5)) { //fanTemp=395
812   // digitalWrite( fan_pin, LOW);
813    fanFlag=1;
814  
815    //если наступило время проветривания или измеренная температура выше заданной на величину авариито включаем продувку.
816//    digitalWrite(extend_heater_pin, HIGH);  // при этом отключаем обогрев
817//    digitalWrite(heater_pin, LOW);
818    hotFlag1 = 1;
819 //   hotFlag2 = 1;
820  }
821  else {
822    fanFlag=0;
823    hotFlag1 = 0;
824  }
825  
826  //digitalWrite(fan_pin, HIGH); //иначе выключаем.
827     
828//    hotFlag1 = 1;
829//    hotFlag2 = 1;
830//
831 
832}
833 
834// вольтметр
835//void voltmeter() {
836//  float outputValue = 0;
837//  outputValue = float(analogRead(voltmeter_pin)) / 63, 9;
838//  //if(outputValue < 4.5) beeper(50);
839//  //Serial.print("Voltage = " );
840//  //Serial.println(outputValue);
841//  lcd.setCursor(14, 3);
842//  lcd.print("V");
843//  lcd.print(outputValue, 1);
844//}
845//
846//// Печать мощности нагрвателя
847//void outpuPower() {
848//  lcd.setCursor(14, 3);
849//  lcd.print("W");
850//  lcd.print(Output, 0);
851//  lcd.print(" ");
852//}
853 
854 
855//==============================
856int tempProcess(boolean ch){
857  int t=0;
858  if(!ch){
859    ds.reset();
860    ds.write(0xCC);
861    ds.write(0x44);
862  }
863  else{
864    ds.reset();
865    ds.write(0xCC);
866    ds.write(0xBE);
867    t= ds.read();
868    t = t | (ds.read()<<8);
869    //return  t>>4;//целые *C, десятые отброшены
870    //return  (t+8)>>4;//целые *С с округлением
871    return  (t*10)>>4;//целое в десятых *C (214=>21,4*C)
872  }
873}
874// чтение
875int EEPROM_int_read(int addr) {   
876  byte raw[2];
877  for(byte i = 0; i < 2; i++) raw[i] = EEPROM.read(addr+i);
878  int &num = (int&)raw;
879  return num;
880}
881 
882// запись
883void EEPROM_int_write(int addr, int num) {
884  byte raw[2];
885  (int&)raw = num;
886  for(byte i = 0; i < 2; i++) EEPROM.write(addr+i, raw[i]);
887}
888//пример int
889//// запись
890//EEPROM_int_write(12, 1000); // адрес 12 (+2 байта)
891//EEPROM_int_write(14, 2000); // адрес 14 (+2 байта)
892//EEPROM_int_write(16, 3000); // адрес 16 (+2 байта)
893//// чтение
894//int d = EEPROM_int_read(12);
895//int e = EEPROM_int_read(14);
896//int f = EEPROM_int_read(16);

 

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

С вентилятором все просто у вас 

В функции setup(), в строке 354 вы включаете вентилятор, digitalWrite(fan_pin, HIGH);

В функции void fan(int fanTime), в строке 812 выключение вентилятора, 13 нога,  закомментировано // digitalWrite( fan_pin, LOW);

То есть так как вы пишете так и должно быть, в вашем случае вентилятор включен постоянно.

Так же в функции void fan(int fanTime) закомментирована строка 817 где идет управление heater_pin, правда он там отключается но все же, если это комментировали вы то вопрос - Зачем?

Про heater_pin

включается нагреватель в одном единственном месте строка 529  digitalWrite(heater_pin,out); и то если переменная out будет равна единице, а ее состояние зависит от переменных  zad и er и тут вообще написано очень загадочно, почему в zero_crosss_int() вызывается ResOut(), почему просто не поместить код ResOut() в zero_crosss_int() ? Опять же это прерывание и переменные int reg,er,zad; должны быть описаны как volatile int reg,er,zad; но этого не сделано. В общем надо автора спрашивать, и потом если инкубатор небольшой яиц на 100 то PID вам не нужен, становится намного проще программа.

01//Внешнее прерывание детектора нуля
02 void zero_crosss_int()
03{
04      ResOut();//Вызов функции управления симистором по алгоритму Брезенхема
05}
06 
07//управление симистором
08void ResOut(){
09  delayMicroseconds(1230);//для попадания в ноль
10  reg = zad + er;
11  if (reg < 50){
12    out=0;
13    er = reg ;
14  
15  }
16  else {
17    out=1;
18 
19    er=reg-100;
20    }
21 if (hotFlag1 ==0){
22 digitalWrite(heater_pin,out); //если проветривание или авария не включаем
23 }
24 else {
25 digitalWrite(heater_pin,LOW);
26    
27  }
28 }

 

 

conder
Offline
Зарегистрирован: 20.01.2014

Дело в том , что я очень плохо разбираюсь ,пытаюсь освоить, но видимо в 59 лет уже поздно.  Эти строки я не трогал. Сейчас попробую отредактировать.

conder
Offline
Зарегистрирован: 20.01.2014

  Andrey12 С вентилятором , что то прояснилось, но есть нюансы. Он включаясь прерывает работу нагревателя во время охлаждения и проветривания. Выставляет флаг 1. Но сам почему то на аварию и перегрев не реагирует. Чего то там явно не хватает , он не видит задание по температуре. Да ладно бы с вентилятором, нагреватель вообще не работает, а с нагревателем я совсем не понимаю, там сделано включение симистора при переходе через ноль. Совершенно лишнее так как оптопарой это реализовать легче. И не нужно алгоритм "минхаузена". За подсказки спасибо. Буду копать дальше.

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

А саму схему собрали с использованием DHT11, он не очень для инкубатора подходит, или если быть точнее очень не подходит.
Если понять что и как у вас подключено, можно попробовать убрать из программы лишнее. Авось заработает.

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

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

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

conder
Offline
Зарегистрирован: 20.01.2014

Andrey12 это уже третий апгрейд инкубатора, первый блок  управления был на компараторе, температура мерилась термометром. Потом собрал на atmege 8 схема от Дмитрия, температура колебалась 0,5 градуса, и показания были на семи сегментном индикаторе. Потом собрал на ардуине mini терморегулятор с ПИД регулированием, колебания уменьшились до 0,2.  Дисплей  16*2 , но нет контроля влажности, и поворота. Датчик ДНТ-11 временно буду заказывать  SHT 10 или 15. это уже адаптировать по готовый скетч не трудно. Пока Китай отдыхает.

Вот решился все ещё раз переделать, сейчас все спаянно на столе рассыпухой.  Ардуино HAHO прошит новый загрузчик с поддержкой сторожевого таймера, вот и не могу подобрать подходящий скетч. То дисплей 20*4 , то скетч  не проходит компиляцию, то ПИД регулятор "мудренный".

Вот нашел подходящий скетч от Emeljanowich    http://arduino.ru/forum/proekty/inkubator?page=1

001//на второй строке дисплея отображаются: мощность на нагеревателе Pw 1-99%;
002//                                       режим инкубации 0 - ручной; 1 - куры; 2 - перепелки; 3 - утки; 4 - гуси;
003//                                       включен поворот - |; выключен поворот - 0
004//                                       вентиляция работает - *; выключена - -;
005//                                       работает вентилятор влажности - #; выключен - -;
006//                                       текущее значение температуры
007 
008 
009//в меню появились два новых пункта: пункт 7 - включение подсветки дисплея - постоянно горит или выключение - погасает по истечении 4 минут после нажатия клавиши "меню"
010//                                   пункт 8 - выбор датчика температуры - DHT22 или 18B20
011//ШИМ модуляция на порт 3 со значением 8-200
012 
013//работа сценария ошибки: - если по истечении 6 часов после включения температура меньше установленной на 2 градуса срабатывает ошибка
014//                        - при достижении температуры установленного значения включается функция определения ошибки - если в течении 20 минут температура
015//                          превышает или ниже установленных пределов срабатывает ошибка
016//                        - если спустя 2 часа после проветривания температура меньше установленной на 2 градуса включается ошибка
017 
018 
019 
020 
021 
022 
023 
024#include <avr/wdt.h> //сторожевой пёс
025#include <OneWire.h>
026#include <DallasTemperature.h>
027#include "DHT.h"
028#include <EEPROM.h>
029#include <Wire.h>
030#include <LiquidCrystal_I2C.h>  // Set the LCD address to 0x27 for a 16 chars and 2 line display
031LiquidCrystal_I2C lcd(0x27, 16, 2);
032 
033#define DHTPIN 12 // номер пина, к которому подсоединен датчик
034DHT dht(DHTPIN, DHT22);//DHT dht(DHTPIN, DHT11);// Data wire is plugged into port 2 on the Arduino
035#define ONE_WIRE_BUS 11 // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
036OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature.
037DallasTemperature sensors(&oneWire);
038 
039#define turnPin 6 //поворот
040#define ventilator 4 //вентилятор проветривания
041#define ventilatorH 5 //венилятор для поддержания влажности
042#define buttonPlus 15
043#define buttonMenu 16
044#define buttonMinus 17
045 
046#define TimeError 60    //время задержки ошибки 20сек * TimeError = 20 1 минута-3 еденицы
047 
048 
049boolean r_povorota, r_povorot, r_ventilator, r_nasosa, proverka, turn, PowerLigt, dhT;
050long prevmicros;
051byte Power_promeg, ventilar, H, dlit_raboti_nasosa = 5, vrema_raboti_ventilatora;  //0-255 vrema_roboti_ventilatora
052 
053byte gradus[8] = {B01000, B10100, B01000, B00111, B01000, B01000, B00111, B00000,};
054 
055boolean counter, r_ventilatora, step, powerTurn, exitMenu, left, right, turnStartPosition, ventilation, error, ErrorPower;
056byte hi, sec, mi, sTimer, mTimer, hTimer, dTimer = 1, day = 1;
057byte backLight, menu;
058byte avtomatik, timeTurn, setPower, timeTurnExperement, periodTurn, accountTurn, Power;
059byte n, rn, rv, m, i, errorTime, errorL, errorH, errorHour = 6;
060unsigned int t, Temperature, b;          //0-65535
061float e, h, tt, kof, tSetprintDisplay;
062//signed char kof; //-128 - 127
063 
064 
065 
066void setup() {
067   
068  wdt_disable();
069  sensors.begin();
070  dht.begin();
071  lcd.begin(); lcd.clear();
072   
073  lcd.createChar(1, gradus);  //Регистрируем собственные символы с кодами 1 и ...
074 
075  DDRB |= (1 << 5); //моргание светодиода на пине 13 каждую секунду
076  pinMode(ventilatorH, OUTPUT); pinMode(ventilator, OUTPUT); digitalWrite(ventilator, LOW);  pinMode(turnPin, OUTPUT); digitalWrite(turnPin, LOW);
077 
078  pinMode(buttonPlus, INPUT_PULLUP); pinMode(buttonMinus, INPUT_PULLUP); pinMode(buttonMenu, INPUT_PULLUP);
079   
080  hTimer = EEPROM.read(20); dTimer = EEPROM.read(3);
081  powerTurn = EEPROM.read(11);
082  kof = EEPROM.read(5);
083  dlit_raboti_nasosa = EEPROM.read(6); vrema_raboti_ventilatora = EEPROM.read(7);
084  avtomatik = EEPROM.read(8); t = EEPROM.read(9) + 370; H = EEPROM.read(10);
085  setPower = EEPROM.read(13); PowerLigt = EEPROM.read(15); dhT = EEPROM.read(16); //dhT - флаг для выбора датчика температуры dht|18B20
086   
087  if (avtomatik) parametri();   
088  setTimer();
089  lcd.backlight(); //noBacklight();
090  backLight = 240;
091  wdt_enable (WDTO_4S);
092 
093   h = dht.readHumidity();
094    if (dhT) {tt = dht.readTemperature();  Temperature = (10 * tt) + kof;}                                 //температура с DHT22 
095    else {sensors.requestTemperatures(); tt = sensors.getTempCByIndex(0); Temperature = (10 * tt) + kof;}  //температура с 18B20
096    lcd.setCursor(2, 0); lcd.print("inkubator_4"); lcd.setCursor(5, 1); lcd.print("v_0.8"); delay(2000);
097  displayPrint();     
098}
099 
100 
101 
102 
103 
104 
105void setTimer(){
106  cli();
107  TCCR1A = 0b00000000; //none   toggle  clear  set - инверсия установить
108  TCCR1B = (1 << WGM12)|(1 << CS12); // 10b00011001;
109  TIMSK1 = (1 << OCIE1A);
110  OCR1A = 62500; //разрешение ШИМ сигнала (ограничение для счета регистра TCNT1), возможно до 65 535
111  sei();
112}
113 
114ISR (TIMER1_COMPA_vect) //вектор прерывания по СТС таймера/счетчика 2 для работы собственного времени контроллера
115{
116  PORTB = PORTB ^ (1 << 5); sTimer++; if (sTimer > 59) {mTimer++; sTimer = 0; if (mTimer > 59) {hTimer++; mTimer = 0;} if (hTimer > 23) {dTimer++; hTimer = 0;}}
117}
118 
119 
120   
121 
122void loop() {
123 
124if (menu){
125switch (menu){
126   case 1:
127      lcd.setCursor(0, 1); lcd.print("Temp calibration");
128      lcd.setCursor(2, 0); lcd.print(kof/10); lcd.print("\1"); //lcd.print(" daL "); lcd.print(e, 1);
129      if (!digitalRead(buttonPlus)) {backLight = 20; delay(200); kof++; EEPROM.write(5, kof); if (kof > 15) {kof = -15; lcd.clear();} exitMenu = true;}
130      if (!digitalRead(buttonMinus)) {backLight = 20; delay(200); kof--; EEPROM.write(5, kof); if (kof < -15) {kof = 15; lcd.clear();} exitMenu = true;}
131      break;
132 
133   case 2: lcd.setCursor(2, 0); lcd.print("reset time?");
134      if (!digitalRead(buttonMinus) || !digitalRead(buttonPlus)) {backLight = 20; delay(200); hTimer = 0; dTimer = 1; day = 1; mTimer = 0;
135      EEPROM.write(3, day); EEPROM.write(2, hTimer); menu = 0; lcd.clear(); displayPrint();}
136      break;
137 
138   case 3: lcd.setCursor(1, 0); lcd.print("setPowerDefaul");
139      if (!digitalRead(buttonPlus)) {backLight = 20; delay(200); setPower--; EEPROM.write(13, setPower); lcd.clear(); exitMenu = true;}
140      if (!digitalRead(buttonMinus)) {backLight = 20; delay(200); setPower++; EEPROM.write(13, setPower); lcd.clear(); exitMenu = true;}
141      lcd.setCursor(5, 1);  i = map(setPower, 60, 200, 99, 1); if (i < 10) lcd.print(" "); lcd.print(i); lcd.print("%"); 
142      break;   
143 
144   case 4: lcd.setCursor(3, 0); lcd.print("avtom setap");
145      if (!digitalRead(buttonPlus)) {backLight = 20; delay(200); avtomatik++; lcd.clear(); EEPROM.write(8, avtomatik); if (avtomatik > 4) avtomatik = 4; exitMenu = true;}
146      if (!digitalRead(buttonMinus)) {backLight = 20; delay(200); avtomatik--; lcd.clear(); EEPROM.write(8, avtomatik); if (avtomatik > 4) avtomatik = 0; exitMenu = true;} 
147      lcd.setCursor(2, 1);
148      if (!avtomatik) lcd.print("not avtom"); if (avtomatik == 1) lcd.print("kuri"); if (avtomatik == 2) lcd.print("perepelki"); if (avtomatik == 3) lcd.print("ytki"); if (avtomatik == 4) lcd.print("gusi");
149      if (avtomatik) parametri();
150      break;
151       
152    case 5: lcd.setCursor(3, 0); lcd.print("test turn");  
153      if (!digitalRead(buttonPlus)) {PORTD = PORTD ^ (1 << 6); turn = !turn; lcd.setCursor(4, 1); if (turn) lcd.print("left"); else lcd.print("right"); delay(500); exitMenu = true;}
154      if (!digitalRead(buttonMinus)) {PORTD = PORTD ^ (1 << 6); turn = !turn; lcd.setCursor(4, 1); if (turn) lcd.print("left"); else lcd.print("right"); delay(500); exitMenu = true;}
155     break
156 
157    case 6: lcd.setCursor(3, 0); lcd.print("test Vent");
158      if (!digitalRead(buttonPlus)) {PORTD = PORTD ^ (1 << 4); ventilation = !ventilation; lcd.setCursor(5, 1); if (ventilation) lcd.print("on "); else lcd.print("off"); delay(500); exitMenu = true;}
159      if (!digitalRead(buttonMinus)) {PORTD = PORTD ^ (1 << 4); ventilation = !ventilation; lcd.setCursor(5, 1); if (ventilation) lcd.print("on "); else lcd.print("off"); delay(500); exitMenu = true;}
160     break;  
161 
162  //  case 6: lcd.setCursor(3, 0); lcd.print("Set Power"); lcd.setCursor(2, 1); i = map(Power, 60, 200, 99, 1); if (i < 10) lcd.print(" "); lcd.print(i); lcd.print("%");
163  //    if (!digitalRead(buttonPlus)) {delay(200); Power--; if (Power < 60) Power = 60; exitMenu = true;}
164  //    if (!digitalRead(buttonMinus)) {delay(200); Power++; if (Power > 200) Power = 200; exitMenu = true;}
165  //   break;
166 
167    case 7: lcd.setCursor(3, 0); lcd.print("Set Ligt"); lcd.setCursor(5, 1); if (PowerLigt) lcd.print("on "); else lcd.print("off");
168      if (!digitalRead(buttonPlus)) {delay(200); PowerLigt = !PowerLigt; exitMenu = true; EEPROM.write(15, PowerLigt);}
169      if (!digitalRead(buttonMinus)) {delay(200); PowerLigt = !PowerLigt; exitMenu = true; EEPROM.write(15, PowerLigt);}
170    break;
171 
172     case 8: lcd.setCursor(3, 0); lcd.print("DHT "); lcd.setCursor(10, 0); lcd.print(" 18B20");
173             lcd.setCursor(8, 0); if (dhT) lcd.print("<"); else lcd.print(">");
174      if (!digitalRead(buttonPlus)) {delay(300); dhT = !dhT; exitMenu = true; EEPROM.write(16, dhT);}
175      if (!digitalRead(buttonMinus)) {delay(300); dhT = !dhT; exitMenu = true; EEPROM.write(16, dhT);}
176    break;
177 
178    case 9: if (avtomatik) {menu = 0; displayPrint(); backLight = 240;}
179            else {lcd.setCursor(1, 0); lcd.print("Set t = "); lcd.setCursor(10, 0); tSetprintDisplay = 370+t; lcd.print(tSetprintDisplay/10); lcd.print("\1"); 
180                if (!digitalRead(buttonPlus)) {delay(200); t++; if (t > 15) t = 15; EEPROM.write(9, t); exitMenu = true;}
181                if (!digitalRead(buttonMinus)) {delay(200); t--; if (t > 8) t = 0; EEPROM.write(9, t); exitMenu = true;}}
182     break;
183 
184    case 10: lcd.setCursor(1, 0); lcd.print("Set H = ");
185                if (!digitalRead(buttonPlus)) {delay(200); H += 5; if (H > 90) H = 90; EEPROM.write(10, H); exitMenu = true;}
186                if (!digitalRead(buttonMinus)) {delay(200); H -= 5; if (H < 30) H = 30; EEPROM.write(10, H); exitMenu = true;}
187     break;
188 
189    case 11: lcd.setCursor(3, 0); lcd.print("povorot  "); if (powerTurn) lcd.print("on "); else lcd.print("off");
190                if (!digitalRead(buttonPlus)) {delay(200); powerTurn = !powerTurn; EEPROM.write(11, powerTurn); exitMenu = true;}
191                if (!digitalRead(buttonMinus)) {delay(200); powerTurn = !powerTurn; EEPROM.write(11, powerTurn); exitMenu = true;}
192       break;
193 
194    case 15: lcd.setCursor(3, 0); lcd.print("error"); lcd.setCursor(10, 0); lcd.print(Temperature * 0.1, 1); lcd.print("\1");
195                lcd.setCursor(1, 1); lcd.print("off"); lcd.setCursor(12, 1); lcd.print("off");
196                if (!digitalRead(buttonPlus)) {delay(200); noTone(8);}
197                if (!digitalRead(buttonMinus)) {delay(200); noTone(8);}
198       break;
199             
200          
201  }
202}
203 
204 
205 if (mi != mTimer){
206        h = dht.readHumidity();     //влажность с DHT22
207  if (!menu) {lcd.setCursor(3, 0); if (mTimer < 10) lcd.print("0"); lcd.print(mTimer);
208  lcd.setCursor(12, 0); lcd.print("H"); lcd.print(h, 0); lcd.print("%"); }      //влажность
209  mi = mTimer;
210 
211  if ((Temperature > t - 5) && (Temperature < t + 5) && (h < H - 3)) {digitalWrite(ventilatorH, HIGH);  displayPrint();}  //вентилятор для поддержания влажности
212  else {digitalWrite(ventilatorH, LOW); displayPrint();} 
213   
214  if (ventilation) {displayPrint(); vrema_raboti_ventilatora--; PORTD |= (1 << 4); if (!vrema_raboti_ventilatora) {PORTD &= ~(1 << 4); ventilation = false; vrema_raboti_ventilatora = EEPROM.read(7);  displayPrint();  //включение/выключение работа вентилятора проветривания
215        errorHour = 2; ErrorPower = false;}}       // включение отсчета времени для срабатывания ошибки
216 }
217 
218 
219 if (sec != sTimer){
220      counter = !counter; if (!menu) {if (counter) {lcd.setCursor(2, 0); lcd.print(":");} else {lcd.setCursor(2, 0); lcd.print(" ");}}
221   
222      if (backLight) {backLight--; lcd.backlight(); if (!backLight) {if (!PowerLigt) lcd.noBacklight(); menu = 0; lcd.clear(); displayPrint();}}
223      
224      if (!ventilation) m++; //если не работает проветривание, то считаем 20 сек для работы нагревателя
225      else {if (dhT) {tt = dht.readTemperature();  Temperature = (10 * tt) + kof;}                                 //температура с DHT22 
226            else {sensors.requestTemperatures(); tt = sensors.getTempCByIndex(0); Temperature = (10 * tt) + kof;}  //температура с 18B20
227            if (!menu) {lcd.setCursor(11, 1); lcd.print(Temperature * 0.1, 1);}}
228    
229      sec = sTimer;}
230 
231 
232 
233  if (hi != hTimer){ if (!menu) {lcd.setCursor(0, 0); if (hTimer < 10) lcd.print("0"); lcd.print(hTimer);} EEPROM.write(20, hTimer); //сохранение текущего часа
234       
235      sensors.requestTemperatures(); // температура с 18b20
236      e = sensors.getTempCByIndex(0);
237      if ((r_ventilator || (!avtomatik && vrema_raboti_ventilatora)) && (hTimer == 6 || hTimer == 18)) {ventilation = true; Power = 2; analogWrite(3, Power);}//включение вентиляции
238      if (powerTurn) {timeTurn++; if (timeTurn > 1) {timeTurn = 0; PORTD = PORTD ^ (1 << 6); accountTurn++;}} //инверсия пина для поворота
239      if (errorHour) errorHour--; //истечение 6 часов для включения режима авария
240      hi = hTimer;}
241 
242 
243  if (day != dTimer) {if (!menu) {lcd.setCursor(6, 0); lcd.print("Day"); lcd.print(dTimer);}
244     EEPROM.write(3, dTimer); day = dTimer; parametri(); }
245 
246  if (m > 20) {
247     
248    if (dhT) {tt = dht.readTemperature();  Temperature = (10 * tt) + kof;}                                 //температура с DHT22 
249    else {sensors.requestTemperatures(); tt = sensors.getTempCByIndex(0); Temperature = (10 * tt) + kof;}  //температура с 18B20
250 
251    
252    if ((!errorHour) && (Temperature < t - 20)) {error = true; menu = 15; errorMelody();}          //включение мелодии ошибки
253    if (Temperature == t) ErrorPower = true;
254    if (ErrorPower)  {if (Temperature < errorL || Temperature > errorH) errorTime++;                                  //определение ошибки
255                      else {errorTime--; if (errorTime > TimeError) {errorTime = 0; noTone(8);}}
256    if (errorTime > TimeError) {errorMelody(); error = true; menu = 15; errorTime = 20;}
257 
258 
259    if (!menu) {lcd.setCursor(11, 1); lcd.print(Temperature * 0.1, 1);}  
260    if (Temperature != t) nagrev(); m = 0;} //работа нагревателя, выполнется 3 разa в 1 минуту(ы), чтобы не мешать инерционности процессу
261   
262    
263  if (!digitalRead(buttonMenu)) {delay(250); menu++; lcd.clear(); if (exitMenu) {menu = 0; displayPrint(); exitMenu = false;}
264      if (menu > 11) {noTone(8); menu = 0; displayPrint(); backLight = 240;}}
265         
266  wdt_reset();
267 
268}
269 
270 
271 
272 
273 
274 
275 
276 
277 
278 
279 
280 
281 
282void nagrev()                              //работа нагревателя, 200 - минимальная мощность, 0 - максимальная
283{
284  // if (!r_ventilatora) {
285    if (Temperature > t + 5) {
286//      digitalWrite(ventilator, HIGH);
287      rn += 4;
288      Power = EEPROM.read(13);
289    }
290 //   if (Temperature < t + 3) digitalWrite(ventilator, LOW);
291//  }
292 
293  if (Temperature < t)      n = 1;
294  if (Temperature < t - 10) n = 2;
295  if (Temperature < t - 40) n = 5;
296  if (Temperature > t)      n = 4;
297  if (Power == 255)         n = 3;
298 
299  switch (n) {
300    case 4:
301      if (rn > 12) {
302        rn = 0;
303        if (Temperature >= b) Power -= 1;
304        else Power += 1;
305        if (Temperature > t + 3) Power -= 6;
306      }
307      else rn++;
308      break;
309 
310    case 1:
311      if (rv > 14) {
312        rv = 0;
313        if (Temperature <= b) Power += 1;
314        else Power -= 1;
315      }
316      else rv++;
317      break;
318 
319    case 2:
320      if (Temperature > b)
321      {
322        b = Temperature - b;
323        switch (b)
324        { case 1: Power -= 4; break;
325          case 2: Power -= 5; break;
326          case 3: Power -= 8; break;
327          case 4: Power -= 8; break;
328          case 5: Power -= 20; break;
329          default: Power -= 22;
330        }
331      }
332      else {
333        Power += 4;
334        if (Temperature < (t - 20)) Power += 30;
335      }
336      break;
337 
338    case 5:
339      if (Temperature <= (b + 30)) Power += 20; if (Power > 200) Power = 200;
340      break;
341 
342    case 3:
343      if (Temperature < t) Power = 30;
344      break;
345  }
346 
347  b = Temperature;                    //промежуточное значение температуры
348  if (Temperature > t + 7) Power -= 20;
349  Power = constrain(Power, 8, 200); //ограничение мощности 50%
350  if ((Power == 8) && (Temperature > t + 3)) Power = 0; //выключение нагревателя
351  if (!menu) {lcd.setCursor(0, 1); lcd.print("Pow"); i = map(Power, 0, 200, 1, 99); if (i < 10) lcd.print(" "); lcd.print(i); lcd.print("%");}//мощность на нагрев
352  analogWrite(3, Power);
353}
354 
355 
356void parametri()                //изменение параметров  в зависимости от дня инкубации, сюда можно внести свои данные режима инкубации
357{
358  switch(avtomatik){
359   case 1:   //для кур
360      if (day < 2) {t = 380; powerTurn = true; r_ventilator = false;  H = 60;}
361         else {t = 378; powerTurn = true; r_ventilator = false; H = 60;}
362      if (day > 14) {t = 377; H = 60; r_ventilator = true; EEPROM.write(7, 18); vrema_raboti_ventilatora = 18; powerTurn = true; }
363      if (day > 17) {t = 370; H = 80; powerTurn = false; r_ventilator = true;}
364    break;
365   case 2:   //для перепелов
366      if (day < 2) {t = 380; powerTurn = true;  r_ventilator = false; H = 60;}
367         else {t = 378; powerTurn = true; r_ventilator = false; H = 60;}
368      if (day > 7) {t = 377; H = 60; r_ventilator = true; EEPROM.write(7, 10); vrema_raboti_ventilatora = 10; powerTurn = true;}
369      if (day > 13) {t = 377; H = 60; powerTurn = true; r_ventilator = true;}
370      if (day > 14) {t = 370; H = 80; powerTurn = false; r_ventilator = true;}
371    break;
372    case 3: //утка
373         if (day < 2) {t = 385; powerTurn = true;  r_ventilator = false; H = 70;}
374         else {t = 380; powerTurn = true; r_ventilator = false; H = 70;}
375      if (day > 7) {t = 378; H = 60; r_ventilator = false; EEPROM.write(7, 15); vrema_raboti_ventilatora = 15; powerTurn = true;}
376      if (day > 14) {t = 378; H = 60; powerTurn = true; r_ventilator = true;}
377      if (day > 25) {t = 375; H = 90; powerTurn = false; r_ventilator = false;}
378    break;
379    case 4: //гуси
380      if (day < 6) {t = 380; powerTurn = true;  r_ventilator = false; H = 70;}
381         else {t = 378; powerTurn = true; r_ventilator = false; H = 60;}
382      if (day > 13) {t = 378; H = 70; r_ventilator = true; EEPROM.write(7, 25); vrema_raboti_ventilatora = 25; powerTurn = true;}
383      if (day > 26) {t = 375; H = 85; powerTurn = true; r_ventilator = true;}
384      if (day > 28) {t = 375; H = 85; powerTurn = false; r_ventilator = false;}
385    break;
386  }
387}
388 
389 
390 
391void displayPrint(){
392  lcd.setCursor(0, 0); if (hTimer < 10) lcd.print("0"); lcd.print(hTimer); lcd.setCursor(3, 0); if (mTimer < 10) lcd.print("0"); lcd.print(mTimer);
393  lcd.setCursor(6, 0); lcd.print("Day"); lcd.print(dTimer);
394  lcd.setCursor(12, 0); lcd.print("H"); lcd.print(h, 0); lcd.print("%");
395   
396  lcd.setCursor(0, 1); lcd.print("Pw"); i = map(Power, 0, 200, 1, 99); if (i < 10) lcd.print(" "); lcd.print(i); lcd.print("%");//мощность на нагрев
397  lcd.setCursor(6, 1); lcd.print(avtomatik);
398  lcd.setCursor(7, 1); if (powerTurn) lcd.print("|"); else lcd.print("0"); lcd.print(accountTurn);
399  lcd.setCursor(8, 1);  if (ventilation) lcd.print("*"); else lcd.print("-");
400  lcd.setCursor(9, 1);  if (digitalRead(ventilatorH)) lcd.print("#"); else lcd.print("-");
401  lcd.setCursor(11, 1); lcd.print(Temperature * 0.1, 1); lcd.print("\1");
402   
403}
404 
405//на второй строке дисплея отображаются: мощность на нагеревателе Pw 1-99%;
406//                                       режим инкубации 0 - ручной; 1 - куры; 2 - перепелки; 3 - утки; 4 - гуси;
407//                                       включен поворот - |; выключен поворот - 0
408//                                       вентиляция работает - *; выключена - -;
409//                                       работает вентилятор влажности - #; выключен - -;
410//                                       текущее значение температуры
411 
412 
413 
414void errorMelody() { //8 пин на буззер
415  //noTone(8);  tone(6, 440, 200);  delay(200);
416  //noTone(6);  tone(7, 494, 500);  delay(500);
417  tone(8, 523, 300); 
418}

на 149 стоке компиляция зависает

   if (avtomatik) parametri();

 

Arduino: 1.8.9 (Windows XP), Плата:"Arduino Nano, ATmega328P"

D:\Documents and Settings\Администратор\Мои документы\Arduino\sketch_feb13a_versia_8\sketch_feb13a_versia_8.ino: In function 'void setup()':

sketch_feb13a_versia_8:87:28: error: 'parametri' was not declared in this scope

sketch_feb13a_versia_8:97:16: error: 'displayPrint' was not declared in this scope

D:\Documents and Settings\Администратор\Мои документы\Arduino\sketch_feb13a_versia_8\sketch_feb13a_versia_8.ino: In function 'void loop()':

sketch_feb13a_versia_8:135:90: error: 'displayPrint' was not declared in this scope

sketch_feb13a_versia_8:149:32: error: 'parametri' was not declared in this scope

sketch_feb13a_versia_8:178:52: error: 'displayPrint' was not declared in this scope

sketch_feb13a_versia_8:211:118: error: 'displayPrint' was not declared in this scope

sketch_feb13a_versia_8:212:54: error: 'displayPrint' was not declared in this scope

sketch_feb13a_versia_8:214:34: error: 'displayPrint' was not declared in this scope

sketch_feb13a_versia_8:222:141: error: 'displayPrint' was not declared in this scope

sketch_feb13a_versia_8:252:87: error: 'errorMelody' was not declared in this scope

sketch_feb13a_versia_8:256:45: error: 'errorMelody' was not declared in this scope

sketch_feb13a_versia_8:260:34: error: 'nagrev' was not declared in this scope

sketch_feb13a_versia_8:263:105: error: 'displayPrint' was not declared in this scope

sketch_feb13a_versia_8:264:57: error: 'displayPrint' was not declared in this scope

sketch_feb13a_versia_8:283:1: error: a function-definition is not allowed here before '{' token

sketch_feb13a_versia_8:418:1: error: expected '}' at end of input

sketch_feb13a_versia_8:418:1: error: expected '}' at end of input

Используем библиотеку OneWire-2.3.5 версии 2.3.5 из папки: D:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\OneWire-2.3.5
Используем библиотеку DallasTemperature версии 3.8.0 из папки: D:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\DallasTemperature
Используем библиотеку DHT-sensor-library-master версии 1.3.8 из папки: D:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\DHT-sensor-library-master
Используем библиотеку EEPROM версии 2.0 из папки: D:\Documents and Settings\Администратор\Рабочий стол\АРДУИНО\arduino-1.8.9-windows\arduino-1.8.9\hardware\arduino\avr\libraries\EEPROM
Используем библиотеку Wire версии 1.0 из папки: D:\Documents and Settings\Администратор\Рабочий стол\АРДУИНО\arduino-1.8.9-windows\arduino-1.8.9\hardware\arduino\avr\libraries\Wire
Используем библиотеку Arduino-LiquidCrystal-I2C-library-master в папке: D:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Arduino-LiquidCrystal-I2C-library-master (legacy)
Используем библиотеку Adafruit_Unified_Sensor версии 1.1.2 из папки: D:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Adafruit_Unified_Sensor
exit status 1
'parametri' was not declared in this scope

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

Тут в строке 269 добавь закрывающую скобку }

Кудато делась, на работе не могу проверить.

Для меня было важно:
1. Выбор режимов для инкубации разных птиц, перепела, индюки, куры...
2. Сигнализация ошибок, температура, СО2 или влажность ушла за пределы
3. Автоповорот

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

Я смотрю тут все скетчи без часов реального времени. Таймеры везде используются. Я в этом слаб, мне проще воткнуть часы DS3231

Мой скетч тоже не блещет красотой, по первых собрано на 2х МК, Atmega32U4 и Attinu85, первый это основное устройство которое за всем следит, второй это ПИД регулятор, как оказалось бесполезный :-(

Отработало 2 сезона, но у меня основная проблема в конструкции, надо все переделывать. Вот под конструкцию и буду делать новую электронику. Но не в этом сезоне, этот сезон думаю старый инкубатор протянет.

Дисплей ОЛЕД 1,3" SSD1306, сенсор температуры влажности Si7021 возможно заменю на SHT31, сенсор eCO CCS811, заменю наверное на MH-Z19B но особой нужды в нем нет, потому как при постоянном небольшом притоке воздуха проблем не наблюдается.

Кнопки управления сенсорные на TTP224.

Да и еще хочу добавить подсветку при выводе, то есть например у кур с 20го дня включать подсветку в инкубаторе, чтоб на свет лезли :-)

conder
Offline
Зарегистрирован: 20.01.2014

Andrey12, спасибо помогло. Но проблему не сняло. Этот вариант на питание от12 вольт, до этого тестировал второй скетч на 220 вольт с управлением симистора. это оба скетча выложил автор Emeljanowich. http://arduino.ru/forum/proekty/inkubator?page=1  К сожалению оба не рабочие , найти ошибку не смог. Тот , что с ошибкой которую  Вы нашли он не выходит в меню настроек, не откликается на кнопки pin15,16,17. Хота температуру и влажность показывает, он постоянно прокручивает заставку (inkubator_4 v_0.8) и панель с показаниями температуры и влажности  времени и шим в процентах.

Второй на работу от 220вольт, сразу прошел компиляцию, но также не работает. Он как бы висит , в меню все управляется температуру и влажность считывает только при загрузке, потом она не меняется. В нем можно только менять корректировку даласа, выбрать ДНТ или далас. поменять мощность, специально что ли выкладывают не рабочие версии. Так и не чего не удалось. Завтра на дежурство сутки. После завтра попытаюсь. Андрей ещё раз спасибо за внимание. Я искал конструкцию по проще, температура с пид регулировкой, влажность, поворот, выход аварии. В любом случае необходим постоянный контроль. Умный инкубатор от Umka мне больше всех понравился, но дома три дисплея на 16х2.  Их надо приспособить.

 

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

А кнопки правильно подключены? Надо к пинам 15 - А1, 16 - А2, 17 - А3. И замыкать на минус. Ну если я не сильно ошибся в нумерации аналоговых пинов.

Вроде как ничего криминального нет в программе.
А переделать с большего дисплея на меньший тот еще геморой, согласен.

В общем проверять надо. Может поставить вывод в Serial состояние кнопок чтобы проверить нажатия.

 

conder
Offline
Зарегистрирован: 20.01.2014

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

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

conder пишет:
К сожалению оба не рабочие , найти ошибку не смог. Тот , что с ошибкой которую  Вы нашли он не выходит в меню настроек, не откликается на кнопки pin15,16,17. Хота температуру и влажность показывает, он постоянно прокручивает заставку (inkubator_4 v_0.8) и панель с показаниями температуры и влажности  времени и шим в процентах.

Ну тут дело думаю в том что срабатывает wdt таймер :-( заставку inkubator_4 v_0.8 оно показывает только при загрузке, а значит почемуто не доходит до сброса wdt, то есть он отображает inkubator_4 v_0.8, потом 2 секунды ждет согласно delay(2000);, потом выполняет displayPrint(); а вот до строки 266 wdt_reset(); почемуто не доходит.

Как вариант попробуйте 
1. увеличить время срабатывания wdt строка 91 укажиет вместо wdt_enable (WDTO_8S);
2. если не поможет вообще отключите WDT закомментируйте строки  91 и 266

Что показывает?

Честно говоря не люблю солянку типа такой if (ventilation) {displayPrint(); vrema_raboti_ventilatora--; PORTD |= (1 << 4);

Я так понимаю не везде потом работает.

conder пишет:
Второй на работу от 220вольт, сразу прошел компиляцию, но также не работает. Он как бы висит , в меню все управляется температуру и влажность считывает только при загрузке, потом она не меняется. В нем можно только менять корректировку даласа, выбрать ДНТ или далас. поменять мощность, специально что ли выкладывают не рабочие версии. Так и не чего не удалось. Завтра на дежурство сутки. После завтра попытаюсь. Андрей ещё раз спасибо за внимание. Я искал конструкцию по проще, температура с пид регулировкой, влажность, поворот, выход аварии. В любом случае необходим постоянный контроль. Умный инкубатор от Umka мне больше всех понравился, но дома три дисплея на 16х2.  Их надо приспособить.

Во втором тоже шаманство

DRD |= (1 << 5)|(1 << 4)|(1 << 6); //кулер, вентилятор, насос
061   PORTD |= (1 << 5);       
062   PORTD &= ~(1 << 4)|(1 << 6);

Вобщем не лучшие варианты. Плата должна быть именно на Атмега328 потому как вот здесь

void setTimer()
092 {
093   cli();
094   TCCR2A |= (1 << WGM21);  //CTC to OCR2A
095   TCCR2A &= ~(1 << WGM20);
096   TCCR2B &= ~(1 << WGM22);
097   TCCR2B |= (1 << CS22) | (1 << CS21) | (1 << CS20);  //1024
098   TIMSK2 &= ~(1 << OCIE2A);
099   OCR2A = 50;
100   sei();
101 }
102  
103 ISR (TIMER2_COMPA_vect)
104 {
105   PORTB = PORTB ^ (1 << 2); //шаги для двигателя поворота (шаговый двинатель типа 28BYJ-49) - времени на шаг 0,0032 сек
106 }

Я так понимаю настраивается именно под этот чип как у автора.
Разбираться в алгоритме дольше чем написать новый. 

conder
Offline
Зарегистрирован: 20.01.2014

Andrey12 увеличение до 8 сек не помогло, закоментировал строки 24,69,92,267. Заработало меню , но работает очень вдумчиво. Кнопки надо удерживать 1-2 секунды. на изменение температуры и влажности отклик секунд 30-50 всегда по разному. Шим стоит 1% и не на что не реагирует. Вероятно там тоже не все в порядке. отсчет дней и часов и минутами идет нормально. Индикация выбора режима инкубации тоже работает. Если он будет с сорока секундной задержкой греть , он и сварить может все.  Побежал на работу, ужинать забегал.

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

conder пишет:

Andrey12 увеличение до 8 сек не помогло, закоментировал строки 24,69,92,267. Заработало меню , но работает очень вдумчиво. Кнопки надо удерживать 1-2 секунды. на изменение температуры и влажности отклик секунд 30-50 всегда по разному. Шим стоит 1% и не на что не реагирует. Вероятно там тоже не все в порядке. отсчет дней и часов и минутами идет нормально. Индикация выбора режима инкубации тоже работает. Если он будет с сорока секундной задержкой греть , он и сварить может все.  Побежал на работу, ужинать забегал.

 

У вас тоже ардуино нано ? на 328 МК?

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

 

Вот може тут какой косяк, если кто знающий или автор зайдут объяснят.

105 void setTimer(){
106   cli();
107   TCCR1A = 0b00000000; //none   toggle  clear  set - инверсия установить
108   TCCR1B = (1 << WGM12)|(1 << CS12); // 10b00011001;
109   TIMSK1 = (1 << OCIE1A);
110   OCR1A = 62500; //разрешение ШИМ сигнала (ограничение для счета регистра TCNT1), возможно до 65 535
111   sei();
112 }
113  
114 ISR (TIMER1_COMPA_vect) //вектор прерывания по СТС таймера/счетчика 2 для работы собственного времени контроллера
115 {
116   PORTB = PORTB ^ (1 << 5); sTimer++; if (sTimer > 59) {mTimer++; sTimer = 0; if (mTimer > 59) {hTimer++; mTimer = 0;} if (hTimer > 23) {dTimer++; hTimer = 0;}}
117 }

 

conder
Offline
Зарегистрирован: 20.01.2014

Andrey12 у мена  ардуино HAHO. Спасибо за помощь , Вы хорошо разбираетесь в этом вопросе.

но что то этот скеч мне сильно разонравился. Буду искать  что по проще и рабочее. Сейчас в раздумьях, после дежурства надо поспать, голова совсем не варит, весна идет и надо принять решение.

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

Я пока на старом варианте этот сезон поинкубирую, может к следующему сезону новый слеплю.

 

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

Уважаемый conder просьба,не засирать мою ветку чужим говнокодом, если есть желание, тут можно обсуждать мой говнокод.

Хотите обсуждать свои, создайте свою ветку.

а Админов прошу почистить сообщения с чужим кодом.

conder
Offline
Зарегистрирован: 20.01.2014

 lean_74 Все понял. К сожалению Ваш код не удалось довести до рабочего состояния.

stranik9
Offline
Зарегистрирован: 19.08.2019

Andrey12 пишет:

 и потом если инкубатор небольшой яиц на 100 то PID вам не нужен, становится намного проще программа.

доброго времени вам! а по подробней, может ли ардуино плавно регулировать

с ув.

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

stranik9 пишет:

Andrey12 пишет:

 и потом если инкубатор небольшой яиц на 100 то PID вам не нужен, становится намного проще программа.

доброго времени вам! а по подробней, может ли ардуино плавно регулировать

с ув.

Плавно регулировать может с использование PID алгоритма. Почему не смочь то, главное суметь настроить.

Vavrychuk
Offline
Зарегистрирован: 06.05.2020

Кто поделиться архивом с печаткой и схемой

Molostov
Offline
Зарегистрирован: 08.11.2013

Добрый день. Какая на данный момент актуальная версия кода?

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