Go Down

Topic: Ajuda com programação de estufa (Read 13635 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...

hugo007

#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

hugo007

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