Инкубатор

Emeljanowich
Emeljanowich аватар
Offline
Зарегистрирован: 30.04.2015

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

Кратко опишу работу данных узлов. В качестве нагревателя, испольлзую две лампы накаливания мощностью 40 Вт. Две - т.к. при перегорании одной, вторая возьмет на себя всю работу. Питание их осуществляется в паралель с помощью ШИМа ардуино. Благодоря этому, регулируется мощность нагревателя в зависимости от температуры внутри инкубатора. Регулировка сделана с задержкой времени в 4 минуты, т.к. процес нагрева не может происходить мгновенно. Показания влажности снимает датчик DHT11, если она меньше заданной, то включается насос на 5 сек и в поддон качает воду. После этого, через час, снова снимаются показания. Каждые три часа мк дает сигнал на поворот яйц. Это осуществляется с помощью старого компьютерного дисковода (привода). Привод немного переделан, но суть таже - он либо выезжает, либо заезжает и тянет за собой сетку, в которой лежат яйца. Они катятся и переварачиваются. Внутри инкубатора постоянно работает большой куллер, он размешивает воздух, что бы температура была одинакова во всех углах коробки. Коробка склеена из пенопласта толщиной 50мм. Если кому интересны узлы или внейшний вид, напишите, сделаю фото. Может я не все расскрыл, спросите, с радостью отвечу. 

По поводу программы. В ней все максимально упрощенно, нет ни какой EEPROM и иных допонительных модулей. Может кто скажет что это не правильно. Чем проще, тем надежнее. В программе можно проследить, после 14 дней инкубации необходимо включить проветривание и после 18 отключить поворот яиц. Это делается при соблюдение условия или день или включена кнопка. Это сделано для того, что бы была возможность долаживать яйца и держать температуру на нужной величине, так же в случаи отключения напряжения для продолжения работы необходимого цикла. Для МК предусмотрено резервное питание от батареи 9 В, в случаи пропадания основного.

#include "DHT.h" //датчик влажности и температуры DHT11

#define DHTPIN 4     //подключение к пину 4 
#define DHTTYPE DHT11   // DHT 11 
DHT dht(DHTPIN, DHTTYPE);

#include <Wire.h>
#include <BMP085.h> //датчик температуры
BMP085 dps = BMP085();

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12); //дисплей подключение выводов

const int ledPin = 13;      // номер выхода светодиода для индикации счета времени

long Temperature = 0;
unsigned int b = 0;    //переменная для хранения промежуточного значения температуры
unsigned long time1 = 0;
unsigned char i = 40;    //переменная мощности нагревателя, в качестве нагревателя 2 лампочки по 40 Вт - объем камеры инкубации примерно 0,4 м^3

long prevmicros = 0;//переменная для хранения значений таймера
unsigned char sek = 0;//значение секунд
unsigned char minu = 0;//значение минут
unsigned char m = 0; 
unsigned char chas = 0;//значение часов
unsigned char den = 1;

boolean counter = false; // счетчик для полусекунд

unsigned int t = 378; // требуемая температура 37,8 C
unsigned char H = 60; //требуемая влажность

unsigned char povorot = 0;
boolean p = 0;  // поворот
boolean r = 0;  //режим инкубации до 18 дней - 0, после - 1
boolean j = 0; // переменная для кнопки
unsigned char ventil = 0;

void setup()
{
  lcd.begin(16, 2);
  Wire.begin();
  dht.begin();

//распиновка пинов--------------------------------------------------------  
  pinMode(ledPin, OUTPUT);      
  pinMode(0, INPUT); // кнопка режима инкубации
  digitalWrite(0, HIGH);
  pinMode(1, INPUT); //кнопка включения проветривания
  digitalWrite(1, HIGH); 
    
  pinMode(6, OUTPUT);    //подключение ШИМ нагревателя
  pinMode(5, OUTPUT);    //подключение вентилятора проветривания
  pinMode(3, OUTPUT);    //поворот яиц
  pinMode(2, OUTPUT);    //подключение насоса для поддержания влажности
 
  dps.init(MODE_STANDARD, 25000, true); 
  delay(1000);
}

void loop()
{
//работа кнопок-----------------------------------------------------------  
if ((digitalRead(0) == LOW) || (den > 17)) {t = 375; H = 80; r = 1;}  //переключение режима работы до и после 18 дней
else {t = 378; H = 60; r = 0;}  

if ((digitalRead(1) == LOW) || (den > 14)) j = 1; //на 15 день включение проветривания
else {j = 0;}

//работа часов------------------------------------------------------------
    if (micros() - prevmicros > 500000)
   {prevmicros = micros();  counter=!counter;
   if (counter==false)
   {sek++;  lcd.setCursor(3,0);  lcd.print(":");         //выводим символ ":"между часами и минутами
   digitalWrite(13, HIGH); }
   else  { lcd.setCursor(3,0);   lcd.print(" ");    
   digitalWrite(13, LOW); }
   if(sek>56) {sek=0; minu++; m++;}
   if(minu>59) {minu=0; chas++; povorot++; ventil++; }
   if(chas>23) {chas=0; den++;} }

//Поворот яиц---------------------------------------------------------------  
if ((r == 0) && (povorot == 3)) 
{digitalWrite(3, HIGH); povorot = 0;  // поворот до 18 дня
delay(500); digitalWrite(3, LOW);
p = !p;}

//вентиляция яиц------------------------------------------------------------
if ((j == 1) && (ventil > 12)) 
{digitalWrite(5, HIGH); ventil = 0;
lcd.clear(); lcd.setCursor(2,0);
analogWrite(6,0);
lcd.print("provetrivanie");
delay(1080000);    //остановка всей программы, проветривание инкубатора 18 минут---------
minu = minu + 18;
digitalWrite(5, LOW); lcd.clear(); }
 
//опрос датчика влажности и темперетуры--------------------------------------- 
 if (((millis() - time1)/1000.0) >= 1.0) 
    {dps.calcTrueTemperature();
    time1 = millis();}
    float h = dht.readHumidity();
    dps.getTemperature(&Temperature);

//работа насоса поддержания влажности-------------------------------------
if ((minu == 0) && (h < H) && (sek == 0))  //выполняется раз в час, при условии влажности меньше заданной
{digitalWrite(2, HIGH); }
if ((digitalRead(2) == HIGH) && (sek > 5))
{digitalWrite(2, LOW);}              //насос рвботает 5 сек, время определяется опытным путем

//печать на дисплей--------------------------------------------------------  
   lcd.setCursor(1,0);//выводим значение часов 
   if (chas>=0 && chas<10) {lcd.print("0"); lcd.print(chas);}
   else lcd.print(chas);
   lcd.setCursor(4,0);//выводим значение минут
   if (minu>=0 && minu<10) {lcd.print("0"); lcd.print(minu);}
   else lcd.print(minu);
   lcd.setCursor(7,0);//выводим значение дня инкубации
   lcd.print("d");
   lcd.print(den); 
   lcd.setCursor(11,0);
   lcd.print("H");
   lcd.print(h,0);//влажность
   lcd.print("%");
   
  lcd.setCursor(0,1);  
  lcd.print(Temperature*0.1,1); //температура если (,1) - 1 знак после запятой
  lcd.print("*C ");
  
  lcd.setCursor(7,1);
  lcd.print("i");  //ШИМ на нагрев
  if (i>=0 && i<20) {lcd.print("0"); lcd.print(i/2);}
  else lcd.print(i/2);
  lcd.print("%");
  lcd.setCursor(12,1);
  lcd.print(p);
  lcd.print(" ");
  lcd.print(r);
  lcd.print(j);
  
 
//работа нагревателя------------------------------------------ 
if (Temperature >= (t+4)) digitalWrite(5, HIGH); //если температура больше на 0,5 градуса, вкл охлаждение
if (Temperature <= (t+3)) digitalWrite(5, LOW);

if ((m > 3) && (Temperature != t) && (r == 0)) //работа нагревателя до 18 дней, температура 37,8
{
  switch (Temperature)
{
  case 375: i = i+12; break;
  case 376: i = i+4; break;
  case 377: i = i+2; break;
  case 379: i = i-6; break;
  case 380: i = i-12; break;
  case 381: i = i-16; break;
  case 382: i = i-20; break;
}
if ((Temperature <= t - 4) && (Temperature <= b)) i = i+20; 

if ((Temperature >= t + 5) || (Temperature > b+2)) i = i-10;

m = 0; b = Temperature;
}

if ((m > 3) && (Temperature != t) && (r == 1)) //работа нагревателя после после 18 дней, температура 37,5
{
  switch (Temperature)
{
  case 372: i = i+12; break;
  case 373: i = i+4; break;
  case 374: i = i+2; break;
  case 376: i = i-6; break;
  case 377: i = i-12; break;
  case 378: i = i-16; break;
}
if ((Temperature <= t - 4) && (Temperature <= b)) i = i+20;

if ((Temperature >= t + 5) || (Temperature > b+2)) i = i-10;

m = 0; b = Temperature;
}

if (Temperature < t - 38) {i = 150; m = 0;}
if (Temperature == t - 38) i = 100;
if ((i == 8) && (Temperature > t + 2)) {i = 0; m = 0;} //выключение нагревателя
if ((i == 0) && (Temperature == t)) i = 16;

if (i >= 160)  i = 160;
if (i <= 8) i = 8;

analogWrite(6,i);
}

 

ромаха28
Offline
Зарегистрирован: 17.06.2016

Здравствуйте!Напишите пожалуйста, какие "железяки" использовали?И фото если можно?

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Вангую - использованы следующие железяки:

1. BMP085 

2. DHT11

3. Двустрочный символьный LCD

4. Вентилятор

5. Насос

6. Нагреватель

7. Тактовые кнопки

ромаха28
Offline
Зарегистрирован: 17.06.2016

А зачем датчик давления?

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

А он ещё и температуру меряет :)

Emeljanowich
Emeljanowich аватар
Offline
Зарегистрирован: 30.04.2015

Датчик давления измеряет температуру, т.к. у него точность измерения - 0,1 С, а у DHT11 - 1 C. По поводу железяк, немного поправлю пользователя выше) - 2 вентилятора, один постоянно гоняет воздух, а другой включается для проветривания. В качестве нагревателя - лампочки накаливания. ,

Все компоненты вместил в коробку, в которой раньше был счетчик. На дисплее выводится время инкубации, день, влажность, температура, мощность нагревателя, положение привода, и последние две цифры говорят о текущем режиме работы. На фото видно, как переделан привод.

ромаха28
Offline
Зарегистрирован: 17.06.2016

Спасибо!А можно,( для тех кто в танке) по - подробнее,что куда подключали,на фото и транзистор на радиаторе!!!поймите только првильно, далекий я!а инкубатор хочу!!!

Emeljanowich
Emeljanowich аватар
Offline
Зарегистрирован: 30.04.2015

Вы начните делать, а непонятные моменты по ходу дела помогу вам решить.

Для подключение дисплея есть много информации, включение вентилятора и насоса происходит через транзистор BD139 - обязателен обратный диод, подключение датчиков Вы тоже найдете без труда, управление силовым транзистором (IRFBE 30, можно любой напряжением выше 400 В на ток более 2 А - параметры завешены для надежности) по такой схеме: (вместо двигателя лампочка)

Нужно внимательно отнестись к работе транзистора и обязательно установить его на радиатор. При минимально-возможном напряжении на лампочке, на транзисторе выделяется большое количество тепла. Так же на радиаторе установлены две кренки на 12 и 5 В. Температура радиатора не превышает 40С. 

 

Fermer90
Offline
Зарегистрирован: 06.01.2017

Здравствуйте!!! а не могли бы схемку набросать? зарание Спасибо!!!

Emeljanowich
Emeljanowich аватар
Offline
Зарегистрирован: 30.04.2015

Здравствуйте! Пожалуйста, для облегчения моего труда, укажите конкретный узел(ы), который вам интересен.

Может будет полезно: https://www.youtube.com/watch?v=oUXaYEYK_vM 

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

#include "DHT.h" //датчик влажности и температуры DHT11
#define DHTPIN 4     //подключение к пину 4 
#define DHTTYPE DHT11   // DHT 11 
DHT dht(DHTPIN, DHTTYPE);

#include <Wire.h>
#include <BMP085.h> //датчик температуры
BMP085 dps = BMP085();

#include <LiquidCrystal.h>  
LiquidCrystal lcd(7, 8, 9, 10, 11, 12); //дисплей подключение выводов
#define ledPin 13      // номер выхода светодиода для индикации счета времени
#define pwm 6          //подключение ШИМ нагревателя
#define ventilator 5   //подключение вентилятора проветривания
#define privod_povorota 3        //поворот яиц
#define nasos 2         //подключение насоса для поддержания влажности

long Temperature = 0;
unsigned int b = 0;    //переменная для хранения промежуточного значения температуры
unsigned long time1 = 0;
int i = 30;    //переменная мощности нагревателя, в качестве нагревателя 2 лампочки по 40 Вт - объем камеры инкубации примерно 0,4 м^3

long prevmicros = 0;//переменная для хранения значений таймера
byte sek, minu, m, chas, povorot, ventil, h;//значение часов
byte den = 1;

int k = 0; //коректирующий коэффициент

unsigned int t = 378; // требуемая температура 37,8 C
unsigned char H = 60; //требуемая влажность

boolean p, counter, r, j; // переменная для кнопки


void setup()
{
  lcd.begin(16, 2);  Wire.begin();  dht.begin();
  pinMode(0, INPUT_PULLUP); pinMode(1, INPUT_PULLUP); 
  pinMode(pwm, OUTPUT); pinMode(ventilator, OUTPUT); pinMode(privod_povorota, OUTPUT); pinMode(nasos, OUTPUT); pinMode(ledPin, OUTPUT); 
  dps.init(MODE_STANDARD, 25000, true); 
  delay(100);
}

void loop()
{
//работа кнопок-----------------------------------------------------------  
if ((digitalRead(0) == LOW) || (den > 17)) {t = 375; H = 80; r = 1;}  //переключение режима работы до и после 18 дней
else {t = 378; H = 60; r = 0;}  

if ((digitalRead(1) == LOW) || (den > 14)) j = 1; //на 15 день включение проветривания
else {j = 0;}

//работа часов------------------------------------------------------------
if (micros() - prevmicros > 500000)
   {prevmicros = micros();  counter=!counter;  if (counter == false) {lcd.setCursor(2, 0);  lcd.print(":");         //выводим символ ":"между часами и минутами
   digitalWrite(ledPin, HIGH);}  else  {lcd.setCursor(2, 0);   lcd.print(" ");  digitalWrite(ledPin, LOW);
   sek++; }
   if(sek > 56)  {sek = 0; minu++; m++; dps.calcTrueTemperature(); float h = dht.readHumidity(); dps.getTemperature(&Temperature); //опрос датчика влажности и темперетуры раз в минуту
     k = analogRead(A0); k = map(k, 0, 1023, -9, 9); Temperature = Temperature + k;}//корректировка +- 0,9 градуса
   if(minu > 59) {minu = 0; chas++; povorot++; ventil++; }
   if(chas > 23) {chas = 0; den++;} }

//Поворот яиц---------------------------------------------------------------  
if ((r == 0) && (povorot == 3)) {digitalWrite(privod_povorota, HIGH); povorot = 0; delay(500); digitalWrite(privod_povorota, LOW); p = !p;}

//вентиляция яиц------------------------------------------------------------
if ((j == 1) && (ventil > 12)) {digitalWrite(ventilator, HIGH); ventil = 0; lcd.clear(); lcd.setCursor(2, 0); analogWrite(pwm, 0);
   lcd.print("provetrivanie"); delay(1080000);    //остановка всей программы, проветривание инкубатора 18 минут---------
   minu = minu + 18; digitalWrite(ventilator, LOW); lcd.clear(); }
 
//работа насоса поддержания влажности-------------------------------------
if ((minu == 0) && (h < H) && (sek == 0)) digitalWrite(nasos, HIGH);
if ((digitalRead(2) == HIGH) && (sek > 5)) digitalWrite(nasos, LOW);              //насос рвботает 5 сек, время определяется опытным путем

//печать на дисплей--------------------------------------------------------  
   lcd.setCursor(0, 0); if (chas < 10) lcd.print("0"); lcd.print(chas);
   lcd.setCursor(3, 0); if (minu < 10) lcd.print("0"); lcd.print(minu);
   lcd.setCursor(6, 0); lcd.print("d"); lcd.print(den); 
   lcd.setCursor(9, 0); if (k > 0) lcd.print("0"); lcd.print(k);  //корректирующий коэффициент
   lcd.setCursor(12, 0); lcd.print("H"); lcd.print(h,0); lcd.print("%");        //влажность
      
   lcd.setCursor(7, 1); lcd.print("i");   if (i < 20) lcd.print("0"); lcd.print(i/2); lcd.print("%");              //ШИМ на нагрев
   lcd.setCursor(12, 1); lcd.print(p); lcd.print(" "); lcd.print(r); lcd.print(j);
   lcd.setCursor(0, 1); lcd.print(Temperature*0.1,1); lcd.print("*C ");
 
if ((m > 3) && (Temperature != t) && (r == 0)) {nagrev(); m = 0;}   //работа нагревателя до 18 дней, температура 37,8
}
 
 void nagrev(){
//работа нагревателя------------------------------------------ 
if (Temperature == (t + 4)) digitalWrite(ventilator, HIGH); //если температура больше на 0,5 градуса, вкл охлаждение
if (Temperature == (t + 2)) digitalWrite(ventilator, LOW);

if ((m > 3) && (Temperature != t) && (r == 0)) //работа нагревателя до 18 дней, температура 37,8
    {
      switch (Temperature)
    {
      case 375: i = i+12; break;
      case 376: i = i+4; break;
      case 377: i = i+2; break;
      case 379: i = i-6; break;
      case 380: i = i-12; break;
      case 381: i = i-26; break;
      case 382: i = i-40; break;
    }
    if ((Temperature <= t - 4) && (Temperature <= b)) i = i+20; 
    
    if ((Temperature >= t + 5) || (Temperature > b+2)) i = i-10;
    
    m = 0; b = Temperature;
    }

if ((m > 3) && (Temperature != t) && (r == 1)) //работа нагревателя после после 18 дней, температура 37,5
    {
      switch (Temperature)
    {
      case 372: i = i+12; break;
      case 373: i = i+4; break;
      case 374: i = i+2; break;
      case 376: i = i-6; break;
      case 377: i = i-16; break;
      case 378: i = i-40; break;
    }
    if ((Temperature <= t - 4) && (Temperature <= b)) i = i+20;
    
    if ((Temperature >= t + 5) || (Temperature > b+2)) i = i-10;
    
    m = 0; b = Temperature;
    }

if (Temperature < t - 38) {i = 150; m = 0;}
if (Temperature == t - 38) i = 100;
if ((i == 8) && (Temperature > t + 1)) {i = 0; m = 0;} //выключение нагревателя
if ((i == 0) && (Temperature == t)) i = 26;
if (Temperature >= t+4) i = 8;

if (i <= 8 && i != 0) {i = 8;}
if (i >= 160)  {i = 160;}


analogWrite(pwm, i);
}

Версия прошивки 2.0. Используется энергонезависимая память, система управления не требует резервного питания, более точно работает нагреватель.

/* Владимир Емельянович, 10.01.2017.
//В отличии от первой версии инкубатор работает полностью в автоматическом режиме. Резервное питание системы управления не требуется. Основные параметры сохраняются в 
энергонезависимую память. Для обнуления памяти служит кнопка, подключенная к пину 0. 
*/

#include "DHT.h" //датчик влажности и температуры DHT11
#define DHTPIN 4     //подключение к пину 4 
#define DHTTYPE DHT11   // DHT 11 
DHT dht(DHTPIN, DHTTYPE);

#include <Wire.h>
#include <BMP085.h> //датчик температуры
BMP085 dps = BMP085();
#include <EEPROM.h>
#include <LiquidCrystalRus.h>  
LiquidCrystalRus lcd(7, 8, 9, 10, 11, 12); //дисплей подключение выводов
#define ledPin 13      // номер выхода светодиода для индикации счета времени
#define pwm 6          //подключение ШИМ нагревателя
#define ventilator 5   //подключение вентилятора проветривания
#define privod_povorota 3        //поворот яиц
#define nasos 2         //подключение насоса для поддержания влажности

long Temperature = 0;
unsigned int b;    //переменная для хранения промежуточного значения температуры
byte kof = 2;
int i = 30;    //переменная мощности нагревателя, в качестве нагревателя 2 лампочки по 40 Вт - объем камеры инкубации примерно 0,4 м^3
float h;
long prevmicros = 0;//переменная для хранения значений таймера
byte sek, minu, m, chas, povorot, ventil, error;//значение часов
byte day = 1;
boolean pov = true;
boolean vent = false;

int k; //коректирующий коэффициент

unsigned int t = 378; // требуемая температура 37,8 C
unsigned char H = 60; //требуемая влажность
boolean p, counter; 

void setup()
{
  lcd.begin(16, 2);  Wire.begin();  dht.begin();
  pinMode(0, INPUT_PULLUP); pinMode(1, INPUT_PULLUP); 
  pinMode(pwm, OUTPUT); pinMode(ventilator, OUTPUT); pinMode(privod_povorota, OUTPUT); pinMode(nasos, OUTPUT); pinMode(ledPin, OUTPUT); 
  dps.init(MODE_STANDARD, 25000, true); 
  lcd.setCursor(2, 0);  lcd.print("Инкубатор 2.0");  delay(1000); lcd.clear();
  if (!digitalRead(0)) {chas = EEPROM.read(2); day = EEPROM.read(4); lcd.setCursor(0, 0); lcd.print("Загрузил данные"); 
      lcd.setCursor(2, 1); lcd.print("День "); lcd.print(day); lcd.print(", Час "); lcd.print(chas); delay(2000); lcd.clear();}
  else {lcd.setCursor(1, 0); lcd.print("С начала цикла"); delay(2000); lcd.clear();                            }    
}

void loop()
{
                                                                                                //работа часов------------------------------------------------------------
if (micros() - prevmicros > 500000)
   {prevmicros = micros();  counter=!counter;  if (counter == false) {lcd.setCursor(2, 0);  lcd.print(":"); digitalWrite(ledPin, HIGH);} 
   else  {lcd.setCursor(2, 0);   lcd.print(" ");  digitalWrite(ledPin, LOW);  sek++; }
   
   if(sek > 58)  {sek = 0; minu++; m++; dps.calcTrueTemperature(); h = dht.readHumidity(); dps.getTemperature(&Temperature); //опрос датчика влажности и темперетуры раз в минуту
     k = analogRead(A0); k = map(k, 0, 1023, -9, 9); if (h < 70) k = k + 4;  Temperature = Temperature + k;}          //корректировка +- 0,9 градуса
   if(minu > 59) {minu = 0; chas++; povorot++; ventil++; EEPROM.write(2, chas);}      //сохранение текущего часа инкубации
   if(chas > 23) {chas = 0; day++; EEPROM.write(4, day); parametri();} }           //сохранение текущего дня инкубации, изменение параметров  в зависимости от дня инкубации

                                                                                                //Поворот яиц---------------------------------------------------------------  
if ((pov) && (povorot >= 3)) {digitalWrite(privod_povorota, HIGH); povorot = 0; delay(500); digitalWrite(privod_povorota, LOW); p = !p;}

                                                                                                //вентиляция яиц------------------------------------------------------------
if ((vent) && (ventil >= 12)) {digitalWrite(ventilator, HIGH); ventil = 0; ; analogWrite(pwm, 0);
   lcd.clear(); lcd.setCursor(2, 0); lcd.print("Проветривание"); delay(1080000);                   //остановка всей программы, проветривание инкубатора 18 минут---------
   minu = minu + 18; digitalWrite(ventilator, LOW); lcd.clear(); }
 
                                                                                                //работа насоса поддержания влажности-------------------------------------
if ((Temperature > t - 5) && (minu == 10) && (h < H) && (sek == 0)) digitalWrite(nasos, HIGH);
if ((digitalRead(2)) && (sek > 5)) digitalWrite(nasos, LOW);              //насос рвботает 5 сек, время определяется опытным путем

                                                                                                //печать на дисплей--------------------------------------------------------  
   lcd.setCursor(0, 0); if (chas < 10) lcd.print("0"); lcd.print(chas);
   lcd.setCursor(3, 0); if (minu < 10) lcd.print("0"); lcd.print(minu);
   lcd.setCursor(6, 0); lcd.print("Д"); lcd.print(day); 
   lcd.setCursor(9, 0); if (k > 0) lcd.print("0"); lcd.print(k);          //корректирующий коэффициент
   lcd.setCursor(12, 0); lcd.print("H"); lcd.print(h,0); lcd.print("%");        //влажность
      
   lcd.setCursor(7, 1); lcd.print("i");   if (i < 20) lcd.print("0"); lcd.print(i/2); lcd.print("%");              //ШИМ на нагрев
   lcd.setCursor(12, 1); if (!digitalRead(0)) lcd.print("Авт"); else lcd.print("***");
   lcd.setCursor(0, 1); lcd.print(Temperature*0.1,1); lcd.print("*C ");
 
if ((m > 3) && (Temperature != t)) {nagrev(); m = 0;}   //работа нагревателя, выполнется раз в 4 минуты чтобы не мешать инерционности процессу
}
 
void nagrev()                              //работа нагревателя
{        
  if (Temperature <= t - 18) {error = (t - Temperature)/10; if (Temperature < b) kof++; i = 8 * (error + kof);}      //по условию греет до 36.0
  if ((Temperature > t - 18) && (Temperature < t) && (Temperature < b + 2)) i = i + 2;
  if ((Temperature > t) || (Temperature > b + 2)) i = i - 2;
  
  if (Temperature > t + 6) i = i - 6;
  if (Temperature >= t + 10) i = 10;                                     //если температура превышает заданную на 1 градус, мощность устанавливается 4%
  
  if ((Temperature < t - 10) && (Temperature < b)) i = i + 10;         //условия добавления мощности, если температура не поднимается
      
      b = Temperature;
      
  if ((i == 8) && (Temperature > t + 1)) {i = 0; m = 0;} //выключение нагревателя
  if ((i == 0) && (Temperature <= t)) i = 30;
  
  if (i <= 8 && i != 0) i = 8;  if (i >= 160) i = 160;    //ограничение мощности до 80%
  analogWrite(pwm, i); 
}

void parametri()                //изменение параметров  в зависимости от дня инкубации
{
  if (day > 17) {t = 370; H = 85; pov = false;}
  if (day < 15) {t = 377; H = 60; vent = true;}
  if (day < 12) t = 378;
  if (day < 2)  t = 380; 
}

 

neverok
Offline
Зарегистрирован: 19.01.2017

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

Как говорил раньше лотки поворачивают сервомоторы, нагреватель хочу поставить 12 вольтовый (пластины)  и скомутировать через релле.

Хочу взять ваш код и подтянуть под свое железо но врятли сам справлюсь ;)

Emeljanowich
Emeljanowich аватар
Offline
Зарегистрирован: 30.04.2015

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

neverok
Offline
Зарегистрирован: 19.01.2017

буду использовать корпус небольшой морозильной камеры 50/60 яиц. На выходных буду на даче сфоткаю макет поворотного механизма, я сразу делаю с пластика (ПВХ) макет а потом уже зная какие где детали буду их изготавливать из подходящего материала. Код поворота :

#include <Servo.h>
Servo myservo;

void setup()
{
 
myservo.attach(2);


}
void loop() {
myservo.attach(2); 
myservo.write(70);
delay(1000);
myservo.detach();
delay(5000);
myservo.attach(2);  
myservo.write(0);
delay(1000);
myservo.detach();
delay(5000);

}

delay(5000) поменять на время между поворотами,

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

 

neverok
Offline
Зарегистрирован: 19.01.2017

я хотел сразу использовать цифровой термо регулятор (https://ru.aliexpress.com/item/1pcs-48-40mm-Xh-w1209-Digital-Temperature-Controller-High-precision-Temperature-Controller-Micro-temperature-Control-Board/32786169364.html?spm=2114.03020208.6.4.1locgd&s=p) и ардуинку на все остальное но мне ето не очень нравится. Как-то не серьёзно :)

neverok
Offline
Зарегистрирован: 19.01.2017

сбросьте адрес почты у меня есть видео поворотного механизма

Emeljanowich
Emeljanowich аватар
Offline
Зарегистрирован: 30.04.2015

Поворот яиц - это очень ответственный момент. Ваши серво должны быть с запасом по мощности, и по- хорошему, обратная связь с мк, о выполненном повороте. Если вы напишете делей(2 часа) между поворотами, то ваш атмега больше ничего не сможет делать, кроме как ждать. Необходимо задать условие - скажем, по истечении 2х часов выполнить часть этого кода.
Терморегулятор хорошая вещь, но если у вас есть мощнейший мк, который сам всё может, зачем тогда лишние затраты. Нужен точный датчик температуры типа 18D20 или подобный. Он умеет считать десятые доли градуса. Но вообще, если о вашем проекте, можно и простой терморезистор или DHT11/ DHT22, т.к. нагреватель ваш работает в релейном режиме с гистерезисом в ~2 градуса.
Почта: Emeljanowich@mail.ru

neverok
Offline
Зарегистрирован: 19.01.2017

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

neverok
Offline
Зарегистрирован: 19.01.2017

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

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

Emeljanowich, а почему отказались от симисторного регулирования накалом, деталей примерно так же, зато нет тепловыделения на силовом элементе и сам он  дешевле.
Для температуры-влажности SHT** хороши, правда дороги если с DHT11 сравнивать.

MVN123P
Offline
Зарегистрирован: 29.07.2016

Собрал автоматику инкубатора по схеме Umka http://arduino.ru/forum/proekty/prostoi-umnyi-inkubator

Пользуюсь им 2-й год (9 инкубаций) очень доволен, результат -ОТЛИЧНЫЙ!!!!

В автоматике реализовано все: Регулировка температуры ПИД, контроль по 2-м цифровым датчикам (DS18b20, SHT10), управление и контроль влажностью, управление переворотом лотков, оповещение в случае аварии (недогрев), оповещение и сбросс температуры в случае перегрева, дополнительный автоматический нагреватель и т.д. 

neverok
Offline
Зарегистрирован: 19.01.2017

я думаю сделать таймер отдельно от ардуино и по сигналу от него переворачивать. Ардуино научить считать перевороты и на какомто перевороте отключить таймер. (как-то так)

Как Вы думаете ?

Emeljanowich
Emeljanowich аватар
Offline
Зарегистрирован: 30.04.2015

Отдельно не нужно делать никакие таймеры! Ардуино вам все посчитает, и если придет время отключит поворот. Программно это все можно сделать, я Вам помогу. По вашему видео о повороте: я вот сомневаюсь, что серва потянет. Вам нужно реальные условия смоделировать. И динамику поворота надо бы поубавить - это тоже программно, вечером выложу код для этого.
bwn (ну и странный ж у вас логин), с вами полностью согласен. Главное результат, а совершенствовать можно до бесконечности ;)

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

Emeljanowich пишет:
bwn (ну и странный ж у вас логин)

А что в ФИО может быть странного? Вот Харитонова Ульяна Яковлевна, гораздо хуже.))))

MVN123P
Offline
Зарегистрирован: 29.07.2016

neverok пишет:

я хотел сразу использовать цифровой термо регулятор (https://ru.aliexpress.com/item/1pcs-48-40mm-Xh-w1209-Digital-Temperature-Controller-High-precision-Temperature-Controller-Micro-temperature-Control-Board/32786169364.html?spm=2114.03020208.6.4.1locgd&s=p) и ардуинку на все остальное но мне ето не очень нравится. Как-то не серьёзно :)

Термостат то цифровой, а вот датчик температуры - аналоговый (терморезистор)

p.s. Однажды сталкивался с таким - результат огорчил.

neverok
Offline
Зарегистрирован: 19.01.2017

Emeljanowich пишет:
По вашему видео о повороте: я вот сомневаюсь, что серва потянет. Вам нужно реальные условия смоделировать.

на один серво будет три лотка на подшипниках на 20яиц будет три серво

neverok
Offline
Зарегистрирован: 19.01.2017

Вы говорите об етом:

Регистры сравнения

В регистрах сравнения хранятся данные, которые постоянно сравниваются с состоянием таймера/счетчика. Установим регистр сравнения (OCR0A) для генерации другого прерывания где-то в середине этого счета. Приведенный ниже код будет генерировать прерывание TIMER0_COMPA всякий раз, когда значение счетчика проходит 0xAF.

// Timer0 уже используется millis() - мы создаем прерывание где-то // в середине и вызываем ниже функцию "Compare A" OCR0A = 0xAF; TIMSK0 |= _BV(OCIE0A);
1
2
3
4
	
// Timer0 уже используется millis() - мы создаем прерывание где-то
// в середине и вызываем ниже функцию "Compare A"
OCR0A = 0xAF;
TIMSK0 |= _BV(OCIE0A);

Затем определим обработчик прерывания для вектора прерывания по таймеру, называемому TIMER0_COMPA_vect. В этом обработчике прерывания будет делаться все то, что мы ранее делали в loop ().
// Прерывание вызывается один раз в миллисекунду SIGNAL(TIMER0_COMPA_vect) { unsigned long currentMillis = millis(); sweeper1.Update(currentMillis); //if(digitalRead(2) == HIGH) { sweeper2.Update(currentMillis); led1.Update(currentMillis); } led2.Update(currentMillis); led3.Update(currentMillis); }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
	
// Прерывание вызывается один раз в миллисекунду
SIGNAL(TIMER0_COMPA_vect)
{
unsigned long currentMillis = millis();
sweeper1.Update(currentMillis);
 
//if(digitalRead(2) == HIGH)
{
  sweeper2.Update(currentMillis);
  led1.Update(currentMillis);
}
 
led2.Update(currentMillis);
led3.Update(currentMillis);
}

Что оставляет нас с абсолютно пустым loop ()
void loop() { }
1
2
3
	
void loop()
{
}

Здесь мы теперь можем делать все что угодно. Можно даже вернуться к использованию delay ()! Это не затронет наши мигающие светодиоды и вращающиеся сервы. Они будут по-прежнему независимо вызываться один раз в миллисекунду.

 

Emeljanowich
Emeljanowich аватар
Offline
Зарегистрирован: 30.04.2015

Не, всё намного проще. Посмотрите внимательно мой код, там есть переменная, которая плюсует 1 каждый час. Когда она больше 2х т.е. = 3, выполняется условие поворота и переменная обнуляется. И так погругу пока день станет > 18.
Внутри у сервы очень маленькие хлюпинькие шестерни - особенно у самых дешевых китайских. Запас прочности маленький, подумайте, пока не поздно,о чем то более серьёзном.

Emeljanowich
Emeljanowich аватар
Offline
Зарегистрирован: 30.04.2015

Загрузите этот код и проверьте работу нагруженной сервы

#include <Servo.h>
Servo myservo;
byte sek, minu, chas, povorot, day;//значение часов
long prevmicros = 0;//переменная для хранения значений таймера
boolean counter, i = false;
#define led 13

void setup()
{
 
myservo.attach(2);
myservo.write(0);  //при старте серво устанавливается в 0
pinMode(led, OUTPUT);


}
void loop() {
   if (micros() - prevmicros > 500000)
  {
      prevmicros = micros();  counter=!counter;  
      if (counter == false) digitalWrite(led, HIGH); 
      else  
    {
      sek++; digitalWrite(led, LOW);
    } 
   
   if(sek > 58)  
    {
      sek = 0; minu++; povorot++; if (povorot > 1) {povoroti(); povorot = 0;} //каждые две минуты, когда переменная povorot будет = 2 или больше, будет выполняться цикл povoroti
    }          
   if(minu > 59) {minu = 0; chas++;} 
   if(chas > 23) {chas = 0; day++;} 
 }    
}
  
  
void povoroti()
  {
    if (i == false) {for (int i = 0; i <= 70; i += 2) {myservo.write(i);  delay(200);} sek += 7; } //серво повернет на угол в 70* через 7 сек, тем самым уменьшится динамика поворота
  
    if (i == true) {for (int i = 70; i <= 0; i -= 2) {myservo.write(i);  delay(200);} sek += 7; }
  }

MVN123P, я уверен, что мой проект дешевле, 3 раза выводил в нем цыплят, ни разу не было серьезных проблем. Только программную часть раз 100 допиливал ;) И мой расчет мощности на нагрев работает не хуже хваленого ПИДа. На теперешний момент, только симистор туда поставил бы вместо транзистора, и то это по замечанию bwn. Планирую переделать лоток, что бы туда можно было >= 300 яиц ложить, но пока нет в этом необходимости.  

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

Emeljanowich пишет:

 На теперешний момент, только симистор туда поставил бы вместо транзистора, и то это по замечанию bwn.

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

neverok
Offline
Зарегистрирован: 19.01.2017
sek=0; minu++; povorot++;  if (povorot > 1){povoroti(); povorot = 0;}

ошбка

exit status 1
'povoroti' was not declared in this scope

я так понял функция обьявлена внутри функции я сделал


  if(sek > 58) 
28	   
29	      sek = 0; minu++; povorot++; if (povorot > 1)  //каждые две минуты, когда переменная povorot будет = 2 или больше, будет выполняться цикл povoroti
30	          
31	   if(minu > 59) {minu = 0; chas++;}

кампиляция прошла серво поворачивает лоток и есть дребезг я раньше отключал его функцией

myservo.detach();

куда ее вписать и как показать что после поворота povorot=0

извените может сильно туплю:)

Emeljanowich
Emeljanowich аватар
Offline
Зарегистрирован: 30.04.2015

Попробуйте так. Щас серва под рукой, все проверил.

#include <Servo.h>
Servo myservo;
byte sek, minu, chas, povorot, day;//значение часов
long prevmicros = 0;//переменная для хранения значений таймера
boolean counter, a;
#define led 13

void setup()
{
 
myservo.attach(2);
myservo.write(0); delay(1000); myservo.detach(); //при старте серво устанавливается в 0
pinMode(led, OUTPUT);


}
void loop() {
   if (micros() - prevmicros > 500000)
  {
      prevmicros = micros();  counter=!counter;  
      if (counter == false) digitalWrite(led, HIGH); 
      else  
    {
      sek++; digitalWrite(led, LOW);
    } 
   
   if(sek > 59)  
    {
      sek = 0; minu++; povorot++; if (povorot > 0) {myservo.attach(2); povoroti(); povorot = 0; myservo.detach();} //каждую минуту, когда переменная povorot будет = 1 или больше, будет выполняться цикл povoroti
    }          
   if(minu > 59) {minu = 0; chas++;} 
   if(chas > 23) {chas = 0; day++;} 
 }    
}
  
  
void povoroti()
  {
   switch (a) {
  case 0: for (int i = 0; i <= 70; i++) {myservo.write(i);  delay(100);} sek += 7; a = 1; break; //серво повернет на угол в 70* за 7 сек, тем самым уменьшится динамика поворота
  case 1: for (int i = 70; i <= 140; i++) {myservo.write(140 - i);  delay(100);} sek += 7;  a = 0; break;}  
  }

 

neverok
Offline
Зарегистрирован: 19.01.2017

та же ошибка с строчкой 29  и я пошол другим путём:

  #include <Servo.h>
 Servo myservo;
  byte sek, minu, chas, povorot, day;//значение часов
  long prevmicros = 0;//переменная для хранения значений таймера
  boolean counter, a;
  #define led 13
  int Pin=(12,8);
int inputPin=(9,10);

  int e;
int val=0;

  void setup()
 {
    
  myservo.attach(2);
  myservo.write(0); delay(1000); myservo.detach(); //при старте серво устанавливается в 0   
  pinMode(led, OUTPUT);
  pinMode(8, OUTPUT);
   pinMode( 9,INPUT);
    pinMode( 10,INPUT);
   
  
   e= (1);
   
  }
  void loop()
  {
    val = digitalRead( 9);
    if (val == HIGH){myservo.attach(2);
  myservo.write(30); delay(1000); myservo.detach();}
  val = digitalRead( 10);
    if (val == HIGH){myservo.attach(2);
  myservo.write(70); delay(1000); myservo.detach();}
    
     if (micros() - prevmicros > 500000)
    {
        prevmicros = micros();  counter=!counter; 
        if (counter == false) digitalWrite(led, HIGH);
        else 
      {
     e++;
     sek++; digitalWrite(led, LOW);
     }
     
     if(e > 21606){e=0;}
     if(sek > 59) 
     {
       sek = 0; minu++; povorot++; 
//     if (povorot > 0) {myservo.attach(2), povoroti(), povorot = 0, myservo.detach();} //каждую минуту, когда переменная povorot будет = 1 или больше, будет выполняться цикл povoroti
      } 
      if(e==10800){digitalWrite(8, HIGH);}
if ( e==10805){digitalWrite(8, LOW);}
      if(e==21600){digitalWrite(12, HIGH);}
 if ( e==21605){digitalWrite(12, LOW);}
     if(minu > 59) {minu = 0; chas++;}
     if(chas > 23) {chas = 0; day++;}
    
  }   
 }

с 12 на 10 и с 8 на 9 пин через делитель подаю сигнал  получаю поворот что скажете?

neverok
Offline
Зарегистрирован: 19.01.2017

вот проверил просто и работает

 #include <Servo.h>
 Servo myservo;
  byte sek, minu, chas, povorot, day;//значение часов
  long prevmicros = 0;//переменная для хранения значений таймера
  boolean counter, a;
  #define led 13
  int Pin=(12,8);
//int inputPin=(9,10);
//int pov;
  int e;
//int val;
//int valr;
  void setup()
 {
    
  myservo.attach(2);
 myservo.write(35); delay(1000); myservo.detach(); //при старте серво устанавливается в 0   
  pinMode(led, OUTPUT);
  pinMode(8, OUTPUT);
   pinMode(9,INPUT);
  
  
   e= (0);
   
  }
  void loop()
  {
  
    
     if (micros() - prevmicros > 500000)
    {
        prevmicros = micros();  counter=!counter; 
        if (counter == false) digitalWrite(led, HIGH);
        else 
      {
     e++;
     sek++; digitalWrite(led, LOW);
     }
     
     if(e > 21600){e=0;}
     if(sek > 59) 
     {
       sek = 0; minu++; 

      } 
      if(e==10800){myservo.attach(2);
  myservo.write(40); delay(500); myservo.write(50); delay(500); myservo.write(70); delay(500); myservo.detach();}

     if(e==21600){myservo.attach(2);
  myservo.write(30); delay(500); myservo.write(20); delay(500); myservo.write(0); delay(500); myservo.detach();}

     if(minu > 59) {minu = 0; chas++;}
     if(chas > 23) {chas = 0; day++;}
    
  }   
 }

для проверки менял значение е

if(e > 59){e=0; povorot++;}
     if(sek > 59) 
     {
       sek = 0; minu++; 

      } 
      if(e==20){myservo.attach(2);
  myservo.write(40); delay(500); myservo.write(50); delay(500); myservo.write(70); delay(500); myservo.detach();}

     if(e==40){myservo.attach(2);
  myservo.write(30); delay(500); myservo.write(20); delay(500); myservo.write(0); delay(500); myservo.detach();}

     if(minu > 59) {minu = 0; chas++;}
     if(chas > 23) {chas = 0; day++;}
    if(povorot==5){digitalWrite(8,HIGH);}
    if(povorot==10){digitalWrite(12,HIGH);}

у меня вопрос функция ++ до скольки считает?

neverok
Offline
Зарегистрирован: 19.01.2017

Emeljanowich подскажите какие Вы брали датчики насос и дисплей хочу сегодня заказать все

Emeljanowich
Emeljanowich аватар
Offline
Зарегистрирован: 30.04.2015

Все детали указанны в постах выше. Пожалуйста, внимательно посмотрите.

Emeljanowich
Emeljanowich аватар
Offline
Зарегистрирован: 30.04.2015

у меня вопрос функция ++ до скольки считает?

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

neverok
Offline
Зарегистрирован: 19.01.2017

понял спасибо

ромаха28
Offline
Зарегистрирован: 17.06.2016

Здравствуйте. Начал знакомится с ардуино,купил уно,кейпад шилд,пару датчиков,дс 18б20 и sht 21.Решил сделать инкубатор,на форуме "перепелка" скачал скетч,все работает,но после нескольких минут работы на экране появляются кракозябры.В чем может быть причина?Прошу помощи!При нажатии rst все становится как надо. но пото сново фигня какая то!

 

Emeljanowich
Emeljanowich аватар
Offline
Зарегистрирован: 30.04.2015

Здравствуйте! По-вашему, я на кофейной гуще ответ на ваш вопрос искать буду? :р Нужен скетч, пару фото что да как. Тогда и попробую помочь.

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

Для начала берем спирит, щетку зубную и тщательно промываем все места засранные флюсом. Ну и надеюсь это все не на макетке с воткнутыми проводами.

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

Он мой скетч скачал, тут есть кстати. Дисплей лагает по причине недостаточного питания, длинных проводов I2C, плохой подтяжки шины и прочих помех. Проблема 100% аппаратная.

И вот вам диммер-шиммер. Код тут есть, "attiny85 и прерывание " почему-то называется. Рулится по i2c или по ШИМ. Код щас кину свежий.

https://www.youtube.com/watch?v=wXA2jGXWzno

Emeljanowich
Emeljanowich аватар
Offline
Зарегистрирован: 30.04.2015

Пост №28, (bwn спасибо!) Отлично работает не нужны никакие атину85. Собрал три схемы по примеру, все сразу заработало, причем идеально без скачков провалов, остановок, мерцаний, какой бы код не был в лоопе и сколько бы не ставили делеев.

ромаха28
Offline
Зарегистрирован: 17.06.2016

Роман, скетч Александра( Папа псих[code]

 
Emeljanowich
Emeljanowich аватар
Offline
Зарегистрирован: 30.04.2015

ромаха28, во-первых, ознакомьтесь с правилами написания и вставки кода на данном сайте, а во-вторых, Umka вам всё разъяснил!

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

Emeljanowich пишет:
Пост №28, (bwn спасибо!) Отлично работает не нужны никакие атину85. Собрал три схемы по примеру, все сразу заработало, причем идеально без скачков провалов, остановок, мерцаний, какой бы код не был в лоопе и сколько бы не ставили делеев.

Ну, не так все сладко, есть проблемы когда что то запрещает прерывания, тогда наблюдаются помигивания. Для инкуба или другого термостата это без разницы, а вот если это освещение.((( На отдельном МК таких проблем точно не будет, ну или 20 независимых каналов потребуется, на I2C вешай хоть сотню.

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

А, тот код в Flprog создан и понять в нем что-то все равно что в бинарнике ковыряться. Диммеры наверное все перепробовал в коде инкубатора - не работают они ровно. В чистом микроконтроллере работают, а с кодом инкубатора нет. Поэтому сделал на отдельной тиньке, ей цена то 50р. Сейчас залью её в эпоксидку и можно прямо к нагревателя ставить. Подальше убрать 220 от контроллера. Ну тут оно дело хозяйское.

neverok
Offline
Зарегистрирован: 19.01.2017

вот собрал проверте может чтото не так (влажность и количество поворотов пока не сделал)

#include <Servo.h>
Servo myservo;
#include <dht11.h>

dht11 DHT11;
#include <LiquidCrystal.h>
#define DHT11PIN 8
//int time =0;
byte sek, minu, chas, povorot, day;
long prevmicros = 0;
boolean counter, i = false;
  #define led 13
int e;
LiquidCrystal lcd(7,6,5,4,3,2);
int pin(10,9);
int val=0;
void setup()

{
 myservo.attach(11);
 myservo.write(35); delay(1000); myservo.detach();
  lcd.begin(16,2);
  lcd.setCursor(0,0);
  lcd.print("D    CH    MI");
  lcd.setCursor(0,1);
  lcd.print("TE    C HU    %");
  pinMode(10, OUTPUT);
   pinMode(led, OUTPUT);
    e= (1);
}
void loop()
{
  if (DHT11.temperature >37){digitalWrite(9,HIGH);}
   else {digitalWrite(9,LOW);}      // нагреватель 
   
  if(e==10800){myservo.attach(2);
  myservo.write(40); delay(500); myservo.write(50); delay(500); myservo.write(70); delay(500); myservo.detach();} // поворот

     if(e==21600){myservo.attach(2);
  myservo.write(30); delay(500); myservo.write(20); delay(500); myservo.write(0); delay(500); myservo.detach();} // поворот
    if (micros() - prevmicros > 500000)
  {
      prevmicros = micros();  counter=!counter;  
      if (counter == false) digitalWrite(led, HIGH); 
      else  
    {
       e++;
      sek++; digitalWrite(led, LOW);
    } 
    if(e > 21606){e=0;}
   if(sek > 59)  
    {
      sek = 0; minu++;
    }          
   if(minu > 59) {minu = 0; chas++;} 
   if(chas > 23) {chas = 0; day++;} 
 }
     
   int chk = DHT11.read(DHT11PIN);  
  digitalWrite(10,HIGH);           //дисплей 
  lcd.setCursor(2,0);
  lcd.print(sek);
  lcd.setCursor(8,0);
  lcd.print(chas);
  lcd.setCursor(14,0);
  lcd.print(minu);
  lcd.setCursor(3,1);
  lcd.print(DHT11.temperature, 1);
  lcd.setCursor(11,1);
  lcd.print(DHT11.humidity, 1);
  
//delay(1000);
 // time++;
}

 

Emeljanowich
Emeljanowich аватар
Offline
Зарегистрирован: 30.04.2015

Для новичка сойдет. С первого взгляда такие моменты бросаются: подсветку дисплея не нужно от мк запитывать, переменную е нужно к минутам привязать и даже лучше к часам, т.е. не нужно ее считать до 10800, а до двух и обнулить (в условие проверки минут её напишите), нет смысла опрашивать датчик температуры и влажности и посылать байты данных на дисплей примерно 10 млн раз в секунду, нужно это привязать к условию проверки секунд и делать это раз в секунду (простите за масло-масленное). Я бы сделал управление нагревателем более точным - привязал бы его потребляемую мощность к количеству потерь и управлял бы ШИМом или фазовым методом (#28 - обратите внимание). Вообщем вы на верном пути, продолжайте!

neverok
Offline
Зарегистрирован: 19.01.2017

Подсветку дисплея хочу поставить на датчик движения  инкубатор маме делаю (кнопки зло)  ;) , переменную исправил, датчик исправил, нагреватели у меня из 3D принтера вставленые в радиатор а он прикручен до внутренёго алюмин. корпуса через термопасту плюс стоит кулер на обдув  радиатора. Через пол часа подымается температура на 37 градусов и внутрений корпус равномерно прогрет, может не надо игратся с шим полёвик отлично справляется. Хочу поставить LM35DZ TO92   датчик температуры и более точно по (пингвинам) настроить, как Вы думаете?

#include <Servo.h>
Servo myservo;
#include <dht11.h>

dht11 DHT11;
#include <LiquidCrystal.h>
#define DHT11PIN 8
//int time =0;
byte sek, minu,m, chas, povorot, day;
long prevmicros = 0;
boolean counter, i = false;
  #define led 13
int e;
LiquidCrystal lcd(7,6,5,4,3,2);
int pin(10,9);
int val=0;
void setup()

{

 myservo.write(35); delay(1000); myservo.detach();
  lcd.begin(16,2);
//lcd.setCursor(0,0);
// lcd.print("D    CH    MI");
// lcd.setCursor(0,1);
//lcd.print("TE    C HU    %");
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
   pinMode(led, OUTPUT);
    e=minu ;
}
void loop()
{
 
  if (DHT11.temperature >37){digitalWrite(9,HIGH);}
   else {digitalWrite(9,LOW);}      // нагреватель 
   
  if(e==1){myservo.attach(2);
  myservo.write(40); delay(500); myservo.write(50); delay(500); myservo.write(70); delay(500); myservo.detach();} // поворот

   if(e==2){myservo.attach(2);
 myservo.write(30); delay(500); myservo.write(20); delay(500); myservo.write(0); delay(500); myservo.detach();} // поворот
    if (micros() - prevmicros > 500000)
  {
      prevmicros = micros();  counter=!counter;  
      if (counter == false) digitalWrite(led, HIGH); 
      else  
    {
     
      sek++; digitalWrite(led, LOW); int chk = DHT11.read(DHT11PIN); lcd.clear();
    } 
    if(e > 2){e=0;}
   if(sek > 59)  
    {
      sek = 0; minu++ ;m++;   
      } 
       //if (sek>30); {int chk = DHT11.read(DHT11PIN); }         
   if(minu > 59) {minu = 0; chas++;} 
   if(chas > 23) {chas = 0; day++;} 
 }
   
 // int chk = DHT11.read(DHT11PIN);
    
  digitalWrite(10,HIGH);           //дисплей 
  lcd.setCursor(0,1);
  lcd.print(sek);
  lcd.setCursor(0,0);
  lcd.print("DAY");
  lcd.setCursor(4,0);
  lcd.print("CH");
  lcd.setCursor(4,1);
  lcd.print(chas);
  lcd.setCursor(7,0);
  lcd.print("MI");
   lcd.setCursor(7,1);
  lcd.print(minu);
  lcd.setCursor(10,0);
  lcd.print("T");
  lcd.setCursor(10,1);
  lcd.print(DHT11.temperature, 1);
  lcd.setCursor(13,0);
 lcd.print("H");
 lcd.setCursor(13,1);
 lcd.print(DHT11.humidity, 1);
  
//delay(1000);
 // time++;

}

 

Emeljanowich
Emeljanowich аватар
Offline
Зарегистрирован: 30.04.2015

Я, наверное, сбиваю вас с толку. В коде я не нашёл где переменная е плюсуется и зачем ей присваивается значение минут? Дисплей нет необходимости очищать каждые пол секунды. LM35 - это вроде аналоговый датчик, как терморезистор работает. В вашем случаи сгодится. Нужно настраивать все конечно в реальных условиях (по пингвинам). Немного измененный ваш код приведен ниже.

#include <Servo.h>
Servo myservo;
#include <dht11.h>

dht11 DHT11;
#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6,5,4,3,2);
#define DHT11PIN 8
#define led 13

byte sek, minu, chas, day;
long prevmicros = 0;
boolean counter, i = false;
int e;



void setup()
{
  myservo.write(35); delay(1000); myservo.detach();
  lcd.begin(16,2);
  pinMode(10, OUTPUT);  pinMode(9, OUTPUT); pinMode(led, OUTPUT);
  digitalWrite(10,HIGH); 
}


void loop()
{
 
     if (micros() - prevmicros > 500000)
  {
      prevmicros = micros();  counter=!counter;  
      if (counter == false) digitalWrite(led, HIGH); 
      else  
    {
     sek++; digitalWrite(led, LOW); int chk = DHT11.read(DHT11PIN); 
          
      if (DHT11.temperature > 37) digitalWrite(9,HIGH);   // нагреватель - выполняется каждую секунду
      else digitalWrite(9,LOW);      
                               
        lcd.setCursor(0,1);     //дисплей
        lcd.print(sek);
        lcd.setCursor(0,0); 
        lcd.print("DAY");
        lcd.setCursor(4,0);
        lcd.print("CH");
        lcd.setCursor(4,1);
        lcd.print(chas);
        lcd.setCursor(7,0);
        lcd.print("MI");
         lcd.setCursor(7,1);
        lcd.print(minu);
        lcd.setCursor(10,0);
        lcd.print("T");
        lcd.setCursor(10,1);
        lcd.print(DHT11.temperature, 1);
        lcd.setCursor(13,0);
       lcd.print("H");
       lcd.setCursor(13,1);
       lcd.print(DHT11.humidity, 1);
    } 
  
   if(sek > 59)  
    {
      sek = 0; minu++ ;m++;   
    } 
       
   if(minu > 59) 
   {
    minu = 0; chas++;
    e++; 
          if (e == 2) //поворот через два отсчета, т.е. два часа
        {
          myservo.attach(2); myservo.write(40); delay(500); myservo.write(50); delay(500); myservo.write(70); delay(500); myservo.detach();
        } // поворот
          if (e == 4)
        {
          myservo.attach(2); myservo.write(30); delay(500); myservo.write(20); delay(500); myservo.write(0); delay(500); myservo.detach();
        } // поворот
    if (e >= 4); e = 0;    
   } 
   
    if(chas > 23) {chas = 0; day++;} 
  }
   

}

 

neverok
Offline
Зарегистрирован: 19.01.2017

я не правельно привязал серво наверное буду возвращатся к е++

if(e==10800){myservo.attach(2);
37
	  myservo.write(40); delay(500); myservo.write(50); delay(500); myservo.write(70); delay(500); myservo.detach();} // поворот
38
	 
39
	     if(e==21600){myservo.attach(2);
40
	  myservo.write(30); delay(500); myservo.write(20); delay(500); myservo.write(0); delay(500); myservo.detach();} // поворот