Суточный таймер на 8 каналов,помогите.

Udav4ik
Offline
Зарегистрирован: 13.10.2015

Уважаемые програмисты, помогите пожалуйста доделать чужой скетч под мои нужды. Автор в теме не появляется, а обратиться мне больше не к кому. Мне нужно чтобы таймер первого канала срабатывал три раза в сутки на включение\выключение. Два срабатывания в скетче уже реализовано, как сделать третье? Обратите внимание на строки скетча 38,39 и 109-111. Это я пытался переделать самостоятельно, но ничего не получилось, скетч компилируется, но реле по времени таймера не срабатывает, подправьте пожалуйста скетч, буду очень признателен, спасибо.

/*Готовая версия контроллера я рад)
 * Роман Четин
 */

//Загрузка библиотек 
#include <OneWire.h>
#include <Wire.h>
#include <RTClib.h>

int TSensorPin1 = 2;
int TSensorPin2 = 3;
OneWire ds1(TSensorPin1);
OneWire ds2(TSensorPin2);

RTC_DS1307 RTC;
//Подключение выходов
const int RelayChn1 = 5;        //Используем цифровой ПОРТ 5  для ПЕРВОГО    канала релейного модуля
const int RelayChn2 = 6;        //Используем цифровой ПОРТ 6  для ВТОРОГО    канала релейного модуля
const int RelayChn3 = 7;        //Используем цифровой ПОРТ 7  для ТРЕТЬЕГО   канала релейного модуля
const int RelayChn4 = 8;        //Используем цифровой ПОРТ 8  для ЧЕТВЕРТОГО канала релейного модуля
const int RelayChn5 = 9;        //Используем цифровой ПОРТ 9  для ПЯТОГО     канала релейного модуля
const int RelayChn6 = 10;       //Используем цифровой ПОРТ 10 для ШЕСТОГО    канала релейного модуля
const int RelayChn7 = 11;       //Используем цифровой ПОРТ 11 для СЕДЬМОГО   канала релейного модуля
const int RelayChn8 = 12;       //Используем цифровой ПОРТ 12 для ВОСЬМОГО   канала релейного модуля
#define sc 1UL
#define mn 60UL
#define hr 3600UL

//----------Настройки времени и продолжительности включения реле

//----------Первый канал  LED 5ШТ.*10ВТ. Реле №3 ------------
const long StartRelCn_1 = 8*hr+00*mn+00*sc;        //Время срабатывания на ПЕРВОМ канале релейного модуля
const long DurationCh_1 = 2*hr+00*mn+00*sc;        //ДЛИТЕЛЬНОСТЬ срабатывания реле на ПЕРВОМ канале
//----------Первый канал  LED 5ШТ.*10ВТ  Реле №3  -------------
const long StartRelCn_1L = 12*hr+00*mn+00*sc;               
const long DurationCh_1L = 2*hr+00*mn+00*sc;
//----------Первый канал----------------------------
//const long StartRelCn_1G = 17*hr+00*mn;               
//const long DurationCh_1G = 5*hr+00*mn;

//----------Второй канал   LED 7ШТ.*10ВТ. Реле №4 ------------
const long StartRelCn_2 = 10*hr+00*mn+00*sc;                    
const long DurationCh_2 = 7*hr+00*mn+00*sc;     
              
//----------Третий канал   LED (24 BLUE+10 RED)*3ВТ. Реле №5 ----
const long StartRelCn_3 = 7*hr+30*mn+00*sc;                      
const long DurationCh_3 = 15*hr+00*mn+00*sc;    
                 
//----------Четвертый канал CO2   Реле №2 --------------
const long StartRelCn_4 = 9*hr+00*mn+00*sc;                     
const long DurationCh_4 = 12*hr+00*mn+00*sc;            

//----------Пятый канал   Удобрения  Реле №1 ------------
const long StartRelCn_5 = 10*hr;                
const long DurationCh_5 = 30*sc;          
          
//----------Шестой канал   Кормушка  ---------------------
const long StartRelCn_6 = 9*hr;                    
const long DurationCh_6 = 0*hr;         
           
//----------Терморегуляторы

//----------Седьмой КАНАЛ----------------------------
float t1 = 24.5;                                     //Уставка температуры для СЕДЬМОГО канала релейного модуля 1 аквариум
float tGistrsis1 = 0.7;                              //Уставка гистерезиса - т.е отклонения от темп-ры уставки т.е. в данном случае 0,7 = плюс минус 0,35 градуса

//----------Восьмой КАНАЛ----------------------------
float t2 = 24.5;                                     //Уставка температуры для ВОСЬМОГО канала релейного модуля 2 аквариум
float tGistrsis2 = 0.7;               
//*********************************************************

void setup () {
  Wire.begin();            
  RTC.begin();
   //  RTC.adjust(DateTime(__DATE__, __TIME__)); // строка только для первой компиляции!!!
  DateTime myTime = RTC.now();

  //Первоначальные установки выходов
    pinMode(RelayChn1,OUTPUT);                       //Инициализируем порт для 1 канала как ВЫХОД
    pinMode(RelayChn2,OUTPUT);                       //Инициализируем порт для 2 канала как ВЫХОД   
    pinMode(RelayChn3,OUTPUT);                       //Инициализируем порт для 3 канала как ВЫХОД  
    pinMode(RelayChn4,OUTPUT);                       //Инициализируем порт для 4 канала как ВЫХОД
    pinMode(RelayChn5,OUTPUT);                       //Инициализируем порт для 5 канала как ВЫХОД   
    pinMode(RelayChn6,OUTPUT);                       //Инициализируем порт для 6 канала как ВЫХОД 
    pinMode(RelayChn7,OUTPUT);                       //Инициализируем порт для 7 канала как ВЫХОД
    pinMode(RelayChn8,OUTPUT);                       //Инициализируем порт для 8 канала как ВЫХОД   
   
    digitalWrite(RelayChn1,LOW);                    //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень 
    digitalWrite(RelayChn2,LOW);                    //Т.к. используемый релейный модуль с опторазвязкой - управляется инверсной логикой 
    digitalWrite(RelayChn3,LOW);                       
    digitalWrite(RelayChn4,LOW);                   
    digitalWrite(RelayChn5,LOW);                    
    digitalWrite(RelayChn6,HIGH);                     
    digitalWrite(RelayChn7,LOW);                   
    digitalWrite(RelayChn8,LOW);                   
 }
//***************************************************
void loop () {
  DateTime myTime = RTC.now();
  uint32_t utime = myTime.unixtime();
  utime %=86400;
  
//----------------------------релейная настройка начало------------------
    //------------КАНАЛ 1------------------------------
    if ((utime >= StartRelCn_1) && 
       (utime < (StartRelCn_1+DurationCh_1)) or (utime >= StartRelCn_1L) && 
       (utime < (StartRelCn_1L+DurationCh_1L))) 
     
   //if ((utime >= StartRelCn_1) && 
   //   (utime < (StartRelCn_1+DurationCh_1)) or (utime >= StartRelCn_1G) && 
   //   (utime < (StartRelCn_1G+DurationCh_1G)))   
      {
          digitalWrite(RelayChn1,LOW);             //Устанавливаем на входе релейного модуля НИЗКИЙ уровень - реле срабатывает
        
       }  
    else
      {
          digitalWrite(RelayChn1,HIGH);              //Устанавливаем на входе релейного модуля ВЫСОКИЙ уровень - реле выключается
         
      } 

    //------------КАНАЛ 2 ------------------------------
    if ((utime >= StartRelCn_2) && 
       (utime < (StartRelCn_2+DurationCh_2)))
      {
        digitalWrite(RelayChn2,LOW);                 //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
        
      }  
    else
      {
          digitalWrite(RelayChn2,HIGH);              //Устанавливаем на ВТОРОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
         
      } 

//------------КАНАЛ 3------------------------------
    if ((utime >= StartRelCn_3) && 
       (utime < (StartRelCn_3+DurationCh_3)))
      {
          digitalWrite(RelayChn3,LOW);               //Устанавливаем на ТРЕТЬЕМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
        
      }  
    else
      {
          digitalWrite(RelayChn3,HIGH);              //Устанавливаем на ТРЕТЬЕМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
          
      } 
//------------КАНАЛ 4------------------------------
    if ((utime >= StartRelCn_4) && 
       (utime < (StartRelCn_4+DurationCh_4)))
      {
          digitalWrite(RelayChn4,LOW);               //Устанавливаем на ЧЕТВЕРТОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
         
      }  
    else
      {
          digitalWrite(RelayChn4,HIGH);              //Устанавливаем на ЧЕТВЕРТОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
          
      } 
//------------КАНАЛ 5------------------------------
    if ((utime >= StartRelCn_5) && 
       (utime < (StartRelCn_5+DurationCh_5)))
      {
          digitalWrite(RelayChn5,LOW);               //Устанавливаем на ПЯТОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
         
      }  
    else
      {
          digitalWrite(RelayChn5,HIGH);              //Устанавливаем на ПЯТОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
         
      } 
//------------КАНАЛ 6------------------------------
    if ((utime >= StartRelCn_6) && 
       (utime < (StartRelCn_6+DurationCh_6)))
      {
          digitalWrite(RelayChn6,HIGH);               //Устанавливаем на ШЕСТОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
        
      }  
    else
      {
          digitalWrite(RelayChn6,LOW);              //Устанавливаем на ШЕСТОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
        
      } 
 //------------КАНАЛ 7 Контроль температуры -------
     float temp1 = getTemp1();                          //Читаем температуру с датчика 

    if (temp1 < t1-tGistrsis1/2)
      {
        digitalWrite(RelayChn7,LOW);                 //Устанавливаем на 7 входе релейного модуля НИЗКИЙ уровень - реле срабатывает
      
      }     
    else if (temp1 > t1+tGistrsis1/2)
      {
        digitalWrite(RelayChn7,HIGH);                //Устанавливаем на 7 входе релейного модуля ВЫСОКИЙ уровень - реле выключается
      
      }     
      
//------------КАНАЛ 8 Контроль температуры -----------
   float temp2 = getTemp2();                          //Читаем температуру с датчика 
  
    //------------КАНАЛ 3 Контроль температуры -------
    if (temp1 < t1-tGistrsis2/2)
      {
        digitalWrite(RelayChn8,LOW);                 //Устанавливаем на 8 входе релейного модуля НИЗКИЙ уровень - реле срабатывает
     
      }     
    else if (temp2 > t2+tGistrsis2/2)
      {
        digitalWrite(RelayChn8,HIGH);                //Устанавливаем на 8 входе релейного модуля ВЫСОКИЙ уровень - реле выключается

      }
}
//*****************************************************
//Функции чтения с датчиков температуры
float getTemp1(){                                       
  byte data[12];
  byte addr[8];
  if ( !ds1.search(addr)) {
    //no more sensors on chain, reset search
    ds1.reset_search();
    return -1001;  
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) {

    return -1002;
  }

  if ( addr[0] != 0x10 && addr[0] != 0x28) {

    return -1003;
  }

  ds1.reset();
  ds1.select(addr);
  ds1.write(0x44,1); 

  byte present = ds1.reset();
  ds1.select(addr); 
  ds1.write(0xBE); 


  for (int i = 0; i < 9; i++) { 
    data[i] = ds1.read();
  }

  ds1.reset_search();

  byte MSB = data[1];
  byte LSB = data[0];

  float TRead = ((MSB<<8) | LSB); 
  float Temperature = TRead / 16;

  return Temperature;
}
float getTemp2(){                                       
  byte data[12];
  byte addr[8];
  if ( !ds2.search(addr)) {
    //no more sensors on chain, reset search
    ds2.reset_search();
    return -1001;  
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) {

    return -1002;
  }

  if ( addr[0] != 0x10 && addr[0] != 0x28) {

    return -1003;
  }

  ds2.reset();
  ds2.select(addr);
  ds2.write(0x44,1); 

  byte present = ds2.reset();
  ds2.select(addr); 
  ds2.write(0xBE); 


  for (int i = 0; i < 9; i++) { 
    data[i] = ds2.read();
  }

  ds2.reset_search();

  byte MSB = data[1];
  byte LSB = data[0];

  float TRead = ((MSB<<8) | LSB); 
  float Temperature = TRead / 16;

  return Temperature;
}

 

Garou
Offline
Зарегистрирован: 24.01.2015

Привет. Мне кажется, так должно быть правильно:



const long StartRelCn_1L = 12*hr+00*mn+00*sc;               
const long DurationCh_1L = 2*hr+00*mn+00*sc;
const long StartRelCn_1G = 17*hr+00*mn+00*sc;               
const long DurationCh_1G = 5*hr+00*mn+00*sc;


 if ((utime >= StartRelCn_1) && 
(utime < (StartRelCn_1+DurationCh_1)) or (utime >= StartRelCn_1L) && 
(utime < (StartRelCn_1L+DurationCh_1L))  or (utime >= StartRelCn_1G) && 
 (utime < (StartRelCn_1G+DurationCh_1G)))   
 {
  digitalWrite(RelayChn1,LOW);            
    }  
 else
 {
    digitalWrite(RelayChn1,HIGH);  
 }

Проверить сейчас не на чем...

Udav4ik
Offline
Зарегистрирован: 13.10.2015

Garou пишет:

Привет. Мне кажется, так должно быть правильно:

Огромное спасибо, все работает!

Udav4ik
Offline
Зарегистрирован: 13.10.2015

Подскажите пожалуйста еще, как вывести показания температуры с датчиков на окно СОМ порта?

Garou
Offline
Зарегистрирован: 24.01.2015

Между строками 74 и 75 добавить





 Serial.begin(9600);

 

Между 184-185





Serial.print("Температура датчика 1: ");

Serial.print(temp1);

Serial.println(" °C");

198-199





Serial.print("Температура датчика 2: ");

Serial.print(temp2);

Serial.println(" °C");

 

Самый простой вариант, но так будет выводить с каждым повторением цикла.

 

Udav4ik
Offline
Зарегистрирован: 13.10.2015

Еще раз спасибо,  Garou, все работает, поставил секундную задержку,мне эта функция нужна только временно, для отладки.