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.
Boa tarde,
enquanto analiso seu código para ver se consigo sugerir uma solução, gostaria de te pedir 2 coisas.
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 ......
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.
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)};