Como fazer que "sensor 1" apareceça somente uma única vez no monitor serial

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. 

Exibições: 423

Anexos

Responder esta

Respostas a este tópico

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.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço