инкубатор под управлением Ардуино Уно

tamerlan37
Offline
Зарегистрирован: 22.10.2013

Всем привет,надеюсь что не повторяю тему,поиском не нашел.Итак по суте.Хочу сделать инкубатор для яиц птицы нужно следующее:

-поддерживать температуру в заданом пределе

-переворачивать яйца через заданый интервал

-поддерживать влажность

-прекращать перевороты по истечению определеного срока (конец инкубации)

-Увеличивать влажность в этот же период

 из апаратной части:

-Funduino(arduino клон) UNO

-ЛСД дисплей16*2

-датчик температуры и влажности DHT11

-Tiny RTC I2C RTC ds1307

-блок реле

-нагреватель

-генератор влажности(возможно пьезо туманогенератор)

-моторедуктор для переворота.

На данном этапе измеряется температура и влажность с выводом на экран и сериал монитор,есть управление включением нагревателя и включением моторедуктора(в моторедукторе концевые выключатели )или шаговый мотор пока еще не определился.

Все настройки вностяся в програму при составлении, кнопок нет .

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

Код в теперешнем состоянии

int led2 = 4;//  "таймер переворот"
int led3 = 2;// нагреватель 
int led4 = 5;//туманогенератор
#include <DS1307RTC.h>
#include <Time.h>
#include <Wire.h>
#include <LiquidCrystal.h>
#include "DHT.h"
   
#define DHTPIN 3 // куда подключен термодатчик

#define DHTTYPE DHT11   // DHT 11 используемый термодатчик
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);

LiquidCrystal lcd(8, 9, 10, 11, 12, 13);
void setup() {
  Serial.begin(9600);
  dht.begin();
  while (!Serial) ; // wait for serial
  delay(200);
  pinMode(led2, OUTPUT);// сигнал "таймер"
  pinMode(led3, OUTPUT);// сигнал нагрева 
  pinMode(led4,OUTPUT);//сигнал туманогенератора
  Serial.println("DS1307RTC Read Test");
  Serial.println("-------------------");
lcd.begin(16, 2);
  // печатаем первую строку
  lcd.print("Inkubator" );
 lcd.setCursor(1, 1);
 delay(500);
  // печатаем вторую строку
  lcd.print("tamerlan-1");
  delay(500);
}


void loop() {
  
   float h = dht.readHumidity();//обозначение влажности
  float t = dht.readTemperature(); //обозначение температуры


  tmElements_t tm; //вывод на экран дата и влажность
  {lcd.setCursor(0, 1);
  print2digits(tm.Day);
  lcd.write('/');
  print2digits(tm.Month);
  lcd.write('/');
  lcd.print(tmYearToCalendar(tm.Year));
  lcd.write('h');
  print2digits (h);
  lcd.write("*H ");
 lcd.setCursor(0, 0);//вывод на экран время и температура
 print2digits(tm.Hour);
  lcd.write(':');
  print2digits(tm.Minute);
  lcd.write('`');
  print2digits(tm.Second);
  
  lcd.write('t');
  print2digits (t);
  lcd.write("*C ");
}
  if (RTC.read(tm)) //информацыя в sereal monitor
  {
    Serial.print("Ok, Time = ");
    Serial.print(tm.Hour);
    Serial.write(':');
    Serial.print(tm.Minute);
    Serial.write(':');
    Serial.print(tm.Second);
    Serial.print(", Date (D/M/Y) = ");
    Serial.print(tm.Day);
    Serial.write('/');
    Serial.print(tm.Month);
    Serial.write('/');
    Serial.print(tmYearToCalendar(tm.Year));
    Serial.println();
  } else {
    if (RTC.chipPresent()) {
      Serial.println("The DS1307 is stopped.  Please run the SetTime");
      Serial.println("example to initialize the time and begin running.");
      Serial.println();
    } else {
      Serial.println("DS1307 read error!  Please check the circuitry.");
      Serial.println();
    }
    delay(900);
  }
  delay(500);
  
 if ((tm.Second)>58) //условия таймера
 {
 digitalWrite(led2, HIGH);//включает таймер
 Serial.print("Taimer On!!   ");//вывод инфо состояния 
 lcd.setCursor(13, 0);//вывод инфо состояния на LCD
 lcd.print("%");
 }
 else
 {
 digitalWrite(led2, LOW);
 Serial.print("Taimer OFF");
 }
 if (t<17)//условия терморегуляции
 {
 digitalWrite(led3,HIGH);
 Serial.print("Vkluchen nagrev!!");//вывод инфо состояния
 lcd.setCursor(15, 0);
 lcd.print("^");//вывод инфо состояния на LCD
 //delay (500);
 }
 else
 { digitalWrite(led3,LOW);
 Serial.print("Temp ok  ");//вывод инфо состояния
 lcd.setCursor(15, 0);
 lcd.print("~");//вывод инфо на LCD
 }
 
 if (h<60)//условия терморегуляции
 {
 digitalWrite(led4,HIGH);
 Serial.print("Vkluchen tuman!!");//вывод инфо состояния
 lcd.setCursor(14, 0);
 lcd.print("#");//вывод инфо состояния на LCD
 //delay (500);
 }
 else
 { digitalWrite(led4,LOW);
 Serial.print("Vlagnost ok  ");//вывод инфо состояния
 lcd.setCursor(14, 0);
 lcd.print("~");//вывод инфо состояния
 }
 
 
 
 
}

void print2digits(int number) {
  if (number >= 0 && number < 10) {
    lcd.write('0');
  }
  lcd.print(number);
}

 

tamerlan37
Offline
Зарегистрирован: 22.10.2013

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

int led2 = 4;//  "таймер переворот"
int led3 = 2;// нагреватель 
int led4 = 5;//туманогенератор
#include <DS1307RTC.h>
#include <Time.h>
#include <Wire.h>
#include <LiquidCrystal.h>
#include "DHT.h"
//#include <DateTime.h>
//#include <EEPROM.h>
#define DHTPIN 3 // куда подключен термодатчик

#define DHTTYPE DHT11   // DHT 11 используемый термодатчик
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);

LiquidCrystal lcd(8, 9, 10, 11, 12, 13);
void setup() {
  Serial.begin(9600);
  dht.begin();
  int day;
  while (!Serial) ; // wait for serial
  delay(200);
  pinMode(led2, OUTPUT);// сигнал "таймер"
  pinMode(led3, OUTPUT);// сигнал нагрева 
  pinMode(led4,OUTPUT);//сигнал туманогенератора
  Serial.println("DS1307RTC Read Test");
  Serial.println("-------------------");
lcd.begin(16, 2);
  // печатаем первую строку
  lcd.print("Inkubator" );
 lcd.setCursor(1, 1);
 delay(500);
  // печатаем вторую строку
  lcd.print("tamerlan-1");
  delay(500);
  /*EEPROM.write(WriteAddress,day);
    ++WriteAddress;
    Serial.println("                              MinTemp recorded");*/
  
}


void loop() {
  
   float h = dht.readHumidity();//обозначение влажности
  float t = dht.readTemperature(); //обозначение температуры
  float x = 5 ;

  tmElements_t tm; //вывод на экран дата и влажность
  {lcd.setCursor(0, 1);
  print2digits(tm.Day);
  lcd.write('/');
  print2digits(tm.Month);
  lcd.write('/');
  lcd.print(tmYearToCalendar(tm.Year));
  lcd.write('h');
  print2digits (h);
  lcd.write("*H ");
 lcd.setCursor(0, 0);//вывод на экран время и температура
 print2digits(tm.Hour);
  lcd.write(':');
  print2digits(tm.Minute);
  lcd.write('`');
  print2digits(tm.Second);
  
  lcd.write('t');
  print2digits (t);
  lcd.write("*C ");
}
  if (RTC.read(tm)) //информацыя в sereal monitor
  {
    Serial.print("Ok, Time = ");
    Serial.print(tm.Hour);
    Serial.write(':');
    Serial.print(tm.Minute);
    Serial.write(':');
    Serial.print(tm.Second);
    Serial.print(", Date (D/M/Y) = ");
    Serial.print(tm.Day);
    Serial.write('/');
    Serial.print(tm.Month);
    Serial.write('/');
    Serial.print(tmYearToCalendar(tm.Year));
    Serial.println();
  } else {
    if (RTC.chipPresent()) {
      Serial.println("The DS1307 is stopped.  Please run the SetTime");
      Serial.println("example to initialize the time and begin running.");
      Serial.println();
    } else {
      Serial.println("DS1307 read error!  Please check the circuitry.");
      Serial.println();
    }
    delay(900);
  }
  delay(500);
  //**************************************************************
  
  //**************************************************************
 if ((tm.Second)>58)if((tm.Day)<=x){//условия таймера
 digitalWrite(led2, HIGH);//включает таймер
 Serial.print("Taimer On!!   ");//вывод инфо состояния 
 lcd.setCursor(13, 0);//вывод инфо состояния на LCD
 lcd.print("%");
 }
 else
 {
 digitalWrite(led2, LOW);
 Serial.print("Taimer OFF");
 }
 //****************************************************************
 if (t<17)//условия терморегуляции
 {
 digitalWrite(led3,HIGH);
 Serial.print("Vkluchen nagrev!!");//вывод инфо состояния
 lcd.setCursor(15, 0);
 lcd.print("^");//вывод инфо состояния на LCD
 //delay (500);
 }
 else
 { digitalWrite(led3,LOW);
 Serial.print("Temp ok  ");//вывод инфо состояния
 lcd.setCursor(15, 0);
 lcd.print("~");//вывод инфо на LCD
 }
 
 //***********************************************************
 if (h<60)//условия регуляции влажности
 {
 digitalWrite(led4,HIGH);
 Serial.print("Vkluchen tuman!!");//вывод инфо состояния
 lcd.setCursor(14, 0);
 lcd.print("#");//вывод инфо состояния на LCD
 //delay (500);
 }
 else
 { digitalWrite(led4,LOW);
 Serial.print("Vlagnost ok  ");//вывод инфо состояния
 lcd.setCursor(14, 0);
 lcd.print("~");//вывод инфо состояния
 }
 
 //************************************************************
 
 
}

void print2digits(int number) {
  if (number >= 0 && number < 10) {
    lcd.write('0');
  }
  lcd.print(number);
}

 

altair
Offline
Зарегистрирован: 05.01.2014

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

В инкубаторе необходимо поддерживать температуру с достаточно высокой точностью (37,9-38,6), DHT 11 дает разрешение в 1 градус и погрешность +- 2 градуса.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

tamerlan37
Offline
Зарегистрирован: 22.10.2013

Вот обьеденил свой код с кодом меню одного из форумчан (dachnik)после небольшой переделки под свои нужды часть с меню работает а вот часть "терморегулятор" почемуто будто игнорируется нет вывода не на LCD не в Serial будто ее нет вовсе я и перемещал этучасть кода в void loop и в отдельную часть но не помогает.Может вы увидете в чем проблема.

// adress eeprom
/*EEPROM 0 //(Минимальное значение температуры актуатора) теперратура мин
EEPROM 1 //(Максимальное значение темп актуатора) температура макс
EEPROM 2 1/0 //включение отключение полива (0=off / 1=on)
EEPROM 3 //Продолжительность минут полива
EEPROM 4 //минута полива
EEPROM 5 //час полива
//цикл*/
//-------------------------------------м----------------------------------------------
int led2 = 4;//  "сигнал таймер переворот"
int led3 = 2;// сигнал нагреватель 
int led4 = 5;// сигнал туманогенератор
//-------------------------------------м----------------------------------------------

//LCD I2C 20x4
#include <DS1307RTC.h>
#include <Time.h>
#include <EEPROM.h>
//#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <LiquidCrystal.h>
//LiquidCrystal_I2C lcd(0x27,20,4);
//LCD
#include "DHT.h"
//------------------------------------мое----------------------------------------------------
#define DHTPIN 3 // куда подключен термодатчик

#define DHTTYPE DHT11   // DHT 11 используемый термодатчик
DHT dht(DHTPIN, DHTTYPE);

LiquidCrystal lcd(8, 9, 10, 11, 12, 13);
//------------------------------------мое----------------------------------------------------

//кнопка
// задаем константы
const int buttonPin = 15;     // номер входа, подключенный к кнопке
const int buttonPin_1 = 16;  //левая кнопка 
const int buttonPin_0 = 14;  //правая кнопка
const int led =  17;      // номер выхода светодиода 
/*
#define buttonEnterPin = 15;
#define buttonPlusPin = 14;
#define buttonMinusPin = 16;
#define EnterPressed   !digitalRead(buttonEnterPin);
#define PlusPressed    !digitalRead(buttonPlusPin);
#define MinusPressed   !digitalRead(buttonMinusPin);
*/
// переменные
int buttonState = 0;         // переменная для хранения состояния кнопки
int buttonState_1 = 0;         // переменная для хранения состояния кнопки
int buttonState_0 = 0;    // previous state of the button


void setup() {
//------------------------------------мое---------------------------------
Serial.begin(9600);
  dht.begin();
  int day;
  while (!Serial) ; // wait for serial
  delay(200);
  pinMode(led, OUTPUT);//индикатор кнопки
  pinMode(led2, OUTPUT);// сигнал "таймер"
  pinMode(led3, OUTPUT);// сигнал нагрева 
  pinMode(led4,OUTPUT);//сигнал туманогенератора
  Serial.println("DS1307RTC Read Test");
  Serial.println("-------------------");
//------------------------------------мое---------------------------------
  //LCD
#ifdef AVR
Wire.begin();
#else
Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
//lcd.init();   // initialize the lcd 
lcd.begin(16, 2);
//------------------------------------мое---------------------------------
// печатаем первую строку
  lcd.print("Inkubator" );
 lcd.setCursor(1, 1);
 delay(500);
  // печатаем вторую строку
  lcd.print("tamerlan-1");
  delay(500);
  lcd.clear();
//------------------------------------мое---------------------------------
//lcd.backlight();
//--LCD

// initialize the button pin as a input:

// initialize the LED as an output:

// initialize serial communication:
Serial.begin(9600);

//pinMode(ledPin, OUTPUT);     
// инициализируем пин, подключенный к кнопке, как вход
pinMode(buttonPin, INPUT);   
pinMode(buttonPin_0, INPUT);   
pinMode(buttonPin_1, INPUT);   
}


