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

http://youtu.be/RT0jYY8rlaM

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

Exibições: 928

Responder esta

Respostas a este tópico

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

Tira o lcd.clear(); e coloca depois da última variável tanto da linha 0 quanto da linha 1 lcd.print (" "); coloque vários espaços assim ele não fica apagando o lcd e renova apenas os valores imprimindo espaço sobre os caracteres restantes da última impressão.

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?

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço