Циклическое включение/выключение нагрузки в течении дня.
- Войдите на сайт для отправки комментариев
Доброго времени суток уважаемые форумчане!
Планирую собрать небольшую установку для циклического включения/отключения небольшой нагрузки посредством реле. Но есть одна особенность:
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 //И так до тех пор поека не дойду до последнего реле т.е. очень долго писать }//------------Конец ЦИКЛА-----------------------------
Пожалуйуста помогите упростить код???
Доброго времени суток уважаемые форумчане!
Планирую собрать небольшую установку для циклического включения/отключения небольшой нагрузки посредством реле. Но есть одна особенность:
1. Цикличночть будет составлять каждые 10-15 минут на 10-15 минут. Точное время запуска цикла и продолжительность буду устанавливать экспериментально.
2. Начало циклов должно начинаться и заканчиваться в определенное время. Например в 8:00 начало запуска цикла, а в 21:00 отключение.
*за делаи в коде - ноги выдергать, спички вставить и танцевать заставить.
if (hour >= 8 && hour < 21) digitalWrite(13, (millis() / 600000) & 1);
Спасибо за оперативность! Подскажите, а как в таком случае менять периодичность и длительность цикла?? Напрмер: периодичность циклов 15 минут, а длительность включения - 10 минут.
прочитай свой пост сам
время запуска цикла у тебя с 8:00 продолжительность каждые 10-15 минут.
Спасибо за оперативность! Подскажите, а как в таком случае менять периодичность и длительность цикла?? Напрмер: периодичность циклов 15 минут, а длительность включения - 10 минут.
Если каждый запуск будет стартовать в разное время с разной длительностью, то только так, как в исходном скетче. Циклы можно записать компактнее, но общий принцип останется тот же - каждый запуск кодировать отдельно.
Мда. Ну накручен код. Время надо свести к подсчету минут от 12 ночи. А то получается "римский счет" вместо "арабского", а точнее "бинарного"
Мда. Ну накручен код.
по-моему, это плоды вашего "просвещения" "классы С++ для чайников" :)
А что делать. Или вы считаете что надо жить в "каменном веке программирования". Зато сейчас многие подходы понятны. И да классы не должны быть большими, это сбивает с толку.
А начинать надо из этого
ПС: И не верьте что Си++ можно изучить за 21 день. Что бы научится писать надо как минимум 2-3 года.
Не совсем так. Все циклы включения или отключения должны быть одинаковыми по времени. Но время во выключенном и отключеном состоянии нужно будет менять. И можно ли это делать как то удобнее, не переписывая каждый раз весь код.? Например. Настроил я включение через каждые 15 мин и задержку во выключенном состоянии 10 минут. Проведя наблюдения я понимаю, что нужно включать каждые 10 мин, и держать во выключенном состоянии 8 мин. Вот как то хочу упростить процесс внесения изменения в код.
По мне так надо делать
Доброго времени суток!
Попробовал переделать код. Выдает ошибку:
restiv. Это разумеется не весь скетч.Скорее набросок
ПС строка 8 uint16_t time;//время в минутах от полночи эту переменую надо обновлять ежеминутно.
А так же надо ежеминутно вызывать метод Brain.tik(); который и будет все делать.
Спасибо! Попробую.
при проверке выдал такую ошибку:
Сегодня решил попробовать полностью забить все временные интервалы и протестить в течении дня. Но после 5 срабатывания код перестал выполняться. Код во вложении.
И вот что выдает монитор порта:
Почему то время включения и отключения стоят одинаковые, хотя по коду забито иначе.
В чем у меня глюк?
Свою ошибку с монитором порта я понял, но почему реле не срабатывает не понимаю.
restiv Похоже у вас и у меня(Ардуино 1.8.0) версии различные. И да я не стремлюсь обновлять.
Подход банален. У вас события обновляются раз в минуту. Так что время будет мерятся в минутах. Да и обновлять надо только в начале минуты. Вот сейчас время time=100; сейчас у вас события в матрице Ev_old[5]. настало время time=101. Теперь надо построить новую матрицу событий Ev[5] под время time=101. Ну а дальше определить какие события включились, а какие отключились.
А меня теперь и мой старый код, опубликованный в первом посте перестал работать. Не понимаю в чем дело!!!!!
Проведя испытания выяснил, что срабатывает реле только один раз, по последнему таймеру. Все остальные пропускает почемуто.