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
O problema e que enquanto o teu dedo esta no botao, o codigo conta para cima... ou para baixo.
Tens de fazer debounce do botao e contar flancos positivos. Ou seja, so incrementa quando o botao passa de zero para um.
unsigned char but_antes = 0;
if(digitalRead(TimeMais_buttonPin)==HIGH && but_antes = 0) {
but_antes = 1;
t++;
}
if (but_antes == 1 && digitalRead(TimeMais_buttonPin)==LOW) but_antes = 0;
unsigned long time_t = t *60 * 1000;
unsigned long count = 0;
if (comecar ==1) {
count = millis();
//activa a saida do arduino...
}
if (comecar == 1 && (millis() - count >= time_t)){
//desactiva a saida...
}
Serial.print (timer_t - (millis() - count)); //imprime o tempo descendente...
bubulindo
fiz o debouncing para os botões porém o erro continua o mesmo do vídeo..
quando incrementa vai de 1 em 1 normal, porém ao passar de 10 ao decrementar ao invés de ir para 9 ele vai para 90..
o que pode ser?
obrigado pela ajuda
Coloca ai o teu código para vermos a falha.
Hugo, o código é este
const int Start_buttonPin = 6;
const int TempMenos_buttonPin = 7;
const int TempMais_buttonPin = 8;
const int TimeMenos_buttonPin = 9;
const int TimeMais_buttonPin = 10;
const int Saida_Pin = 13;
unsigned char TimeMais_antes = 0;
unsigned char TimeMenos_antes = 0;
int Start_buttonState = 0;
int setTemp = 0;
int t;
int SensorPin = 0; // Pino analogico para ligacao do LM35
int samples[30]; // Array para precisão na medição
int i;
int tempc;
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //Define os pinos que serão ligados ao LCD
byte a[8]=
{B00110,B01001,B00110,B00000,B00000,B00000,B00000,B00000,}; //Array que desenha o simbolo de grau
void setup()
{
Serial.begin(9600); // Inicializa comunicação serial
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
lcd.begin(16, 2); //Inicializa
lcd.setCursor(0, 0);
lcd.print("Temperatura: ");
lcd.setCursor(0, 1);
lcd.print("Tempo= ");
pinMode(Saida_Pin, OUTPUT);
pinMode(Start_buttonPin, INPUT);
pinMode(TempMenos_buttonPin, INPUT);
pinMode(TempMais_buttonPin, INPUT);
pinMode(TimeMenos_buttonPin, INPUT);
pinMode(TimeMais_buttonPin, INPUT);
}
void loop()
{
for(i = 0;i<=29;i++){ // Loop que faz a leitura da temperatura 8 vezes
samples[i] = ( 5.0 * analogRead(SensorPin) * 100.0) / 1024.0;
tempc = tempc + samples[i]; //A cada leitura, incrementa o valor da variavel tempc
}
tempc = tempc/30.0; // Divide a variavel tempc por 8, para obter precisão na medição
delay(100);
lcd.setCursor(13, 0);
lcd.print(tempc,DEC); //Escreve no display o valor da temperatura
tempc=0;
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;
lcd.setCursor(7, 1);
lcd.print(t);
}
int setTemp = 0;
int t; //->Variavel nao inicializada pode conter qualquer numero inteiro!
int SensorPin = 0; // Pino analogico para ligacao do LM35
int samples[30]; // Array para precisão na medição
int i; //->Variavel nao inicializada pode conter qualquer numero inteiro!
int tempc; //->Variavel nao inicializada pode conter qualquer numero inteiro!
O teu problema esta aqui:
if(digitalRead(TimeMais_buttonPin)== HIGH && TimeMais_antes == 0) {
TimeMais_antes = 1;
t++; //Estas a incrementar o quê?? A variavel t esta undefined.Provavel efeito colateral
}
if (TimeMais_antes == 1 && digitalRead(TimeMais_buttonPin)==LOW) TimeMais_antes = 0;
if(digitalRead(TimeMenos_buttonPin)== HIGH && TimeMenos_antes == 0) {
TimeMenos_antes = 1; //Estas a decrementar o quê?? A variavel t esta undefined.Provavel efeito colateral
t--;
hugo, mesmo zerando as variáveis na inicialização ainda não resolveu o problema, continua o mesmo problema do vídeo.
ao decrementar de 10 para 9, ao invés de ir à 9 vai à 90
muito confuso
Usei um serial print para ver o valor real da variável e no serial monitor o valor esta correto baixa de 10 para 9
apenas no lcd aparece 90, o que estou esquecendo no comando do lcd?
LOL
Limpar o LCD antes de reescreveres, costuma ajudar...
Quando escreves 10 na posição 13 do LCD, a posição 13 tem um '1' e a posição 14 tem um '0'.
Quando escreves 9 na posição 13, a posição 13 fica com o '9' e que acontece à posição 14????
Nada... a posição 14 fica com o que já lá estava porque não escreveste nada nela. Daí veres 90.
pessoal, resolvido a parte da impressao no lcd, estou com problemas para implementar o contador do tempo
fiz a seguinte lógica com a sugestao do bubulindo
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 a sair errado?
primeiro problema:
o valor da varivel time_t quando t esta com o valor 1 esta retornando 4294961760 quando deveria retornar 60000.
É normal devido a estares a fazer a variável t que é um inteiro signed a entrar em overflow ao fazer t *60 *1000
um inteiro tem o valor máximo de 65525, se for signed o valor vai de -32,768 a 32,767 logo o resultado 60000 estoirou a escala.
Tens duas soluções, ou fazes um cast á variável int assim:
unsigned long time_t = (long)t * 60 * 1000;
Ou corriges o teu int para ser um unsigned int t
unsigned int t = 1;
Eu prefiro a segunda escolha
resolvi o problema do tamanho da variavel t usando um unsigned long.
mas continuo com o problema da contagem,..
o valor do teste millis() - contagem esta retornando sempre 5 e numca atinge a condição >= time_t
ta dificil
Estas a dizer que isto contagem = millis() - count; esta sempre a dar 5?
Qual é o tipo de dados do count e do contagem?
Olhando para a tua lógica, faz todo o sentido que dê 5... é precisamente o tempo que demora a executar estas instruções.
digitalWrite(Saida_Pin, HIGH); //activa a saida do arduino...
lcd.clear();
lcd.setCursor(1, 0 );
lcd.print(time_t);
Não sei onde arranjaste o último excerto de código que colocaste, mas dizer que seguiste a minha sugestão é no mínimo errado. Compara ambos os excertos de código e diz-me se o teu é remotamente parecido com o meu.
Nota que no meu exemplo, o programa usa uma contagem de tempo ascendente para criar a funcionalidade que queres e depois para ser bonito para o utilizador imprime a contagem invertida (não sei se funcionará, mas deve estar perto). O teu código não faz nem uma nem outra.
HugoPT:
Estas a dizer que isto contagem = millis() - count; esta sempre a dar 5?
Qual é o tipo de dados do count e do contagem?
hugoPt a variavel contagem é do tipo unsigned long
bubulindo:
Olhando para a tua lógica, faz todo o sentido que dê 5... é precisamente o tempo que demora a executar estas instruções.
digitalWrite(Saida_Pin, HIGH); //activa a saida do arduino...
lcd.clear();
lcd.setCursor(1, 0 );
lcd.print(time_t);
Não sei onde arranjaste o último excerto de código que colocaste, mas dizer que seguiste a minha sugestão é no mínimo errado. Compara ambos os excertos de código e diz-me se o teu é remotamente parecido com o meu.
Nota que no meu exemplo, o programa usa uma contagem de tempo ascendente para criar a funcionalidade que queres e depois para ser bonito para o utilizador imprime a contagem invertida (não sei se funcionará, mas deve estar perto). O teu código não faz nem uma nem outra.
[code]time_t = t *60 *1000;
if (StartStatus ==1 && time_t > 0) {
count = millis();
digitalWrite(Saida_Pin, HIGH) ;//activa a saida do arduino...
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(time_t);
lcd.setCursor(0, 1);
lcd.print(millis() - count);
}
if (StartStatus == 1 && (millis() - count >= time_t)){
digitalWrite(Saida_Pin, LOW); //desactiva a saida...
}
[/code]
bubulindo se reparar o código esta praticamente igual, apenas adicionei a parte do lcd para visualizar o que esta a suceder...
time_t = t *60 *1000;
if (StartStatus ==1 && time_t > 0) {
count = millis();
digitalWrite(Saida_Pin, HIGH) ;//activa a saida do arduino...
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(time_t);
lcd.setCursor(0, 1);
lcd.print(millis() - count);
}
if (StartStatus == 1 && (millis() - count >= time_t)){
digitalWrite(Saida_Pin, LOW); //desactiva a saida...
}
Se tiveres a correr isso no loop ou dentro de algum ciclo repetitivo é normal que não funcione devido á variável count = millis(); estar a ser sempre actualizada, já que nada a encrava para não ser corrida de novo.Ou seja o tempo que passa acaba por não ser contado.
Nota que StartSatus esta sempre 1 pelos visto logo if (StartStatus ==1 && time_t > 0) é sempre corrido e count = millis(); actualizado.
Desta forma o if (StartStatus == 1 && (millis() - count >= time_t)) nunca é corrido devido a millis() - count >= time_t nunca chegar a ser verdade
Ja agora para que é isto && time_t > 0, visto que time_t = t *60 *1000 é sempre maior que 0 e nunca o vai deixar de ser?
Tenta isto:
time_t = t *60 *1000;
char escravada = 0;
while(1)
{
if (StartStatus ==1 && escravada == 0) {
count = millis();//Guardamos os milisegundos
escravada =1;//Previne que este if seja percorrido novamente, garantindo assim a contagem temporal
digitalWrite(Saida_Pin, HIGH) ;//activa a saida do arduino...
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(time_t);
lcd.setCursor(0, 1);
lcd.print(millis() - count);
}
if (StartStatus == 1 && (millis() - count >= time_t)){
digitalWrite(Saida_Pin, LOW); //desactiva a saida...
escravada = 0;
break;
}
}
rafa_mazali:
bubulindo se reparar o código esta praticamente igual, apenas adicionei a parte do lcd para visualizar o que esta a suceder...
Adicionaste mais qualquer coisa... Experimenta pegar no meu exemplo e adicionar o lcd...
HugoPT:
time_t = t *60 *1000;
if (StartStatus ==1 && time_t > 0) {
count = millis();
digitalWrite(Saida_Pin, HIGH) ;//activa a saida do arduino...
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(time_t);
lcd.setCursor(0, 1);
lcd.print(millis() - count);
}
if (StartStatus == 1 && (millis() - count >= time_t)){
digitalWrite(Saida_Pin, LOW); //desactiva a saida...
}
Se tiveres a correr isso no loop ou dentro de algum ciclo repetitivo é normal que não funcione devido á variável count = millis(); estar a ser sempre actualizada, já que nada a encrava para não ser corrida de novo.Ou seja o tempo que passa acaba por não ser contado.
Nota que StartSatus esta sempre 1 pelos visto logo if (StartStatus ==1 && time_t > 0) é sempre corrido e count = millis(); actualizado.
Desta forma o if (StartStatus == 1 && (millis() - count >= time_t)) nunca é corrido devido a millis() - count >= time_t nunca chegar a ser verdade
Ja agora para que é isto && time_t > 0, visto que time_t = t *60 *1000 é sempre maior que 0 e nunca o vai deixar de ser?
Tenta isto:
time_t = t *60 *1000;
char escravada = 0;
while(1)
{
if (StartStatus ==1 && escravada == 0) {
count = millis();//Guardamos os milisegundos
escravada =1;//Previne que este if seja percorrido novamente, garantindo assim a contagem temporal
digitalWrite(Saida_Pin, HIGH) ;//activa a saida do arduino...
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(time_t);
lcd.setCursor(0, 1);
lcd.print(millis() - count);
}
if (StartStatus == 1 && (millis() - count >= time_t)){
digitalWrite(Saida_Pin, LOW); //desactiva a saida...
escravada = 0;
break;
}
}
hugopt, no exemplo que me passou tem alguma coisa bloqueando a execução do programa e não consegui descobrir o que é;;;
nenhum botão responde