Olá.. Boa tarde pessoal do Lab.

Estou com uma dúvida, será que alguém pode me ajudar?? Tenho um sensor de temperatura e um Modulo RTC DS1307 que está funcionando perfeitamente. Mas agora gostaria que as medições de temp/umidade fossem em determinada hora (de hora em hora).

Já tentei vários jeitos, mas basicamente nesse momento meu programa tá assim:

(...) parte inicial do programa desnecessária

//configuração do sensor, já com data ajustada pelo comando setTime

rtc.halt(false);
rtc.setSQWRate(SQW_RATE_1);
rtc.enableSQW(true);

char minutosensor[8]; //crio uma variavel

strcpy(minutosensor, rtc.getTimeStr()); //pego os dados do RTC opção hora


     if ((minutosensor[3] = '5') && (minutosensor[4] = '9') ) // inicia-se do [0], só iria ler sensor quando desse: 'xx:59:xx'
     {

     (aqueles codigos básicos de leitura e configuração do sensor)

     Serial.print("Hora da medição: ");      

     Serial.print(rtc.getTimeStr()); //mostra a hora 

     Serial.print(" - Temperatura: "); 

     Serial.println(temp); //mostra temp

     }

 

O programa compila certinho, mas ele faz a leitura do sensor normalmente (de segundo em segundo), como se o IF não existi-se, ou seja, não faz a leitura do sensor em cada hora.

Será que alguém pode me ajudar onde está o erro??

Muito Obrigado.

Atenciosamente,

Wesley Ricci.

OBS: se eu fosse colocar delay para uma hora seria delay(3600000), ai se eu fosse em 24hr (1 leitura por dia) ficaria superior ao que Arduino consegue suportar neh?!?!

Exibições: 712

As respostas para este tópico estão encerradas.

Respostas a este tópico

esse teu IF está incompleto.

Precisa se atentar ao fato de que quando os minutos do relógio estiverem em xx:59:xx a condicional estará validada durante 60 segundos ininterruptos, isto é, entre xx:59:00 e xx:59:59

Sugiro que vc crie uma variável para sinalizar que a leitura já foi realizada dentro daquele horário.

Algo como:

boolean SensorLido = false; // inclua essa linha no início do sketch, fora do setup e fora do loop

if ( minutosDoRelogio == 59 && SensorLido == false ) // 

{

// aqui vc coloca o código pra ler o sensor;

SensorLido = !SensorLido ; // muda o status para true; assim no próximo loop em que os minutos estiverem no 59, o sensor não será lido

}

if  ( minutosDoRelogio != 59  && SensorLido == true )

{

SensorLido = !SensorLido ; // muda o status para false assim que o relógio estiver com os minutos diferente de 59 e o status estiver como true

}

PS: vc precisará ajustar o código acima para suas necessidades, ok? Eu tentei apenas te passar a idéia do caminho por onde vc deve seguir pra resolver seu problema

Obrigado pela resposta imhugo..

Realmente você tem razão, no exemplo que eu dei, seria validada durante 60 segundos ininterruptos mesmo, mas nem me preocupei a isso, pois assim que eu rodava o programa ele já começava a captura de dados com ex: 57 min,58 min, etc.. Fiz varios testes e varios metodos durante o final de semana, entre eles, esses dois ai em baixo, mas ambos não funcionaram, ainda continuam fazendo medições assim que rodo o programa, só que agora o programa só faz duas medições e simplesmente para de medir.. até ai tudo ainda vai, não medir, mas quando chega 59 ele tambem não mede..

char minutosensor[8];
strcpy(minutosensor, rtc.getTimeStr());

if ( ((minutosensor[3] = '5') && (minutosensor[4] = '9')) && SensorLido == false )
{

 Serial.print("Hora da medição: ");      

     Serial.print(rtc.getTimeStr());

     Serial.print(" - Temperatura: "); 

     Serial.println(temp); //mostra temp


SensorLido = !SensorLido ;
}
if ( ((minutosensor[3] = '5') && (minutosensor[4] = '9')) && SensorLido == true )
{
SensorLido = !SensorLido ;
}

---------------------------------------------------------------------------------------------------------

char minutosensor[8];
strcpy(minutosensor, rtc.getTimeStr());
if((minutosensor[3] = '5') && (minutosensor[4] = '9') )
{
if ( minutosensor == "59" && SensorLido == false )
{

 Serial.print("Hora da medição: ");      

     Serial.print(rtc.getTimeStr()); //mostra a hora 

     Serial.print(" - Temperatura: "); 

     Serial.println(temp); //mostra temp


SensorLido = !SensorLido ;
}
if ( minutosensor != "59" && SensorLido == true )
{
SensorLido = !SensorLido ;
}

eu não tenho como testar esse sketch, mas logo de cara já dá pra perceber um erro básico: quando vc quiser fazer comparação no IF, precisa usar "==" e não apenas "="

Perceba o erro por exemplo ocorrendo aqui:

if ( ((minutosensor[3] = '5') && (minutosensor[4] = '9')) && SensorLido == false ) 

Isso deveria estar assim:

if ( ((minutosensor[3] == '5') && (minutosensor[4] == '9')) && SensorLido == false ) 

Tentei isso também, mas aparece esse erro:

testertc.ino:92:56: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]

é companheiro... eu não tenho como te ajudar na resolução desse seu problema... eu te passei a idéia de qual caminho seguir pra vc ler apenas uma vez por hora seu sensor.

Faz o seguinte: recomece do zero, apenas pra vc aprender a mexer com o RTC exibindo as horas no seu serial monitor. 

Aplique a técnica que eu te sugeri para fazer exibir o horário ininterruptamente, e apenas uma frase especial a cada minuto.

Depois aplique a mesma técnica pra fazer exibir a frase especial nos minutos pares

Depois faça aparecer a frase especial apenas uma vez no minuto que vc desejar

Assim vc dominará essa técnica de fazer aparecer qualquer frase apenas uma vez no tempo em que desejar

Depois modifique o sketch para que ao invés de texto, seja feita a leitura do sensor.

Vai por etapas amigo. È bom pro seu aprendizado e te permitirá domínio absoluto pra alterar da forma que quiser.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço