Pessoal estou construindo uma estufa que o controlador terá que controlar temperatura e tempo.
ex: programo 75 graus e 15 minutos ao apertar o botão start ele aciona a resistência e começa a contar o tempo, passados 15 minutos ela desliga a resistência.
estou com um problema estranho na programação..
criei a variável de tempo como t
e ao acionar os botão para incrementar o t vai normalmente
só que ao acionar o batão para decrementar ele começa a decrementar de 1 em 1 mas derepente ele pula muitos números
if(digitalRead(TimeMais_buttonPin)==HIGH) t++;
if(digitalRead(TimeMenos_buttonPin)==HIGH) t--;
vejam o vídeo
outra coisa: como posso implementar a contagem regressiva do tempo? ex: eu coloco 15 minutos na variável e ao apertar start ele começa a decrementar até 0?
obrigado
Tags:
Pessoal identifiquei que o "erro" não é na variável e sim na forma com que ela é apresentada no lcd..
printei a variável no serial monitor e vi que ela esta funcionando normalmente só que no lcd não
tipo quando ela chega em 10 o zero ocupa a proxima casa do lcd certo, só que ao voltar para 9 esse 0 que fazia parte do 10
não some ele continua la.. esta muito estranho.. segue a parte do código para que possam avaliar..
if(digitalRead(TimeMais_buttonPin)== HIGH && TimeMais_antes == 0) {
TimeMais_antes = 1;
t++;
}
if (TimeMais_antes == 1 && digitalRead(TimeMais_buttonPin)==LOW) TimeMais_antes = 0;
if(digitalRead(TimeMenos_buttonPin)== HIGH && TimeMenos_antes == 0) {
TimeMenos_antes = 1;
t--;
}
if (TimeMenos_antes == 1 && digitalRead(TimeMenos_buttonPin)==LOW) TimeMenos_antes =0;
Serial.println("Tempo");
Serial.println(t);
lcd.setCursor(7, 1);
lcd.print(t);
o que pode ser?
obrigado
Já tentou dar um comando clear() toda vez antes de escrever? assim vc apaga o que esta no LCD e escreve o que quer sem este problema. Não sei como fica a sintaxe nunca utilizei o display com arduino mas deve ficar assim
Serial.println("Tempo");
Serial.println(t);lcd . clear ();
lcd.setCursor(7, 1);
lcd.print(t);
entao, o lcd.clear limpa a tela toda, e como eu escrevi "tempo" no setup ele é limpo e nao escreve novamente,, vou ter que tirar o "tempo" do setup e escrever no loop junto com o valor da variável, assim acho que dará certo. testarei quando chegar em casa.
mas gostaria de saber se o comando lcd.clear pode ser pontual, ou seja limpar apenas algumas posições do lcd e não ele todo, tipo: lcd.clear( 13, 1).. sei la se isso é possível
pessoal, resolvido a parte da impressao no lcd, estou com problemas para implementar o contador do tempo
fiz a seguinte lógica:
time_t = t *60 *1000;
if (SaidaStatus == 1 && t > 0) {
count = millis();
digitalWrite(Saida_Pin, HIGH); //activa a saida do arduino...
lcd.clear();
lcd.setCursor(1, 0 );
lcd.print(time_t);
contagem = millis() - count;
lcd.setCursor(12, 1);
lcd.print(contagem);
}
if (contagem >= time_t){
digitalWrite(Saida_Pin, LOW); //desactiva a saida...
primeiro problema:
o valor da varivel time_t quando t esta com o valor 1 esta retornando 4294961760 quando deveria retornar 60000.
segundo problema, o valor da variavel contagem fica sempre entre 6 e 7 e o teste fica sempre na primeira condição com a saida ativada e mesmo ao pressionar o botao start para parar a contagem a saida fica sempre ativada..
deu pra entender ou ficou confuso??
o que esta errado?
resolvi o problema do valor da variavel usando um unsigned long ao invés de int..
o problema agora é na contagem do tempo.
vejam no código
time_t = t *60 *1000;
if (SaidaStatus == 1 && t > 0) {
contagem = millis();
digitalWrite(Saida_Pin, HIGH); //activa a saida do arduino...
lcd.clear();
lcd.setCursor(1, 0 );
lcd.print(time_t);
lcd.setCursor(12, 1);
lcd.print(millis() - contagem);
}
if (SaidaStatus == 1 && (millis() - contagem >= time_t)){
digitalWrite(Saida_Pin, LOW); //desactiva a saida...
}
a variavel contagem recebe o valor de milis() e depois no teste eu faço millis() - contagem para definir o tempo que passou para testar se é >= time_t
porém o valor retornado da expressão millis() - contagem é sempre 5 e dessa forma nunca vai satisfazer a condição da operação..
preciso de uma ajudinha pessoal
Olá Rafael.
Acho que a solução neste caso é tranquila.
Você comentou que a contagem sempre é 5, sim, ela vai ser isso pois você começa colocando o tempo na variável contagem, e depois só verifica o tempo depois de um certo número de instruções ( linhas de código), que é sempre o mesmo. O que você precisa fazer é sempre ficar verificando a passagem do tempo, e quando for verdadeiro, continuar o programa.
Com um while você resolve isto, segue o exemplo:
time_t = t *60 *1000;
if (SaidaStatus == 1 && t > 0) {
digitalWrite(Saida_Pin, HIGH); //activa a saida do arduino...
lcd.clear();
lcd.setCursor(1, 0 );
lcd.print(time_t);
}
contagem = millis(); // Seria o tempo inicial.
// Aguarda o tempo necessário e atualiza o lcd.
while((millis() - contagem) < time_t){
lcd.setCursor(12, 1);
lcd.print(millis() - contagem);
delay(10); // apenas para não sobrecarregar o lcd, pode ser alterado
}
if (SaidaStatus == 1 && (millis() - contagem >= time_t)){
digitalWrite(Saida_Pin, LOW); //desactiva a saida...
}
É isso, espero que funcione. ^^
T++.
Olá, amigo eu recomendaria a você usar uma interrupção interna, neste caso o "timeOne" eu uso ele em vários projetos e funciona perfeitamente com ele a interrupção pode ser chamada quando você precisar seja de um em um segundo ou qualquer outro valor dai basta você trabalhar a logica para transformar isso em um cronometro exato para seu projeto. Para melhor entendimento segue abaixo link para pesquisa, você precisa baixar a biblioteca do TimeOne. ( tem um exemplo abaixo porem não tive como testar mas espero ajudar).
http://playground.arduino.cc/Code/Timer1
#include "TimerOne.h"
int segundo = 0;
int minuto = 0;
void setup()
{
Timer1.initialize(1000000); // inicialize o timeOne a cada um segundo ou 1000ms
Timer1.attachInterrupt(callback); // Função a ser chamada pelo timeOne. Neste caso callback
}
void callback()
{
segundo = segundo ++;
if(segundo == 60){segundo = 0; minuto = minuto++;}
if(minuto == 60){minuto = 0;}
}
void loop()
{
// Sua logica de programa
}
resolvi o problema usando um laço while vejam:
time_t = t *60 *1000;
if (SaidaStatus == 1 && t > 0) {
count = millis();
digitalWrite(Saida_Pin, HIGH); //activa a saida do arduino…
// fiz o laço abaixo para mostrar o tempo no LCD
contagem = 0;
while (contagem < time_t) {
if(StartStatus);
break;
lcd.clear();
lcd.setCursor(1, 0);
lcd.print(time_t);
contagem = millis() - count;
lcd.setCursor(12, 1);
lcd.print(contagem);
}
}
digitalWrite(Saida_Pin, LOW); //desactiva a saida…
SaidaStatus=0;
if(SaidaStatus == 0)
digitalWrite(StatusLed, LOW);
else
digitalWrite(StatusLed, HIGH);
}
tem um problema agora..
quero colocar o botato para parar a execução do while para que quando o botao for pressionado ele de um break
porem nao funcionou, adicionei a linha if(botao) break; vejam no codigo acima..
porem com essa linha a mais o laço while nao executa mais
qual a maneira correta de implementar isso?
pessoal agora o meu laço while ta redondinho esta assim:
while (contagem < time_t) {
if (digitalRead(Start_buttonPin) == HIGH && StopStatus == 0) {
StopStatus = 1;
}
if(StopStatus == 1 && digitalRead(Start_buttonPin) == HIGH) StopStatus = 2;
contagem = millis() - count;
t_restante = contagem;
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Tempo:");
lcd.setCursor(7, 1);
lcd.print(float(time_t - t_restante));
lcd.setCursor(0, 0);
lcd.print("SetTemp:");
lcd.setCursor(9, 0);
lcd.print(SetTemp);
lcd.setCursor(13, 0);
lcd.print(tempc,DEC);
if(StopStatus == 2) break;
}
o problema é que devido ser um laço com poucas instruçoes o lcd atualiza muito rápido entao parece estar piscando..
como posso resolver isso?
obrigado
resolvi colocando o lcd para atualizar segundo a segundo
tenho uma dúvida agora.. como formatar a contagem de tempo no formato mm:ss
por que como eu fiz 1 minuto por exemplo quando começa a contar vai à 0.99 , 0.98 e não 0,59 0,58 e assim por diante..
como formatar isso?
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por