Инкубатор

NewNiK
Offline
Зарегистрирован: 06.04.2018

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

//_____________________________________________________________________________________________
//______________________________ОБЪЯВЛЕНИЕ_ПЕРЕМЕННЫХ_______________________________________|
 
#include "DHT.h"                  //Объявление Библиотек которые буду использоваться в скетче
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <iarduino_RTC.h>        //_________
 
    
#define DHTTYPE DHT21   // DHT 21 (AM2301)         // указываем тип датчика
#define DHTPIN 2                                  // указываем куда датчик подключен
DHT dht(DHTPIN, DHTTYPE); //Подключить 10К Ом резистор между 2 пином(дата) и питанием. Честно. я не знаю зачем...
 
 
LiquidCrystal_I2C lcd(0x27, 16, 2); // параметры ЖК экрана
 
iarduino_RTC time(RTC_DS1302, 9, 10, 11); // подключаем RTC модуль на базе чипа DS1302, указывая выводы Arduino подключённые к выводам модуля RST, CLK, DAT
boolean flag = 0;
 
int Green = 12; // вводим переменные для зеленого
int Red = 13;    // и красного светодиодов
 
int IN1 = 5;   //ДРАЙВЕР ДВИГАТЕЛЯ 
int IN2 = 4;  // планируется использовать для управления влажностью с помощью насоса. но пока не испольхуется.
 
int relay = 6; // Реле для управления температурой
int relay2 = 7; // реле на переворот
int zumm = 3; //Зумер для влажности
 
//_____________________________________________________________________________________________
//___________________________ЗАПУСК_МОДУЛЕЙ_ПРИ_СТАРТЕ______________________________________|
void setup() {
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);
  
 pinMode(7, OUTPUT);
 
  dht.begin();  //запуск датчика
  lcd.begin();  // запуск жк экрана
  lcd.backlight();
  
  time.begin(); // запуск модуля времени
  
  pinMode(relay2, OUTPUT);
  pinMode(relay, OUTPUT); // сюда подключено реле для управления нагревательным элементом
  pinMode(zumm, OUTPUT);
 pinMode(Green, OUTPUT); // зеленый
 pinMode(Red, OUTPUT); // и красный светодиоды для наглядности
 
//pinMode(IN1, OUTPUT); // драйвер двигателя в данный момент не используется
 //pinMode(IN2, OUTPUT); //
}
//_____________________________________________________________________________________________
//___________________________________ПРОГРАММА_______________________________________________|
void loop() {
 
//_____________________ЧИТАЕМ ДАННЫЕ С ДАТЧИКА____________________________
  //delay(2000);
  float h = dht.readHumidity();   // Читаем влажность
  float t = dht.readTemperature(); // Читаем температуру
  int potentiometr1 = map(analogRead(A0), 0, 1023, 320, 410); // Вводим переменную для введения максимума для температуры
  int potentiometr2 = map(analogRead(A1), 0, 1023, 400, 800); // Вводим переменную для максимума влажности
  float pot = potentiometr1*0.1;
  float pot2 = potentiometr2*0.1;
 
//____ВЫВЕСТИ ТЕМПЕРАТУРУ И ВЛАЖНОСТЬ НА LED ЭКРАН_______________ 
 
 lcd.setCursor(0,0);
 lcd.print("t-"); // печатаем температуру
 lcd.setCursor(2,0);
 lcd.print(t);
 lcd.setCursor(8,0);
 lcd.print("Max-");
 lcd.setCursor(12,0);
 lcd.print(pot);
 lcd.setCursor(0,1);
 lcd.print("H-"); // печатаем влажность
  lcd.setCursor(2,1);
 lcd.print(h);
 lcd.setCursor(8,1);
 lcd.print("Max-");
 lcd.setCursor(12,1);
 lcd.print(pot2);
//______________________________ВЛАЖНОСТЬ___________________________________
 
 
if(h<pot2){ //если влажность ниже порога, то
  analogWrite(zumm, 125); // оповещаем сигналом
  delay(200);
  analogWrite(zumm, 0);
  delay(50);
  analogWrite(zumm, 125); 
  delay(200);
  analogWrite(zumm, 0); // оповещаем сигналом
  delay(1200);
}
 
 
 //_______________________________НАГРЕВ___________________________________
 
 
if(t<pot){           // если температура меньше установленного значения то нагреваем
  digitalWrite(relay, HIGH);
  digitalWrite(Green, LOW); // зелененький горит = идет нагрев
  digitalWrite(Red, HIGH); //
 }
 else if(t>pot){
  digitalWrite(relay, LOW); // если больше то перестаем нагревать
  digitalWrite(Green, HIGH); //
  digitalWrite(Red, LOW); // красненький горит = не идет нагрев
 } 
                       
   
 //___________________________ПЕРЕВОРОТ ЯИЦ________________________________
  time.gettime(); // получаем время с модуля 
  int Hour =  time.hours; // объявляем переменную которая считывает минуты
 
  if(Hour%2 == 0 && flag == 0){
    digitalWrite(relay2, LOW);
    delay(15000);                //подходящее количество времени для переворота
    digitalWrite(relay2, HIGH);   
    flag = 1;
    
  } else if(Hour%2 != 0){
    digitalWrite(relay2, HIGH);
    flag = 0;
  }     
  
    delay(50); //для нормальной работы жк экрана 
  
}
Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

