Pages: [1]   Go Down
Author Topic: Alternar dados no LCD a cada 2 segundos  (Read 284 times)
1 Member and 2 Guests are viewing this topic.
Offline Offline
Newbie
*
Karma: 1
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Boas pll,

no meu código fonte tenho uma parte em que alterno dados no LCD a cada 2 segundos:

Code:
{switch (Key)
case 'B' :
                             digitalWrite(buzzer, LOW);
                             delay(100);
                             digitalWrite(buzzer, HIGH);
                             do{lcd.clear();
                             MostraInfo(TARGET, 0, 0,"Temperatura Max");
                             MostraInfo(TARGET, 1, 1,"do dia");
                             lcd.setCursor(8,1);
                             lcd.print(max_temp_dia);
                             MostraInfo(TARGET, 13,1,"C");
                             delay(2000);
                             lcd.clear();
                             MostraInfo(TARGET, 0, 0,"Temperatura Min");
                             MostraInfo(TARGET, 1, 1,"do dia");
                             lcd.setCursor(8,1);
                             lcd.print(min_temp_dia);
                             MostraInfo(TARGET, 13,1,"C");
                             delay(2000);}
                             while(keypad.getKey() == NO_KEY);
                             tempo = millis();
                         break;

O que pretendia era substituir a função delay pela função millis, já andei para aqui a "inventar" utilizando:

millis() - tempo > 1000

mas ele não alterna entre o 1º ecrã e o 2º, alguém pode dar uma dica?

Obg
NJPinheiro
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pll,
isto assim não devia funcionar?

Code:
int menuEcra;

void loop() {
......
........
..........case 'B' :
                            digitalWrite(buzzer, LOW);
                             delay(100);
                             digitalWrite(buzzer, HIGH);
                             tempo = millis();
                             if (millis() - tempo > 4000)
                             menuEcra = 3;
                             if (millis()- tempo > 2000 || millis()-tempo <=4000)
                             menuEcra = 2;
                             if(millis() -tempo <=2000)
                             menuEcra = 1;
                          switch (menuEcra) {
                                 case 1:
                                     lcd.clear();
                                     MostraInfo(TARGET, 0, 0,"Temperatura Max");
                                     MostraInfo(TARGET, 1, 1,"do dia");
                                     lcd.setCursor(8,1);
                                     lcd.print(max_temp_dia);
                                     MostraInfo(TARGET, 13,1,"C");
                                   break;
                                  case 2:
                                     lcd.clear();
                                     MostraInfo(TARGET, 0, 0,"Temperatura Min");
                                     MostraInfo(TARGET, 1, 1,"do dia");
                                     lcd.setCursor(8,1);
                                     lcd.print(min_temp_dia);
                                     MostraInfo(TARGET, 13,1,"C");
                                    break;
                                   case 3:
                                     tempo - millis();
                                    break;}
                             tempo = millis();
                         break;
}


Que grande dor de cabeça que arranjei smiley-razz

Obg NJPinheiro
« Last Edit: August 31, 2014, 02:19:23 pm by NJPinheiro » Logged

Portugal
Offline Offline
Edison Member
*
Karma: 43
Posts: 1166
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Não gosto. Esta instrução:
Code:
tempo = millis();
tem que estar em outro lugar. Assim, nos if's a differença entre millis() e tempo, é um valor muito pequeno.

Depois está esta instrução:
Code:
                                   case 3:
                                     tempo - millis();
                                    break;

que não faz absolutamente nada (e até penso que deve dar erro de compilação).

Sem pensar muito, o que digo que pode dar, é:
Code:
                             if (millis() - tempo > 2000) {
                                menuEcra++;
                                if (menuEcra > 3) {
                                   menuEcra = 1;
                                }
                                tempo=millis();
                             }
no início deste processo, a variável tempo tem que ter um valor pequeno, por exemplo 0 (isto pode ser feito na função setup() ou na inicialização da variável) e a variável menuEcra deve ter o valor 1.

Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Boas,
isto não está facil smiley-mad

comecei por declarar no inicio do código:
Code:
int menuEcra = 1;


.....
......
.......
........
if (Key >= 'A' && Key <= 'D')
                {switch (Key)
                    {case 'A' :
                                xxxxxx
                        else
                                xxxxxx
                         break;
                     case 'B' :
                             digitalWrite(buzzer, LOW);
                             delay(100);
                             digitalWrite(buzzer, HIGH);
                             if (millis() - tempo > 2000)
                                {menuEcra++;
                                  if (menuEcra >= 3)
                                     {menuEcra = 1;}
                                     tempo=millis();
                                }
                             switch (menuEcra)
                                {case 1:
                                     lcd.clear();
                                     MostraInfo(TARGET, 0, 0,"Temperatura Max");
                                     MostraInfo(TARGET, 1, 1,"do dia");
                                     lcd.setCursor(8,1);
                                     lcd.print(max_temp_dia);
                                     MostraInfo(TARGET, 13,1,"C");
                                   break;
                                  case 2:
                                     lcd.clear();
                                     MostraInfo(TARGET, 0, 0,"Temperatura Min");
                                     MostraInfo(TARGET, 1, 1,"do dia");
                                     lcd.setCursor(8,1);
                                     lcd.print(min_temp_dia);
                                     MostraInfo(TARGET, 13,1,"C");
                                    break;}
                             tempo = millis();
                         break;       
                     default:
                     estado = false;
                     password.reset();                    // vai ler novamente a password, por isso elimina os valores anteriores
                     Serial.print(indisponibilidade);
                     digitalWrite(buzzer, LOW);
                     lcd.clear();
                     MostraInfo(TARGET, 5, 0, "Funcao");
                     MostraInfo(TARGET, 2, 1, "Indisponivel");
                     delay(1500);
                     lcd.clear();
                     MostraInfo(TARGET, 3, 0,"Bloqueado");
                     delay(1000);
                     digitalWrite(buzzer, HIGH);
                    }
                 value = 0;
                }


Só que ele salta logo para o "case 2" e não estou a conseguir "passar" no "case 1"

Alguma dica de onde a coisa pode estar a falhar?
eu tenho ideia que será na utilização da função millis(), mas...

Outra pergunta, (se calhar parva, mas um maçarico como eu deve poder fazer:) )
quando fazemos:
Code:
if (millis() - tempo > 2000)
                                {menuEcra++;
                                  if (menuEcra >= 3)
                                     {menuEcra = 1;}
                                     tempo=millis();
                                }

algures no código não deveria fazer qualquer coisa do genero:
Code:
menuEcra1 = lcd.clear();
                                     MostraInfo(TARGET, 0, 0,"Temperatura Max");
                                     MostraInfo(TARGET, 1, 1,"do dia");
                                     lcd.setCursor(8,1);
                                     lcd.print(max_temp_dia);
                                     MostraInfo(TARGET, 13,1,"C");

menuEcra2 = lcd.clear();
                                     MostraInfo(TARGET, 0, 0,"Temperatura Min");
                                     MostraInfo(TARGET, 1, 1,"do dia");
                                     lcd.setCursor(8,1);
                                     lcd.print(min_temp_dia);
                                     MostraInfo(TARGET, 13,1,"C");

etc...


agradeço todo o contributo que possam dar smiley

NJPinheiro
Logged

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

Estás a baralhar-te todo...

Eu vejo teclas e temporizações a mexer no ecra... Tenta colocar o codigo de forma a podermos entender e também completo.
Meter aos bocados não dá para perceber o que se passa.
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).

Portugal
Offline Offline
Edison Member
*
Karma: 43
Posts: 1166
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

O que está a fazer, nesta parte:
Code:
                                  case 2:
                                     lcd.clear();
                                     MostraInfo(TARGET, 0, 0,"Temperatura Min");
                                     MostraInfo(TARGET, 1, 1,"do dia");
                                     lcd.setCursor(8,1);
                                     lcd.print(min_temp_dia);
                                     MostraInfo(TARGET, 13,1,"C");
                                    break;}
                             tempo = millis();

Outro tempo = millis();?

Em relação à questão:
Quote
Outra pergunta, (se calhar parva, mas um maçarico como eu deve poder fazer:) )
quando fazemos(...)
não faz sentido, uma vez que isso está a ser feito na parte:
Code:
                             switch (menuEcra)
                                {case 1:
                                     lcd.clear();
                                     MostraInfo(TARGET, 0, 0,"Temperatura Max");
                                     MostraInfo(TARGET, 1, 1,"do dia");
                                     lcd.setCursor(8,1);
                                     lcd.print(max_temp_dia);
                                     MostraInfo(TARGET, 13,1,"C");
                                   break;
                                  case 2:
                                     lcd.clear();
                                     MostraInfo(TARGET, 0, 0,"Temperatura Min");
                                     MostraInfo(TARGET, 1, 1,"do dia");
                                     lcd.setCursor(8,1);
                                     lcd.print(min_temp_dia);
                                     MostraInfo(TARGET, 13,1,"C");
                                    break;}
(...)

Em relação à questão:
Quote
Só que ele salta logo para o "case 2" e não estou a conseguir "passar" no "case 1"
se não me engano, basta alterar, no início do código:
Code:
int menuEcra = 1;
(...)

para:
Code:
int menuEcra = 0;
(...)
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Estás a baralhar-te todo...

E não é pouco smiley-confuse ...mas acho que faz parte de quem está a aprender smiley


Eu vejo teclas e temporizações a mexer no ecra... Tenta colocar o codigo de forma a podermos entender e também completo.
Meter aos bocados não dá para perceber o que se passa.

Pois, acredito que o código não esteja nada bonito...mas é aquilo que tenho conseguido fazer, (com a vossa ajuda claro), e acredita que tenho muitas horas investidas aqui. É qualquer coisa como queres ir de Lisboa ao Algarve, mas só saberes partes do caminho, e por isso fazes Lisboa/Evora/Beja/Aljustrel/Faro, mas chegas lá  smiley

Quanto ao código deixo abaixo o link:
https://googledrive.com/host/0B-Pv876wR5B1OVFDdF9rYjZ6UFk

As teclas que vês é um teclado matricial que tenho, que "normalmente" está num estado bloqueado, desbloqueando com a introdução da password, e tornando a bloquear ao fim de 3 minutos sem que nenhuma tecla seja pressionada, (os tais temporizadores).

Agora estou a tentar fazer com que ao carregares na tecla "B" apareça no LCD a temperatura maxima do dia, passados 2 segundos mude para a temperatura minima, e se mantenha em ciclo até uma de duas coisas acontecerem:
 - seja carregada outra tecla;
 - passem 3 minutos sem que nenhuma tecla seja carregada

É nesta parte que estou todo baralhado com a função millis()

PS: Também já andei de volta das funções while e do...while, mas não tive sorte nenhuma  smiley-fat

Obg
NJPinheiro
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

O que está a fazer, nesta parte:

Code:
                                  case 2:
                                     lcd.clear();
                                     MostraInfo(TARGET, 0, 0,"Temperatura Min");
                                     MostraInfo(TARGET, 1, 1,"do dia");
                                     lcd.setCursor(8,1);
                                     lcd.print(min_temp_dia);
                                     MostraInfo(TARGET, 13,1,"C");
                                    break;}
                             tempo = millis();

Code:
  Outro [tt]tempo = millis();[/tt]?

Pode não estar percéptivel aqui, mas esse "tempo=millis()", o que me esta a fazer, (acho e espero eu), é zerar-me o contador quando carrego na tecla "B", para começar a contar os 3 minutos para bloquear o sistema se nenhuma tecla for pressionada.

Em relação à questão:
Quote
Outra pergunta, (se calhar parva, mas um maçarico como eu deve poder fazer:) )
quando fazemos(...)
não faz sentido, uma vez que isso está a ser feito na parte:
Code:
                             switch (menuEcra)
                                {case 1:
                                     lcd.clear();
                                     MostraInfo(TARGET, 0, 0,"Temperatura Max");
                                     MostraInfo(TARGET, 1, 1,"do dia");
                                     lcd.setCursor(8,1);
                                     lcd.print(max_temp_dia);
                                     MostraInfo(TARGET, 13,1,"C");
                                   break;
                                  case 2:
                                     lcd.clear();
                                     MostraInfo(TARGET, 0, 0,"Temperatura Min");
                                     MostraInfo(TARGET, 1, 1,"do dia");
                                     lcd.setCursor(8,1);
                                     lcd.print(min_temp_dia);
                                     MostraInfo(TARGET, 13,1,"C");
                                    break;}
(...)

Ok, percebi, mas então onde está:
Code:
if (menuEcra > 3)

Deveria estar:
Code:
if (menuEcra >= 3)

certo?

Em relação à questão:
se não me engano, basta alterar, no início do código:
Code:
int menuEcra = 1;
(...)

para:
Code:
int menuEcra = 0;
(...)

Alterei e não resultou smiley-confuse smiley-confuse

Não sei porquê mas estou com a ideia de que é na função millis() que a coisa não está a correr bem, só não sei é aonde  smiley-mad smiley-mad smiley-mad

Obg
NJPinheiro
Logged

Portugal
Offline Offline
Edison Member
*
Karma: 43
Posts: 1166
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Ok, percebi, mas então onde está:
Code:
if (menuEcra > 3)

Deveria estar:
Code:
if (menuEcra >= 3)

certo?

Sim, isto é verdade. Eu devo ter visto 3 opções no case em vez de apenas duas, como está agora.

Estive a olhar para o código e está pelo menos outra coisa mal. O que se passa agora é que tem que se estar constantemente a carregar na tecla 'B' para que a informação esteja a passar, e penso que não é essa a ideia. Outra coisa é a confusão entre o "tempo" para que seja bloqueado o ecrã e o "tempo" para passar a informação. Podem ser o mesmo, mas penso que tem que ser pensado de outra forma, e não como aqui está. Por isso, penso que o melhor será separar isso criando duas variáveis diferentes, uma para cada situação.

Sendo assim, penso que o melhor é criar um novo estado para o caso de estar a "passar a informação" e entra-se nesse estado, quando se prime a tecla 'B'.
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 43
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Estive a olhar para o código e está pelo menos outra coisa mal. O que se passa agora é que tem que se estar constantemente a carregar na tecla 'B' para que a informação esteja a passar, e penso que não é essa a ideia. Outra coisa é a confusão entre o "tempo" para que seja bloqueado o ecrã e o "tempo" para passar a informação. Podem ser o mesmo, mas penso que tem que ser pensado de outra forma, e não como aqui está. Por isso, penso que o melhor será separar isso criando duas variáveis diferentes, uma para cada situação.

Sendo assim, penso que o melhor é criar um novo estado para o caso de estar a "passar a informação" e entra-se nesse estado, quando se prime a tecla 'B'.

luisilva,
Antes de mais começo por dizer que sem a sua ajuda, ( e de outros membros do forum), não teria chegado aqui, e por isso estou grato.
A sua ajuda tem-se revelado adequada, porque não me dá o peixe, mas tem-me dado a cana, e depois como eu tenho de "correr atrás do prejuízo" a cada post vou sempre aprendendo qualquer coisa.

Dito isto, tenho-lhe de pedir se "troca por miúdos"  o que apresento citado neste post, porque tenho mesmo tentado "dissecar" a informação que me está a dar, mas sem sorte smiley-fat

Obg
NJPinheiro
Logged

Pages: [1]   Go Up
Jump to: