Включение реле по времени модуля Tiny RTC

rushaks
Offline
Зарегистрирован: 08.07.2015

Добрый день!

Использую 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);
}

 

Araris
Offline
Зарегистрирован: 09.11.2012

Более наглядно:

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)

 
rushaks
Offline
Зарегистрирован: 08.07.2015

Спасибо за совет.

Вообщем немного посидел, подумал и вот что получилось

#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);
}

 

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

  Я так думаю, что данные о последнем включении нужно записывать в EEPROM. Затем, после отключения\включения электричества, считывать эти данные и отталкиваться от них. 

rushaks
Offline
Зарегистрирован: 08.07.2015

sandr4 пишет:

  Я так думаю, что данные о последнем включении нужно записывать в EEPROM. Затем, после отключения\включения электричества, считывать эти данные и отталкиваться от них. 

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

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

два раза в сутки - при нормальной сети это хорошо
но если сеть скачет...... :(

вариант - запитать ардуину от хоть какой-то батарейки , чтобы не мучить EEPROM
1....осуществлять контроль что ПОСЛЕ   8:00 насос отработал ИМЕННО 45 сек
2....осуществлять контроль что ПОСЛЕ 20:00 насос отработал ИМЕННО 45 сек

логика - если насос с 8:00 до 20:00 не отработал 45 сек , то в период с 20:00 до 8:00 он должен отработать 90 сек.... и т.д.
как страховка от сбоев ардуины - да , запись крайних данных в EEPROM