Estou fazendo um código pra acionar um relé e ao mesmo tempo medir o consumo de corrente no aparelho que estiver conectado no relé, mas não posso usar o delay pra temporizar pois ele para tudo.

Queria ajuda pra adicionar um temporizador pra ele ir contando o tempo enquanto o sensor mede a corrente.

Quais bibliotecas usar?

O código onde estou tentando colocar o timer é esse aqui:

https://pastebin.com/P3jPAjci

Exibições: 286

Responder esta

Respostas a este tópico

Você pode usar a função millis() e fazer operações usando os tempos.

Por exemplo, suponha que a Tarefa1() deva ser executada a cada 5 segundos, mas sem travar o resto do código durante esse intervalo. Você pode fazer:

unsigned long prev_time1 = 0;

unsigned long intervalo1 = 5000;

void setup()

{

}

void loop()

{

     if(millis() - prev_time1 >= intervalo1 )

     {

           prev_time1 = millis();

           Tarefa1();

      }

     //Restante do código

}

Obrigado, vou desenvolver em cima disso.

Boa noite colegas, estou com outra dúvida aqui:

Consegui fazer o que eu queria com a biblioteca TimerOne, botei pra imprimir o tempo no LCD e tudo mais, porém o tempo que ele imprime é em milisegundos e não estou conseguindo converter esse tempo para minutos:segundos.

Alguém tem alguma sugestão?

@Edit

Aproveitando, alguem pode revisar a linha do meu código por gentileza? Fiz umas alterações aqui e agora está imprimindo a linha tempo após o número do WattHora.

O código é esse aqui:

case 3:
lcd.clear();
lcd.home();
lcd.print("Vc escolheu:");
lcd.setCursor(0,1);
lcd.print("Banho Curto");
lcd.setCursor(0,0);
delay (5000);
lcd.clear();
//A partir daqui aciona o relé e começa a monitorar o consumo
while (time <= 3000){
digitalWrite(rele, HIGH); //Liga rele
lcd.print("Tempo="); // mostra texto
lcd.setCursor(0,1); // seleciona coluna 0, linha 1
lcd.print("WattHora="); // mostra texto
Irms = EnerMonitor.calcIrms(1480); // calculo da corrente RMS
lcd.setCursor(9,0); // seleciona coluna 9, linha 0
lcd.print(time); // mostra o tempo em milisegundos
lcd.setCursor(9,1); // seleciona coluna 9, linha 1
lcd.print(Irms*Vrede*(Tempo/3600)); // calculo de Watt/hora
Tempo++;
delay (100);
}
if(time > 3000){ //Quando o tempo passar de 5 minutos, o relé desarma e volta para o estado 2
digitalWrite(rele, LOW);
delay (15000);
estado = 2;
}
break;

Faça a conversão matematicamente, já que 1000ms = 1s, 60 seg = 1min... e etc. Basta ir fazendo a divisão e incrementando e zerando cada variável de forma adequada.

Sobre o erro na impressão, acredito que a biblioteca imprima o valor na última posição válida do cursor. Ou seja, como vc não especifica o (0,0) do "Tempo", ele imprime depois da impressão do Wh. Em alguns casos há o clear antes, então o cursor volta pro (0,0) e não ocorre esse problema.

A solução possivelmente é informar a posição do cursos antes de imprimir o "Tempo".

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço