Не работает реле с RTC

voVWan
Offline
Зарегистрирован: 04.01.2016

Да конечно мне интересен сейчас любой код по этой теме, лучше в котором есть комментарии :) так легче разобраться с нуля :)

lex2k
Offline
Зарегистрирован: 17.12.2015

ПОЧТА.....ПРОГА К АДРОИДУ НАДО?  НО ТАМ HC-05 НАДО БУДЕТ

ВОТ ПОСМОТРИ

https://drive.google.com/open?id=0B9rTcUo5hhxQWVVMWm5kcW1pOXM

lex2k
Offline
Зарегистрирован: 17.12.2015

voVWan пишет:

Да конечно мне интересен сейчас любой код по этой теме, лучше в котором есть комментарии :) так легче разобраться с нуля :)

 

// программа имеет два канала упраления 1- по времени.....2 - в промежутке включения реле времени включается контроль  по темперетуре........... время(дискретность 30 мин) и температура(дискретность 1 градус) ВКЛ и ВЫКЛ устанавливается через блютуф c Android девайса 
// контролер Duemilanove на 168, время берется с DS3231, температура с DHT11.  блютуф HC-05. время и температура ВКЛ и ВЫКЛ 5 раз в сутки при изменеии сохраняются в eeprom  на DS3231
// есть тест вкл\выкл реле.
 
#include <Wire.h>
#include <DS3231.h>
DS3231 Clock;
#include <dht11.h>      //  библиотека DHT11
dht11 DHT;               // Объявление переменной класса dht11
#define DHT11_PIN 4     // Датчик DHT11 подключен к цифровому пину номер 4
int Curent_Time, On_Time, Off_Time;//текущее время в минутах // время вкл в минутах // время выкл в минутах
byte  hour, minute,second, temperature, hum, temp,ton,tof;
byte hour_on, min_on, hour_of, min_of;
bool h12;             // для DS3231
bool PM;               // для DS3231 
 
 String strtmp, timestate, tempstate;     // вспомогательная переменная для формирования текста ответа
 char inchar[5];    //  буфер команды  на 4 символа + 1 символ конца строки
 
 void clrch()      // отчиска  буфера команды 
 {                 
   inchar[0]='\0';
   inchar[1]='\0';
   inchar[2]='\0';
   inchar[3]='\0';
 }
 
void i2c_eeprom_write_byte( int deviceaddress, unsigned int eeaddress, byte data ) {
    int rdata = data;
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddress >> 8)); // MSB
    Wire.write((int)(eeaddress & 0xFF)); // LSB
    Wire.write(rdata);
    Wire.endTransmission();
  }
  byte i2c_eeprom_read_byte( int deviceaddress, unsigned int eeaddress ) {
    byte rdata = 0xFF;
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddress >> 8)); // MSB
    Wire.write((int)(eeaddress & 0xFF)); // LSB
    Wire.endTransmission();
    Wire.requestFrom(deviceaddress,1);
    if (Wire.available()) rdata = Wire.read();
    return rdata;
  }   
   
void setup(){
  Wire.begin();
  Serial.begin(115000);   // Скорость работы порта
  pinMode(11, OUTPUT);          //вых реле 1 
  digitalWrite(11, HIGH);
  pinMode(12, OUTPUT);          //вых реле 2
  digitalWrite(12, HIGH);
  
//считывает из микросхемы памяти памяти установленной на DS3231
   hour_on = i2c_eeprom_read_byte(0x57, 0);    // час вкл
   hour_of = i2c_eeprom_read_byte(0x57, 1);    // час выкл
   min_on  = i2c_eeprom_read_byte(0x57, 2);    // минута вкл
   min_of  = i2c_eeprom_read_byte(0x57, 3);    // минута выкл
   ton = i2c_eeprom_read_byte(0x57, 4);       // температура вкл
   tof = i2c_eeprom_read_byte(0x57, 5);       // температура выкл
  
/*
  Clock.setSecond(50);//Set the second 
  Clock.setMinute(59);//Set the minute 
  Clock.setHour(11);  //Set the hour 
  Clock.setDoW(5);    //Set the day of the week
  Clock.setDate(31);  //Set the date of the month
  Clock.setMonth(5);  //Set the month of the year
  Clock.setYear(13);  //Set the year (Last two digits of the year)
 
 
 
   // Мониторинг ошибок DTH11
  chk = DHT.read(DHT11_PIN);    // Чтение данных
  switch (chk){
  case DHTLIB_OK:  
    break;
  case DHTLIB_ERROR_CHECKSUM:
    Serial.println("DHT11:Checksum error, \t");
    break;
  case DHTLIB_ERROR_TIMEOUT:
    Serial.println("DHT11:Time out error, \t");
    break;
  default:
    Serial.println("DHT11:Unknown error, \t");
    break;}
    */ 
}
 
void loop()
{
  second=Clock.getSecond();       //    считываем время с DS3231
  minute=Clock.getMinute();
  hour=Clock.getHour(h12, PM);
  temperature=Clock.getTemperature();
  
             
  temp = byte(DHT.temperature);   // считываем с DTH11
  hum = byte(DHT.humidity);
             
   
   // начало обработки  команд блютуфа __________________________________________________________________________
   if( Serial.available() )
  {  
      if ( Serial.peek()!='#')                          // если  следующий символ  не "#" 
                    Serial.read(); delay(10);          // просто принять символ в никуда
 
                                                       // если  следующий символ "#", (с него начинается строка команды )
  if ( Serial.peek()=='#')                             // считывается 4 символа комады начинающейся с "#"
      { 
        inchar[0]= Serial.read(); delay(10);   //!!!!!!!!задержка необходима,  иначе НЕ происходит разпознование команд   // 1-й это "#"
        inchar[1]= Serial.read(); delay(10);    //!!!!!!!! установленно как факт                     // 2-й
        inchar[2]= Serial.read(); delay(10);                                                         // 3-й
        inchar[3]= Serial.read(); delay(10);                                                         // 4-й
          
      }
      
                             
  if (String(inchar)=="#ht?")                               // распознавание 1-й команды
       {                                                    // действия на команду отправить значения температуры и влажности , температуру вкл и температуру откл
        strtmp = String (hum)  + "  %" + '\n'               // формирование текста для отправки ответа
                 + String (temp)+ "  C" + '\n' + '\n'+ '\n'
                 + String (ton)+ "  C"  + "               "    
                 + String (tof)+ "  C" + '\n' + '\n'+ tempstate ;    
       
       Serial.println(strtmp);                              // отправка ответа
      
       clrch();                                            // отчиска  буфера команды 
       }
 
  if (String(inchar)=="#tm?")                                           // распознавание -й команды
       {                                                               // действия на команду отправить значения температуры с датчика часов; часы, минуты, секунды времени; 
                                                                       // часы, минуты ВКЛ ;часы, минуты ВЫКЛ
        strtmp =  String (temperature)+ "  C" + "     "                // формирование текста для отправки ответа
        + String (hour) + ":" + String (minute)+ ":" + String (second) +'\n' + '\n' +'\n'   
        + String (hour_on) + ":" + String (min_on) + "               " 
        + String (hour_of) + ":" + String (min_of)  +'\n' + '\n'+ timestate ;
          
       Serial.println(strtmp);
      
       clrch();                                     
       } 
   // начало установки времени============================== 
   if (String(inchar)=="#hnp")                             // распознавание -й команды
       {                                                 // действия на команду  ЧАС ВКЛ  +1
       if (hour_on < 23)  hour_on +=1;
      
       clrch();
           
       }  
 
    if (String(inchar)=="#hnm")                             // распознавание -й команды
       {                                                 // действия на команду  ЧАС ВКЛ  -1
       if (hour_on > 0) hour_on -=1;
     
       clrch();
       }    
       
       
    if (String(inchar)=="#mns")                             // распознавание -й команды
       {                                                 // действия на команду МИНУТЫ ВКЛ  +- 30 
       if (min_on == 0) min_on = 30; else min_on = 0 ;
      
       clrch();
       } 
       
    if (String(inchar)=="#hfp")                             // распознавание -й команды
       {                                                 // действия на команду  ЧАС ВЫКЛ  +1
        if (hour_of < 23)hour_of +=1;
        
        clrch();
           
       }  
 
    if (String(inchar)=="#hfm")                             // распознавание -й команды
       {                                                 // действия на команду  ЧАС ВЫКЛ  -1
        if (hour_of > 0) hour_of -=1;
       
        clrch();
       }                                           
      
       
    if (String(inchar)=="#mfs")                             // распознавание -й команды
       {                                                 // действия на команду  МИНУТЫ ВЫКЛ +- 30  
       if (min_of == 0) min_of = 30; else min_of = 0 ;
      
       clrch();
       } 
// конец установки времени============================== 
                                  
// начало установки температуры======================================
    if (String(inchar)=="#tnu")            // распознавание -й команды 
       {                                // действия на команду увеличить на 1 темп вкл
       if (ton < 50 && ton < tof-1) ton+=1;                            
        clrch(); 
       }
       
  if (String(inchar)=="#tnd")           // распознавание -й команды 
       {                               // действия на команду уменьшить на 1 темп вкл
         if (ton > 0)ton-=1;
        clrch();
       }                          
  if (String(inchar)=="#tfu")          // распознавание -й команды 
       {                                // действия на команду увеличить на 1 темп откл
        if (tof < 50)tof+=1;
        clrch();
       }
  if (String(inchar)=="#tfd")            // распознавание -й команды 
       {                                // действия на команду уменьшить на 1 темп откл
      if (tof > 0 && tof > ton+1 ) tof-=1 ;        
       clrch(); 
       }
// конец установки температуры======================================  
 
 // начало тест реле======================================
 
  if (String(inchar)=="#rhn")           // распознавание -й команды 
       {                               // действия на команду тест вкл реле по температуре
       digitalWrite(11,  LOW);
       delay(3000);
       clrch();
       }
  if (String(inchar)=="#rhf")           // распознавание -й команды 
       {                               // действия на команду тест выкл реле по температуре
        digitalWrite(11,  HIGH); 
        delay(3000);
        clrch();
       }     
  if (String(inchar)=="#rln")           // распознавание -й команды 
       {                               // действия на команду тест вкл реле по времени
        digitalWrite(12, LOW); 
        delay(3000);
        clrch();
       } 
   if (String(inchar)=="#rlf")           // распознавание -й команды 
       {                               // действия на команду тест выкл реле  по времени
        digitalWrite(12, HIGH); 
        delay(3000);
        clrch();
       } 
       // конец тест реле======================================
                         
  }
// конец обр команд______________________________________________________________
 
// начало управления по температуре_______________________________________________________
    if (digitalRead(12)== LOW)                      // если реле времени сработало контроль  температуры вкл
    {
    if (temp < ton ) digitalWrite(11, LOW);
    if (temp > tof ) digitalWrite(11, HIGH);
    }
    else
    digitalWrite(11, HIGH) ;
    
   if (digitalRead(11))  tempstate = "OFF"; else tempstate = "ON"; //   для вывода состояния реле
   
// конец управления по температуре___________________________________________________________
 
// начало управления по времени_______________________________________________________
   Curent_Time=(hour*60+minute)-1;//текущее время в минутах //1440=24часа*60мин
   On_Time=(hour_on*60+min_on)-1; // время вкл в минутах
   Off_Time=( hour_of*60+min_of)-1; // время выкл в минутах
   
   if (On_Time < Off_Time) //Проверка при On_Time < Off_Time
  {
    if (Curent_Time >= On_Time && Curent_Time <= Off_Time)
      {
        digitalWrite(12, LOW);        
      }
    else
      {
        digitalWrite(12, HIGH);       
      }
  }
  else // Проверка при On_Time > Off_Time
 
  {
        if (Curent_Time >= On_Time ||Curent_Time <= Off_Time)//1440=24часа*60мин
      {
        digitalWrite(12, LOW);        
      }
    else
      {
        digitalWrite(12, HIGH);        
      }
  }
 
   if (digitalRead(12))  timestate = "OFF"; else timestate = "ON";
 // конец управления по времени___________________________________________________________ 
  
 // начало eeprom_______________________________________________________
   if ( (hour % 4)  == 0  && minute == 0 && second == 0 )  // запись по времени каждые раз 4 чеса если были изменения установок
   { 
     byte ch_sum = hour_on +  hour_of + min_on + min_of + ton + tof;
        
     byte ch_sum_ee =  i2c_eeprom_read_byte(0x57, 6);
     
    if (ch_sum_ee != ch_sum)
     {
      i2c_eeprom_write_byte(0x57,0, hour_on) ;
      delay(10); 
      i2c_eeprom_write_byte(0x57,1, hour_of) ;
      delay(10); 
      i2c_eeprom_write_byte(0x57,2, min_on);
      delay(10);   
      i2c_eeprom_write_byte(0x57,3, min_of) ;
      delay(10);  
      i2c_eeprom_write_byte(0x57,4, ton) ;
      delay(10); 
      i2c_eeprom_write_byte(0x57,5, tof) ;
      delay(10); 
      i2c_eeprom_write_byte(0x57,6, ch_sum) ;
      delay(10); 
      i2c_eeprom_write_byte(0x57,7, i2c_eeprom_read_byte(0x57, 7)+ 1) ; // количество записей eeprom
      delay(10);
      delay(1000); // что бы секунды при сравнении  не совпали повторно и не было повторной записи
      }
    }; 
  
   // конец eeprom___________________________________________________________ 
           
}
 
voVWan
Offline
Зарегистрирован: 04.01.2016

Вообшем собрал я солянку из чужих скетчей) Пока черновик но как ни странно работает!))) спасибо всем за помощь, ваши скетчи тоже буду изучать

Задача: в определенный заданный интервал времени, один раз ночью, первое реле должно включить нагрев ёмкости на 5 минут. Но наргрев должен происходить только до определенной температуры и реле должно поддерживать заданную температуру эти 5 минут.

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

После того как время работы первого реле истекет, и жидкость будет нужной нужной температуры - то тут включается второе реле, приводя в действие водянную помпу на несколько секнд, что бы та налила нужное количество жидкости.

 

//----------ИМПОРТ БИБЛИОТЕК-------------------------
#include <Wire.h>                                   //Подключаем библиотеку для использования I2C интерфейса с модулем RTC 
#include <OneWire.h>                                //Подключаем библиотеку для использования однопроводного интерфейса 
OneWire oneWire(10);                                //Подключаем датчик DS18B20 на цифровой пин 10
#include <DallasTemperature.h>                      //Температурного датчика DS18B20
#include <RTClib.h>                                 //Подключаем библиотеку для использования модуля часов реального времени RTC
DallasTemperature sensors(&oneWire);                //Создаем объект sensors, подключенный по OneWire

//Создаем переменные для работы с термометром

DeviceAddress tempDeviceAddress;                   //переменная для хранения адреса датчика
float temp=0;                                      //переменная для текущего значения температуры
const int t0 = 55;                                 //Уставка температуры включения первого реле
const int tGistrsis = 1;                           //Уставка гистерезиса - т.е отклонения от темп-ры уставки
                                                   //т.е. в данном случае 1 = плюс минус 0.5 градус

RTC_DS1307 RTC;                                     //Создаем переменную класса - для использования RTC
//----------Объявляем разные переменные--------------
const int RelayChn1 = 6;                            //Используем цифровой ПОРТ 6 для ПЕРВОГО канала релейного модуля
const int RelayChn2 = 7;                            //Используем цифровой ПОРТ 7 для ВТОРОГО канала релейного модуля

//----------Настройки времени и продолжительности включения реле
//----------ПЕРВЫЙ канал----------------------------
const long StartRelCn_1 = 76860;                     //Время срабатывания в ПЕРВОМ канале релейного модуля (в секундах от начала суток) 
                                                     //в данном случае 25200 - это 7 часов 00 минут  = ( 60секунд *60 минут *7 = 25200) 
const long DurationCh_1 = 300;                        //ДЛИТЕЛЬНОСТЬ срабатывания реле в ПЕРВОМ канале (в секундах) 
//----------ВТОРОЙ канал----------------------------
const long StartRelCn_2 = 77200;                     //Время срабатывания во ВТОРОМ канале релейного модуля (в секундах от начала суток)
                                                     //В данном случае 10 часов 30 минут = (60 секунд * 60 минут * 10 часов + 60сек*30мин = 37800) 
const long DurationCh_2 = 14;                        //ДЛИТЕЛЬНОСТЬ срабатывания реле во ВТОРОМ канале (в секундах) 
//----------ТРЕТИЙ КАНАЛ----------------------------


//----------Модуль инициализации setup() - выполняется один раз при инициализации платы при подаче напряжение (и аналогичных событиях) 
void setup(){

    //Инициализируем термодатчик и установим разрешающую способность 12 бит 
    sensors.begin();
    sensors.getAddress(tempDeviceAddress, 0);
  
    //digitalWrite(TSensorPin,HIGH); 
    pinMode(RelayChn1,OUTPUT);                       //Инициализируем порт для ПЕРВОГО канала как ВЫХОД
    pinMode(RelayChn2,OUTPUT);                       //Инициализируем порт для ВТОРОГО канала как ВЫХОД  

    digitalWrite(RelayChn1,HIGH);                    //Устанавливаем на входах релейного модуля ВЫСОКИЙ уровень 
    digitalWrite(RelayChn2,HIGH);                    //Т.к. используемый релейный модуль с опторазвязкой - управляется инверсной логикой   

    Wire.begin();                                    //Инициируем I2C интерфейс
    RTC.begin();                                     //Инициирум RTC модуль
   

}                                                    
//--------------------------------------------------
void loop()                                         
{ 
    //Запуск процедуры измерения температуры
    sensors.setWaitForConversion(false);
    sensors.requestTemperatures();
    sensors.setWaitForConversion(true);
    //Считывание значения температуры
    sensors.getAddress(tempDeviceAddress, 0);
    temp=sensors.getTempC(tempDeviceAddress);
    
    DateTime myTime = RTC.now();                     //Читаем данные времени из RTC   
 
    //----------Раздел обработки реле по времени ----
    long utime = myTime.unixtime();                  //сохраняем время в формате UNIX
    utime %= 86400;                                  //Сохраняем в переменной остаток деления на кол-во секнд в сутках, 
                                                     //Это дает количество секунд с начала текущих суток

    //------------КАНАЛ 1 (Контроль температуры по времени) -------
    sensors.requestTemperatures();
    if ((((utime >= StartRelCn_1) &&                 //Если секунд с начала суток больше, чем задано для включения                                             
       (utime < (StartRelCn_1+DurationCh_1)))) &&    //Но одновременно и меньше, чем задано для включения + длительность  
       (temp < t0-tGistrsis/2))                      //И при этом температура ниже чем заданная минус половина гистерезиса
      {
        digitalWrite(RelayChn1,LOW);                 //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
      }     
    else if (temp > t0+tGistrsis/2)                  //Температура выше чем заданная плюс половина гистерезиса
      {                                              //И во всех остальных случаях, в том числе и если время на работу реле истекло
        digitalWrite(RelayChn1,HIGH);                //Устанавливаем на ВТОРОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
      }     
      
 //------------КАНАЛ 2 (Включение насоса)------------------------------
    if ((utime >= StartRelCn_2) && 
       (utime < (StartRelCn_2+DurationCh_2)))
                                                     //Если секунд с начала суток больше, чем задано для включения 
                                                     //Но, одновременно и меньше, чем задано для включения + длительность 
      {
          digitalWrite(RelayChn2,LOW);               //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
      }  
    else
      {
          digitalWrite(RelayChn2,HIGH);              //Устанавливаем на ВТОРОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
      } 

}//------------Конец ЦИКЛА-----------------------------

 

Alexino
Offline
Зарегистрирован: 29.12.2015

Странно. Неужели вот это :







    //------------КАНАЛ 1 (Контроль температуры по времени) -------
    sensors.requestTemperatures();
    if ((((utime >= StartRelCn_1) &&                 //Если секунд с начала суток больше, чем задано для включения                                             
       (utime < (StartRelCn_1+DurationCh_1)))) &&    //Но одновременно и меньше, чем задано для включения + длительность  
       (temp < t0-tGistrsis/2))                      //И при этом температура ниже чем заданная минус половина гистерезиса
      {
        digitalWrite(RelayChn1,LOW);                 //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
      }     
    else if (temp > t0+tGistrsis/2)                  //Температура выше чем заданная плюс половина гистерезиса
      {                                              //И во всех остальных случаях, в том числе и если время на работу реле истекло
        digitalWrite(RelayChn1,HIGH);                //Устанавливаем на ВТОРОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
      }     
      
 //------------КАНАЛ 2 (Включение насоса)------------------------------
    if ((utime >= StartRelCn_2) && 
       (utime < (StartRelCn_2+DurationCh_2)))
                                                     //Если секунд с начала суток больше, чем задано для включения 
                                                     //Но, одновременно и меньше, чем задано для включения + длительность 
      {
          digitalWrite(RelayChn2,LOW);               //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле срабатывает
      }  
    else
      {
          digitalWrite(RelayChn2,HIGH);              //Устанавливаем на ВТОРОМ входе релейного модуля ВЫСОКИЙ уровень - реле выключается
      } 

выглядит симпатичнее этого :







    //-------------------------------------------------------
    relay_1 = (cur_time>=relay_1_on) && (cur_time<relay_1_off);
    relay_2 = (cur_time>=relay_2_on) && (cur_time<relay_2_off);
    //-------------------------------------------------------

А это :







//----------Настройки времени и продолжительности включения реле
//----------ПЕРВЫЙ канал----------------------------
const long StartRelCn_1 = 76860;                     //Время срабатывания в ПЕРВОМ канале релейного модуля (в секундах от начала суток) 
                                                     //в данном случае 25200 - это 7 часов 00 минут  = ( 60секунд *60 минут *7 = 25200) 
const long DurationCh_1 = 300;                        //ДЛИТЕЛЬНОСТЬ срабатывания реле в ПЕРВОМ канале (в секундах) 
//----------ВТОРОЙ канал----------------------------
const long StartRelCn_2 = 77200;                     //Время срабатывания во ВТОРОМ канале релейного модуля (в секундах от начала суток)
                                                     //В данном случае 10 часов 30 минут = (60 секунд * 60 минут * 10 часов + 60сек*30мин = 37800) 
const long DurationCh_2 = 14;                        //ДЛИТЕЛЬНОСТЬ срабатывания реле во ВТОРОМ канале (в секундах) 

информативней этого :







time    relay_1_on(20, 26, 0);   // 20:26:0
time    relay_1_off(20, 26, 10);  // 20:26:10	
time    relay_2_on(20, 26, 30);
time    relay_2_off(20, 26, 40);

?

Очень странно.... 

Можно ещё в класс добавить пару строк, и вот это :

DateTime myTime = RTC.now();
cur_time.set_time(myTime.hour(), myTime.minute(), myTime.second());

сведётся к одной строке :

cur_time = RTC.now();

 

voVWan
Offline
Зарегистрирован: 04.01.2016

Alexino пишет:

TСтранно. Неужели вот это выглядит симпатичнее этого :

да нет конечно :) мне ваш метод работы с временем понравился больше, только я его не использовал в этом черновике :) сам вообще удивился что этот код заработал :)

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

voVWan
Offline
Зарегистрирован: 04.01.2016

Ну вот собрал черновик по вашему примеру кода:

//----------ИМПОРТ БИБЛИОТЕК-------------------------
#include <Wire.h>                                   //Подключаем библиотеку для использования I2C интерфейса с модулем RTC 
#include <OneWire.h>                                //Подключаем библиотеку для использования однопроводного интерфейса 
#include <DallasTemperature.h>                      //Температурного датчика DS18B20
#include <RTClib.h>                                 //Подключаем библиотеку для использования модуля часов реального времени RTC

//----------Объявляем разные переменные--------------
#define     RelayChn1   6        //  Используем цифровой ПОРТ 6 для ПЕРВОГО канала релейного модуля
#define     RelayChn2   7        //  Используем цифровой ПОРТ 6 для ВТОРОГО канала релейного модуля

OneWire oneWire(10);                                //Подключаем датчик DS18B20 на цифровой пин 10

DallasTemperature sensors(&oneWire);                //Создаем объект sensors, подключенный по OneWire

//Создаем переменные для работы с термометром

DeviceAddress tempDeviceAddress;                   //переменная для хранения адреса датчика
float temp=0;                                      //переменная для текущего значения температуры (то что показывает датчик)
const int t0 = 25;                                 //Уставка температуры включения первого реле
const int tGistrsis = 1;                           //Уставка гистерезиса - т.е отклонения от темп-ры уставки
                                                   //т.е. в данном случае 1 = плюс минус 0.5 градус


//------------------------------------------------------------------
class time{
public:
        time(unsigned char h=0, unsigned char m=0, unsigned char s=0){
            set_time(h, m, s);
        }
        time&   operator = (time &t){hour = t.hour; min = t.min; sec = t.sec; seconds = t.seconds; return *this;}
        boolean operator ==(time &t){return seconds==t.get_time();}
        boolean operator !=(time &t){return !(*this==t);}
        boolean operator > (time &t){return seconds>t.get_time();}
        boolean operator < (time &t){return seconds<t.get_time();}
        boolean operator >=(time &t){return seconds>=t.get_time();}
        boolean operator <=(time &t){return seconds<=t.get_time();}
        void set_time(unsigned char h, unsigned char m, unsigned char s){
            hour=h; min=m; sec=s;
            seconds=(unsigned long)h*1440 + (unsigned long)m*60 + s;
        }
        unsigned long get_time(){return seconds;};
        void print()    {Serial.print(hour); Serial.print(':');Serial.print(min); Serial.print(':');Serial.println(sec);}
private:
        unsigned char   hour;
        unsigned char   min;
        unsigned char   sec;
        unsigned long   seconds;
};
//------------------------------------------------------------------
class relay{
public:
    relay(unsigned char pin){
        pin_num = pin;
        pinMode(pin_num, OUTPUT);
        digitalWrite(pin_num, 1); 
        state=0;
    }
    void operator =(boolean val) {digitalWrite(pin_num, !val); state=val;}
    operator boolean()  {return state;}
private:
    unsigned char   pin_num;
    boolean         state;
};                    
//------------------------------------------------------------------
RTC_DS1307  RTC;                        //Создаем переменную класса - для использования RTC

time    cur_time;

time    relay_1_on(13, 32, 0);          // Время включения 1-ого реле
time    relay_1_off(13, 35, 10);        // Время отключения 1-ого реле  

time    relay_2_on(13, 35, 20);         // Время включения 2-ого реле
time    relay_2_off(13, 36, 40);        // Время отключения 2-ого реле  

relay   relay_1(RelayChn1);             // Реле 1 
relay   relay_2(RelayChn2);             // Реле 2  

//--------------------------------------------------
void setup(){
  
    sensors.begin();                                 //Инициализируем термодатчик 
    sensors.getAddress(tempDeviceAddress, 0);
    
    Wire.begin();                                    //Инициируем I2C интерфейс
    RTC.begin();                                     //Инициирум RTC модуль

    Serial.begin(9600);
    Serial.println("Hello !");

    Serial.print("Relay_1 ON =");
    relay_1_on.print();
    Serial.print("Relay_1 OFF =");
    relay_1_off.print();
    Serial.print("Relay_2 ON =");
    relay_2_on.print();
    Serial.print("Relay_2 OFF =");
    relay_2_off.print();
   

}                                                    
//--------------------------------------------------
void loop()                                         
{ 
    delay(1000);                                                         // Задержка 1 сек. Чтобы не печаталось быстро
    
    //Запуск процедуры измерения температуры
    sensors.setWaitForConversion(false);
    sensors.requestTemperatures();
    sensors.setWaitForConversion(true);
    
    //Считывание значения температуры
    sensors.getAddress(tempDeviceAddress, 0);
    temp=sensors.getTempC(tempDeviceAddress);
    
    DateTime myTime = RTC.now();                                         // Получаем текущее время из DS1307  
    cur_time.set_time(myTime.hour(), myTime.minute(), myTime.second());  // Устанавливаем часы, минут, секунды в cur_time

    cur_time.print();                                                    // Выводим текущее время

    
    //------------КАНАЛ 1 (Контроль температуры по времени) -------
    sensors.requestTemperatures();

    relay_1 = ((cur_time>=relay_1_on) && (cur_time<relay_1_off) && (temp < t0-tGistrsis/2));     // Состояние реле 1 = нахождение текущего времени в диапазоне от relay_1_on до relay_1_off и в диапазоне заданных температур 
    

    //------------КАНАЛ 2 (Включение насоса)------------------------------
    relay_2 = (cur_time>=relay_2_on) && (cur_time<relay_2_off);     // Состояние реле 2 = нахождение текущего времени в диапазоне от relay_2_on до relay_2_off

}//------------Конец ЦИКЛА-----------------------------

Правда мне кажется что с температурой в "void loop" я мог написать чего то лишнего :))) 

Я правильно понимаю что классы служат нам для упращения работы в дальнейшем? Типо написал один раз класс в начале кода и потом весь код пишется проще? Если так то это конечно красивее, но для меня как новичка то что написано в классе выглядит как дремучий лес :) Я там ни чего практический не понимаю из написанного :) Но буду учить матчасть как говориться.

Потому и сначала написал более приметивный вариант кода, потому что мне там почти все строки понятны были :)

Спасибо, код с вашими примерами тоже работает как надо. Единственно хочу уточнить по незнанию, в строке 

relay_1 = ((cur_time>=relay_1_on) && (cur_time<relay_1_off) && (temp < t0-tGistrsis/2));     // Состояние реле 1 = нахождение текущего времени в диапазоне от relay_1_on до relay_1_off и в диапазоне заданных температур 
    

не нужно для безопастности добавить строку типо "во всех остальных случаях реле выключено"? 

Alexino
Offline
Зарегистрирован: 29.12.2015

Цитата:

не нужно для безопастности добавить строку типо "во всех остальных случаях реле выключено"? 
Нет, не нужно. Состояние реле определяется выражением после знака "=". У него будет 2 состояния - включено (когда выражение == false) или включено (выражение == true).

Цитата:

Я правильно понимаю что классы служат нам для упращения работы в дальнейшем? Типо написал один раз класс в начале кода и потом весь код пишется проще?
Ну смотрите. Вы в коде пишите :











relay=1;    //  Включить реле
if(rele){   //  Узнаём состояние реле

а класс уже сам делает всю низкоуровневую работу с портом. Вы просто работаете с объектом как с переменной.
Так же и со временем, всю рутинную работу берёт на себя класс, Вам остаётся только вставлять в код имя объекта.

VadR53
Offline
Зарегистрирован: 23.05.2016

.

Flymen-33
Offline
Зарегистрирован: 22.05.2016

Сегодня писал для себя. У меня DS1302. В коде конечно работа реле по часам, минуты не прикручивал. С 6 утра начинает работать программа, до 21 часа. Каждый час вкл и выкл.

// DS1302:  RST pin    -> Arduino Digital 10
//          DAT pin   -> Arduino Digital 12
//          CLK pin  -> Arduino Digital 13

#include <DS1302.h>
const int Relay1 = 5;
int State = LOW;
long previousMillis = 0;
long Work = 3600000; // 1час в миллисекундах (1000*60*60)
// Init the DS1302
DS1302 rtc(10, 12, 13);
Time t;
void setup()
{
  // Set the clock to run-mode, and disable the write protection
  rtc.halt(false);
  rtc.writeProtect(true);
  
  // Setup Serial connection
  Serial.begin(9600);

  // The following lines can be commented out to use the values already stored in the DS1302
  rtc.setDOW(2);        // Set Day-of-Week to FRIDAY
  rtc.setTime(6, 33, 0);     // Set the time to 12:00:00 (24hr format)
  rtc.setDate(31, 5, 2016);   // Set the date to August 6th, 2010

  pinMode(Relay1, OUTPUT);
}

void loop()
{
  t = rtc.getTime();
  Serial.print(t.hour);
  Serial.print(":");
  Serial.print(t.min, DEC);
  Serial.print(":");
  Serial.print(t.sec);
  Serial.println();
  unsigned long currentMillis = millis();
  //Serial.print(currentMillis);
  if (t.hour>=6){
    if (currentMillis-previousMillis > Work){
      previousMillis = currentMillis;
      if (State == LOW){
        State = HIGH;
      }
      else{
        State = LOW;
      }
    }
    //digitalWrite(Relay1,State);
//    delay (Work);
  }
  if (t.hour>21){
    if (State == LOW){
      State = HIGH;
    }
    
  }
  digitalWrite(Relay1,State);
}

Если это не то, что тебе нужно. Прошу прощения.

VadR53
Offline
Зарегистрирован: 23.05.2016

.

VadR53
Offline
Зарегистрирован: 23.05.2016

.

VadR53
Offline
Зарегистрирован: 23.05.2016

.

VadR53
Offline
Зарегистрирован: 23.05.2016

.

VadR53
Offline
Зарегистрирован: 23.05.2016

Ответов и комментов как я понимаю небудет, думал форум ускорит мою работу. Хоть под вторым ником регистрируйся и отвечай на свои же вопросы.

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

VadR53 пишет:

Ответов и комментов как я понимаю небудет, думал форум ускорит мою работу. Хоть под вторым ником регистрируйся и отвечай на свои же вопросы.

Конечно, не будет.

Вы всерьёъз считаете, что кто-то будет читать столько букв сплошного текста. а потом писать Вам что-то ссылаясь на номера строк, посчитанные пальчиком от начала или от конца поста?

Опубликуйте скетч как положено, тогда может быть кто-то и ответит.

VadR53
Offline
Зарегистрирован: 23.05.2016

.

VadR53
Offline
Зарегистрирован: 23.05.2016

.