void loop() {
//-------------------------------------m----------------------------------------------
float h = dht.readHumidity();//обозначение влажности
  float t = dht.readTemperature(); //обозначение температуры
  float x =EEPROM.read(2);//день месяца соответствующий проклевыванию
  tmElements_t tm; //вывод на экран дата и влажность
  {//lcd.setCursor(0, 1);
  //print2digits(tm.Day);
  //lcd.write('/');
  //print2digits(tm.Month);
  //lcd.write('/');
  //lcd.print(tmYearToCalendar(tm.Year));
  /*lcd.write('h');
  print2digits (h);
  //lcd.write("*H ");*/
 lcd.setCursor(0, 0);//вывод на экран время и температура
 print2digits(tm.Hour);
  lcd.write(':');
  print2digits(tm.Minute);
  lcd.write('`');
  print2digits(tm.Second);
  lcd.write(' ');
  print2digits(tm.Day);
  lcd.write('/');
  print2digits(tm.Month);
  //lcd.write('/');
  //lcd.print(tmYearToCalendar(tm.Year));
  //lcd.write('h');
  //print2digits (h);
  //lcd.write("*H ");
  //lcd.write('t');
  //print2digits (t);
  //lcd.write("*C ");
  //delay(1000);
  if (RTC.read(tm)) //информацыя в sereal monitor
  {
    Serial.print("Ok, Time = ");
    Serial.print(tm.Hour);
    Serial.write(':');
    Serial.print(tm.Minute);
    Serial.write(':');
    Serial.print(tm.Second);
    Serial.print(", Date (D/M/Y) = ");
    Serial.print(tm.Day);
    Serial.write('/');
    Serial.print(tm.Month);
    Serial.write('/');
    Serial.print(tmYearToCalendar(tm.Year));
    Serial.println();
  } else {
    if (RTC.chipPresent()) {
      Serial.println("The DS1307 is stopped.  Please run the SetTime");
      Serial.println("example to initialize the time and begin running.");
      Serial.println();
    } else {
      Serial.println("DS1307 read error!  Please check the circuitry.");
      Serial.println();
    }
    delay(900);
  }
  //delay(500);
//-------------------------------------m----------------------------------------------  
// read the pushbutton input pin:
  //lcd.setCursor(0,0);
  //lcd.print("Ink MENU v1");
  //lcd.setCursor(0,1);
  //lcd.print("(very good menu)");
  lcd.setCursor(0,1);
  lcd.print("      MENU      ");
  lcd.setCursor(0,1);
  lcd.write('t');
  print2digits (t);
  lcd.write("*C");
  lcd.setCursor(12,1);
  lcd.write('h');
  print2digits (h);
  lcd.write("*H ");
  
buttonState = digitalRead(buttonPin);
// проверяем нажата ли кнопка
// если нажата, то buttonState будет HIGH:
if (buttonState == HIGH) {   
digitalWrite(led, HIGH);
delay(1000);// включаем светодиод   
lcd.clear(); //очищаем экран
menu();
}
}
}
//-------------------------------------терморегулятор--------------------------------
void termo/*string_irrigation_time*/() // функция формирования строки времни полива
{
 tmElements_t tm; //вывод на экран дата и влажность
 float h = dht.readHumidity();//обозначение влажности
  float t = dht.readTemperature(); //обозначение температуры
  float x =EEPROM.read(2);//день месяца соответствующий проклевыванию 
  String irr_time = ""; //объявление переменной строки 


int minuts = EEPROM.read(4); //читаем память
int hours = EEPROM.read(5);
 /*if (hours >= 0 && hours <=9) {irr_time += 0; irr_time += hours;} else{irr_time += hours;} //дописываем нолик 
 
 irr_time += ":";
 if (minuts >= 0 && minuts <=9){irr_time += 0; irr_time += minuts;} else{irr_time += minuts;}
 
 
 irr_time += ":";
 irr_time += "00";*/
// lcd.setCursor(0,1);
 //lcd.print("irr_time=");
 //lcd.print(irr_time);
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

if ((tm.Minute)= minuts)/*((tm.Second)>58)if((tm.Day)<=x)*/{//условия таймера
 digitalWrite(led2, HIGH);//включает переворот
 // поворот по часовой стрелке
   Serial.println("povorot po chasovoi");
  //myStepper.step(stepsPerRevolution);
  //Serial.print("Taimer On!!   ");//вывод инфо состояния 
 lcd.setCursor(15,1);//вывод инфо состояния на LCD
 lcd.print("%");
 
 /*  // step one revolution in the other direction:
  Serial.println("povorot protiv chasovoi");
  myStepper.step(-stepsPerRevolution);
   */
 }
 else
 {
 digitalWrite(led2, LOW);
 Serial.print("Taimer OFF");
 }
 //****************************************************************
 if (t<EEPROM.read(0))//условия терморегуляции
 {
 digitalWrite(led3,HIGH);
 Serial.print("Vkluchen nagrev!!");//вывод инфо состояния
 lcd.setCursor(15, 0);
 lcd.print("^");//вывод инфо состояния на LCD
 //delay (500);
 }
 else
 { digitalWrite(led3,LOW);
 Serial.print("Temp ok  ");//вывод инфо состояния
 lcd.setCursor(15, 0);
 lcd.print("~");//вывод инфо на LCD
 }
 
 //***********************************************************
 if (h<EEPROM.read(1))//условия регуляции влажности
 {
 digitalWrite(led4,HIGH);
 Serial.print("Vkluchen tuman!!");//вывод инфо состояния
 lcd.setCursor(14, 0);
 lcd.print("#");//вывод инфо состояния на LCD
 //delay (500);
 }
 else
 { digitalWrite(led4,LOW);
 Serial.print("Vlagnost ok  ");//вывод инфо состояния
 lcd.setCursor(14, 0);
 lcd.print("~");//вывод инфо состояния
 }
 
 //************************************************************
 }
//-------------------------------------терморегулятор конец--------------------------

void menu()
{
actuator_setup();//температура
irrigtion_setup();//переворот 
irrigation_set_time(); //влажность
}

void actuator_setup()//установка температуры 
{
lcd.clear(); //очищаем экран
while(1){ //бесконечный цикл 
buttonState = digitalRead(buttonPin); //запоминаем значение кнопки
buttonState_0 = digitalRead(buttonPin_0); //запоминаем значение кнопки
buttonState_1 = digitalRead(buttonPin_1); //запоминаем значение кнопки

/*lcd.setCursor(0,0);
lcd.print(" -=TEMP SETUP=- ");//Actuator setup
lcd.clear();*/
int t_mini = EEPROM.read(0);
lcd.setCursor(0,0);
lcd.print("min=");
lcd.print(t_mini);
lcd.print((char)223);

int t_maxi = EEPROM.read(1);
lcd.setCursor(9,0);
lcd.print("max=");
lcd.print(t_maxi);
lcd.print((char)223);                   

//lcd.setCursor(0,2);
//lcd.print("________________");

lcd.setCursor(0,1);
lcd.print("T_MIN NEXT T_MAX");
digitalWrite(led, HIGH);
if (buttonState == HIGH) {   
 digitalWrite(led, LOW);             
 delay(1000);// включаем светодиод   
 lcd.clear(); //очищаем экран
 digitalWrite(led, HIGH);
 break; }
                      
 if (buttonState_1 == HIGH) {   
 digitalWrite(led, LOW);             
   lcd.clear();
        t_min();
       delay(500);
       lcd.clear(); //очищаем экран
          
       digitalWrite(led, HIGH);            
       }       
    
if (buttonState_0 == HIGH) {   
       digitalWrite(led, LOW);             
       lcd.clear();
        t_max();
       delay(500);// включаем светодиод   
       lcd.clear(); //очищаем экран
                   
       digitalWrite(led, HIGH);
      }  
     
     }}


