Возможно ли график таймера сделать компактнее?

Hardwell
Offline
Зарегистрирован: 04.01.2017

Приветствую Всех! Написал таймер для управления реле:

//Цепляем библиотеки
#include <DS3231.h>
#include <Wire.h>
#include <RTC.h>
#include <Time.h>
#include <TimeLib.h>
//Готово
 
int Rele = 7; //номер пина для реле
DS3231 Clock; //подключаем часики
bool h12; //24часовой формат
bool PM; //тоже к часикам и формату
 
void setup() { //запускаемся
  Serial.begin(9600); //устанавливаем скорость передачи данных
  Wire.begin();
  digitalWrite(Rele, HIGH); //устанавливаем значение на реле - "выключено"
  pinMode(Rele, OUTPUT); //устанавливаем на реле "высокий" уровень
}
 
void loop() { //рабочий режим/алгоритмы
  Clock.setClockMode(false);
int day, hour, minute, second; //объявляем переменные
 
day = Clock.getDoW(); //получаем день недели
hour = Clock.getHour(h12, PM); //присваиваем часы
minute = Clock.getMinute(); //присваиваем минуты
second = Clock.getSecond(); //присваиваем секунды
 
 
 
if ( day == 1||2||3||4||5 && hour == 8 && minute == 30 && second == 00 )
  {
    digitalWrite(Rele, LOW);
    delay(5000);
    digitalWrite(Rele, HIGH);
  }
 
if ( day == 1||2||3||4||5 && hour == 9 && minute == 15 && second == 00 )
  {
    digitalWrite(Rele, LOW);
    delay(5000);
    digitalWrite(Rele, HIGH);
  }
 
if ( day == 1||2||3||4||5 && hour == 9 && minute == 25 && second == 00 )
  {
    digitalWrite(Rele, LOW);
    delay(5000);
    digitalWrite(Rele, HIGH);
  }
 
if ( day == 1||2||3||4||5 && hour == 10 && minute == 10 && second == 00 )
  {
    digitalWrite(Rele, LOW);
    delay(5000);
    digitalWrite(Rele, HIGH);
  }
 
if ( day == 1||2||3||4||5 && hour == 10 && minute == 25 && second == 00 )
  {
    digitalWrite(Rele, LOW);
    delay(5000);
    digitalWrite(Rele, HIGH);
  }
 
if ( day == 1||2||3||4||5 && hour == 11 && minute == 10 && second == 00 )
  {
    digitalWrite(Rele, LOW);
    delay(5000);
    digitalWrite(Rele, HIGH);
  }
 
if ( day == 1||2||3||4||5 && hour == 12 && minute == 15 && second == 00 )
  {
    digitalWrite(Rele, LOW);
    delay(5000);
    digitalWrite(Rele, HIGH);
  }
 
if ( day == 1||2||3||4||5 && hour == 12 && minute == 30 && second == 00 )
  {
    digitalWrite(Rele, LOW);
    delay(5000);
    digitalWrite(Rele, HIGH);
  }
 
if ( day == 1||2||3||4||5 && hour == 13 && minute == 15 && second == 00 )
  {
    digitalWrite(Rele, LOW);
    delay(5000);
    digitalWrite(Rele, HIGH);
  }
 
if ( day == 1||2||3||4||5 && hour == 13 && minute == 25 && second == 00 )
  {
    digitalWrite(Rele, LOW);
    delay(5000);
    digitalWrite(Rele, HIGH);
  }
 
if ( day == 1||2||3||4||5 && hour == 14 && minute == 10 && second == 00 )
  {
    digitalWrite(Rele, LOW);
    delay(5000);
    digitalWrite(Rele, HIGH);
  }
 
if ( day == 1||2||3||4||5 && hour == 14 && minute == 20 && second == 00 )
  {
    digitalWrite(Rele, LOW);
    delay(5000);
    digitalWrite(Rele, HIGH);
  }
 
if ( day == 1||2||3||4||5 && hour == 15 && minute == 05 && second == 00 )
  {
    digitalWrite(Rele, LOW);
    delay(5000);
    digitalWrite(Rele, HIGH);
  }
 
if ( day == 1||2||3||4||5 && hour == 15 && minute == 25 && second == 00 )
  {
    digitalWrite(Rele, LOW);
    delay(5000);
    digitalWrite(Rele, HIGH);
  }
 
if ( day == 1||2||3||4||5 && hour == 16 && minute == 10 && second == 00 )
  {
    digitalWrite(Rele, LOW);
    delay(5000);
    digitalWrite(Rele, HIGH);
  }
 
if ( day == 1||2||3||4||5 && hour == 16 && minute == 30 && second == 00 )
  {
    digitalWrite(Rele, LOW);
    delay(5000);
    digitalWrite(Rele, HIGH);
  }
 
if ( day == 1||2||3||4||5 && hour == 17 && minute == 15 && second == 00 )
  {
    digitalWrite(Rele, LOW);
    delay(5000);
    digitalWrite(Rele, HIGH);
  }
 
if ( day == 1||2||3||4||5 && hour == 17 && minute == 25 && second == 00 )
  {
    digitalWrite(Rele, LOW);
    delay(5000);
    digitalWrite(Rele, HIGH);
  }
 
if ( day == 1||2||3||4||5 && hour == 18 && minute == 10 && second == 00 )
  {
    digitalWrite(Rele, LOW);
    delay(5000);
    digitalWrite(Rele, HIGH);
  }
 
if ( day == 1||2||3||4||5 && hour == 18 && minute == 20 && second == 00 )
  {
    digitalWrite(Rele, LOW);
    delay(5000);
    digitalWrite(Rele, HIGH);
  }
 
if ( day == 1||2||3||4||5 && hour == 19 && minute == 05 && second == 00 )
  {
    digitalWrite(Rele, LOW);
    delay(5000);
    digitalWrite(Rele, HIGH);
  }

График получается слишком громоздким и мне кажется, что ардуинке будет тяжело его переваривать. (хотя памяти он не особо много занимает) Можно ли как-то сделать расписание компактнее? Буду очень благодарен советам!

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

О как! А мы так  не не могём!

Hardwell
Offline
Зарегистрирован: 04.01.2017

Я понимаю, что за такое выпороть нужно) Я только учусь

JasKo
Offline
Зарегистрирован: 21.11.2015

Одинаковый повторяющийся код выведи в отдельную функцию. А весь график засунь в массив структур и в цикле его обрабатывай.

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Как вариант.

void testmatch(){
bool flag=0;
  if(day<1||day>5||second!=0) return;
  flag|=(hour==8&&minute==30);
  flag|=(hour==9&&minute==15);
  flag|=(hour==9&&minute==25);
  flag|=(hour==10&&minute==10);
  flag|=(hour==10&&minute==25);
  flag|=(hour==11&&minute==10);
  flag|=(hour==12&&minute==15);
  flag|=(hour==12&&minute==30);
  flag|=(hour==13&&minute==15);
  flag|=(hour==13&&minute==25);
  flag|=(hour==14&&minute==10);
  flag|=(hour==14&&minute==20);
  flag|=(hour==15&&minute==05);
  flag|=(hour==15&&minute==25);
  flag|=(hour==16&&minute==10);
  flag|=(hour==16&&minute==30);
  flag|=(hour==17&&minute==15);
  flag|=(hour==17&&minute==25);
  flag|=(hour==18&&minute==10);
  flag|=(hour==18&&minute==20);
  flag|=(hour==19&&minute==05);
  if(!flag) return;
  digitalWrite(Rele, LOW);
  delay(5000);
  digitalWrite(Rele, HIGH);
}

Что делает:

Смотрит что день не от 1 до 5 или не нулевая секунда, выходит. Иначе работает дальше.

Делает лог. переменную false, которая станет true если время любое из условий.

Если всё ещё false значит ни одно из условий не сработало, выходит. Иначе do the shit.

Hardwell
Offline
Зарегистрирован: 04.01.2017

Voodoo Doll пишет:

Как вариант.

void testmatch(){
bool flag=0;
  if(day<1||day>5||second!=0) return;
  flag|=(hour==8&&minute==30);
  flag|=(hour==9&&minute==15);
  flag|=(hour==9&&minute==25);
  flag|=(hour==10&&minute==10);
  flag|=(hour==10&&minute==25);
  flag|=(hour==11&&minute==10);
  flag|=(hour==12&&minute==15);
  flag|=(hour==12&&minute==30);
  flag|=(hour==13&&minute==15);
  flag|=(hour==13&&minute==25);
  flag|=(hour==14&&minute==10);
  flag|=(hour==14&&minute==20);
  flag|=(hour==15&&minute==05);
  flag|=(hour==15&&minute==25);
  flag|=(hour==16&&minute==10);
  flag|=(hour==16&&minute==30);
  flag|=(hour==17&&minute==15);
  flag|=(hour==17&&minute==25);
  flag|=(hour==18&&minute==10);
  flag|=(hour==18&&minute==20);
  flag|=(hour==19&&minute==05);
  if(!flag) return;
  digitalWrite(Rele, LOW);
  delay(5000);
  digitalWrite(Rele, HIGH);
}

Что делает:

Смотрит что день не от 1 до 5 или не нулевая секунда, выходит. Иначе работает дальше.

Делает лог. переменную false, которая станет true если время любое из условий.

Если всё ещё false значит ни одно из условий не сработало, выходит. Иначе do the shit.

JasKo, благодарю за идею)  Voodoo Doll, блин, спасибо большое, что примером показали! Попозже или утром попробую. Voodoo Doll, у Вас есть Киви/Вебмани?) Поблагодарю, чем смогу:3

Hardwell
Offline
Зарегистрирован: 04.01.2017

Поставил Ваш код, при проверке вылетает ошибка (это кусок, других ошибок там нет):

Program:33: error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator<' 
if(day<1||day>5||second!=0) return; 
^ 
Program:33: error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator>' 
if(day<1||day>5||second!=0) return; 
^ 
Program:33: error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator!=' 
if(day<1||day>5||second!=0) return; 
^ 
Program:34: error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator==' 
flag|=(hour==8&&minute==30); 

В гугле не нашел нормальных ответов

 

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Видимо, придётся так:

if((day<1)||(day>5)||(second!=0)) return;

если надо то ЯД 410011919696337.

 

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