Go Down

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


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


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