Este tópico era para resolver uma dúvida. Como ligar o RELE em determinado horário, procurando na internet eu e meu
professor Luiz Fernando encontramos um código e modificamos ele conforme a minha necessidade. Porém agradeço muito ao Paulo Cesar Antunes, ao
Carlos Kwiek e o Luciano Vieira da Silva Jr.
Segue abaixo o código que foi montado.Detalhe: Nesse código o comando LOW liga e HIGH desliga, não sei o motivo, mas funcionou dessa forma.
Tags:
Veja se esse código meu não te serve:
http://labdegaragem.com/forum/topics/ajuda-com-c-digo-2
Acredito que ajustando vai te ajudar...
Sou novo nessa área, então pelo que eu entendi não dará certo.
Obs: Necessito gravar a data e a hora no RTC, já que o mesmo não ficará conectado a nenhum computador, e em determinadas horas ( designadas por mim ) ele irá " falar " pro relê mandar energia para a válvula solenoide e a mesma abrir a passagem da água.
Hugo, esse código que te passei serve sim para o que vc diz querer....
Nesse campo será onde vc determinará o horário de ligar (Onde está Bomba 1 e 2 será a tua solenoide) ´que no exemplo irá funcionar das 6 da manha até as 18 horas ( você coloca horário que quiser, basta alterar)
//Bomba 1 e 2 : Ligada entre 06:00 e 18:00 todos os dias
if ((hour >=06 &minute >=00 &second >=01) && (hour <=17 &minute <=59 &second <=53))
Já o tempo que você quer que fique ligada a solenoide irá determina nesse campo que fica logo incio do código...
long interval = 5000; // tempo de transição entre estados (milisegundos)
O tempo está em milésimos de segundo no exemplo ai 5 segundos (5000)
Bom você pode não ter entendido o código, mas que ele te serve serve, basta ajustar...
Caro Paulo Cesar Antunes, hoje na minha aula de PTCC eu e meu professor analisamos o código e o modificamos como mostra abaixo, porém ele não está ligando o pino 13, fizemos o teste com o exemplo BLINK para ver se o ARDUINO estava com defeito, o teste foi um sucesso(o rele funcionou perfeitamente), ou seja, é alguma coisa a cima do loop que está atrapalhando. Tem como me ajudar nessa parte ?
int bomb4 = 13; // LED conectado ao pino digital 12
int value = LOW; // último valor do LED
long previousMillis = 0; // último momento que o LED foi atualizado
long interval = 5000; // tempo de transição entre estados (milisegundos)
#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68
/
//Converter números decimais normais para binário codificado decimal
byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}
//Converter decimal binário codificado para números decimais normais
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}
// 1) Define a data e a hora no ds1307
// 2) Inicia o relógio
// 3) Define o modo de hora a relógio de 24 horas
// Assume que você está passando em números válidos
void setDateDs1307(byte second, // 0-59
byte minute, // 0-59
byte hour, // 1-23
byte dayOfWeek, // 1-7
byte dayOfMonth, // 1-28/29/30/31
byte month, // 1-12
byte year) // 0-99
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.write(decToBcd(second)); // 0 a 7 bit no cronômetro
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour)); // Se você quiser am 12 hora / pm é necessário definir
// 6 bit (também precisa mudar readDateDs1307)
Wire.write(decToBcd(dayOfWeek));
Wire.write(decToBcd(dayOfMonth));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.endTransmission();
}
// Obtém a data e hora do ds1307
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year )
{
// Reset o ponteiro registro
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
// Algumas delas precisam de máscaras porque certos bits são bits de controle
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f); // Necessidade de mudar isso se 12 horas am/pm
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}
void setup()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
Wire.begin();
Serial.begin(9600);
// configura o pino digital como saída
pinMode(bomb4, OUTPUT);
// Alterar esses valores para o que você quer definir o seu relógio para.
// Você provavelmente só quer definir o seu relógio uma vez e, em seguida, remover
//the setDateDs1307 call.
second = 00;
minute = 38;
hour = 13;
dayOfWeek = 0;
dayOfMonth = 03;
month = 9;
year = 15;
setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
}
void loop()
{
digitalWrite(bomb4, LOW);
AtualizaSaidas();
delay(1000);
digitalWrite(bomb4, HIGH);
delay(1000);
}
void AtualizaSaidas()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
//Bomba 1 e 2 : Ligada entre 06:00 e 18:00 todos os dias
if ((hour ==13 &minute ==45 &second >=01) && (hour ==13 &minute ==45&second <=59))
//if (millis() - previousMillis > interval)
{
digitalWrite(bomb4, HIGH);
}
else
{
digitalWrite(bomb4, LOW);
}
}
Tenta mudar :
if ((hour ==13 &minute ==45 &second >=01) && (hour ==13 &minute ==45&second <=59))
Para:
if ((hour >=13 &minute >=45 &second >=01) && (hour >=13 &minute >=45 &second <=59) )
Quase certeza problema está ai
Hugo, RTC serve para vc definir a hora real uma única vez, e a partir daí o relógio funciona somando o tempo a partir daquele horário que vc definiu como sendo a hora atual.
Aí vc programa o arduino para perguntar ao RTC que horas são naquele momento. E tendo essa informação em mãos (horário que o RTC informa como sendo atual), vc opta por exibir o horário no serial monitor, exibir o horário no display, ou simplemente manda o arduino executar alguma função caso o horário atual coincida com aquele horário que vc definiu como hora da irrigação.
Então, para o seu projeto, aprenda a mandar o arduino perguntar pro RTC que horas são. Esse é o primeiro passo. Mande exibir no serial monitor.
Depois, comece a brincar, comece a treinar sua capacidade de programação. Mande por exemplo o arduino perguntar ao RTC que horas são, e se os minutos forem menores que trinta, mande exibir uma mensagem "MINUTOS MENOR QUE TRINTA" e se os minutos forem maiores que 30, mande exibir "MINUTOS MAIOR QUE TRINTA"
Depois mande o arduino exibir também, além dos minutos maior ou menor que trinta, a mensagem "HORA PAR" OU "HORA IMPAR" conforme a hora que o RTC te informou. (por exemplo, irá exibir "HORA PAR, MINUTOS MAIOR QUE 30"
Com isso, vc vai estar pronto pra mandar o arduino perguntar ao RTC que horas são e mandar exibir a mensagem no serial monitor "IRRIGAR" caso o horário esteja por exemplo entre 08:00 e 08:15
Aí o próximo passo é ao invés de mandar exibir mensagem no serial monitor, mandar o arduino acionar o relê.
esse é o caminho das pedras. Existe algo já pronto? Não sei, talvez exista. Mas se quiser aprender, siga esses passos que te falei. E se vc aprender isso, com certeza vai poder usar a imaginação pra fazer muitas outras coisas úteis com o RTC
Olá Hugo,
Você pretende fazer algo similar a este vídeo?
https://www.youtube.com/watch?v=gAdXyfof19A
Abs.
Sim, é a mesma coisa só que o tempo seria uma vez por semana em uma determinada hora liga a válvula 1 e duas vezes na semana a válvula 2, e por enquanto sem o LCD. Se você puder me passar o código que você montou agradeço, mais irei tentar fazer o ajuste que o Paulo me disse e ver se vai dar certo. :D
O que o Paulo te passou é o código que fiz e passei para ele, aqui somos assim, passamos conhecimento um aos outros sem outra finalidade que a de compartilhar conhecimento e ajudar o próximo e receber ajuda.
Teste as modificações se quiser antes, e se também quiser passe o seu @gmail que compartilho todo projeto no Google Drive.
A maneira como vai usar, ligar x dia, x horas o programa permite fazer as escolhas, basta saber entender o código que esta todo comentado linha a linha e se tiver duvidas, eu o Paulo que esta inclusive realizando testes práticos pode lhe auxiliar bem como todos os colegas do forum.
Por outra parte preste atenção no link que o Paulo te passou, note que todos mudamos para o RTC DS3231 depois que o Paulo apontou uma grande deficiência do DS1307 que atrasa e muito, o DS3231 é preciso, confirmação esta corroborada pelo colega ihmugo na pratica também.
Também lhe aconselho a mesma biblioteca que estamos usando que pode baixar aqui:
http://www.rinkydinkelectronics.com/library.php
Embora no meu projeto utilizo somente
#include <Wire.h>
#include <LiquidCrystal.h>
#include <Time.h>
Te encorajo a seguir os conselhos do colega ihmugo, porque copiar e colar apenas não é uma boa escolha
Boa sorte.
Eu quero aprender, pretendo fazer alguns projetos para o meu uso, porém agora não tenho muito tempo para estudar os comandos para fazer do 0, por isso gostaria de ter algum mais ou menos pronto para o que eu preciso, já que é para a fins escolares. Você tem skype ? É mais fácil do que ficar trocando muitas mensagens por aqui (já que está dando alguns errinhos xD). E não tem como eu comprar outro RTC, já que este o grupo todo pagou.
Sim eu tenho skype, mas todas coisas que fazemos aqui são compartilhadas e não privadas, a intenção de um forum é exatamente essa, trocar informação para que todos aqui opinem, compartilhei sua ideia a respeito do assunto, ajudem, critiquem, ou seja la o que for dentro do mutuo respeito e regras do forum, dessa forma é que funciona o espirito de um forum, se para você é mais fácil o skype que trocar mensagens por aqui, acho bom procurar ajuda no forum do Skype, o qua acha?
Abs.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por