Ну раз яйца придут уже скоро то помогу хоятбы вставкой кода правильной

//_____________________________________________________________________________________________
//______________________________ОБЪЯВЛЕНИЕ_ПЕРЕМЕННЫХ_______________________________________|
 
#include "DHT.h"                  //Объявление Библиотек которые буду использоваться в скетче
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <iarduino_RTC.h>        //_________
 
    
#define DHTTYPE DHT21   // DHT 21 (AM2301)         // указываем тип датчика
#define DHTPIN 2                                  // указываем куда датчик подключен
DHT dht(DHTPIN, DHTTYPE); //Подключить 10К Ом резистор между 2 пином(дата) и питанием. Честно. я не знаю зачем...
 
 
LiquidCrystal_I2C lcd(0x27, 16, 2); // параметры ЖК экрана
 
iarduino_RTC time(RTC_DS1302, 9, 10, 11); // подключаем RTC модуль на базе чипа DS1302, указывая выводы Arduino подключённые к выводам модуля RST, CLK, DAT
boolean flag = 0;
 
int Green = 12; // вводим переменные для зеленого
int Red = 13;    // и красного светодиодов
 
int IN1 = 5;   //ДРАЙВЕР ДВИГАТЕЛЯ 
int IN2 = 4;  // планируется использовать для управления влажностью с помощью насоса. но пока не испольхуется.
 
int relay = 6; // Реле для управления температурой
int relay2 = 7; // реле на переворот
int zumm = 3; //Зумер для влажности
 
//_____________________________________________________________________________________________
//___________________________ЗАПУСК_МОДУЛЕЙ_ПРИ_СТАРТЕ______________________________________|
void setup() {
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);
  
 pinMode(7, OUTPUT);
 
  dht.begin();  //запуск датчика
  lcd.begin();  // запуск жк экрана
  lcd.backlight();
  
  time.begin(); // запуск модуля времени
  
  pinMode(relay2, OUTPUT);
  pinMode(relay, OUTPUT); // сюда подключено реле для управления нагревательным элементом
  pinMode(zumm, OUTPUT);
 pinMode(Green, OUTPUT); // зеленый
 pinMode(Red, OUTPUT); // и красный светодиоды для наглядности
 
//pinMode(IN1, OUTPUT); // драйвер двигателя в данный момент не используется
 //pinMode(IN2, OUTPUT); //
}
//_____________________________________________________________________________________________
//___________________________________ПРОГРАММА_______________________________________________|
void loop() {
 
//_____________________ЧИТАЕМ ДАННЫЕ С ДАТЧИКА____________________________
  //delay(2000);
  float h = dht.readHumidity();   // Читаем влажность
  float t = dht.readTemperature(); // Читаем температуру
  int potentiometr1 = map(analogRead(A0), 0, 1023, 320, 410); // Вводим переменную для введения максимума для температуры
  int potentiometr2 = map(analogRead(A1), 0, 1023, 400, 800); // Вводим переменную для максимума влажности
  float pot = potentiometr1*0.1;
  float pot2 = potentiometr2*0.1;
 
//____ВЫВЕСТИ ТЕМПЕРАТУРУ И ВЛАЖНОСТЬ НА LED ЭКРАН_______________ 
 
 lcd.setCursor(0,0);
 lcd.print("t-"); // печатаем температуру
 lcd.setCursor(2,0);
 lcd.print(t);
 lcd.setCursor(8,0);
 lcd.print("Max-");
 lcd.setCursor(12,0);
 lcd.print(pot);
 lcd.setCursor(0,1);
 lcd.print("H-"); // печатаем влажность
  lcd.setCursor(2,1);
 lcd.print(h);
 lcd.setCursor(8,1);
 lcd.print("Max-");
 lcd.setCursor(12,1);
 lcd.print(pot2);
//______________________________ВЛАЖНОСТЬ___________________________________
 
 
if(h<pot2){ //если влажность ниже порога, то
  analogWrite(zumm, 125); // оповещаем сигналом
  delay(200);
  analogWrite(zumm, 0);
  delay(50);
  analogWrite(zumm, 125); 
  delay(200);
  analogWrite(zumm, 0); // оповещаем сигналом
  delay(1200);
}
 
 
 //_______________________________НАГРЕВ___________________________________
 
 
if(t<pot){           // если температура меньше установленного значения то нагреваем
  digitalWrite(relay, HIGH);
  digitalWrite(Green, LOW); // зелененький горит = идет нагрев
  digitalWrite(Red, HIGH); //
 }
 else if(t>pot){
  digitalWrite(relay, LOW); // если больше то перестаем нагревать
  digitalWrite(Green, HIGH); //
  digitalWrite(Red, LOW); // красненький горит = не идет нагрев
 } 
                       
   
 //___________________________ПЕРЕВОРОТ ЯИЦ________________________________
  time.gettime(); // получаем время с модуля 
  int Hour =  time.hours; // объявляем переменную которая считывает минуты
 
  if(Hour%2 == 0 && flag == 0){
    digitalWrite(relay2, LOW);
    delay(15000);                //подходящее количество времени для переворота
    digitalWrite(relay2, HIGH);   
    flag = 1;
    
  } else if(Hour%2 != 0){
    digitalWrite(relay2, HIGH);
    flag = 0;
  }     
  
    delay(50); //для нормальной работы жк экрана 
  
}

А вот  этот фрагмент очень интересный.

 if(Hour%2 == 0 && flag == 0){
    digitalWrite(relay2, LOW);
    delay(15000);                //подходящее количество времени для переворота
    digitalWrite(relay2, HIGH);   
    flag = 1;
    
  } else if(Hour%2 != 0){
    digitalWrite(relay2, HIGH);
    flag = 0;
  }     

Можно схему попросить выложить подключения двигателя и типа двигателя и принцип поворота.

То есть когда часы кратны 2 (2,4,6,8,10 итд) мы сигналом digitalWrite(relay2, LOW); включаем реле, ждем 15 секунд пока произойдет поворот лотка и командой digitalWrite(relay2, HIGH); выключаем реле.

А нафига нам этот код? Без понимания как у вас все подключено и каков принцип поворота тут не разобраться.

else if(Hour%2 != 0){
    digitalWrite(relay2, HIGH);
    flag = 0;
  }     

 

NewNiK
Offline
Зарегистрирован: 06.04.2018

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

 

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

Вот переделал корявенько но без Delay в повороте, но не могу откомпилировать, библиотек не хватает.

По коду: 
1. Надо убрать delay совсем.
2. Обновление экрана надо делать только при изменении показаний, а не постоянно.
3. Зуммер тоже так организовавыть не годится. Надо переделывать на millis.

По датчику DHT11 или DHT22 плохой вариант для инкубатора.

Попробуй, должно работать.

//_____________________________________________________________________________________________
//______________________________ОБЪЯВЛЕНИЕ_ПЕРЕМЕННЫХ_______________________________________|

#include "DHT.h"                  //Объявление Библиотек которые буду использоваться в скетче
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <iarduino_RTC.h>        //_________


#define DHTTYPE DHT21   // DHT 21 (AM2301)         // указываем тип датчика
#define DHTPIN 2                                  // указываем куда датчик подключен
DHT dht(DHTPIN, DHTTYPE); //Подключить 10К Ом резистор между 2 пином(дата) и питанием. Честно. я не знаю зачем...


LiquidCrystal_I2C lcd(0x27, 16, 2); // параметры ЖК экрана

iarduino_RTC time(RTC_DS1302, 9, 10, 11); // подключаем RTC модуль на базе чипа DS1302, указывая выводы Arduino подключённые к выводам модуля RST, CLK, DAT
boolean flag = false;

int Green = 12; // вводим переменные для зеленого
int Red = 13;    // и красного светодиодов

int IN1 = 5;   //ДРАЙВЕР ДВИГАТЕЛЯ
int IN2 = 4;  // планируется использовать для управления влажностью с помощью насоса. но пока не испольхуется.

int relay = 6; // Реле для управления температурой
int relay2 = 7; // реле на переворот
int zumm = 3; //Зумер для влажности

unsigned long gTrayRotateTime = 15000; // время поворота лотка мсек
unsigned long currentMillis = 0;
unsigned long previousMillis = 0;


//_____________________________________________________________________________________________
//___________________________ЗАПУСК_МОДУЛЕЙ_ПРИ_СТАРТЕ______________________________________|
void setup() {
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);

  pinMode(7, OUTPUT);

  dht.begin();  //запуск датчика
  lcd.begin();  // запуск жк экрана
  lcd.backlight();

  time.begin(); // запуск модуля времени

  pinMode(relay2, OUTPUT);
  pinMode(relay, OUTPUT); // сюда подключено реле для управления нагревательным элементом
  pinMode(zumm, OUTPUT);
  pinMode(Green, OUTPUT); // зеленый
  pinMode(Red, OUTPUT); // и красный светодиоды для наглядности

  //pinMode(IN1, OUTPUT); // драйвер двигателя в данный момент не используется
  //pinMode(IN2, OUTPUT); //
}
//_____________________________________________________________________________________________
//___________________________________ПРОГРАММА_______________________________________________|
void loop() {

  //_____________________ЧИТАЕМ ДАННЫЕ С ДАТЧИКА____________________________
  //delay(2000);
  float h = dht.readHumidity();   // Читаем влажность
  float t = dht.readTemperature(); // Читаем температуру
  int potentiometr1 = map(analogRead(A0), 0, 1023, 320, 410); // Вводим переменную для введения максимума для температуры
  int potentiometr2 = map(analogRead(A1), 0, 1023, 400, 800); // Вводим переменную для максимума влажности
  float pot = potentiometr1 * 0.1;
  float pot2 = potentiometr2 * 0.1;



  //____ВЫВЕСТИ ТЕМПЕРАТУРУ И ВЛАЖНОСТЬ НА LED ЭКРАН_______________

  lcd.setCursor(0, 0);
  lcd.print("t-"); // печатаем температуру
  lcd.setCursor(2, 0);
  lcd.print(t);
  lcd.setCursor(8, 0);
  lcd.print("Max-");
  lcd.setCursor(12, 0);
  lcd.print(pot);
  lcd.setCursor(0, 1);
  lcd.print("H-"); // печатаем влажность
  lcd.setCursor(2, 1);
  lcd.print(h);
  lcd.setCursor(8, 1);
  lcd.print("Max-");
  lcd.setCursor(12, 1);
  lcd.print(pot2);
  //______________________________ВЛАЖНОСТЬ___________________________________


  if (h < pot2) { //если влажность ниже порога, то
    analogWrite(zumm, 125); // оповещаем сигналом
    delay(200);
    analogWrite(zumm, 0);
    delay(50);
    analogWrite(zumm, 125);
    delay(200);
    analogWrite(zumm, 0); // оповещаем сигналом
    delay(1200);
  }


  //_______________________________НАГРЕВ___________________________________


  if (t < pot) {       // если температура меньше установленного значения то нагреваем
    digitalWrite(relay, HIGH);
    digitalWrite(Green, LOW); // зелененький горит = идет нагрев
    digitalWrite(Red, HIGH); //
  }
  else if (t > pot) {
    digitalWrite(relay, LOW); // если больше то перестаем нагревать
    digitalWrite(Green, HIGH); //
    digitalWrite(Red, LOW); // красненький горит = не идет нагрев
  }


  //___________________________ПЕРЕВОРОТ ЯИЦ________________________________
  time.gettime(); // получаем время с модуля
  int Hour =  time.hours; // объявляем переменную которая считывает минуты
  currentMillis = millis();
  if (Hour % 2 == 0 && !flag) {
    flag = true;
    digitalWrite(relay2, LOW);
    previousMillis = currentMillis;
    //    delay(15000);                //подходящее количество времени для переворота

  } else if (Hour % 2 != 0 && flag) {
    // digitalWrite(relay2, HIGH);
    flag = false;
  }

  if (currentMillis - previousMillis > gTrayRotateTime && !digitalRead(relay2)) {
    digitalWrite(relay2, HIGH);
  }


  delay(50); //для нормальной работы жк экрана

}

 

NewNiK
Offline
Зарегистрирован: 06.04.2018

Хм. Интересно. Посмотрю в интернете поподробнее про millis();
Сейчас оставлю его на часа два - три. все будет нормально работать - оставлю. не будет - возьму ваш код.
И кстати. Там стоит датчик Dht 21, он измеряет до десятых долей, так что сгодится.

Еще раз Спасибо!

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

NewNiK пишет:

И кстати. Там стоит датчик Dht 21, он измеряет до десятых долей, так что сгодится.

Дело не в точности, дело в конструкции. На будущее присмотритесть к SHT30, он для инкубатора получше будет.