Pages: 1 [2] 3   Go Down
Author Topic: Ajuda com programação de estufa  (Read 4762 times)
0 Members and 1 Guest are viewing this topic.
Ribeirão Preto - SP
Offline Offline
Jr. Member
**
Karma: 0
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Ribeirão Preto - SP
Offline Offline
Jr. Member
**
Karma: 0
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
[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...
Logged

Portugal
Offline Offline
Edison Member
*
Karma: 37
Posts: 1572
Pretending you know everything then you will learn nothing.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
}
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:
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;
  }
}
« Last Edit: March 10, 2014, 05:23:51 pm by HugoPT » Logged

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


'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3243
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Ribeirão Preto - SP
Offline Offline
Jr. Member
**
Karma: 0
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
}
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:
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
Logged

Portugal
Offline Offline
Edison Member
*
Karma: 37
Posts: 1572
Pretending you know everything then you will learn nothing.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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


Ribeirão Preto - SP
Offline Offline
Jr. Member
**
Karma: 0
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

central nervous system
Offline Offline
Full Member
***
Karma: 0
Posts: 135
Causing havoc inside your brain since 1980
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Seu código original está assim:
Code:
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:
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:
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...
}
« Last Edit: March 12, 2014, 12:55:28 am by neuron_upheaval » Logged

Ribeirão Preto - SP
Offline Offline
Jr. Member
**
Karma: 0
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

central nervous system
Offline Offline
Full Member
***
Karma: 0
Posts: 135
Causing havoc inside your brain since 1980
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Ribeirão Preto - SP
Offline Offline
Jr. Member
**
Karma: 0
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3243
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Dentro do while tens de ler o botão... Senão não sabes o estado dele... Apenas da flag.
Logged

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

Ribeirão Preto - SP
Offline Offline
Jr. Member
**
Karma: 0
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3243
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Ribeirão Preto - SP
Offline Offline
Jr. Member
**
Karma: 0
Posts: 78
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Pages: 1 [2] 3   Go Up
Jump to: