Go Down

Topic: Problema com LCD 20 x 4 (Read 9392 times) previous topic - next topic

bubulindo

Estás a tentar compilar só o código que escrevi?

Ou já tens um sketch com este código?

Se já tens um sketch, mete-o aqui.
This... is a hobby.

wilsonalves

Estou a fazer numa janela à parte para testes e depois de testada passo para o código original o que fiz foi isto:
Code: [Select]
#include<LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);                     //Pinos digitais onde o lcd esté conetado 12, 11, 5, 4, 3, 2
#define Switch_Pin 10
#define NUM_MENUS   2                                      //exemplo, 2 menus...
unsigned char var_menus = 0;

void setup()
lcd.begin(20, 4)

void loop()
if (Switch_Pin == TRUE)                             // pseudocodigo...
   var_menus++;

switch(var_menus%NUM_MENUS) {

case 0:
    lcd.print("menu 0");
    break;

case 1:
    lcd.print("menu 1");
    break;

}

bubulindo

#17
Jul 29, 2013, 05:37 pm Last Edit: Jul 29, 2013, 05:41 pm by bubulindo Reason: 1

Code: [Select]
#include<LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);                     //Pinos digitais onde o lcd esté conetado 12, 11, 5, 4, 3, 2
#define Switch_Pin 10
#define NUM_MENUS   2                                      //exemplo, 2 menus...
unsigned char var_menus = 0;

void setup(){
lcd.begin(20, 4);
}
void loop(){
if (Switch_Pin == TRUE)                             // pseudocodigo...
  var_menus++;

switch(var_menus%NUM_MENUS) {

case 0:
   lcd.print("menu 0");
   break;

case 1:
   lcd.print("menu 1");
   break;

}
}

Isto deve compilar... mas não funciona.

Vais ter imenso que aprender...

Começa por ver os exemplos na IDE do Arduino para perceberes como funciona a linguagem C e depois volta à carga.

A forma como colocaste o código aqui, demonstra que não tens muitos conhecimentos de base e é isso que te falta tanto para este problema, como para o outro que tens com a medição de energia.

Dá uma olhada também nos exemplos que lidam com botões digitais e com a função digitalRead().
This... is a hobby.

wilsonalves

Continua a não compilar e já percebi que nem sequer tinha posto digitalRead para ler o pino do switch.

Obrigado pela paciência tenho noção que tenho mesmo muito para aprender.

wilsonalves

Não estou mesmo a conseguir fazer o código para mudar a tela do LCD não sei o que me está a faltar ou o que estou a fazer mal pedia umas noções ou mesmo como fazer.

Cumprimentos

bubulindo

#20
Jul 29, 2013, 08:03 pm Last Edit: Jul 30, 2013, 11:37 am by bubulindo Reason: 1
Um dos problemas é que o botão tem de funcionar por flanco. Ou seja, só deve contar quando o estado passar de LOW para HIGH e não sempre que estiver high. Isso faz-se com um encravamento.

Code: [Select]

unsigned char encrava = 0;

if ( botao == HIGH && encrava == 1) {
  var_menu++;
}
if (botao == LOW) encrava = 0;


Então o código ficava:

Code: [Select]

#include<LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);                     //Pinos digitais onde o lcd esté conetado 12, 11, 5, 4, 3, 2
#define SWITCH 10
#define NUM_MENUS   2                                      //exemplo, 2 menus...
unsigned char var_menus = 0;



void setup(){
pinMode(SWITCH, INPUT_PULLUP);
lcd.begin(20, 4);
}

void loop(){
if (digitalRead(SWITCH) == HIGH && encrava == 1)//tinhas aqui o erro.                              // pseudocodigo...
  var_menus++;
if (digitalRead(SWITCH == LOW) encrava = 0;

switch(var_menus%NUM_MENUS) {

case 0:
   lcd.clear();
   lcd.print("menu 0");
   break;

case 1:
   lcd.clear();
   lcd.print("menu 1");
   break;

}
}


Este código vai ter o problema de teres o lcd a modos que a piscar.

Então o melhor é criares uma função que lida com o LCD e teres condições para a chamares. Por exemplo:
Code: [Select]

#include<LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);                     //Pinos digitais onde o lcd esté conetado 12, 11, 5, 4, 3, 2
#define SWITCH 10
#define NUM_MENUS   2                                      //exemplo, 2 menus...
unsigned char var_menus = 0;

void setup(){
pinMode(SWITCH, INPUT_PULLUP);
lcd.begin(20, 4);
}

unsigned long refresh = 0;

void loop(){
if (digitalRead(SWITCH) == HIGH && encrava == 0){
  var_menus++;
  trata_lcd();
  encrava = 1;
}
if (digitalRead(SWITCH == LOW) encrava = 0;

//refresca o LCD de segundo a segundo.
if (millis() - refresh >= 1000) {
  trata_lcd();
}

}

void trata_lcd() {
switch(var_menus%NUM_MENUS) {

case 0:
   lcd.clear();
   lcd.print("menu 0");
   break;

case 1:
   lcd.clear();
   lcd.print("menu 1");
   break;

}
}
This... is a hobby.

wilsonalves

Antes de mais obrigada bubulindo
Não estava a compilar mas consegui po-lo a compilar.
E agora está com dois problemas
Um é quando fazemos UPLOAD as letras do menu 1 mal se veem e parece que estão a tremer, depois quando carregamos no switch o fica escrito menu   1 na perfeição só que quando voltamos a primir não passa novamente para o menu 0.


wilsonalves

Antes de mais obrigada bubulindo
Não estava a compilar mas consegui pô-lo a compilar.
E agora está com dois problemas
Um é quando fazemos UPLOAD as letras do menu 0 mal se vêem e parece que estão a tremer, depois quando carregamos no switch o fica escrito menu   1 na perfeição só que quando voltamos a premir não passa novamente para o menu 0.

bubulindo

Pois não... erro estúpido da minha parte. Desculpa.

Code: [Select]
#include<LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);                     //Pinos digitais onde o lcd esté conetado 12, 11, 5, 4, 3, 2
#define SWITCH 10
#define NUM_MENUS   2                                      //exemplo, 2 menus...
unsigned char var_menus = 0;

void setup(){
pinMode(SWITCH, INPUT_PULLUP);
lcd.begin(20, 4);
}

unsigned long refresh = 0;

void loop(){
if (digitalRead(SWITCH) == HIGH && encrava == 0){
   var_menus++;
   trata_lcd();
   encrava = 1;
}
if (digitalRead(SWITCH == LOW) encrava = 0;

//refresca o LCD de segundo a segundo.
if (millis() - refresh >= 1000) {
   trata_lcd();
   refresh = millis(); //actualiza a contagem.
}

}

void trata_lcd() {
switch(var_menus%NUM_MENUS) {

case 0:
    lcd.clear();
    lcd.print("menu 0");
    break;

case 1:
    lcd.clear();
    lcd.print("menu 1");
    break;

}
}


Outro problema que podes estar a ter é que o teu botão está a fazer bounce.
This... is a hobby.

wilsonalves

A situação do menu 0 estar a piscar já está ultrapassada muda de menu 0 para menu um mas volta a não mudar de menu 1 para menu 0
O código não estava a compilar modifiquei algumas coisas espero não ter feito nada de errado o código segue abaixo:
O que é o botão estar a fazer bounce?? 
Code: [Select]
#include<LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);                     //Pinos digitais onde o lcd esté conetado 12, 11, 5, 4, 3, 2
#define SWITCH 10
#define NUM_MENUS   2                                      //exemplo, 2 menus...
unsigned char var_menus = 0;
unsigned char encrava = 0;
unsigned long refresh = 0;

void setup(){
pinMode(SWITCH, INPUT_PULLUP);
lcd.begin(20, 4);
}


void loop(){

if (digitalRead(SWITCH) == HIGH && encrava == 0){
   var_menus++;
   trata_lcd();
   encrava = 1;
}
if (digitalRead(SWITCH == LOW)&& encrava == 0);

//refresca o LCD de segundo a segundo.
if (millis() - refresh >= 1000) {
   trata_lcd();
   refresh = millis(); //actualiza a contagem.
}

}

void trata_lcd() {
switch(var_menus%NUM_MENUS) {

case 0:
    lcd.clear();
    lcd.print("menu 0");
    break;

case 1:
    lcd.clear();
    lcd.print("menu 1");
    break;

}
}

bubulindo

Porque é que colocaste esta linha:

Code: [Select]
if (digitalRead(SWITCH == LOW)&& encrava == 0);

No teu código?
This... is a hobby.

wilsonalves

Porque assim como pôs:
Code: [Select]
if (digitalRead(SWITCH == LOW) encrava = 0;
Não compila então achei que se tivesse enganado e modifiquei metendo igual ao HIGH que está por cima.
Como é então???

LegendBR

Faltou um parênteses:

Code: [Select]
if (digitalRead(SWITCH) == LOW) encrava = 0;

wilsonalves

Já está optimo muito obrigado pela ajuda!!

wilsonalves

Estou a adaptar o switch no meu projecto e o que pensei foi em fazer dois arreios então fiz  e pus no void loop so o código do swich com os arreios está a dar erro não sei porquê.
Code: [Select]

void loop()
{
   if (digitalRead(SWITCH) == HIGH && encrava == 0){
   var_menus++;
   trata_lcd();
   encrava = 1;
}
if (digitalRead(SWITCH) == LOW) encrava = 0;

//refresca o LCD de segundo a segundo.
if (millis() - refresh >= 1000) {
   trata_lcd();
   refresh = millis(); //actualiza a contagem.
}

}

void trata_lcd() {
switch(var_menus%NUM_MENUS) {

case 0:
    lcd.clear();
    lcd.print(vinstantaneo());
    break;

case 1:
    lcd.clear();
    lcd.print(vhora());
    break;
}
}
   

Go Up