Go Down

Topic: Ajuda com programação de estufa (Read 5434 times) previous topic - next topic

rafa_mazali

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

bubulindo

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.

Code: [Select]

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;



Code: [Select]

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...


Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

rafa_mazali

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

HugoPT

Coloca ai o teu código para vermos  a falha.
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

rafa_mazali

Hugo, o código é este

Code: [Select]
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);
   
  }


HugoPT

#5
Mar 05, 2014, 04:10 pm Last Edit: Mar 05, 2014, 04:13 pm by HugoPT Reason: 1
Code: [Select]

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:

Code: [Select]

  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--;

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

rafa_mazali

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

rafa_mazali

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?

bubulindo

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.

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

HugoPT

Quote
Nada... a posição 14 fica com o que já lá estava porque não escreveste nada nela. Daí veres 90.

Bem apanhado :smiley-mr-green:
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

rafa_mazali

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

Code: [Select]
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?

HugoPT

Quote
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:
Code: [Select]
unsigned long time_t = (long)t * 60 * 1000;
Ou corriges o teu int para ser um unsigned int t
Code: [Select]
unsigned int t = 1;
Eu prefiro a segunda escolha  :D
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

rafa_mazali

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

HugoPT

Estas a dizer que isto  contagem = millis() - count; esta sempre a dar 5?
Qual é o tipo de dados do count e do contagem?
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

bubulindo

Olhando para a tua lógica, faz todo o sentido que dê 5... é precisamente o tempo que demora a executar estas instruções.
Quote

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. 

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Go Up