void irrigtion_setup()
{
lcd.clear(); //очищаем экран
while(1){ //бесконечный цикл 
buttonState = digitalRead(butto/запоминаем значение кнопки
buttonState_0 = digitalRead(buttonPin_0); //запоминаем значение кнопки
buttonState_1 = digitalRead(buttonPin_1); //запоминаем значение кнопки

 /*lcd.setCursor(0,0);
 lcd.print("=Perevorot SET=");//IRRIGATION*/
 int on_off = EEPROM.read(2);
String z;
 if (on_off == 1) {z="ON";}
 if (on_off == 0) {z="OFF";}

 lcd.setCursor(0,0);
 lcd.print("per=");
 lcd.print(z);


 int duration = EEPROM.read(3);//продолжительность
 lcd.setCursor(9,0);
 lcd.print("prod=");
 lcd.print(duration);
 lcd.print("min");                   
 //lcd.setCursor(0,1);
 //lcd.print("____________________"); 
 lcd.setCursor(0,1);
 lcd.print("ON/OFF NEXT prod");
//                   digitalWrite(ledPin, HIGH);
    if (buttonState == HIGH) {   
           digitalWrite(led, LOW);             
           delay(500);// включаем светодиод   
           lcd.clear(); //очищаем экран
            break;
           }
    
    if (buttonState_0 == HIGH) {   
           digitalWrite(led, LOW);             
           lcd.clear();
            durration_irrigation();  
           delay(500);// включаем светодиод   
               lcd.clear(); //очищаем экран
              
           digitalWrite(led, HIGH);            
           }       
        
    if (buttonState_1 == HIGH) {   
           digitalWrite(led, LOW);             
           lcd.clear();
            on_off_irrigation();  
           delay(500);// включаем светодиод   
           lcd.clear(); //очищаем экран
                       
           digitalWrite(led, HIGH);
          }  
 
 }}

void irrigation_set_time()//настройка времени переворота
{
lcd.clear(); //очищаем экран
while(1){ //бесконечный цикл 
buttonState = digitalRead(buttonPin); //запоминаем значение кнопки
buttonState_0 = digitalRead(buttonPin_0); //запоминаем значение кнопки
buttonState_1 = digitalRead(buttonPin_1); //запоминаем значение кнопки
 lcd.setCursor(0,0);
 lcd.print("Povor SET TIME");//"IRIGAT SET TIME"
 //lcd.setCursor(0,1);
 //lcd.print("pov_time= "); string_irrigation_time();

 /*lcd.setCursor(0,0);
 lcd.print("____________________");*/

 lcd.setCursor(0,1);
 lcd.print("minut NEXT hour");
 digitalWrite(led, HIGH);
if (buttonState == HIGH) {   
       digitalWrite(led, LOW);             
       delay(1000);// включаем светодиод   
           lcd.clear(); //очищаем экран
           break;
       digitalWrite(led, HIGH);
       }

if (buttonState_1 == HIGH) {   
       digitalWrite(led, LOW);             
       lcd.clear();
        irrigation_set_minuts();
       delay(500);
       lcd.clear(); //очищаем экран
          
       digitalWrite(led, HIGH);            
       }       
    
if (buttonState_0 == HIGH) {   
       digitalWrite(led, LOW);             
       lcd.clear();
       irrigation_set_hours();
       delay(500);// включаем светодиод   
       lcd.clear(); //очищаем экран
                   
       digitalWrite(led, HIGH);
      }  
 
 }}



//////--------------------------------------------------------------------------
//SUB MENU

void t_min()
{

lcd.clear(); //очищаем экран
delay(1000);
while(1){ //бесконечный цикл 
buttonState = digitalRead(buttonPin); //запоминаем значение кнопки
buttonState_0 = digitalRead(buttonPin_0); //запоминаем значение кнопки
buttonState_1 = digitalRead(buttonPin_1); //запоминаем значение кнопки

 lcd.setCursor(0,0);
 lcd.print("tMinSET");
 int t_min = EEPROM.read(0);
 lcd.setCursor(8,0);
 lcd.print("t=");
 lcd.print(t_min);
 lcd.print((char)223);
 lcd.print("C");                   
 lcd.setCursor(0,1);
 lcd.print("tmin-1NEXTtmin+1");
 //lcd.setCursor(0,1);
 //lcd.print("________________");

 digitalWrite(led, HIGH);
    if (buttonState == HIGH) {   
           digitalWrite(led, LOW);             
           delay(1000);// включаем светодиод   
               lcd.clear(); //очищаем экран
               break;
           digitalWrite(led, HIGH);
           }
    
    if (buttonState_0 == HIGH) {   
            delay(500);     
            digitalWrite(led, LOW);             
            lcd.clear();
            EEPROM.write(0, t_min + 1);
            digitalWrite(led, HIGH);            
           }       
        
    if (buttonState_1 == HIGH) {   
          delay(500); 
          digitalWrite(led, LOW);             
          lcd.clear();
          EEPROM.write(0, t_min - 1);
          digitalWrite(led, HIGH);
          }  
 
 }
}

void t_max()
{

lcd.clear(); //очищаем экран
delay(1000);
while(1){ //бесконечный цикл 
buttonState = digitalRead(buttonPin); //запоминаем значение кнопки
buttonState_0 = digitalRead(buttonPin_0); //запоминаем значение кнопки
buttonState_1 = digitalRead(buttonPin_1); //запоминаем значение кнопки

 lcd.setCursor(0,0);
 lcd.print("tMaxSET");
 int t_max = EEPROM.read(1);
 lcd.setCursor(8,0);
 lcd.print("t=");
 lcd.print(t_max);
 lcd.print((char)223);
 lcd.print("C");                   
 lcd.setCursor(0,1);
 lcd.print("tmax-1NEXTtmax+1");
 //lcd.setCursor(0,0);
 //lcd.print("________________");

 digitalWrite(led, HIGH);
    if (buttonState == HIGH) {   
           digitalWrite(led, LOW);             
           delay(1000);// включаем светодиод   
               lcd.clear(); //очищаем экран
               break;
           digitalWrite(led, HIGH);
           }
    
    if (buttonState_0 == HIGH) {   
            delay(500);     
            digitalWrite(led, LOW);             
            lcd.clear();
            EEPROM.write(1, t_max + 1);
            digitalWrite(led, HIGH);            
           }       
        
    if (buttonState_1 == HIGH) {   
          delay(500); 
          digitalWrite(led, LOW);             
          lcd.clear();
          EEPROM.write(1, t_max - 1);
          digitalWrite(led, HIGH);
          }  
 
 }
}

void on_off_irrigation()//вкл/выкл переворот
{

lcd.clear(); //очищаем экран
delay(1000);
while(1){ //бесконечный цикл 
buttonState = digitalRead(buttonPin); //запоминаем значение кнопки
buttonState_0 = digitalRead(buttonPin_0); //запоминаем значение кнопки
buttonState_1 = digitalRead(buttonPin_1); //запоминаем значение кнопки

 /*lcd.setCursor(0,0);
 lcd.print("ON/OFF Povorot");//IRRIGATION*/
 int on_off = EEPROM.read(2);
 String z;
 if (on_off == 1) {z="ON";}
 if (on_off == 0) {z="OFF";}
 lcd.setCursor(0,0);
 lcd.print("now povor=");//irrignation
 lcd.setCursor(11,0);
 lcd.print(z);
 //lcd.setCursor(0,2);
 //lcd.print("____________________");                                      
 //lcd.clear();
 lcd.setCursor(0,1);
 lcd.print("ON   NEXT  OFF");


 digitalWrite(led, HIGH);
    if (buttonState == HIGH) {   
           digitalWrite(led, LOW);             
           delay(1000);// включаем светодиод   
               lcd.clear(); //очищаем экран
               break;
           digitalWrite(led, HIGH);
           }
    
    if (buttonState_0 == HIGH) {   
            delay(500);     
            digitalWrite(led, LOW);             
            lcd.clear();
            EEPROM.write(2, 0);
            digitalWrite(led, HIGH);            
           }       
        
    if (buttonState_1 == HIGH) {   
          delay(500); 
          digitalWrite(led, LOW);             
          lcd.clear();
          EEPROM.write(2, 1);
          digitalWrite(led, HIGH);
          }  
 
 }
}
void durration_irrigation()
{

lcd.clear(); //очищаем экран
delay(1000);
while(1){ //бесконечный цикл 
buttonState = digitalRead(buttonPin); //запоминаем значение кнопки
buttonState_0 = digitalRead(buttonPin_0); //запоминаем значение кнопки
buttonState_1 = digitalRead(buttonPin_1); //запоминаем значение кнопки

 /*lcd.setCursor(0,0);
 lcd.print("povor do");*/
 int duration = EEPROM.read(3);
 lcd.setCursor(0,0);
 lcd.print("povor=");
 lcd.print(duration);
 lcd.print("day");                   
//lcd.clear();
 lcd.setCursor(0,1);
 lcd.print("-1day NEXT +1day");
 //lcd.setCursor(0,2);
 //lcd.print("____________________");

 digitalWrite(led, HIGH);
    if (buttonState == HIGH) {   
           digitalWrite(led, LOW);             
           delay(1000);// включаем светодиод   
               lcd.clear(); //очищаем экран
               break;
           digitalWrite(led, HIGH);
           }
    
    if (buttonState_0 == HIGH) {   
            delay(500);     
            digitalWrite(led, LOW);             
            lcd.clear();
            EEPROM.write(3, duration + 1);
            digitalWrite(led, HIGH);            
           }       
        
    if (buttonState_1 == HIGH) {   
          delay(500); 
          digitalWrite(led, LOW);             
          lcd.clear();
          EEPROM.write(3, duration - 1);
          digitalWrite(led, HIGH);
          }  
 
 }
}
//---------------------------------------------------peredelano-------------------------------
void irrigation_set_minuts()//время поворота минуты
{

lcd.clear(); //очищаем экран
delay(1000);
while(1){ //бесконечный цикл 
buttonState = digitalRead(buttonPin); //запоминаем значение кнопки
buttonState_0 = digitalRead(buttonPin_0); //запоминаем значение кнопки
buttonState_1 = digitalRead(buttonPin_1); //запоминаем значение кнопки

 /*lcd.setCursor(0,0);
 lcd.print("SET MINUT");*/
 int minuts = EEPROM.read(4);
 lcd.setCursor(0,0);
 lcd.print("minuts=");
 lcd.print(minuts);
 lcd.print("min");                   
 //lcd.clear();
 lcd.setCursor(0,1);
 lcd.print("-1min NEXT +1min");
 //lcd.setCursor(0,2);
// lcd.print("____________________");

 digitalWrite(led, HIGH);
    if (buttonState == HIGH) {   
           digitalWrite(led, LOW);             
           delay(1000);// включаем светодиод   
               lcd.clear(); //очищаем экран
               break;
           digitalWrite(led, HIGH);
           }
    
    if (buttonState_0 == HIGH) {   
            delay(500);     
            digitalWrite(led, LOW);             
            lcd.clear();
            minuts = minuts + 1;
            if (minuts >59){minuts=0;}
            EEPROM.write(4, minuts);
            digitalWrite(led, HIGH);            
           }       
        
    if (buttonState_1 == HIGH) {   
          delay(500); 
          digitalWrite(led, LOW);             
          lcd.clear();
          minuts = minuts - 1;
          if (minuts < 0) {minuts=59;}
          EEPROM.write(4, minuts);
          digitalWrite(led, HIGH);
          }  
 
 }

}
void irrigation_set_hours()
{

lcd.clear(); //очищаем экран
delay(1000);
while(1){ //бесконечный цикл
buttonState = digitalRead(buttonPin); //запоминаем значение кнопки
buttonState_0 = digitalRead(buttonPin_0); //запоминаем значение кнопки
buttonState_1 = digitalRead(buttonPin_1); //запоминаем значение кнопки

 /*lcd.setCursor(0,0);
 lcd.print("SET hours");*/
 int hours = EEPROM.read(5);
 lcd.setCursor(0,0);
 lcd.print("hours = ");
 lcd.print(hours);
 lcd.print("h");
//lcd.clear(); 
 lcd.setCursor(0,1);
 lcd.print("-1hourNEXT+1hour");
 //lcd.setCursor(0,2);
// lcd.print("____________________");

 digitalWrite(led, HIGH);
    if (buttonState == HIGH) {   
           digitalWrite(led, LOW);             
           delay(1000);// включаем светодиод   
               lcd.clear(); //очищаем экран
               break;
           digitalWrite(led, HIGH);
           }
    
    if (buttonState_0 == HIGH) {   
            delay(500);     
            digitalWrite(led, LOW);             
            lcd.clear();
            hours = hours + 1;
            if (hours >23){hours=0;}
            EEPROM.write(5, hours);
            digitalWrite(led, HIGH);            
           }       
        
    if (buttonState_1 == HIGH) {   
          delay(500); 
          digitalWrite(led, LOW);             
          lcd.clear();
          hours = hours - 1;
          if (hours < 0) {hours=23;}
          EEPROM.write(5, hours);
          digitalWrite(led, HIGH);
          }  
 
 }

}

//----------------------------------------m-----------------------------------------------
void print2digits(int number) {
  if (number >= 0 && number < 10) {
    lcd.write('0');
  }
  lcd.print(number);
}
//----------------------------------------m-----------------------------------------------

 

maksim
Offline
Зарегистрирован: 12.02.2012

Почитайте: Вставка программного кода в тему/комментарий там написано как сворачивать портянки.

tamerlan37
Offline
Зарегистрирован: 22.10.2013

maksim пишет:

Почитайте: Вставка программного кода в тему/комментарий там написано как сворачивать портянки.

Спасибо,поправил.

aeniks (не проверено)

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

 

Mega_Serg
Offline
Зарегистрирован: 18.02.2014

tamerlan37, схему (хотя бы примерную) девайса можно взглянуть? к какому пину что...?

tamerlan37
Offline
Зарегистрирован: 22.10.2013

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

tamerlan37
Offline
Зарегистрирован: 22.10.2013

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

Код еще не доделан еще не введен PID и Dallas.

Life23
Offline
Зарегистрирован: 10.08.2013

меняйте LCD на интерфейс i2c - проще станет жить! )))

