настройка DS1307+ Реле + TFT 3,2" (Mega 2560)

asvitich
Offline
Зарегистрирован: 10.06.2016

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

[code]
#include <DS1307.h>
#include <UTFT.h>
#include <Wire.h> 


#include <dht11.h>      // Добавляем библиотеку DHT11
dht11 DHT;               // Объявление переменной класса dht11
#define DHT11_PIN A1
#define RELAY_ON LOW
#define RELAY_OFF HIGH
#define Relay_1  9  // температура воды
//#define Relay_2  2  // температура суши
//#define Relay_3  10  //  реле лампы 
//#define Relay_4  11  // реле кормушки
long Temperature = 0, Pressure = 0;


extern uint8_t SmallFont[];
extern uint8_t BigFont[];

DS1307  rtc(6, 7);

Time t;

UTFT myGLCD(CTE32HR, 38, 39, 40, 41);

 

void setup()
{
  Serial.begin(9600);
  Serial.println("DHT11 test!");
  Wire.begin(); 



 rtc.halt(false); //Запускаем часы


 //rtc.setDOW(THURSDAY);        // настройка дня недели
 //rtc.setTime(11, 30, 0);     // настройка часов
 //rtc.setDate(16, 6, 2016);   // настройка даты                                   
 
  digitalWrite(Relay_1, RELAY_OFF); // 
  //digitalWrite(Relay_2, RELAY_OFF);
 // digitalWrite(Relay_3, RELAY_OFF);
 // digitalWrite(Relay_4, RELAY_OFF);

  pinMode(Relay_1, OUTPUT);
 // pinMode(Relay_2, OUTPUT);
 // pinMode(Relay_3, OUTPUT);
 // pinMode(Relay_4, OUTPUT);

  delay(1000);


  myGLCD.InitLCD();
 // Нарисовать несколько линий
       myGLCD.setColor(VGA_WHITE);
       int x1, x2, y1, y2;
      myGLCD.clrScr();
      myGLCD.drawLine(0, 184, 479, 184);
      myGLCD.drawLine(0, 49, 479, 49);
      myGLCD.drawLine(0, 319, 479, 319);
      myGLCD.drawLine(239, 49, 239, 319);
       
      myGLCD.setColor(VGA_WHITE);
      myGLCD.setBackColor(0, 0, 0);
      myGLCD.setFont(BigFont);
   
      
      // водоем
      myGLCD.print("VODA", 55, 59);
      myGLCD.print("Temp.   :", LEFT, 89);
     
      // суша
      myGLCD.setColor(VGA_WHITE);
      myGLCD.print("SUSHA", 303, 59);
      myGLCD.print("Temp.  :", 240, 89);
      myGLCD.print("Hum.   :", 240, 109);
      
       //время работы лампы
      myGLCD.setColor(VGA_WHITE);
      myGLCD.print("SVET", 29, 194);
      myGLCD.print("Time   : 9-21", LEFT, 224);
      
   
     // время кормления
      myGLCD.setColor(VGA_WHITE);
      myGLCD.print("KORM", 300, 194);   
      myGLCD.print("Time   : 10-00", 240, 224);
      myGLCD.print("Time   : 18-00", 240, 244);
      
 
}
void loop()
{
  int chk;
  ; 
  // Мониторинг ошибок
  chk = DHT.read(DHT11_PIN);    // Чтение данных
  switch (chk){
  case DHTLIB_OK:  
    break;
  case DHTLIB_ERROR_CHECKSUM:
    Serial.println("Checksum error, \t");
    break;
  case DHTLIB_ERROR_TIMEOUT:
    Serial.println("Time out error, \t");
    break;
  default:
    Serial.println("Unknown error, \t");
    break;
  }
  digitalWrite(12,HIGH); ////

  t = rtc.getTime(); 
  String stringOne = rtc.getTimeStr(); 

 
myGLCD.setColor(VGA_WHITE); //Цвет отображения
myGLCD.setFont(BigFont); //Шрифт для отображения
myGLCD.print(rtc.getTimeStr(), CENTER, 1); //Отображаем часы

myGLCD.setColor(VGA_WHITE); //Цвет отображения
myGLCD.setFont(SmallFont); //Шрифт для отображения
myGLCD.print(rtc.getDateStr(), CENTER, 20); //Отображаем дату
 
 
  // Выводим показания влажности и температуры
  Serial.print("Humidity = ");
  Serial.print(DHT.humidity, 1);
  Serial.print(", Temp = ");
  Serial.println(DHT.temperature,1);

     // Реле подогрева суши
    if (DHT.temperature <= 28) digitalWrite(Relay_1, RELAY_ON); //включаем реле если температура ниже 
    else if (DHT.temperature > 30) digitalWrite(Relay_1, RELAY_OFF); //выключаем реле если температура выше 

           // Реле подогрева воды
   // if (DHT.temperature <= 25) digitalWrite(Relay_2, RELAY_ON); //включаем реле если температура ниже 
   // else if (DHT.temperature > 28) digitalWrite(Relay_2, RELAY_OFF); //выключаем реле если температура выше 

         // Реле включения выключения лампы уф
     // if (??) digitalWrite(Relay_3, RELAY_ON); //включаем реле если время 09-00 
     // else if (??) digitalWrite(Relay_3, RELAY_OFF); //выключаем реле если время 21-00 
    
         // реле включения кормушки
     //if (??) digitalWrite(Relay_4, RELAY_ON); //включаем реле в 10-00 на 2 секунды 
    //else if (??) digitalWrite(Relay_4, RELAY_OFF);  

     // реле включения кормушки
     //if (??) digitalWrite(Relay_4, RELAY_ON); //включаем реле в 18-00 на 2 секунды 
   // else if (??) digitalWrite(Relay_4, RELAY_OFF);  
    
        myGLCD.setFont(BigFont);
        myGLCD.setColor(VGA_WHITE);
      //  myGLCD.print(String(Temperature*0.1), 144,89); // температура воды
        myGLCD.setColor(VGA_WHITE);
        
        myGLCD.print(String(DHT.temperature), 368,89) ;
        myGLCD.print("C ", 432,89 );
        myGLCD.print(String(DHT.humidity), 368,109);
        myGLCD.print("%", 432,109);
  delay (5000);
}
[/code]

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

asvitich пишет:

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

А черепахи на каком контроллере?

asvitich
Offline
Зарегистрирован: 10.06.2016

ЕвгенийП пишет:

asvitich пишет:

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

А черепахи на каком контроллере?

живые...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

asvitich пишет:

живые...

Ой, блин, простите. Честное слово не стёб. Как раз смотрел на шестиного робота-паука и был абсолютно уверен, что у Вас черепахи-роботы. Даже подумал - "кормушка", это они типа сами походят к зарядке и подзаряжаются, что-ли? :))))))

asvitich
Offline
Зарегистрирован: 10.06.2016

неужели ни кто не может помочь?

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

Не знаю какую библиотеку Вы ипользуете, но Вам надо прочитать значение 1)-часов, 2)минут, 3)секунд, Например так:

void pokazChasov()
  {
  sekA = RTC.get(DS1307_SEC, true);   // Читаем значения секунды
  minA = RTC.get(DS1307_MIN, true);  // Читаем значения минуты
  chasA = RTC.get(DS1307_HR, true);  // Читаем значения часы
  denA = RTC.get(DS1307_DOW, true);   // Читаем значения номер дня недели
  chisA = RTC.get(DS1307_DATE, true);  // Читаем значения число
  mesA = RTC.get(DS1307_MTH, true);   // Читаем значения месяц
  godA = RTC.get(DS1307_YR, true);    // Читаем значения год
  }
После этого проверяете значение и реагируете

// Реле включения выключения лампы уф
     if (chasA == 9) digitalWrite(Relay_3, RELAY_ON); //включаем реле если время 09-00 
     if (chasA == 21 digitalWrite(Relay_3, RELAY_OFF); //выключаем реле если время 21-00 
    
         // реле включения кормушки
     if (chasA == 10 && minA == 0 && sekA == 0) digitalWrite(Relay_4, RELAY_ON); //включаем реле в 10-00 на 2 секунды 
     if (chasA == 10 && minA == 0 && sekA==2) digitalWrite(Relay_4, RELAY_OFF);  

     // реле включения кормушки
     if (chasA == 18 && minA == 0 && sekA == 0) digitalWrite(Relay_4, RELAY_ON); //включаем реле в 18-00 на 2 секунды 
    if (chasA == 18 && minA == 0 && sekA==2) digitalWrite(Relay_4, RELAY_OFF);  

И уберите в конце delay 5сек. потому что Вы не сможете открыть/закрыть комушку на 2 сек.

asvitich
Offline
Зарегистрирован: 10.06.2016

vosara пишет:

Не знаю какую библиотеку Вы ипользуете, но Вам надо прочитать значение 1)-часов, 2)минут, 3)секунд, Например так:

void pokazChasov()
  {
  sekA = RTC.get(DS1307_SEC, true);   // Читаем значения секунды
  minA = RTC.get(DS1307_MIN, true);  // Читаем значения минуты
  chasA = RTC.get(DS1307_HR, true);  // Читаем значения часы
  denA = RTC.get(DS1307_DOW, true);   // Читаем значения номер дня недели
  chisA = RTC.get(DS1307_DATE, true);  // Читаем значения число
  mesA = RTC.get(DS1307_MTH, true);   // Читаем значения месяц
  godA = RTC.get(DS1307_YR, true);    // Читаем значения год
  }
После этого проверяете значение и реагируете

// Реле включения выключения лампы уф
     if (chasA == 9) digitalWrite(Relay_3, RELAY_ON); //включаем реле если время 09-00 
     if (chasA == 21 digitalWrite(Relay_3, RELAY_OFF); //выключаем реле если время 21-00 
    
         // реле включения кормушки
     if (chasA == 10 && minA == 0 && sekA == 0) digitalWrite(Relay_4, RELAY_ON); //включаем реле в 10-00 на 2 секунды 
     if (chasA == 10 && minA == 0 && sekA==2) digitalWrite(Relay_4, RELAY_OFF);  

     // реле включения кормушки
     if (chasA == 18 && minA == 0 && sekA == 0) digitalWrite(Relay_4, RELAY_ON); //включаем реле в 18-00 на 2 секунды 
    if (chasA == 18 && minA == 0 && sekA==2) digitalWrite(Relay_4, RELAY_OFF);  

И уберите в конце delay 5сек. потому что Вы не сможете открыть/закрыть комушку на 2 сек.

Спасибо, за совет, что то при компиляции ошибка 'sekA' was not declared in this scope я так понимаю ее надо прописать где то...

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

Канешно этоже переменные, их нужно декларировать!!!

int sekA; 
int minA;
int chasA;
asvitich
Offline
Зарегистрирован: 10.06.2016

Теперь опять ошибка 'DS1307_SEC' was not declared in this scope

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

Я же Вам написал "Например так" Это значит что каждая библиотека по своему определяет часы, минуты, секунды. В самой библиотеке должны быть примеры, посмотрите их и определите как присвоить значение.

asvitich
Offline
Зарегистрирован: 10.06.2016

Понял, прошу прощения за глупые вопросы

asvitich
Offline
Зарегистрирован: 10.06.2016

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

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

Вот ссылка на сайт где есть библиотека которую я описал, но там надо регистрироваться а мне это не надо. Почитайте и скачаете. http://full-chip.net/17-arduino-rtc-ds1307-chasy-realnogo-vremeni-i-arduino-s-vyvodom-na-displey-16x2.html

У себе найти не могу!

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

Вот код на той библиотеке что у Вас (если я угадал) _ проверяйте:

#include <DS1307.h>

// Init the DS1307
DS1307  rtc(6, 7);

#define RELAY_ON LOW
#define RELAY_OFF HIGH
#define Relay_1  9  // температура воды
#define Relay_2  2  // температура суши
#define Relay_3  10  //  реле лампы 
#define Relay_4  11  // реле кормушки

// Init a Time-data structure
Time  t;
int chasA;
int minA;
int sekA;

void setup()
{
  // Set the clock to run-mode
  rtc.halt(false);
  
  // Setup Serial connection
  Serial.begin(9600);
  
}

void loop()
{
  // Get data from the DS1307
  t = rtc.getTime();
  
  chasA = t.hour;
  minA = t.min;
  sekA = t.sec;
  
  
// Реле включения выключения лампы уф
     if (chasA == 9) digitalWrite(Relay_3, RELAY_ON); //включаем реле если время 09-00 
     if (chasA == 21) digitalWrite(Relay_3, RELAY_OFF); //выключаем реле если время 21-00 
    
         // реле включения кормушки
     if (chasA == 10 && minA == 0 && sekA == 0) digitalWrite(Relay_4, RELAY_ON); //включаем реле в 10-00 на 2 секунды 
     if (chasA == 10 && minA == 0 && sekA==2) digitalWrite(Relay_4, RELAY_OFF);  

     // реле включения кормушки
     if (chasA == 18 && minA == 0 && sekA == 0) digitalWrite(Relay_4, RELAY_ON); //включаем реле в 18-00 на 2 секунды 
    if (chasA == 18 && minA == 0 && sekA==2) digitalWrite(Relay_4, RELAY_OFF);  
  
}

 

asvitich
Offline
Зарегистрирован: 10.06.2016

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

asvitich
Offline
Зарегистрирован: 10.06.2016

Включилось реле убрав одно равно if (chasA = 9) 

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

В 38 строчку пропишите Serial.println(chasA);

или Serial.println(t.hour); и посмотрите если монитор выдаст 9 и не включится то это один вопрос а если другое число то значит время не наступило
asvitich
Offline
Зарегистрирован: 10.06.2016

Выдало другое число, как настроить что реле работало с 9 до 21?

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

В принцепе там в коде все настроено (Правда я его не проверял) необходимо дождаться времени срабатывания и проверять все с помощью Serial. Просто проведите суточную проверку!!!

 

asvitich
Offline
Зарегистрирован: 10.06.2016

Хорошо попробую

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

asvitich пишет:

Выдало другое число, как настроить что реле работало с 9 до 21?

Попробуйте так:

#include <DS1307.h>

// Init the DS1307
DS1307  rtc(6, 7);

#define RELAY_ON LOW
#define RELAY_OFF HIGH
#define Relay_1  9  // температура воды
#define Relay_2  2  // температура суши
#define Relay_3  10  //  реле лампы 
#define Relay_4  11  // реле кормушки

// Init a Time-data structure
Time  t;
int chasA;
int minA;
int sekA;

void setup()
{
  // Set the clock to run-mode
  rtc.halt(false);

  // Setup Serial connection
  Serial.begin(9600);

}

void loop()
{
  // Get data from the DS1307
  t = rtc.getTime();

  chasA = t.hour;
  minA = t.min;
  sekA = t.sec;


  // Реле включения выключения лампы уф
  if (chasA >= 9 && chasA <= 21) digitalWrite(Relay_3, RELAY_ON); //включаем реле если время 09-00
  else digitalWrite(Relay_3, RELAY_OFF); //выключаем реле если время 21-00

  // реле включения кормушки
  if (chasA == 10 && minA == 0 && sekA == 0) digitalWrite(Relay_4, RELAY_ON); //включаем реле в 10-00 на 2 секунды
  if (chasA == 10 && minA == 0 && sekA == 2) digitalWrite(Relay_4, RELAY_OFF);

  // реле включения кормушки
  if (chasA == 18 && minA == 0 && sekA == 0) digitalWrite(Relay_4, RELAY_ON); //включаем реле в 18-00 на 2 секунды
  if (chasA == 18 && minA == 0 && sekA == 2) digitalWrite(Relay_4, RELAY_OFF);

}

 

asvitich
Offline
Зарегистрирован: 10.06.2016

Супер, так работает, спасибо большое! 

asvitich
Offline
Зарегистрирован: 10.06.2016

Спасибо работают оба кода, проблема была в delay, тогда другой вопрос как сделать чтоб информация о температуре и влажности не скакала так сильно... обновлялась каждые 5 секунд?

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

Мерять каждые 0,5 секунды - через 5 сек. получим 10 значений. Вывести среднее