Ao carregar o código abaixo a palavra sensor é gravada infinitas vezes.
Como fazer para que isso aconteça somente uma vez (sem afetar o RTC)?
Tente com if e for (além do existente) e não consegui.
#include <DS3231.h>
DS3231 rtc(SDA, SCL);
Time t;
void setup(){
Serial.begin(115200);
rtc.begin();
}
void loop(){
t=rtc.getTime();
if(t.hour==22 && t.min ==59)
Serial.println("sensor 1");
delay(1000);
}
Muito obrigado.
Obs. estou anexando o mesmo arquivo para quando necessário.
Tags:
Olá Max!
Você definiu a hora e data inicial do RTC?
A hora inicial do RTC deve ser definida pelo menos uma vez quando liga
Coloque no setup a data e hora inicial desejada.
Exemplo:
rtc.setTime(12, 0, 0);
rtc.setDate(1, 1, 2017);
Depois de feito isso, pode retirar do setup na próxima vez que compilar o sketch.
É boa prática também colocar chaves nos blocos de código do IF
No seu caso não seria necessário, mas é aconselhável
if(t.hour==22 && t.min ==59) {
Serial.println("sensor 1");
}
Obrigado Cintra.
Fiz tudo isso mas "sensor 1" fica sendo repetido.
Preciso que apareça somente uma vez.
É possível?.
Max, Estranho isso.
Faça um teste e imprima a data e hora para verificar se está obtendo resultados coerentes:
if(t.hour==22 && t.min ==59) {
Serial.println("sensor 1");
Serial.println(t.hour);
Serial.println(t.min);
}
Cintra, obrigado.
Fiz como recomendou e apareceram no monitor as horas atuais até a hora do "if" e então
apareceu sensor1 , etc.
Portanto coerentes.
Porém com a sugestão do Eduardo e sua acho que não alcançaria meu objetivo:
Pensava em (usando o RTC) fazer com que em determinados instantes do dia fossem
lidos os valores de um sensor e em outros instantes valores de outro sensor (simbolizei
com sensor1) . Nos dias seguintes se repetiriam os mesmos instantes, sendo que os instantes
de um sensor seriam diferentes dos instantes do outro sensor. E futuramente esses valores
poderiam ser acessados pela internet. Alguém disse que teria que usar interrupção interna
(que não entendo nada) e outrem que poderia ser somente com o RTC. Estou tentando
a segunda alternativa.
O que você acha? Tem saída?
Se entendi o que acontece é que o teste:
if(t.hour==22 && t.min ==59)
é verdadeiro enquanto forem 22:59, ou seja: durante um minuto.
Vc quer escrever apenas quando chegar, sem repetir.
Para isso vc precisa localizar o que chamamos de borda de um sinal. Quando ele estava 58 e agora é 59. No caso pode ser quando ele estava qualquer coisa diferente de 59 e agora é 59.
Crie uma variavel mina (minuto anterior) e verifique se ela é diferente de 59.
if((t.hour==22) && (t.min ==59) && (mina!=59)) {
Serial.println("sensor 1");
mina=t.min;}
Realmente, o Eduardo tem razão.
Não havia entendido o problema.
Só complementando a resposta:
Não se esqueça de voltar o valor da variável mina quando encerrar esse 1 minuto.
Caso contrário o alarme não funcionará da próxima vez
Em tempo: Algumas libs do 3231 possuem funções de alarme:
https://github.com/jarzebski/Arduino-DS3231/blob/master/DS3231_alar...
Vish, verdade !
O ideal seria:
Criar uma para min e outra para mina.
min=t.min;
if((t.hour==22) && (min ==59) && (mina!=59))
Serial.println("sensor 1");
mina=min;
Isso pq alem do bug que o Jose Augusto Cintra citou achei um outro:
Se testar 2x t.min pode acontecer de numa lida ele ter um valor e na outra já ter outro. Com é uma variável que muda sozinha é melhor ler apenas uma vez por loop.
Fiz como recomendou o Cintra e apareceram no monitor as horas atuais até a hora do "if" e então
apareceu sensor1 , etc.
Portanto coerentes.
Porém com a sua sugestão e do Cintra eu acho que não alcançaria meu objetivo:
Pensava em (usando o RTC) fazer com que em determinados instantes do dia fossem
lidos os valores de um sensor e em outros instantes valores de outro sensor (simbolizei
com sensor1) . Nos dias seguintes se repetiriam os mesmos instantes, sendo que os instantes
de um sensor seriam diferentes dos instantes do outro sensor. E futuramente esses valores
poderiam ser acessados pela internet. Alguém disse que teria que usar interrupção interna
(que não entendo nada) e outrem que poderia ser somente com o RTC. Estou tentando
a segunda alternativa.
O que você acha? Tem saída?
Obrigado Cintra.
#include DS3231.hDS3231 rtc(SDA, SCL); Time t;
boolean tvr1;
void setup()
{
Serial.begin(115200);
rtc.begin();
}
void loop()
{
t=rtc.getTime();
if(t.hour==22 && t.min ==59 && tvr1 == false)
{
Serial.println("sensor 1");
tvr1=true;
delay(1000);
}
if(t.min!=59)
{
tvr1=false;
}
}
Bom dia amigo, não sei se resolveu seu problema mas tente esse code que eu fiz...
Tem uma variável do tipo boolean que vai permitir que o if passe somente uma vez pois quando passar pelo if essa variável tvr1 vai ser true, invalidando o if. Quando t.min for diferente de 59(condição dentro do if) a variável volta a ser true, possibilitando o if a correr novamente. Espero ter ajudado.
Obrigado Rhaicmer;
Vou fazer isso.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por