Olá pessoal! Estou começando agora no Arduino e meu primeiro projeto é acender uma lâmpada (30 LEDs) num aquário pequeno.  A questão é que preciso que a lâmpada acenda em dias e horários pré-definidos. Para isso estou usando um RTC. Consegui fazê-la acender todo dia das 17h às 22h, mas quando tento alternar com outros dias/horários, tipo, acender sábados e domingos das 8h-22h não funciona. E preciso também que o push button acenda ou apague a lâmpada fora desses horários predefinidos. Não consigo fazer a lógica toda sem conflitos. Até tentei por um sensor PIR, mas também conflitou.

Bom, resumindo: Consigo ter o RTC funcionando perfeitamente e acendendo o LED todo dia das 17h-22h, mas não consigo inserir nem o push button, nem o PIR ou nem mesmo acender a lampada em outros horários e dias. Eis o meu código:

//inclusão de biblioteca e objetos do módulo relógio
#include <DS3231.h>
DS3231 rtc(SDA, SCL);
Time t;

//determina pino botão
#define pinBotao 6

//determina pinoPIR
//#define pinPIR 7

//determina pinoRelè
#define pinRele 8

//determina estado relè
#define estadoRele

//parâmetros de horário que serão atualizados
int horaAtual, minutoAtual;

void setup()
{

//inicia o módulo relógio
rtc.begin();

//inicia o monitor serial
Serial.begin(115200);

//determina o pino do relé como saída
pinMode(pinRele, OUTPUT);

//determina pino do PIR como entrada
//pinMode(pinPIR, INPUT);

//determina pino botão como entrada usando resistor do arduino
pinMode(pinBotao, INPUT_PULLUP);

//desliga o relé para começar.
digitalWrite(pinRele, HIGH);

//as linhas abaixo devem ser descomentadas para configurar o relógio interno.
//Descomente, carregue o código para o arduino, comente novamente e suba o código mais uma vez.
//rtc.setDate(29,7,2019); // determina a data (dia, mes, ano)
//rtc.setDOW(MONDAY); // determina o dia da semana
//rtc.setTime(13,11,0); // determina o horário (hora, minuto, segundo)

}

void loop()
{

//determina o horário atual
t = rtc.getTime();
horaAtual = t.hour;
minutoAtual = t.min;

//lê estado da porta do PIR e guarda na variável
//bool valorPIR = digitalRead(pinPIR);

//verifica se iluminação precisa estar acesa por movimento
/*if (valorPIR)
{
digitalWrite(pinRele, LOW);
}
else
{
digitalWrite(pinRele, HIGH);
}
*/
//verifica se iluminação precisa estar acesa por horário
if ((horaAtual >=17) && (horaAtual <=21)){
digitalWrite(pinRele, LOW);
}
else{
digitalWrite(pinRele, HIGH);
}

//verifica se iluminação precisa estar acesa por botão
if(digitalRead(pinBotao) == LOW){
delay(300);
digitalWrite(pinRele, !digitalRead(pinRele));
}

//Imprime o horário
Serial.print("Horário atual: ");
Serial.println(rtc.getTimeStr());
//Serial.print("Sensor PIR: ");
//Serial.println(valorPIR);

//atualiza monitor serial
delay (1000);
}

Exibições: 1746

Responder esta

Respostas a este tópico

Olá Elcids, tudo bem? Então, na última semana consegui avanços em meu aprendizado.

Agora o Alive tá funcionando. Porém, quando fecho a porta e a fita LED acende (RELE2), o botão e o PIR não atuam, ficam inoperantes. A Lâmpada LED do aquário (RELE1), se estiver acessa, não apaga e se estiver apagada, não acende. O RTC também para de informar a hora segundo a segundo no monitor Serial, mas não desajusta o relógio, só não informa. 

Ao abrir a porta e apagar a Fita LED (RELE2), tudo volta ao normal, inclusive o monitor Serial informando hora a cada segundo.

Pretendo sanar pelo menos essa questão do interruptor magnético (fita LED) ativando o RELE2. Estava na expectativa de colocar o display LCD informando temperatura da água, mas em meus testes em outro arduino  o sistema ficou extremamente lento quando adicionei o display LCD 1602 + sensor de temperatura + interruptor magnético ao seu código.

Tenha uma ótima semana!!!

olá Rodrigo, boa tarde.

      Fiquei duas semanas distante do LDG, e por isso demorei a vir aqui responder.

      Então abordando suas questões, uma de cada vez:

      1) o comportamento que vc evidenciou, sobre a falha descrita no seu exemplo nos comandos "duplos" na segunda e quinta-feira,  realmente há um erro no código. Já identifiquei e a correção é em apenas uma única linha do programa (acho que na correria, eu esqueci de digitar uma parte).  Irei logo postar o código com a correção.

      2) sobre o acréscimos dos elementos que vc mencionou (LCD, MC-38, Termômetro, etc), é simples integrar isso ao código. Mas apesar de muito simples, é preciso saber como se faz isso, mantendo a Máquina de Estados funcionando corretamente (além do "Alive" que vc disse que deu zica nas suas "experiências").  Não se preocupe, irei te mostrar como fazer essas implementações, mas antes irei publicar a correção para o  item 1)  acima (a correção para a falha com os comandos "duplos").

      Como eu disse, fique tranquilo, pois é possível fazer que todos os elementos funcionem em perfeita harmonia,  mesmo que vc acrescente uma infinidade destes elementos.

      Para este seu item 2), irei também te perguntar mais detalhes, para se obter o melhor resultado.

      Abrçs,

      Elcids

Boa noite Eucids! Rapaz, estou fascinado com seu código! Esqueci por duas vezes de mencionar aqui o quão fantástico é ajustar o RTC através do monitor serial do arduino (terminal). Depois que você me fez conhecer isso, o método antigo, aquele de descomentar/comentar as linhas dos ajustes, me pareceu gambiarra, kkkk.
Agora, em relação à integrar mais atuadores e sensores ao projeto, é ótimo ouvir de você que é possível ter tudo isso em harmonia, pois já estava achando que é muita coisa pros 16MHz do Uno.
Como digo sempre, obrigado por tudo e espero pacientemente suas colaborações!

Abraços!

boa noite Rodrigo.

      Novamente peço desculpas pela demora, mas fiquei distante do site por alguns dias.

      Estou publicando a correção para o problema "1" que vc relatou, quando no mesmo dia da semana haviam dois comandos, e apenas um deles funcionava.

      Vou esclarecer o porque deste problema. Ocorre que a lista de comandos é varrida, e se naquele dia da semana um comando é encontrado cuja faixa de horário bata com a hora atual, então é sinalizado que a Lâmpada deve ser ligada, e isto está correto. Porém se um outro comando no mesmo dia é encontrado logo depois daquele que "mandou" ligar a lâmpada, e este comando não bate com a hora atual, então para este comando a lâmpada seria desligada. Como este comando foi "encontrado" logo depois do que "mandou" ligar a Lâmpada, acaba que a Lâmpada não é ligada, pois o mecanismo se comportou como se o último comando tivesse prioridade, embora não seja este o caso (pois a Lâmpada deveria ser ligada, já que bateu o dia da semana e a hora atual está na faixa do comando).

      Este comportamento não era esperado, mas ele ocorreu porque não digitei um único caracter na linha de código. Veja na figura a seguir apontado pela seta "rosa", onde mostro a Flag "ligar" que indica se a Lâmpada deve ou não ser ligada na versão anterior do código:

(clique na figura para "zoom")

      Note que ali está apenas assim:    ligar = Ok1 && Ok2;

      Agora veja a correção mostrada na figura seguinte apontado pela seta "azul", no código corrigido:

(clique na figura para "zoom")

      Parece difícil de acreditar, mas a correção é esta mesma: apenas acrescentar o caracter "|" antes do caracter "=", ficando a linha assim:     ligar |= Ok1 && Ok2;

      Ocorre que com o "|=",  fica um "registro" de que um comando anterior para aquele dia e naquele horário, detectou que a Lâmpada deve ser ligada, e portanto mesmo que outro comando seja encontrado dizendo o contrário, o que vale é o que o "registro" está indicando.  Uma solução alternativa e também mais "adequada", seria finalizar o loop "for" (mas SEM USAR o MALDITO "BREAK" que quase todo mundo insiste em usar e é uma prática muito ruim em programação!!!!!!),  logo que é detectado que a Lâmpada deve ser ligada. Mas preferi apenas corrigir acrescentando o "|" que faltou, pois isto não muda praticamente nada na estrutura que já havia ali.

      Veja que neste caso, foi apenas um esquecimento de digitação que causou o problema. Mas isto também serve para mostrar como o conhecimento e domínio da linguagem C/C++  são fundamentais se vc quer fazer algo "sério" e principalmente "robusto".

      O código com a correção está neste link:    Lampada_Aquario_03.zip

      Na simulação via Proteus, apenas o arquivo "HEX" precisou ser atualizado, uma vez que nos circuitos nada mudou.

      Sobre os demais pontos que vc quer implementar, preciso de mais detalhes. Irei te enviar um email informando o meu Skype, assim ficará mais fácil vc me descrever estes outros itens que vc deseja incluir. Já adianto que não tenho whatsapp (e nunca tive). Apenas Skype pois já usava no trabalho.

      Abrçs,

      Elcids

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço