Go Down

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

rafa_mazali


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

rafa_mazali


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. 




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

HugoPT

#17
Mar 10, 2014, 11:15 pm Last Edit: Mar 10, 2014, 11:23 pm by HugoPT Reason: 1
Code: [Select]

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

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;
  }
}
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

bubulindo

Quote from: rafa_mazali link=topic=223315.msg1628430#msg1628430


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...
This... is a hobby.

rafa_mazali


Code: [Select]

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

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

HugoPT

Remove o while(1) e as {} correspondestes.Estas a correr isso no loop() certo?
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

rafa_mazali


Remove o while(1) e as {} correspondestes.Estas a correr isso no loop() certo?


sim esta no loop, onde devo coloca-los? fora do loop?

neuron_upheaval

#22
Mar 12, 2014, 06:34 am Last Edit: Mar 12, 2014, 06:55 am by neuron_upheaval Reason: 1
Seu código original está assim:
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...

E você quer que o LCD fique mostrando um tempo, certo? A passagem do tempo deve ocorrer dentro de um laço e, dentro desse laço, você mostra o valor no LCD:
Code: [Select]

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) {
       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…

Peraí, já que você disse que está bloqueando com o while(1) do Hugo_PT, tente fazer assim:
Code: [Select]

time_t = t *60 *1000;

if (SaidaStatus == 1 && t > 0) {
   if (count == 0) {
       count = millis();
   }
   digitalWrite(Saida_Pin, HIGH); //activa a saida do arduino…
    contagem = millis() - count;
} else {
   count = 0;
    contagem = 0;
}

lcd.clear();
lcd.setCursor(1, 0);
lcd.print(time_t);
lcd.setCursor(12, 1);
lcd.print(contagem);

if (contagem >= time_t) {
   digitalWrite(Saida_Pin, LOW); //desactiva a saida...
}

rafa_mazali


Seu código original está assim:
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...

E você quer que o LCD fique mostrando um tempo, certo? A passagem do tempo deve ocorrer dentro de um laço e, dentro desse laço, você mostra o valor no LCD:
Code: [Select]

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) {
       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…

Peraí, já que você disse que está bloqueando com o while(1) do Hugo_PT, tente fazer assim:
Code: [Select]

time_t = t *60 *1000;

if (SaidaStatus == 1 && t > 0) {
   if (count == 0) {
       count = millis();
   }
   digitalWrite(Saida_Pin, HIGH); //activa a saida do arduino…
    contagem = millis() - count;
} else {
   count = 0;
    contagem = 0;
}

lcd.clear();
lcd.setCursor(1, 0);
lcd.print(time_t);
lcd.setCursor(12, 1);
lcd.print(contagem);

if (contagem >= time_t) {
   digitalWrite(Saida_Pin, LOW); //desactiva a saida...
}




Cara o teu laço while funcionou perfeitamente, muito obrigado.

Agora estou querendo implementar o botão start para dar um break no while para parar a execução do bloco. Fiz assim

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


coloquei o if(StartStatus); break..

porem agora o laço nao executa mais..

qual a forma certa de implementar o break atraves de um botao?

valeu

neuron_upheaval

Me explica o que o StartStatus tem que fazer que a gente já agiliza.

rafa_mazali


Me explica o que o StartStatus tem que fazer que a gente já agiliza.


entao cara o StartStatus é uma flag para o botao start/stop

entao eu queria que durante o while se eu apertasse o botão start/stop ele desse um break no laco

bubulindo

Dentro do while tens de ler o botão... Senão não sabes o estado dele... Apenas da flag.
This... is a hobby.

rafa_mazali

bubulindo obrigado pela dica.

consegui resolver o problema agora esta parte esta funcionando como deveria ser..

agora tenho mais 2 dúvidas. 

a contagem esta em millisegundos para mostrar em segundo é só fazer contagem / 1000?

outra coisa, por ser um laço com poucas instruções ele é executado rapidamente então meu lcd esta atualizando muito rapido e piscando muito, como resolver isto?

valeu pessoal

bubulindo

Sim.

O teu LCD deve ser actualizado quando:

- houver uma alteração de estado ou... se não te quiseres dar a esse trabalho.
- de segundo a segundo ou com um intervalo maior.

Eu referi isto num post mais atrás...
This... is a hobby.

rafa_mazali


Sim.

O teu LCD deve ser actualizado quando:

- houver uma alteração de estado ou... se não te quiseres dar a esse trabalho.
- de segundo a segundo ou com um intervalo maior.

Eu referi isto num post mais atrás...


bubulindo resolvi atualizar segundo a segundo mesmo..

só estou com dificuldade em colocar a contagem de tempo no formato mm:ss

fiz assim

float(time_t - t_restante)/1000/60

só que assim o resultado de 1 minuto é 0.99 > 0.98 até 0.00

como formatar corretamente?

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy