Циклическое включение/выключение нагрузки в течении дня.

restiv
Offline
Зарегистрирован: 03.01.2016

Доброго времени суток уважаемые форумчане!

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

1. Цикличночть будет составлять каждые 10-15 минут на 10-15 минут. Точное время запуска цикла и продолжительность буду устанавливать экспериментально.

2. Начало циклов должно начинаться и заканчиваться в определенное время. Например в 8:00 начало запуска цикла, а в 21:00 отключение.

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





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

//----------Объявляем разные переменные--------------
#define     RelayChn1   6        //  Используем цифровой ПОРТ 6 для ПЕРВОГО канала релейного модуля
#define     RelayChn2   13        //  Используем цифровой ПОРТ 13 для ВТОРОГО канала релейного модуля
#define     RelayChn3   13        //  Используем цифровой ПОРТ 13 для ВТОРОГО канала релейного модуля
#define     RelayChn4   13        //  Используем цифровой ПОРТ 13 для ВТОРОГО канала релейного модуля
#define     RelayChn5   13        //  Используем цифровой ПОРТ 13 для ВТОРОГО канала релейного модуля
//И так до тех пор поека не дойду до 21:00 т.е. очень долго писать
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(8, 00, 0);          // Время включения 1-ого реле
time    relay_1_off(8, 15, 0);         // Время отключения 1-ого реле  

time    relay_2_on(08, 00, 0);         // Время включения 2-ого реле
time    relay_2_off(08, 15, 0);        // Время отключения 2-ого реле  

time    relay_3_on(08, 30, 0);         // Время включения 2-ого реле
time    relay_3_off(08, 45, 0);        // Время отключения 2-ого реле  

time    relay_4_on(08, 30, 0);         // Время включения 2-ого реле
time    relay_4_off(08, 45, 0);        // Время отключения 2-ого реле 

time    relay_5_on(08, 30, 0);         // Время включения 2-ого реле
time    relay_5_off(08, 45, 0);        // Время отключения 2-ого реле 

//И так до тех пор поека не дойду до 21:00 т.е. очень долго писать

relay   relay_1(RelayChn1);             // Реле 1 
relay   relay_2(RelayChn2);             // Реле 2  
relay   relay_3(RelayChn3);             // Реле 2  
relay   relay_4(RelayChn4);             // Реле 2  
relay   relay_5(RelayChn5);             // Реле 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();
    Serial.print("Relay_3 ON =");
    relay_3_on.print();
    Serial.print("Relay_3 OFF =");
    relay_3_off.print();
    Serial.print("Relay_3 ON =");
    relay_4_on.print();
    Serial.print("Relay_3 OFF =");
    relay_4_off.print();
    Serial.print("Relay_3 ON =");
    relay_5_on.print();
    Serial.print("Relay_3 OFF =");
    relay_5_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

//------------КАНАЛ 2 (Включение насоса)------------------------------
    relay_3 = (cur_time>=relay_3_on) && (cur_time<relay_3_off);     // Состояние реле 2 = нахождение текущего времени в диапазоне от relay_3_on до relay_3_off
    
//------------КАНАЛ 2 (Включение насоса)------------------------------
    relay_4 = (cur_time>=relay_4_on) && (cur_time<relay_4_off);     // Состояние реле 2 = нахождение текущего времени в диапазоне от relay_4_on до relay_4_off
    
//------------КАНАЛ 2 (Включение насоса)------------------------------
    relay_5 = (cur_time>=relay_5_on) && (cur_time<relay_5_off);     // Состояние реле 2 = нахождение текущего времени в диапазоне от relay_5_on до relay_5_off

//И так до тех пор поека не дойду до последнего реле т.е. очень долго писать 
  
}//------------Конец ЦИКЛА-----------------------------

 

Пожалуйуста помогите упростить код???

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

restiv пишет:

Доброго времени суток уважаемые форумчане!

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

1. Цикличночть будет составлять каждые 10-15 минут на 10-15 минут. Точное время запуска цикла и продолжительность буду устанавливать экспериментально.

2. Начало циклов должно начинаться и заканчиваться в определенное время. Например в 8:00 начало запуска цикла, а в 21:00 отключение.

if (hour >= 8 && hour < 21) digitalWrite(13, (millis() / 600000) & 1);

*за делаи в коде - ноги выдергать, спички вставить и танцевать заставить.

restiv
Offline
Зарегистрирован: 03.01.2016

Клапауций 112 пишет:

if (hour >= 8 && hour < 21) digitalWrite(13, (millis() / 600000) & 1);

Спасибо за оперативность! Подскажите, а как в таком случае менять периодичность и длительность цикла?? Напрмер: периодичность циклов 15 минут, а длительность включения - 10 минут.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

restiv пишет:
Прочитайте текст моего поста после цифры 1. Там как раз это я и указывал.

прочитай свой пост сам

время запуска цикла у тебя с 8:00 продолжительность каждые 10-15 минут.

b707
Offline
Зарегистрирован: 26.05.2017

restiv пишет:

Спасибо за оперативность! Подскажите, а как в таком случае менять периодичность и длительность цикла?? Напрмер: периодичность циклов 15 минут, а длительность включения - 10 минут.

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

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Мда. Ну накручен код. Время надо свести к подсчету минут от 12 ночи. А то получается "римский счет" вместо "арабского", а точнее "бинарного" 

b707 пишет:
Если каждый запуск будет стартовать в разное время с разной длительностью, то только так, как в исходном скетче. Циклы можно записать компактнее, но общий принцип останется тот же -  каждый запуск кодировать отдельно.
 А точнее завести банальный список из записей :тогда-то вкл и тогда-то выкл реле номер такое-то.

b707
Offline
Зарегистрирован: 26.05.2017

qwone пишет:

Мда. Ну накручен код.

по-моему, это плоды вашего "просвещения" "классы С++ для чайников" :)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

b707 пишет:
по-моему, это плоды вашего "просвещения" "классы С++ для чайников" :)

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

А начинать надо из этого

struct str_Do {
  unsigned long time_ON ;// время вкл
  unsigned long time_OFF;// время выкл
  byte event;// какое событие должно произойти
  struct str_Do * next; // следующий элемент
};

ПС: И не верьте что Си++ можно изучить за 21 день. Что бы научится писать надо как минимум 2-3 года.

restiv
Offline
Зарегистрирован: 03.01.2016

Не совсем так. Все циклы включения или отключения должны быть одинаковыми по времени. Но время во выключенном и отключеном состоянии нужно будет менять. И можно ли это делать как то удобнее, не переписывая каждый раз весь код.? Например. Настроил я включение через каждые 15 мин и задержку во выключенном состоянии 10 минут. Проведя наблюдения я понимаю, что нужно включать каждые 10 мин, и держать во выключенном состоянии 8 мин. Вот как то хочу упростить процесс внесения изменения в код.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

По мне так надо делать

enum event_t {RELAY1_ON, RELAY2_ON, RELAY3_ON, RELAY4_ON, RELAY5_ON};

//-------------------Компоновка------------------------
Cl_Brain Brain;
//-----------------main()---------------------------
void setup() {
  Brain.setup();
  Brain.Add(/*время активации час*/8 ,/*мин*/0 ,/*время отмены*/8 ,/*мин*/10,/*событие*/RELAY1_ON);
  Brain.Add(/*время активации час*/8 ,/*мин*/30,/*время отмены*/8 ,/*мин*/40,/*событие*/RELAY1_ON);
  Brain.Add(/*время активации час*/9 ,/*мин*/0 ,/*время отмены*/9 ,/*мин*/10,/*событие*/RELAY2_ON);
  Brain.Add(/*время активации час*/9 ,/*мин*/30,/*время отмены*/9 ,/*мин*/40,/*событие*/RELAY2_ON);
  Brain.Add(/*время активации час*/10,/*мин*/0 ,/*время отмены*/10,/*мин*/10,/*событие*/RELAY3_ON);
  Brain.Add(/*время активации час*/10,/*мин*/30,/*время отмены*/10,/*мин*/40,/*событие*/RELAY3_ON);
//--- Вот так вы и набираете таблицу.
}

void loop() {
  // put your main code here, to run repeatedly:

}

 

restiv
Offline
Зарегистрирован: 03.01.2016

Доброго времени суток!

Попробовал переделать код. Выдает ошибку:

Rtc2ReleyManyLoops_V2:98: error: 'Cl_Brain' does not name a type
 
 Cl_Brain Brain;
 
 ^
 
C:\Users\Documents\Arduino\Rtc2ReleyManyLoops_V2\Rtc2ReleyManyLoops_V2.ino: In function 'void setup()':
 
Rtc2ReleyManyLoops_V2:137: error: 'Brain' was not declared in this scope
 
     Brain.setup();
 
 
 
qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

restiv. Это разумеется не весь скетч.Скорее набросок

/*
  ардуино пин 2<--> реле 1
  ардуино пин 3<--> реле 2
  ардуино пин 4<--> реле 3
  ардуино пин 5<--> реле 4
  ардуино пин 6<--> реле 5
*/
uint16_t time;//время в минутах от полночи
//-----Cl_Relay-----------------------------------
// класс реле
class Cl_Relay {
    byte pin;
    bool inv;
    bool relay;
  public:
    Cl_Relay(byte _pin, bool _inv)
      : pin(_pin), inv(_inv) {}
    void setup() {
      pinMode(pin, OUTPUT);
      OFF();
    }
    void ON() {
      relay = 1;
      digitalWrite(pin, relay ^ inv);
    }
    void OFF() {
      relay = 0;
      digitalWrite(pin, relay ^ inv);
    }
};
//-----Cl_Brain----------------------------------
// класс "мозг"
enum event_t {RELAY1_ON = 0, RELAY2_ON, RELAY3_ON, RELAY4_ON, RELAY5_ON};
struct str_Do {
  uint16_t time_ON ;// время вкл
  uint16_t time_OFF;// время выкл
  event_t event;// какое событие должно произойти
  struct str_Do * next; // следующий элемент
};
class Cl_Brain {
    uint16_t *time;//указатель на время в минутах от полночи
    void (*Do1_ON)(), (*Do1_OFF)(), (*Do2_ON)(), (*Do2_OFF)(), (*Do3_ON)(), (*Do3_OFF)(),
         (*Do4_ON)(), (*Do4_OFF)(), (*Do5_ON)(), (*Do5_OFF)();
    event_t EV[5], EV_old[5];// события теперешние и старые
    struct str_Do * Start = NULL;
  public:
    Cl_Brain(uint16_t *_time,
             void (*_Do1_ON)(), void (*_Do1_OFF)(), void (*_Do2_ON)(), void (*_Do2_OFF)(),
             void (*_Do3_ON)(), void (*_Do3_OFF)(), void (*_Do4_ON)(), void (*_Do4_OFF)(),
             void (*_Do5_ON)(), void (*_Do5_OFF)())
      : time(_time),
        Do1_ON(_Do1_ON), Do1_OFF(_Do1_OFF), Do2_ON(_Do2_ON), Do2_OFF(_Do2_OFF),
        Do3_ON(_Do3_ON), Do3_OFF(_Do3_OFF), Do4_ON(_Do4_ON), Do4_OFF(_Do4_OFF),
        Do5_ON(_Do5_ON), Do5_OFF(_Do5_OFF) {}
    void setup() {
      for (byte i = 0; i < 5; ++i)EV_old[i];


    }
    void Add(byte hourON, byte minON, byte hourOFF, byte minOFF, event_t event) {
      uint16_t timeON = hourON * 60 + minON;
      uint16_t timeOFF = hourOFF * 60 + minOFF;
      if (timeON >= timeOFF)return;
      struct str_Do *New = new struct str_Do();
      New->time_ON = timeON;
      New->time_OFF = timeOFF;
      New->event = event;
      New->next = Start;
      Start = New;
    }
    void tik() {
      for (byte i = 0; i < 5; ++i)EV[i];
      for (struct str_Do *ii = Start; ii != NULL ; ii = ii->next) {
        if (ii->time_ON >= *time && *time >= ii->time_OFF)EV[ii->event] = 1;
      }
      if (EV[0] && !EV_old[0]) { // если событие 1 произошло
        EV_old[0] = 1;
        Do1_ON();
      }
      if (!EV[0] && EV_old[0]) { // если событие 1 закончилось
        EV_old[0] = 0;
        Do2_OFF();
      }
      if (EV[1] && !EV_old[1]) { // если событие 2 произошло
        EV_old[1] = 1;
        Do2_ON();
      }
      if (!EV[1] && EV_old[1]) { // если событие 2 закончилось
        EV_old[1] = 0;
        Do3_OFF();
      }
      if (EV[2] && !EV_old[2]) { // если событие 3 произошло
        EV_old[2] = 1;
        Do3_ON();
      }
      if (!EV[2] && EV_old[2]) { // если событие 3 закончилось
        EV_old[2] = 0;
        Do3_OFF();
      }
      if (EV[3] && !EV_old[3]) { // если событие 4 произошло
        EV_old[3] = 1;
        Do4_ON();
      }
      if (!EV[3] && EV_old[3]) { // если событие 4 закончилось
        EV_old[3] = 0;
        Do4_OFF();
      }
      if (EV[4] && !EV_old[4]) { // если событие 5 произошло
        EV_old[4] = 1;
        Do5_ON();
      }
      if (!EV[4] && EV_old[4]) { // если событие 5 закончилось
        EV_old[4] = 0;
        Do5_OFF();
      }
    }
};
//----------------компоновка------------------------
Cl_Relay Relay1(/*пин*/2,/*инверсия*/0);
Cl_Relay Relay2(/*пин*/3,/*инверсия*/0);
Cl_Relay Relay3(/*пин*/4,/*инверсия*/0);
Cl_Relay Relay4(/*пин*/5,/*инверсия*/0);
Cl_Relay Relay5(/*пин*/6,/*инверсия*/0);
void Do1_ON() {
  Relay1.ON();
}
void Do1_OFF() {
  Relay1.OFF();
}
void Do2_ON() {
  Relay2.ON();
}
void Do2_OFF() {
  Relay2.OFF();
}
void Do3_ON() {
  Relay3.ON();
}
void Do3_OFF() {
  Relay3.OFF();
}
void Do4_ON() {
  Relay4.ON();
}
void Do4_OFF() {
  Relay4.OFF();
}
void Do5_ON() {
  Relay5.ON();
}
void Do5_OFF() {
  Relay5.OFF();
}

Cl_Brain Brain(
  /*время в мин*/&time,
  /*активация 1 события*/Do1_ON,/*деактивация 1 события*/Do1_OFF,
  /*активация 2 события*/Do2_ON,/*деактивация 2 события*/Do2_OFF,
  /*активация 3 события*/Do3_ON,/*деактивация 3 события*/Do3_OFF,
  /*активация 4 события*/Do4_ON,/*деактивация 4 события*/Do4_OFF,
  /*активация 5 события*/Do5_ON,/*деактивация 5 события*/Do5_OFF
);
//--------------main--------------------------
void setup() {
  Relay1.setup();
  Relay2.setup();
  Relay3.setup();
  Relay4.setup();
  Relay5.setup();
  Brain.setup();
  Brain.Add(/*время активации час*/8 ,/*мин*/0 ,/*время отмены*/8 ,/*мин*/10,/*событие*/RELAY1_ON);
  Brain.Add(/*время активации час*/8 ,/*мин*/30,/*время отмены*/8 ,/*мин*/40,/*событие*/RELAY1_ON);
  Brain.Add(/*время активации час*/9 ,/*мин*/0 ,/*время отмены*/9 ,/*мин*/10,/*событие*/RELAY2_ON);
  Brain.Add(/*время активации час*/9 ,/*мин*/30,/*время отмены*/9 ,/*мин*/40,/*событие*/RELAY2_ON);
  Brain.Add(/*время активации час*/10,/*мин*/0 ,/*время отмены*/10,/*мин*/10,/*событие*/RELAY3_ON);
  Brain.Add(/*время активации час*/10,/*мин*/30,/*время отмены*/10,/*мин*/40,/*событие*/RELAY3_ON);
  //--- Вот так вы и набираете таблицу.
}

void loop() {
}
/*Скетч использует 2018 байт (6%) памяти устройства. Всего доступно 32256 байт.
  Глобальные переменные используют 80 байт (3%) динамической памяти, оставляя 1968 байт для локальных переменных. Максимум: 2048 байт.
*/.

ПС строка 8 uint16_t time;//время в минутах от полночи эту переменую надо обновлять ежеминутно.

А так же надо ежеминутно вызывать метод Brain.tik(); который и будет все делать.

restiv
Offline
Зарегистрирован: 03.01.2016

Спасибо! Попробую.

restiv
Offline
Зарегистрирован: 03.01.2016

при проверке выдал такую ошибку:

C:\Users\ANALYT~1\AppData\Local\Temp\arduino_modified_sketch_454443\sketch_jul29a.ino: In member function 'void Cl_Brain::tik()':
 
C:\Users\ANALYT~1\AppData\Local\Temp\arduino_modified_sketch_454443\sketch_jul29a.ino:74:73: warning: invalid conversion from 'int' to 'event_t' [-fpermissive]
 
         if (ii->time_ON >= *time && *time >= ii->time_OFF)EV[ii->event] = 1;
 
                                                                         ^
 
C:\Users\ANALYT~1\AppData\Local\Temp\arduino_modified_sketch_454443\sketch_jul29a.ino:77:19: warning: invalid conversion from 'int' to 'event_t' [-fpermissive]
 
         EV_old[0] = 1;
 
                   ^
 
C:\Users\ANALYT~1\AppData\Local\Temp\arduino_modified_sketch_454443\sketch_jul29a.ino:81:19: warning: invalid conversion from 'int' to 'event_t' [-fpermissive]
 
         EV_old[0] = 0;
 
                   ^
 
C:\Users\ANALYT~1\AppData\Local\Temp\arduino_modified_sketch_454443\sketch_jul29a.ino:85:19: warning: invalid conversion from 'int' to 'event_t' [-fpermissive]
 
         EV_old[1] = 1;
 
                   ^
 
C:\Users\ANALYT~1\AppData\Local\Temp\arduino_modified_sketch_454443\sketch_jul29a.ino:89:19: warning: invalid conversion from 'int' to 'event_t' [-fpermissive]
 
         EV_old[1] = 0;
 
                   ^
 
C:\Users\ANALYT~1\AppData\Local\Temp\arduino_modified_sketch_454443\sketch_jul29a.ino:93:19: warning: invalid conversion from 'int' to 'event_t' [-fpermissive]
 
         EV_old[2] = 1;
 
                   ^
 
C:\Users\ANALYT~1\AppData\Local\Temp\arduino_modified_sketch_454443\sketch_jul29a.ino:97:19: warning: invalid conversion from 'int' to 'event_t' [-fpermissive]
 
         EV_old[2] = 0;
 
                   ^
 
C:\Users\ANALYT~1\AppData\Local\Temp\arduino_modified_sketch_454443\sketch_jul29a.ino:101:19: warning: invalid conversion from 'int' to 'event_t' [-fpermissive]
 
         EV_old[3] = 1;
 
                   ^
 
C:\Users\ANALYT~1\AppData\Local\Temp\arduino_modified_sketch_454443\sketch_jul29a.ino:105:19: warning: invalid conversion from 'int' to 'event_t' [-fpermissive]
 
         EV_old[3] = 0;
 
                   ^
 
C:\Users\ANALYT~1\AppData\Local\Temp\arduino_modified_sketch_454443\sketch_jul29a.ino:109:19: warning: invalid conversion from 'int' to 'event_t' [-fpermissive]
 
         EV_old[4] = 1;
 
                   ^
 
C:\Users\ANALYT~1\AppData\Local\Temp\arduino_modified_sketch_454443\sketch_jul29a.ino:113:19: warning: invalid conversion from 'int' to 'event_t' [-fpermissive]
 
         EV_old[4] = 0;
 
restiv
Offline
Зарегистрирован: 03.01.2016

Сегодня решил попробовать полностью забить все временные интервалы и протестить в течении дня. Но после 5 срабатывания код перестал выполняться. Код во вложении.

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

//----------Объявляем разные переменные--------------
#define     RelayChn1   6        //  Используем цифровой ПОРТ 6 для ПЕРВОГО канала релейного модуля
#define     RelayChn2   10       //  Используем цифровой ПОРТ 10 для ВТОРОГО канала релейного модуля
#define     RelayChn3   10       //  Используем цифровой ПОРТ 10 для ВТОРОГО канала релейного модуля
#define     RelayChn4   10       //  Используем цифровой ПОРТ 10 для ВТОРОГО канала релейного модуля
#define     RelayChn5   10       //  Используем цифровой ПОРТ 10 для ВТОРОГО канала релейного модуля
#define     RelayChn6   10       //  Используем цифровой ПОРТ 10 для ВТОРОГО канала релейного модуля
#define     RelayChn7   10       //  Используем цифровой ПОРТ 10 для ВТОРОГО канала релейного модуля
#define     RelayChn8   10       //  Используем цифровой ПОРТ 10 для ВТОРОГО канала релейного модуля
#define     RelayChn9   10       //  Используем цифровой ПОРТ 10 для ВТОРОГО канала релейного модуля
#define     RelayChn10   10      //  Используем цифровой ПОРТ 10 для ВТОРОГО канала релейного модуля
#define     RelayChn11   10      //  Используем цифровой ПОРТ 10 для ПЕРВОГО канала релейного модуля
#define     RelayChn12   10      //  Используем цифровой ПОРТ 10 для ВТОРОГО канала релейного модуля
#define     RelayChn13   10      //  Используем цифровой ПОРТ 10 для ВТОРОГО канала релейного модуля
#define     RelayChn14   10      //  Используем цифровой ПОРТ 10 для ВТОРОГО канала релейного модуля
#define     RelayChn15   10      //  Используем цифровой ПОРТ 10 для ВТОРОГО канала релейного модуля
#define     RelayChn16   10      //  Используем цифровой ПОРТ 10 для ВТОРОГО канала релейного модуля
#define     RelayChn17   10      //  Используем цифровой ПОРТ 10 для ВТОРОГО канала релейного модуля
#define     RelayChn18   10      //  Используем цифровой ПОРТ 10 для ВТОРОГО канала релейного модуля
#define     RelayChn19   10      //  Используем цифровой ПОРТ 10 для ВТОРОГО канала релейного модуля
#define     RelayChn20   10      //  Используем цифровой ПОРТ 10 для ВТОРОГО канала релейного модуля

//OneWire oneWire(11);                                //Подключаем датчик 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(8, 00, 0);          // Время включения 1-ого реле
time    relay_1_off(11, 12, 0);        // Время отключения 1-ого реле  

time    relay_2_on(8, 0, 0);         // Время включения 2-ого реле
time    relay_2_off(8, 15, 0);       // Время отключения 2-ого реле  

time    relay_3_on(8, 25, 0);        // Время включения 2-ого реле
time    relay_3_off(8, 40, 0);       // Время отключения 2-ого реле  

time    relay_4_on(8, 50, 0);         // Время включения 2-ого реле
time    relay_4_off(9, 05, 0);       // Время отключения 2-ого реле 
 
time    relay_5_on(9, 15, 0);        // Время включения 2-ого реле
time    relay_5_off(9, 30, 0);        // Время отключения 2-ого реле 

time    relay_6_on(10, 5, 0);        // Время включения 2-ого реле
time    relay_6_off(10, 20, 0);        // Время отключения 2-ого реле 

time    relay_7_on(10, 30, 0);        // Время включения 2-ого реле
time    relay_7_off(10, 45, 0);        // Время отключения 2-ого реле

time    relay_8_on(10, 55, 0);        // Время включения 2-ого реле
time    relay_8_off(11, 10, 0);        // Время отключения 2-ого реле 

time    relay_9_on(11, 20, 0);        // Время включения 2-ого реле
time    relay_9_off(11, 35, 0);        // Время отключения 2-ого реле 

time    relay_10_on(11, 45, 0);        // Время включения 2-ого реле
time    relay_10_off(12, 0, 0);        // Время отключения 2-ого реле 

time    relay_11_on(12, 10, 0);         // Время включения 2-ого реле
time    relay_11_off(12, 25, 0);       // Время отключения 2-ого реле  

time    relay_12_on(12, 35, 0);        // Время включения 2-ого реле
time    relay_12_off(12, 50, 0);       // Время отключения 2-ого реле  

time    relay_13_on(13, 0, 0);         // Время включения 2-ого реле
time    relay_13_off(13, 15, 0);       // Время отключения 2-ого реле 
 
time    relay_14_on(13, 25, 0);        // Время включения 2-ого реле
time    relay_14_off(13, 40, 0);        // Время отключения 2-ого реле 
 
time    relay_15_on(13, 50, 0);        // Время включения 2-ого реле
time    relay_15_off(14, 5, 0);        // Время отключения 2-ого реле 

time    relay_16_on(14, 15, 0);        // Время включения 2-ого реле
time    relay_16_off(14, 30, 0);        // Время отключения 2-ого реле 

time    relay_17_on(14, 43, 0);        // Время включения 2-ого реле
time    relay_17_off(14, 55, 0);        // Время отключения 2-ого реле

time    relay_18_on(15, 5, 0);        // Время включения 2-ого реле
time    relay_18_off(15, 20, 0);        // Время отключения 2-ого реле 

time    relay_19_on(15, 30, 0);        // Время включения 2-ого реле
time    relay_19_off(15, 45, 0);        // Время отключения 2-ого реле 

time    relay_20_on(15, 55, 0);        // Время включения 2-ого реле
time    relay_20_off(16, 10, 0);        // Время отключения 2-ого реле 

relay   relay_1(RelayChn1);             // Реле 1 
relay   relay_2(RelayChn2);             // Реле 2  
relay   relay_3(RelayChn3);             // Реле 2  
relay   relay_4(RelayChn4);             // Реле 2  
relay   relay_5(RelayChn5);             // Реле 2  
relay   relay_6(RelayChn6);             // Реле 2  
relay   relay_7(RelayChn7);             // Реле 2  
relay   relay_8(RelayChn8);             // Реле 2  
relay   relay_9(RelayChn9);             // Реле 2  
relay   relay_10(RelayChn10);             // Реле 2  
relay   relay_11(RelayChn11);             // Реле 2  
relay   relay_12(RelayChn12);             // Реле 2  
relay   relay_13(RelayChn13);             // Реле 2  
relay   relay_14(RelayChn14);             // Реле 2  
relay   relay_15(RelayChn15);             // Реле 2 
relay   relay_16(RelayChn16);             // Реле 2  
relay   relay_17(RelayChn17);             // Реле 2  
relay   relay_18(RelayChn18);             // Реле 2  
relay   relay_19(RelayChn19);             // Реле 2  
relay   relay_20(RelayChn20);             // Реле 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();
    Serial.print("Relay_3 ON =");
    relay_3_on.print();
    Serial.print("Relay_3 OFF =");
    relay_3_off.print();
    Serial.print("Relay_4 ON =");
    relay_4_on.print();
    Serial.print("Relay_4 OFF =");
    relay_4_off.print();
    Serial.print("Relay_5 ON =");
    relay_5_on.print();
    Serial.print("Relay_5 OFF =");
    relay_5_off.print();
    Serial.print("Relay_6 ON =");
    relay_6_off.print();
    Serial.print("Relay_6 OFF =");
    relay_6_off.print();
    Serial.print("Relay_7 ON =");
    relay_7_off.print();
    Serial.print("Relay_7 OFF =");
    relay_7_off.print();
    Serial.print("Relay_8 ON =");
    relay_8_off.print();
    Serial.print("Relay_8 OFF =");
    relay_8_off.print();
    Serial.print("Relay_9 ON =");
    relay_9_off.print();
    Serial.print("Relay_9 OFF =");
    relay_9_off.print();
    Serial.print("Relay_10 ON =");
    relay_10_off.print();
    Serial.print("Relay_10 OFF =");
    relay_10_off.print();
    Serial.print("Relay_11 ON =");
    relay_11_on.print();
    Serial.print("Relay_11 OFF =");
    relay_11_off.print();
    Serial.print("Relay_12 ON =");
    relay_12_on.print();
    Serial.print("Relay_12 OFF =");
    relay_12_off.print();
    Serial.print("Relay_13 ON =");
    relay_13_on.print();
    Serial.print("Relay_13 OFF =");
    relay_13_off.print();
    Serial.print("Relay_14 ON =");
    relay_14_on.print();
    Serial.print("Relay_14 OFF =");
    relay_14_off.print();
    Serial.print("Relay_15 ON =");
    relay_15_on.print();
    Serial.print("Relay_15 OFF =");
    relay_15_off.print();
    Serial.print("Relay_16 ON =");
    relay_16_off.print();
    Serial.print("Relay_16 OFF =");
    relay_16_off.print();
    Serial.print("Relay_17 ON =");
    relay_17_off.print();
    Serial.print("Relay_17 OFF =");
    relay_17_off.print();
    Serial.print("Relay_18 ON =");
    relay_18_off.print();
    Serial.print("Relay_18 OFF =");
    relay_18_off.print();
    Serial.print("Relay_19 ON =");
    relay_19_off.print();
    Serial.print("Relay_19 OFF =");
    relay_19_off.print();
    Serial.print("Relay_20 ON =");
    relay_20_off.print();
    Serial.print("Relay_20 OFF =");
    relay_20_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
    relay_3 = (cur_time>=relay_3_on) && (cur_time<relay_3_off);     // Состояние реле 2 = нахождение текущего времени в диапазоне от relay_3_on до relay_3_off
    relay_4 = (cur_time>=relay_4_on) && (cur_time<relay_4_off);     // Состояние реле 2 = нахождение текущего времени в диапазоне от relay_4_on до relay_4_off
    relay_5 = (cur_time>=relay_5_on) && (cur_time<relay_5_off);     // Состояние реле 2 = нахождение текущего времени в диапазоне от relay_5_on до relay_5_off
    relay_6 = (cur_time>=relay_6_on) && (cur_time<relay_6_off);     // Состояние реле 2 = нахождение текущего времени в диапазоне от relay_2_on до relay_2_off
    relay_7 = (cur_time>=relay_7_on) && (cur_time<relay_7_off);     // Состояние реле 2 = нахождение текущего времени в диапазоне от relay_3_on до relay_3_off
    relay_8 = (cur_time>=relay_8_on) && (cur_time<relay_8_off);     // Состояние реле 2 = нахождение текущего времени в диапазоне от relay_4_on до relay_4_off
    relay_9 = (cur_time>=relay_9_on) && (cur_time<relay_9_off);     // Состояние реле 2 = нахождение текущего времени в диапазоне от relay_5_on до relay_5_off
    relay_10 = (cur_time>=relay_10_on) && (cur_time<relay_10_off);     // Состояние реле 2 = нахождение текущего времени в диапазоне от relay_2_on до relay_2_off
    relay_11 = (cur_time>=relay_11_on) && (cur_time<relay_11_off);     // Состояние реле 2 = нахождение текущего времени в диапазоне от relay_2_on до relay_2_off
    relay_12 = (cur_time>=relay_12_on) && (cur_time<relay_12_off);     // Состояние реле 2 = нахождение текущего времени в диапазоне от relay_2_on до relay_2_off
    relay_13 = (cur_time>=relay_13_on) && (cur_time<relay_13_off);     // Состояние реле 2 = нахождение текущего времени в диапазоне от relay_3_on до relay_3_off
    relay_14 = (cur_time>=relay_14_on) && (cur_time<relay_14_off);     // Состояние реле 2 = нахождение текущего времени в диапазоне от relay_4_on до relay_4_off
    relay_15 = (cur_time>=relay_15_on) && (cur_time<relay_15_off);     // Состояние реле 2 = нахождение текущего времени в диапазоне от relay_5_on до relay_5_off
    relay_16 = (cur_time>=relay_16_on) && (cur_time<relay_16_off);     // Состояние реле 2 = нахождение текущего времени в диапазоне от relay_2_on до relay_2_off
    relay_17 = (cur_time>=relay_17_on) && (cur_time<relay_17_off);     // Состояние реле 2 = нахождение текущего времени в диапазоне от relay_3_on до relay_3_off
    relay_18 = (cur_time>=relay_18_on) && (cur_time<relay_18_off);     // Состояние реле 2 = нахождение текущего времени в диапазоне от relay_4_on до relay_4_off
    relay_19 = (cur_time>=relay_19_on) && (cur_time<relay_19_off);     // Состояние реле 2 = нахождение текущего времени в диапазоне от relay_5_on до relay_5_off
    relay_20 = (cur_time>=relay_20_on) && (cur_time<relay_20_off);     // Состояние реле 2 = нахождение текущего времени в диапазоне от relay_2_on до relay_2_off
}//------------Конец ЦИКЛА-----------------------------

 

И вот что выдает монитор порта:

Почему то время включения и отключения стоят одинаковые, хотя по коду забито иначе.

В чем у меня глюк?

restiv
Offline
Зарегистрирован: 03.01.2016

Свою ошибку с монитором порта я понял, но почему реле не срабатывает не понимаю.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

restiv Похоже у вас и у меня(Ардуино 1.8.0) версии различные. И да я не стремлюсь обновлять.

Подход банален. У вас события обновляются раз в минуту. Так что время будет мерятся в минутах. Да и обновлять надо только в начале минуты. Вот сейчас время time=100; сейчас у вас события в матрице Ev_old[5]. настало время time=101. Теперь надо построить новую матрицу событий Ev[5] под время time=101. Ну а дальше определить какие события включились, а какие отключились.

restiv
Offline
Зарегистрирован: 03.01.2016

А меня теперь и мой старый код, опубликованный в первом посте перестал работать. Не понимаю в чем дело!!!!!

restiv
Offline
Зарегистрирован: 03.01.2016

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