Включение реле по времени модуля Tiny RTC
- Войдите на сайт для отправки комментариев
Добрый день!
Использую arduino uno, модуль времени Tiny RTC и библиотеку адафруит.
Как то давно написал простой код, который позволяет включать и отключать реле с момента включения ардуинки.
Периодически летом (редко но всё же) моргает/выключают свет и при включении получается что насос, работающий от реле может работать не по расписанию и несколько раз в сутки. А смысл в чем : в 8.00 и в 20.00 включается насос (+ параллельно пищалка) и качает в течении 45 секунд канализационные стоки в юнилос, этот режим в принципе хорош но при выключении света и включении насос включается лишний раз что не совсем то что нужно.
int Relay = 10;
int Beep = 9;
int length = 1;
char notes[] = "c";
int beats[] = { 1 };
int tempo = 300;
void setup()
{
Serial.begin(9600);
pinMode(Relay, OUTPUT);
pinMode(Beep, OUTPUT);
delay(1000);
}
void loop()
{
digitalWrite(Relay, HIGH);
analogWrite(Beep, HIGH);
delay(45000);
digitalWrite(Relay, LOW);
digitalWrite(Beep, LOW);
delay(43200000);
}
Помогите пожалуйста написать код, который бы позволял включать РЕЛЕ два раза в сутки по определенному времени.
Вроде бы как набросал но знаю что что то не дописал или ошибся, помогите пожалуйста
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
int hour;
int minute;
int second;
int Relay = 10;
void setup () {
Serial.begin(9600);
pinMode(Relay, OUTPUT);
digitalWrite(Relay, LOW);
Wire.begin();
RTC.begin();
}
void loop ()
{
DateTime now = RTC.now();
hour = (now.hour(), true);
minute = (now.minute(), false);
second = (now.second(), false);
if (hour == 13 && minute == 55 && second >=15)
{digitalWrite(Relay, HIGH);}
if (hour == 13 && minute == 55 && second >=55)
{digitalWrite(Relay, LOW);}
delay(1000);
}
Более наглядно:
if(hour == 13 && minute == 55 && second >= 15 && second < 55){digitalWrite(Relay, HIGH);}
else
{digitalWrite(Relay, LOW);}
Если два раза в сутки, то
if
( (hour == 13 ||hour == 20) && minute == 55 && second >= 15 && second < 55)Спасибо за совет.
Вообщем немного посидел, подумал и вот что получилось
#include <Wire.h> #include "RTClib.h" RTC_DS1307 RTC; int Relay = 10; int Beep = 9; int length = 1; char notes[] = "c"; int beats[] = { 1 }; int tempo = 300; void setup () { Serial.begin(9600); pinMode(Relay, OUTPUT); pinMode(Beep, OUTPUT); digitalWrite(Relay, LOW); Wire.begin(); RTC.begin(); } void loop () { DateTime now = RTC.now(); if ( (now.hour() == 12 || now.hour() == 24) && now.minute() == 44 && now.second() >= 10 && now.second() < 55) {digitalWrite(Relay, HIGH); analogWrite(Beep, HIGH);} else {digitalWrite(Relay, LOW); analogWrite(Beep, LOW);} delay(1000); }Я так думаю, что данные о последнем включении нужно записывать в EEPROM. Затем, после отключения\включения электричества, считывать эти данные и отталкиваться от них.
Я так думаю, что данные о последнем включении нужно записывать в EEPROM. Затем, после отключения\включения электричества, считывать эти данные и отталкиваться от них.
В принципе я с Вами согласен, идея хорошая, но для кратковременных выключений можно обойтись и без этого. Но я все же попробую сделать как Вы сказали
два раза в сутки - при нормальной сети это хорошо
но если сеть скачет...... :(
вариант - запитать ардуину от хоть какой-то батарейки , чтобы не мучить EEPROM
1....осуществлять контроль что ПОСЛЕ 8:00 насос отработал ИМЕННО 45 сек
2....осуществлять контроль что ПОСЛЕ 20:00 насос отработал ИМЕННО 45 сек
логика - если насос с 8:00 до 20:00 не отработал 45 сек , то в период с 20:00 до 8:00 он должен отработать 90 сек.... и т.д.
как страховка от сбоев ардуины - да , запись крайних данных в EEPROM