Pages: 1 [2]   Go Down
Author Topic: criar menu lcd shield  (Read 3158 times)
0 Members and 1 Guest are viewing this topic.
'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3112
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Não mostra a hora porque não há lá uma instrução para o fazer... o motivo pelo qual vês o LCD a piscar ou com menos intensidade será por causa do lcd.clear e de imprimir.
Ou seja, o trataLCD está a ser chamado muito mais vezes do que devia. Ou então podes alterar para apenas imprimir os valores que mudam (temperatura, distância, etc...)
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).

Offline Offline
Jr. Member
**
Karma: 0
Posts: 69
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ao ligar mostra apenas:
hora...
data...

ao carregar nos botoes nao muda nada

eu sei que hora... e data... foi o que coloquei para testes antes de ligar ao rtc.

Logged

Offline Offline
God Member
*****
Karma: 12
Posts: 508
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Coloca aqui o teu código atual. Se os botões não produzem efeito, pode ser que não estás monitorando a mudança dentro do loop? Ou então o dalay que colocaste atrapalha em algo? Só podemos imaginar sem ver o código ^^
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 69
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ora bem, depois de uma pausa nisto desde o dia de ontem, hoje retomei ao trabalho.
Resultado: Nao pesco nada disto. smiley-sad

se alguem tiver por ai um menu para o lcd 16x2 que coloque o codigo pf, a ver se me entendo. smiley-sad

vou deixar aqui o codigo, estou completamente perdido no loop, por mais que tente nada da, ou seja, estou mesmo a leste do que devo meter no codigo. smiley-sad

mesmo com a ajuda do bubulindo, e do marcelo, isto para estes lados esta complicado.

o codigo que tenho ate agora é este:
Code:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int tempAlarmPin = 22;    //Buzzer ligado no PIN 22
#define ONE_WIRE_BUS 28 //Sensores ligados no PIN 28
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
//Endereços sensores
DeviceAddress insideThermometer = { 0x28, 0x0C, 0x0D, 0xB0, 0x04, 0x00, 0x00, 0x80 };
DeviceAddress outsideThermometer = { 0x28, 0x49, 0x04, 0xB1, 0x04, 0x00, 0x00, 0x62 };
// define some values used by the panel and buttons
int lcd_key     = 0;
int adc_key_in  = 0;
#define butRIGHT  0
#define butUP     1
#define butDOWN   2
#define butLEFT   3
#define butSELECT 4
#define butNONE   5
#define HOME      0
#define MENU_1   1
#define MENU_2   2
#define MENU_3   3
#define MENU_4   4
 
// read the buttons
int read_LCD_buttons()
{
 adc_key_in = analogRead(0);      // read the value from the sensor
 // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
 // we add approx 50 to those values and check to see if we are close
 if (adc_key_in > 1000) return butNONE; // We make this the 1st option for speed reasons since it will be the most likely result
 if (adc_key_in < 50)   return butRIGHT; 
 if (adc_key_in < 195)  return butUP;
 if (adc_key_in < 380)  return butDOWN;
 if (adc_key_in < 555)  return butLEFT;
 if (adc_key_in < 790)  return butSELECT;   
 return butNONE;  // when all others fail, return this...
}
void setup(void)
{
// Start up the library
sensors.begin();
// set the resolution to 10 bit (good enough?)
sensors.setResolution(insideThermometer, 10);
sensors.setResolution(outsideThermometer, 10);

pinMode(tempAlarmPin, OUTPUT);    //Buzzer

lcd.begin(16,2); // columns, rows. use 16,2 for a 16x2 LCD, etc.
lcd.clear(); // start with a blank screen
}

void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
lcd.print("Error");
} else {
lcd.print(tempC);
lcd.print("C");
}
}

void alarm(DeviceAddress deviceAddress){
float tempA = sensors.getTempC(deviceAddress);
if ( (tempA) >= 25) //Temp superior a 23 Graus
    {
    digitalWrite(tempAlarmPin, HIGH);
    delay(500);
    digitalWrite(tempAlarmPin, LOW);
    }
    else if ( (tempA) <= 20) //Temp inferior a 20 graus
    {
    digitalWrite(tempAlarmPin, HIGH);
    delay(500);
    digitalWrite(tempAlarmPin, LOW);

    }
}

void trataLCD() {

static unsigned char menu = 0; //isto faz com que o menu correcto seja mostrado sempre que a função é chamada.

unsigned int button = analogRead(A0);
//criar funcao que passa o analog read para uma variavel tipo butUP...

//máquina de estados.
switch(menu) {
  case HOME: {
    if (button == butUP) {
      menu = MENU_1;
    }
    if (button == butDOWN) {
      menu = MENU_4;
    }
    lcd.clear();
    lcd.print("hora...");
    lcd.setCursor(0,1);
    lcd.print("data...");
    button = butNONE;
    break;
  };
  case MENU_1: {
    if (button == butUP) {
      menu++;
    }
    if (button == butDOWN) {
      menu--;
    }
    lcd.clear();
    lcd.print("temp aquario");
    button = butNONE;
    break;
  };
  case MENU_2: {
    if (button == butUP) {
      menu++;
    }
    if (button == butDOWN) {
      menu--;
    }
    lcd.clear();
    lcd.print("temp exterior");
    button = butNONE;   
    break;
  };
  case MENU_3: {
        if (button == butUP) {
      menu++;
    }
    if (button == butDOWN) {
      menu--;
    }
    lcd.clear();
    lcd.print("distancia");
    button = butNONE;
    break;
  };
  case MENU_4: {
    if (button == butUP) {
      menu = HOME;
    }
    if (button == butDOWN) {
      menu--;
    }
    lcd.clear();
    lcd.print("temperatura...");
    button = butNONE;

    break;
  }
}
}
void loop(void)
{
}
Logged

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

Isto compila?
Quote
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>

#define NUMBER_OF_MENUS    5


LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int tempAlarmPin = 22;    //Buzzer ligado no PIN 22
#define ONE_WIRE_BUS 28 //Sensores ligados no PIN 28
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
//Endereços sensores
DeviceAddress insideThermometer = { 0x28, 0x0C, 0x0D, 0xB0, 0x04, 0x00, 0x00, 0x80 };
DeviceAddress outsideThermometer = { 0x28, 0x49, 0x04, 0xB1, 0x04, 0x00, 0x00, 0x62 };
// define some values used by the panel and buttons
int lcd_key     = 0;
int adc_key_in  = 0;
#define butRIGHT  0
#define butUP     1
#define butDOWN   2
#define butLEFT   3
#define butSELECT 4
#define butNONE   5
#define HOME      0
#define MENU_1   1
#define MENU_2   2
#define MENU_3   3
#define MENU_4   4
 
// read the buttons
int read_LCD_buttons()
{
 adc_key_in = analogRead(0);      // read the value from the sensor
 // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
 // we add approx 50 to those values and check to see if we are close
 if (adc_key_in > 1000) return butNONE; // We make this the 1st option for speed reasons since it will be the most likely result
 if (adc_key_in < 50)   return butRIGHT; 
 if (adc_key_in < 195)  return butUP;
 if (adc_key_in < 380)  return butDOWN;
 if (adc_key_in < 555)  return butLEFT;
 if (adc_key_in < 790)  return butSELECT;   


 return butNONE;  // when all others fail, return this...
}

void setup(void)
{
// Start up the library
sensors.begin();
// set the resolution to 10 bit (good enough?)
sensors.setResolution(insideThermometer, 10);
sensors.setResolution(outsideThermometer, 10);

pinMode(tempAlarmPin, OUTPUT);    //Buzzer

lcd.begin(16,2); // columns, rows. use 16,2 for a 16x2 LCD, etc.
lcd.clear(); // start with a blank screen
}

