Agendar horario para ligar e desligar rele

Boa tarde pessoal, sou novo com Arduino e estou querendo usar o Arduino para acender e apagar as lâmpadas da minha empresa.
A principio fiz um código com apenas um rele que esta funcionando.
A minha duvida é: Como fazer esse agendamento usando também minutos, vendo que so consegui fazer com horas "cheias".

Estou utilizando Arduino UNO - RTC DS1302 - RELE de um canal.

Segue a sketch.

#include <virtuabotixRTC.h>                 RTC DS1302      

#define   clk   13
#define   dat   12
#define   rst   11
#define   rele  5

// Constantes Auxiliares
#define   segL       40
#define   minL       59
#define   horL       17
#define   d_semL      3
#define   d_mesL     17
#define   mesL        5
#define   anoL     2022

// Objetos 
virtuabotixRTC   myRTC(clk, dat, rst);

// Funções
void DS1302();
void week(int dayW);

// 
void setup()
{
  Serial.begin(9600);
  pinMode(rele, OUTPUT);
  digitalWrite (rele, LOW);

  // configura hora e data (comentar apos enviar)
  myRTC.setDS1302Time(segL, minL, horL, d_semL, d_mesL, mesL, anoL);

} //end setup

// --- Loop Infinito ---
void loop()
{
  DS1302();

// AGENDAMENTO DOS RELES
  if ((myRTC.hours >= 18) && (myRTC.hours <= 24)) digitalWrite (rele, HIGH);
  if ((myRTC.hours >= 00) && (myRTC.hours <= 17)) digitalWrite (rele, LOW);

} //end loop

// Funções 
void DS1302()
{
  myRTC.updateTime();         //faz leitura do DS1302

  // Imprime informações
  Serial.print(" -> ");
  week(myRTC.dayofweek);
  Serial.print(" | ");
  Serial.print(myRTC.dayofmonth);
  Serial.print("/");
  Serial.print(myRTC.month);
  Serial.print("/");
  Serial.print(myRTC.year);
  Serial.print(" | ");
  if (myRTC.hours < 10) Serial.print("0");
  Serial.print(myRTC.hours);
  Serial.print(":");
  if (myRTC.minutes < 10) Serial.print("0");
  Serial.print(myRTC.minutes);
  Serial.print(":");
  if (myRTC.seconds < 10) Serial.print("0");
  Serial.println(myRTC.seconds);
  delay(5000);

} //end DS1302


void week(int dayW)
{

  switch (dayW)
  {
    case 1: Serial.print("Dom"); break;
    case 2: Serial.print("Seg"); break;
    case 3: Serial.print("Ter"); break;
    case 4: Serial.print("Qua"); break;
    case 5: Serial.print("Qui"); break;
    case 6: Serial.print("Sex"); break;
    case 7: Serial.print("Sab"); break;

  } //end switch

} //end week

Desde já agradeço

Boa tarde,
enquanto analiso seu código para ver se consigo sugerir uma solução, gostaria de te pedir 2 coisas.

  1. Edite seu tópico e coloque o código postado entre as tags </>.
    Basta clicar no ícone das tags </> e mudar seu código para ficar ente os ..... e ......

  2. Leia com atenção o tópico para novos usuários do fórum.
    How to get the best out of this forum
    Como está em inglês, se tiver dificuldade use o tradutor do google.

Acho que que agora esta correto.

Não, não é.
Vá para editar:

Em seguida, selecione todo o seu código que você publicou, corte-o e clique em</>

E então você cola.

pegar

Bom dia, agora sim!

Bom dia,
veja se esta modificação atende sua necessidade.
A modificação está após " // AGENDAMENTO DOS RELES"

#include <virtuabotixRTC.h>                 RTC DS1302

#define   clk   13
#define   dat   12
#define   rst   11
#define   rele  5

// Constantes Auxiliares
#define   segL       40
#define   minL       59
#define   horL       17
#define   d_semL      3
#define   d_mesL     17
#define   mesL        5
#define   anoL     2022

// Objetos
virtuabotixRTC   myRTC(clk, dat, rst);

// Funções
void DS1302();
void week(int dayW);

//-------------------------------------------------------
void setup()
{
  Serial.begin(9600);
  pinMode(rele, OUTPUT);
  digitalWrite (rele, LOW);

  // configura hora e data (comentar apos enviar)
  myRTC.setDS1302Time(segL, minL, horL, d_semL, d_mesL, mesL, anoL);

} //end setup

// --- Loop Infinito ---------------------------------------------------------
void loop()
{
  DS1302();

  // AGENDAMENTO DOS RELES
 
  int hora_min = (myRTC.hours  * 100) + myRTC.minutes;   // Transforma hora em milhar/centena e soma aos minutos
    
  if ((hora_min >= 1820) && (hora_min <= 2349)) digitalWrite (rele, HIGH);  // 18:20  ate 23:49
  if ((hora_min >= 18) && (hora_min <= 140)) digitalWrite (rele, LOW);      // 00:18  ate 01:40


} //end loop

// Funções
void DS1302()
{
  myRTC.updateTime();         //faz leitura do DS1302

  // Imprime informações
  Serial.print(" -> ");
  week(myRTC.dayofweek);
  Serial.print(" | ");
  Serial.print(myRTC.dayofmonth);
  Serial.print("/");
  Serial.print(myRTC.month);
  Serial.print("/");
  Serial.print(myRTC.year);
  Serial.print(" | ");
  if (myRTC.hours < 10) Serial.print("0");
  Serial.print(myRTC.hours);
  Serial.print(":");
  if (myRTC.minutes < 10) Serial.print("0");
  Serial.print(myRTC.minutes);
  Serial.print(":");
  if (myRTC.seconds < 10) Serial.print("0");
  Serial.println(myRTC.seconds);
  delay(5000);

} //end DS1302

//-------------------------------------------------------
void week(int dayW)
{

  switch (dayW)
  {
    case 1: Serial.print("Dom"); break;
    case 2: Serial.print("Seg"); break;
    case 3: Serial.print("Ter"); break;
    case 4: Serial.print("Qua"); break;
    case 5: Serial.print("Qui"); break;
    case 6: Serial.print("Sex"); break;
    case 7: Serial.print("Sab"); break;

  } //end switch

} //end week

Boa noite,

A conversão em milhar e soma funcionaram.

Porem acho que as condições não estão se entendendo. Por ex:
O rele aciona entre 18:20 e 23:49, porem ate as 00:18 ele continua ligado e após as 01:40 continua desligado. Tentei usar outros horários, porem se o segundo IF não iniciar de 0 hora, ele também se perde. Por ex:

// --- DEFINE AGENDAMENTO DOS RELES ---

  int hora_min = (myRTC.hours  * 100) + myRTC.minutes;   // Transforma hora em milhar/centena e soma aos minutos
  if ((hora_min >= 1800) && (hora_min <= 1820)) digitalWrite (rele, LOW);  // 18:00  ate 18:20
  if ((hora_min >= 1821) && (hora_min <= 1759)) digitalWrite (rele, HIGH);      // 18:21  ate 17:59

Outra situação que aconteceu e não sei se por ter trocado para um rele de estado solido, é que tive que inverter o LOW e o HIGH das condições.

Vejamos, está a fazer-me uma confusão, quantos minutos são as horas na sua cidade, 100, caramba, na minha são 60, penso que teria de multiplicar por 60.
Digamos que queremos tê-lo ligado das 14:30 às 23:45. O código ficaria assim:

  int hora_min = (myRTC.hours  * 60) + myRTC.minutes;   // Transforma hora em minutos e soma aos minutos
  if ((hora_min >= 870) && (hora_min <= 1425)) {digitalWrite (rele, LOW);}  // 14:30 = (14*60) +30=870 ate 23:45 = (23*60)+45=1425
  else {digitalWrite (rele, HIGH); }

Acredito que das duas formas funcionam, porem multiplicando por 100 acho que o entendimento fica mais simples.
Usando "else" funcionou melhor realmente. Porem caso precise desligar e ligar em mais de um horario utilizei "||". Se tiver outra solucao para mais de dois agendamentos agradeço.

Ficou assim

int hora_min = (myRTC.hours  * 100) + myRTC.minutes;   // Transforma hora em milhar/centena e soma aos minutos
   if ((hora_min >= 1800) && (hora_min <= 1820) || (hora_min >= 1900) && (hora_min <= 1920)) digitalWrite (rele, LOW);  // acionado entre 18:00 ate 18:20 e 19:00 e 19:20
  else (digitalWrite (rele, HIGH));

Se ficar mais claro, é como tirar os dois pontos de separação, mas se no futuro você quiser fazer operações com aquele formato, como subtrair 45 minutos por meio de um botão na hora de desligar ou ligar, o operação seria complexa, sim multiplicar por 60 é uma simples subtração.
A operação " ||" está correto, outra forma poderia ser colocar dois if-else, o resultado é o mesmo.

 if ((hora_min >= 1800) && (hora_min <= 1820)) {digitalWrite (rele, LOW);} // acionado entre 18:00 e 18:20 
  else {digitalWrite (rele, HIGH);}
 if ((hora_min >= 1900) && (hora_min <= 1920)) {digitalWrite (rele, LOW);}  // acionado entre 19:00 e 19:20
  else {digitalWrite (rele, HIGH)};

Ok, fui infeliz na escola dos "intervalos";

Tente com os seguintes intervalos:

if ((hora_min >= 1820) && (hora_min <= 2349)) digitalWrite (rele, HIGH); // 18:20 ate 23:49
if ((hora_min > 2349) && (hora_min <= 140)) digitalWrite (rele, LOW); // 00:18 ate 01:40

Entendo, a principio nao tinha pensando em usar um botão para fazer essa programação, mas vou considerar sua ideia. Obrigado.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.