ИМХО

 

tamerlan37
Offline
Зарегистрирован: 22.10.2013

Пока недостатка во входах нет а вкладывать деньги на это не хочется.

dachnik
Offline
Зарегистрирован: 26.07.2013

А что за PID у тебя?

tamerlan37
Offline
Зарегистрирован: 22.10.2013

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

XAM
Offline
Зарегистрирован: 01.03.2014

Прошу прощения я новичок. И тоже необходимо такой контроллер Из скетча не понял получилось реализовать отключение переворота на 17-21 день или нет. Если нет то может для включения инкубатора использовать двойной тумблер одни контакты будут включать arduino и остальное а другой контакт включать батарею на модуле часов. Как я понимаю таймер обнулится и наверное можно привязать отключение к дате.  А перевороты привязать к часам например 4 8 12 16 20 24 вполне достаточно.

XAM
Offline
Зарегистрирован: 01.03.2014

Я правда ещё не экперементировал посколько жду когда придут заказанные части.Я не знаю как поведет себя ds1307 после отключения батареи он сброситься грубо говоря на 01 01 01 00:00 (день месяц год   часы минуты) или это могут быть не единицы. Можно вывести на экран не число месяц год а только дни с момента включения поскольку вся домашняя птица до месяца проходит режим инкубаций и будет понятно сколько дней осталось до конца . А какой нагреватель планируете использовать? Из моей небольшой практики лучне всего показали себя лампочки накаливания. У них меньше всего инерция после выключения.

XAM
Offline
Зарегистрирован: 01.03.2014

Да и ещё поворот яиц вы как планируете делать? Если наклоном то можно прицепить шаговый двигатель.  После включения поворачивается на 45градусов  и далее по премени на 90градусов после отключения переворота возвращается обратно на 45 в горизонтальное положение.

tamerlan37
Offline
Зарегистрирован: 22.10.2013

для отключения можно через if сравнивать заданый день(дата день) месяца с текущим и если больше то прекращать,но нужно при запуске програмировать когда день проклевывания будет.а часы збивать думаю не стоит.И еще вроде можно считать сколько прошло со времени запуска скетча но тоже думаю муторно.

tamerlan37
Offline
Зарегистрирован: 22.10.2013

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

tamerlan37
Offline
Зарегистрирован: 22.10.2013

Нагреватели,наверное лампочки дешево сердито и ремонтировать легко если что и видно как работает.

XAM
Offline
Зарегистрирован: 01.03.2014

Я ставил моторчик дворника заднего от нивы но мне кажется углы маловаты. его в деле не проверял. До етого был маленький инкубатор где то на 40 перепилиных яиц. Там делал два вала между ними типа конвеера и каждый ряд был зафиксирован пруток . 4 раза в сутки включался конвеер где то на 2 секунды и проворачивал

aljoshka
Offline
Зарегистрирован: 03.03.2014

можно ли подключать, например, по 2 датчика температуры и влажности в 2-ух областях инкубатора папалельно к одному пину? например, датчик температуры 1 сверху, второй снизу но контакт отвечающий за данные объėдинить в 1 пин? новичок... ;)

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

aljoshka пишет:

можно ли подключать, например, по 2 датчика температуры и влажности в 2-ух областях инкубатора папалельно к одному пину? например, датчик температуры 1 сверху, второй снизу но контакт отвечающий за данные объėдинить в 1 пин? новичок... ;)

Здесь используется DHT11 (или DHT22) - вот и поищите в гугле по фразе "подключить два DHT11 на одну шину". Если мерять температуру датчиками DS18* - то там поисковая фраза будет выглядеть как-то так: "подключение датчиков 1-wire"

tamerlan37
Offline
Зарегистрирован: 22.10.2013

Andrey_Y_Ostanovsky пишет:

aljoshka пишет:

можно ли подключать, например, по 2 датчика температуры и влажности в 2-ух областях инкубатора папалельно к одному пину? например, датчик температуры 1 сверху, второй снизу но контакт отвечающий за данные объėдинить в 1 пин? новичок... ;)

Здесь используется DHT11 (или DHT22) - вот и поищите в гугле по фразе "подключить два DHT11 на одну шину". Если мерять температуру датчиками DS18* - то там поисковая фраза будет выглядеть как-то так: "подключение датчиков 1-wire"

поправка, использовался в ранней версии, сейчас все же будет 18В20, DHT11 (или DHT22) по отзывам боятся пыли и непригодны для инкубатора,а мой такой датчик еще не дойдя до инкубатора на стадии макета перестал работать(((.Так что 18В20.

aljoshka
Offline
Зарегистрирован: 03.03.2014

если я правильно понял, то меняем ето: dht22

 

 

 

 

 

на ето:

 

 

 

 

 

a датчик влажности какой? ;)

все датчики подключаются на прямую к ардуино, или нужны какие-то модули-посредники?

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Для "датчика влажности почвы" - нужна токопроводящая среда. Страшно представить: какое потребуется напряжение, чтобы воздух стал проводящим на таком расстоянии. :) У меня что-то типа DHT11 живет в ванной в вентиляторе: там и пыль, и влажность.

aljoshka
Offline
Зарегистрирован: 03.03.2014

погрешность в пол градуса у DHT11/22 будет нармальной для поддержания температуры, если её допустимая амплитуда около 1.5 градуса? ;) 

tamerlan37
Offline
Зарегистрирован: 22.10.2013

Andrey_Y_Ostanovsky пишет:

Для "датчика влажности почвы" - нужна токопроводящая среда. Страшно представить: какое потребуется напряжение, чтобы воздух стал проводящим на таком расстоянии. :) У меня что-то типа DHT11 живет в ванной в вентиляторе: там и пыль, и влажность.

а причем тут "датчик влажности почвы"?

aljoshka
Offline
Зарегистрирован: 03.03.2014

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

tamerlan37
Offline
Зарегистрирован: 22.10.2013

не знаю с чем связано но код идет на верссии ардуино IDE 1.0.1 а на более поздних выдает ошибки при компеляции(((

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

aljoshka
Offline
Зарегистрирован: 03.03.2014

искал, старые версии есть бесплатные но не удобно тем что там обозначение детали не картинкой.. ;) а ардуБлок на последней версии уже интересней, много добавлено всего, только кроме мигающего диода ещо ничего не умею, 2 дня как познакомился с Ардуино... ;)

aljoshka
Offline
Зарегистрирован: 03.03.2014

Пара вопросиков.. ;) хотелось-бы сделать переворот по вот такому принцыпу:

 

 

 

 

 

 

 

 

 

 

..и чтоб сэкономить на пошаговом движке, использовать движок от старого принтера Епсон... какой контроллер посоветуете и нужен-ли такой вообсче (моторчик на 4 пина, сам питается гдето 20-30в, а управление тоже от 5в как у других ?) как пример, возможно подойдёт такой:

 

1.Double H bridge drive
2.Chip L298N (ST NEW)
3.Logical voltage 5V
4.Drive voltage 5V-35V
5.Logical current 0mA-36mA
6.Drive current 2A(MAX single bridge)
7.Storage temperature -20 to +135
8.Max power 25W
 

tamerlan37
Offline
Зарегистрирован: 22.10.2013

А потянет движок такую нагрузку

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

tamerlan37 пишет:
А потянет движок такую нагрузку

Если сделать винтовую передачу, как у актуатора, и прицепить с края - то потянет. А если вращать всю этажерку из центра - то вряд ли.

aljoshka
Offline
Зарегистрирован: 03.03.2014

Andrey_Y_Ostanovsky пишет:

tamerlan37 пишет:
А потянет движок такую нагрузку

Если сделать винтовую передачу, как у актуатора, и прицепить с края - то потянет. А если вращать всю этажерку из центра - то вряд ли.

 

мотор конечно с края надо ставить, ато тот штырь с резьбой в дверьку упрётся, когда подтянет лотки к себе.. ;) 

ну а контролировать то можно етот движок от принтера без драивера?

aljoshka
Offline
Зарегистрирован: 03.03.2014

Код былбы то что надо (первый код тамерлана), но что ето за ошибки? компиляцию делал на версиях 1.0.5.. и 1.5....(бета) для ардуино уно... ехх :(

 

inkubator1:16: error: 'DHT11' was not declared in this scope
inkubator1.ino: In function 'void setup()':
inkubator1:21: error: 'class DHT' has no member named 'begin'
inkubator1.ino: In function 'void loop()':
inkubator1:47: error: 'class DHT' has no member named 'readHumidity'
inkubator1:48: error: 'class DHT' has no member named 'readTemperature'
inkubator1:51: error: 'tmElements_t' was not declared in this scope
inkubator1:51: error: expected `;' before 'tm'
inkubator1:53: error: 'tm' was not declared in this scope
inkubator1:57: error: 'tmYearToCalendar' was not declared in this scope
inkubator1:72: error: 'RTC' was not declared in this scope
inkubator1:72: error: 'tm' was not declared in this scope
inkubator1:85: error: 'tmYearToCalendar' was not declared in this scope
inkubator1:102: error: 'tm' was not declared in this scope

aeniks7
Offline
Зарегистрирован: 08.02.2014

Интересно было бы посмотреть новый код

 

aljoshka
Offline
Зарегистрирован: 03.03.2014










максимально урезанный код тамерлана, лишь в таком виде проходит компиляцию... :(оцените его жизнеспособность и помогите вписать сенсор DS18B20 в код, чтоб его показания былиб управляющими а температура дхт11 лишь информационной и печаталась-бы как ТЕМПЕРАТУРА 2 .... и почемуто не распознаётся библиотека ,,далласТемпература,,... спасибо.. ;)









int led3 = 2;// нагреватель
int led4 = 5;//туманогенератор
#include <DHT.h>
#include <LiquidCrystal.h>
#include <Wire.h>
#include <OneWire.h> //??????????????????????????
#include <DallasTemperature.h> //??????????????????????


#define DHTPIN 3 // куда подключен термодатчик
#define DHTTYPE DHT11 // DHT 11 используемый термодатчик
#define ONE_WIRE_BUS 2 //???????????????????????????????
OneWire oneWire(ONE_WIRE_BUS); //????????????????????????????
DHT dht(DHTPIN, DHTTYPE); 

LiquidCrystal lcd(8, 9, 10, 11, 12, 13);
void setup()
{
Serial.begin(9600);
dht.begin();
while (!Serial) ; // wait for serial
delay(200);
pinMode(led3, OUTPUT);// сигнал нагрева
pinMode(led4,OUTPUT);//сигнал туманогенератора
Serial.println("DHT11 Read Test");
Serial.println("-------------------");
lcd.begin(16, 2); // печатаем первую строку
lcd.print("Inkubator" );
lcd.setCursor(1, 1);
delay(500); // печатаем вторую строку
lcd.print("tamerlan-1");
delay(500);
}

void loop() {
float h = dht.readHumidity();//обозначение влажности
float t = dht.readTemperature(); //обозначение температуры
if (t<17)//условия терморегуляции
{
digitalWrite(led3,HIGH);
Serial.print("Vkluchen nagrev!!");//вывод инфо состояния
lcd.setCursor(15, 0);
lcd.print("^");//вывод инфо состояния на LCD
//delay (500);
}
else
{ digitalWrite(led3,LOW);
Serial.print("Temp ok ");//вывод инфо состояния
lcd.setCursor(15, 0);
lcd.print("~");//вывод инфо на LCD
}
if (h<60)//условия терморегуляции
{
digitalWrite(led4,HIGH);
Serial.print("Vkluchen tuman!!");//вывод инфо состояния
lcd.setCursor(14, 0);
lcd.print("#");//вывод инфо состояния на LCD
//delay (500);
}
else
{ digitalWrite(led4,LOW);
Serial.print("Vlagnost ok ");//вывод инфо состояния
lcd.setCursor(14, 0);
lcd.print("~");//вывод инфо состояния
}
}

void print2digits(int number) {
if (number >= 0 && number < 10) {
lcd.write('0');
}
lcd.print(number);
}

 

tamerlan37
Offline
Зарегистрирован: 22.10.2013

у меня компеляцыя идет только на ранней версии.Пока новее кода нет. все руки не доходят нужно переделать ее на ПИД и включить туда DS18B20.Как только будет выложу свежак.

aljoshka
Offline
Зарегистрирован: 03.03.2014

в качестве концевиков движка переворота можно использовать ик сенсоры- TCRT5000, но опять-же, нет знаний чтоб их прописаать в код.. :( можно-ли обойтись без RTC... , а просто чтоб перевороот осуществлялся по таимеру, например через каждые 2 часа... и какую реверсионную релюшку или переключатель посоветовалиб(в наличии мотор 220в с конденсаторами на 3 провода(2 из них нужно менять местами для изменения направления оборотов))? 

aljoshka
Offline
Зарегистрирован: 03.03.2014





int led3 = 3;// нагреватель vkl.
int led4 = 4;//туманогенератор vkl.
int led5 = 5; // motor vniz
int led6 = 6; // motor vverh
int led7 = 7; // nizhnij koncevik TCRT5000
int analogPin = 5; // verhnij koncevik k analogovomu portu nr 5...............ILI ON BUDET NAZYVATSJA 18-YM? HMMM...

#include <DHT.h>
#include <LiquidCrystal.h>
#include <Wire.h>
#include <OneWire.h>

                                                                                    //PROPISHITE DS18S20 DATCHIK V KOD... ;)

#define DHTPIN 1 // куда подключен термодатчик
#define DHTTYPE DHT11   // DHT 11 используемый термодатчик
#define ONE_WIRE_BUS 2 //kuda podkljuchen DS18S20 Temperature chip
OneWire oneWire(ONE_WIRE_BUS);
DHT dht(DHTPIN, DHTTYPE);
OneWire ds(2); //DS18S20 Temperature chip k portu 2

LiquidCrystal lcd(8, 9, 10, 11, 12, 13);
void setup() 
{
Serial.begin(9600);
dht.begin();
while (!Serial) ; // wait for serial
delay(200);
pinMode(led3, OUTPUT);// сигнал нагрева 
pinMode(led4,OUTPUT);//сигнал туманогенератора
pinMode(led5, OUTPUT);// signal motoru vniz
pinMode(led6, OUTPUT);// signal motoru vverh
pinMode(led7, INPUT);// signal ot nizhnego koncevika
pinMode(analogPin, INPUT); // signal ot verhnego koncevika
Serial.println("DHT11 Read Test");
Serial.println("-------------------");
lcd.begin(16, 2);  // печатаем первую строку
lcd.print("Inkubator" );
lcd.setCursor(1, 1);
delay(500);  // печатаем вторую строку
lcd.print("tamerlan-1");
delay(500);
}
//********************************klimatkontrolj*************************************
void loop() {
 float h = dht.readHumidity();//обозначение влажности
float t = dht.readTemperature(); //обозначение температуры
if (t<38)//условия терморегуляции
{
digitalWrite(led3,HIGH);
Serial.print("Vkluchen nagrev!!");//вывод инфо состояния
lcd.setCursor(15, 0);
lcd.print("^");//вывод инфо состояния на LCD
//delay (500);
}
else
{ digitalWrite(led3,LOW);
Serial.print("Temp ok  ");//вывод инфо состояния
lcd.setCursor(15, 0);
lcd.print("~");//вывод инфо на LCD
}
if (h<60)//условия терморегуляции
{
digitalWrite(led4,HIGH);
Serial.print("Vkluchen tuman!!");//вывод инфо состояния
lcd.setCursor(14, 0);
lcd.print("#");//вывод инфо состояния на LCD
//delay (500);
}
else
{ digitalWrite(led4,LOW);
Serial.print("Vlazhnost ok  ");//вывод инфо состояния
lcd.setCursor(14, 0);
lcd.print("~");//вывод инфо состояния
}
//***********************************perevorot*************************
if (led7, LOW);// PROVERITJ KOMANDU.........................................mozhet-  digitalRead(led7,LOW); ili (led7 == LOW); ili kakto cherez TRUE / FALSE!!   proveritj,  net li signala ot nizhnego koncevika
{
  digitalWrite(led5, HIGH); // motor vkljuchaet na spusk
}
if (led7, HIGH);
{
  digitalWrite(led5, LOW);// ostonavlivaet spusk
  delay(3600000); //pauza 2 chasa
  digitalWrite(led6, HIGH); // motor podnimaet
}
if (analogPin, HIGH);// verhnij koncevik.................. neznaju kak analogovye propisyvatj
{
  digitalWrite(led6, LOW);// ostonavlivaet podjom
  delay(3600000);// pauza 2 chasa
}
}

 

aljoshka
Offline
Зарегистрирован: 03.03.2014

кому не трудно, проверте последний раздел- переворот, какие команды нужно исползовать и т.д, а также дописать и исправить ... испытать смогу лишь через пару недель когда придут детали... первый раз делаю такое.. ;)

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

aljoshka пишет:

виков движка переворота можно использовать ик сенсоры- TCRT5000, но опять-же, нет знаний чтоб их прописаать в код.. :(

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

XAM
Offline
Зарегистрирован: 01.03.2014

Не испытывал. Но мне кажется что delay(3600000) остановит контроллер на 2 часа не будет регулировки температуры и влажности. Я сам тоже жду детали. И думаю привязать к часам

aljoshka
Offline
Зарегистрирован: 03.03.2014
   





// так вроде по правильней будет чуток, но насчот делая тоже сомнения были... мож и вправду всё замрёт... :(
вместо delay() исполозвать millis() ? может поможет? 


int led3 = 3;// нагреватель vkl.
int led4 = 4;//туманогенератор vkl.
int led5 = 5; // motor vniz
int led6 = 6; // motor vverh
int swichPin1 = 14; // nizhnij koncevik TCRT5000 k analogovomu portu 0
int swichPin2 = 15; // verhnij koncevik k analogovomu portu nr 1...

#include <DHT.h>
#include <LiquidCrystal.h>
#include <Wire.h>
#include <OneWire.h>

                         //PROPISHITE DS18S20 DATCHIK V KOD... ;)

#define DHTPIN 1 // куда подключен термодатчик
#define DHTTYPE DHT11   // DHT 11 используемый термодатчик
#define ONE_WIRE_BUS 2 //kuda podkljuchen DS18S20 Temperature chip
OneWire oneWire(ONE_WIRE_BUS);
DHT dht(DHTPIN, DHTTYPE);
OneWire ds(2); //DS18S20 Temperature chip k portu 2

LiquidCrystal lcd(8, 9, 10, 11, 12, 13);
void setup() 
{
Serial.begin(9600);
dht.begin();
while (!Serial) ; // wait for serial
delay(200);
pinMode(led3, OUTPUT);// сигнал нагрева 
pinMode(led4,OUTPUT);//сигнал туманогенератора
pinMode(led5, OUTPUT);// signal motoru vniz
pinMode(led6, OUTPUT);// signal motoru vverh
pinMode(swichPin1, INPUT);// signal ot nizhnego koncevika
pinMode(swichPin2, INPUT); // signal ot verhnego koncevika
Serial.println("DHT11 Read Test");
Serial.println("-------------------");
lcd.begin(16, 2);  // печатаем первую строку
lcd.print("Inkubator" );
lcd.setCursor(1, 1);
delay(500);  // печатаем вторую строку
lcd.print("tamerlan-1");
delay(500);
}
//********************************klimatkontrolj***************
void loop() {
 float h = dht.readHumidity();//обозначение влажности
float t = dht.readTemperature(); //обозначение температуры
if (t<38)//условия терморегуляции
{
digitalWrite(led3,HIGH);
Serial.print("Vkluchen nagrev!!");//вывод инфо состояния
lcd.setCursor(15, 0);
lcd.print("^");//вывод инфо состояния на LCD
//delay (500);
}
else
{ digitalWrite(led3,LOW);
Serial.print("Temp ok  ");//вывод инфо состояния
lcd.setCursor(15, 0);
lcd.print("~");//вывод инфо на LCD
}
if (h<60)//условия терморегуляции
{
digitalWrite(led4,HIGH);
Serial.print("Vkluchen tuman!!");//вывод инфо состояния
lcd.setCursor(14, 0);
lcd.print("#");//вывод инфо состояния на LCD
//delay (500);
}
else
{ digitalWrite(led4,LOW);
Serial.print("Vlazhnost ok  ");//вывод инфо состояния
lcd.setCursor(14, 0);
lcd.print("~");//вывод инфо состояния
}
//***********************************perevorot*************************
if (digitalRead(swichPin1) == LOW);// PROVERITJ KOMANDU.......... proveritj,  net li signala ot nizhnego koncevika
{
  digitalWrite(led5, HIGH); // motor vkljuchaet na spusk
}
if (digitalRead(swichPin1) == HIGH);
{
  digitalWrite(led5, LOW);// ostonavlivaet spusk
  delay(3600000); //pauza 2 chasa
  digitalWrite(led6, HIGH); // motor podnimaet
}
if (digitalRead(swichPin2) == HIGH);// verhnij koncevik..............
{
  digitalWrite(led6, LOW);// ostonavlivaet podjom
  delay(3600000);// pauza 2 chasa
}
}

 

aljoshka
Offline
Зарегистрирован: 03.03.2014

Andrey_Y_Ostanovsky пишет:

aljoshka пишет:

виков движка переворота можно использовать ик сенсоры- TCRT5000, но опять-же, нет знаний чтоб их прописаать в код.. :(

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

в курсе... ;) транзисторы BC547 подойдут?

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

aljoshka пишет:

транзисторы BC547 подойдут?

Куда-нибудь - точно подойдут. Вы куда их планируете использовать?

aljoshka
Offline
Зарегистрирован: 03.03.2014

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

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

aljoshka пишет:
С ик сенсором.. с сенсора слабый ток идёт, даже диод еле горит.. думал сигнал с сенсора на базу транзистора пустить а коллетор и еммитер 5в уже подключалиб к релюшке..

У меня на тестовом образце ток порядка 10 миллиампер. При наличии в схеме ардуино - какой смысл заводить сигнал сразу на реле?

aljoshka
Offline
Зарегистрирован: 03.03.2014

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