void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
lcd.print("Error");
else {
lcd.print(tempC);
lcd.print("C");
}
}

void alarm(DeviceAddress deviceAddress){
float tempA = sensors.getTempC(deviceAddress);
if ( (tempA) >= 25) //Temp superior a 23 Graus
    {
    digitalWrite(tempAlarmPin, HIGH);
    delay(500);
    digitalWrite(tempAlarmPin, LOW);
    }
    else if ( (tempA) <= 20) //Temp inferior a 20 graus
    {
    digitalWrite(tempAlarmPin, HIGH);
    delay(500);
    digitalWrite(tempAlarmPin, LOW);

    }
}

void updateHeader() { //isto imprime as partes estaticas do LCD.

//máquina de estados.
switch(Menu) {
  case HOME: {
    lcd.clear();
    lcd.print("hora:");
    lcd.setCursor(0,1);
    lcd.print("data:");
    break;
  };
  case MENU_1: {
    lcd.clear();
    lcd.print("temp aquario");
    break;
  };
  case MENU_2: {
    lcd.clear();
    lcd.print("temp exterior");
    break;
  };
  case MENU_3: {
    lcd.clear();
    lcd.print("distancia");
    break;
  };
  case MENU_4: {
    lcd.clear();
    lcd.print("settings");
    break;
  }//end case
}//end switch
    updateValues(); //update the non-static values
}

void updateValues() {
static unsigned int hora = 0;
  
switch(Menu) {
  case HOME: { //tens de definir o relogio...
    lcd.setCursor(7,0);
    lcd.print(hora++); //impar
    lcd.setCursor(7,1);
    lcd.print(hora++); //par...
    break;
  };
  case MENU_1: {
    lcd.setCursor(0,1);
    lcd.print(sensors.getTempC(insideThermometer));
    lcd.print(" C");
    break;
  };
  case MENU_2: {
    lcd.setCursor(0,1);
    lcd.print(sensors.getTempC(outsideThermometer));
    lcd.print(" C");
    break;
  };
  case MENU_3: {
    lcd.setCursor(0,1);
    lcd.print(hora);
    lcd.print(" cm");
    break;
  };
  case MENU_4: {
    lcd.setCursor(0,1);
    lcd.print("min:);
    lcd.print(minima);
    lcd.print("max:");
    lcd.print(maxima);
    break;
  }//end case
}//end switch


}

char Menu = HOME;
float minima = 20.0, maxima = 25.0;
unsigned long antes = 0;

void loop(void) //se esta funç~o estiver vazia so por milagre e que algo acontecera...
{
static unsigned int button=0, previousButton = 0; 
char temp = Menu;
unsigned long agora;

    if ((button=read_LCD_buttons()) != previousButton){ //alguem carregou na tecla.
      previousButton = button; //fazer update do ultimo botao pressionado.
      if (button == butUP) {
        Menu = (temp++)%NUMBER_OF_MENUS;//bounded buffer.
      }
      if (button == butDOWN) {
        Menu = (temp--)%NUMBER_OF_MENUS;//bounded buffer.
      }
    updateHeader();
    }//end if
  
  //fazer update do LCD
  if ((agora = millis()) - antes > 1000) { //passou um segundo
    antes = agora; 
    updateValues();
  }
}

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

Offline Offline
Jr. Member
**
Karma: 0
Posts: 69
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

nao, diz que o menu, minima e maxima nao estao declarados.

ja ando a exprimentar com outro codigo de exemplo, e ja consegui por a mostrar uma temp, mas o resto ta complicado. smiley

Logged

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

Apaga esta linha:

Code:
float minima = 20.0, maxima = 25.0;

E coloca-a no topo do ficheiro.
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).

Offline Offline
Jr. Member
**
Karma: 0
Posts: 69
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

esta complicado. smiley

Code:
sketch_apr07a.ino: In function 'void updateHeader()':
sketch_apr07a:95: error: 'Menu' was not declared in this scope
sketch_apr07a.ino: In function 'void updateValues()':
sketch_apr07a:130: error: 'Menu' was not declared in this scope
Logged

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

Apaga estas linhas:

Code:
char Menu = HOME;
float minima = 20.0, maxima = 25.0;
unsigned long antes = 0;

E coloca-as no topo do ficheiro.
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).

Offline Offline
Jr. Member
**
Karma: 0
Posts: 69
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

assim ja compila.

mas fica assim:

hora:  x
data: x

onde o X muda por segundo, ou entao muda rapido ao carregar nos botoes.

agradeço a ajuda bubulindo, mas acho que para ja, vou testando outras coisas mais importantes (e aprendendo um pouco mais) e entao depois dedico-me a serio a este menu.

abraços
Logged

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

Desculpa... mas estás a gozar comigo?

Onde é que vais buscar a hora e data para o teu sistema?

Achas que eu sou adivinho para saber de onde virá a hora e data para o teu sistema?

Já disse por várias vezes que tens de colocar lá as horas e data vindas dum RTC ou algo do género. Se isso não está definido, eu não posso adivinhar de onde isso virá ou mesmo que hardware tens ligado que possibilite saber se tens um relógio que dê para usar.

Se olhares para o programa vês que o que aparece é um contador que aumenta sempre que a função é chamada... que é de segundo a segundo ou quando carregas nas teclas.

O menu já aparece pelo menos?
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).

Offline Offline
Jr. Member
**
Karma: 0
Posts: 69
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ajudas-te e agradeço, se eu percebe-se nao tinha perguntado nada.

nao ajudes mais, nao vale a pena.

eu alterei o teu primeiro codigo, nao para mostrar as horas do rtc, mas sim para testar apenas o menu, e isso continua sem funcionar.

tal como disse antes, por mim isto esta encerrado.

Logged

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

Ok...

O que é que acontece com o menu?

Quando carregas nas teclas, nada acontece?

Na loop, se colocares este código:

Code:
void loop(void) //se esta funç~o estiver vazia so por milagre e que algo acontecera...
{
static unsigned int button=0, previousButton = 0; 
char temp = Menu;
unsigned long agora;

    if ((button=read_LCD_buttons()) != previousButton){ //alguem carregou na tecla.
      Serial.println("tecla");
      previousButton = button; //fazer update do ultimo botao pressionado.
      if (button == butUP) {
        Menu = (temp++)%NUMBER_OF_MENUS;//bounded buffer.
      }
      if (button == butDOWN) {
        Menu = (temp--)%NUMBER_OF_MENUS;//bounded buffer.
      }
    updateHeader();
    }//end if
 
  //fazer update do LCD
  if ((agora = millis()) - antes > 1000) { //passou um segundo
    antes = agora;
    updateValues();
  }
}

Recebes algo pelo Serial Port? Chegaste a testar as teclas para garantir que a função funcionava?
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).

Offline Offline
Jr. Member
**
Karma: 1
Posts: 75
3ª Idade ... in the house
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ajudas-te e agradeço, se eu percebe-se nao tinha perguntado nada.

nao ajudes mais, nao vale a pena.

eu alterei o teu primeiro codigo, nao para mostrar as horas do rtc, mas sim para testar apenas o menu, e isso continua sem funcionar.

tal como disse antes, por mim isto esta encerrado.



Boas ,

Visto que percebes disto tanto como eu aqui te deixo um site que te vai salvar a "vida" em relação ao menus ... pouco aprendes a usar este tipo de livrarias (pelo menos foi assim comigo) mas penso que vais conseguir fazer o que queres.

http://www.coagula.org/content/pages/tutorial-manage-menu-and-lcd-display-arduino

Cumprimentos

Zé tretas
Logged

Arduino Mega 2560
Arduino Nano
Arduino UNO Rev3
Raspberry PI Model B
EasyPIC v4

Pages: 1 [2]   Go Up
Jump to: