|     Inicio    |   |         |  |   FOROS      |  |      |      
   Elastix - VoIP B4A (Basic4Android) App inventor 2 PHP - MySQL
  Estación meteorológica B4J (Basic4Java) ADB Shell - Android Arduino
  AutoIt (Programación) Visual Basic Script (VBS) FireBase (BD autoactualizable) NodeMCU como Arduino
  Teleco - Emisora de A.M. Visual Basic Cosas de Windows Webs interesantes
T Búsqueda en este sitio:


.

Arduino en español
Circuitos con Arduino - Juan Antonio Villalpando

-- Tutorial de iniciación a Arduino --

Volver al índice del tutorial

____________________________

49BB2.- Teclado 4x4, bus I2C. Pantalla LCD. Menú.

- Con un teclado 4x4 con bus I2C y una pantalla LCD, vamos a construir un menú.

- Según la tecla pulsada se visualizará un valor como indico en esta tabla.

Tecla
Visualización en la pantalla LCD
'B'
Visualiza la Humedad.
'C'
Visualiza la Temperatura.
'D'
Visualiza la distancia del ultrasonido por RF.
'0'
Visualiza la lluvia.
'*'
Visualiza la hora.
'1'
Visualiza el humo mediante el I2C
'2'
Visualiza valor LDR-PWM

- Los valores visualizados son solamente de ejemplo, es decir en este código no utilizaremos sensores, pondremos valores de ejemplo: humedad = "87", temperatura ="23",...

- Ya que solamente se intenta hacer un ejercicio de menú.

- Según la tecla pulsada iremos a su función correspondiente, por ejemplo si pulsamos la tecla 'C' iremos a la función: ver_temperatura ();

- Las funciones son trozos de códigos de forma similar a esta:

void ver_temperatura () {

.....

}

- Observa en el código la manera que hago la selección, juego con variables booleanas, que pueden ser true o false.

- En los if ejecuto la opción que es true y pongo en false las demás.

- Se podría realizar este menú de una forma más sencilla, como veremos al final de esta página, pero para el proyecto de sensores que estamos utilizando en estos tutoriales, he decidio esta forma de menú, tú puedes modificarlos de otras maneras.

______________________________________________________
- Conexionado.

______________________________________________________
- Código para el Arduino.

- Fíjate que he puesto la dirección I2C de mi módulo para la pantalla LCD: 0x27

- Fíjate que he puesto la dirección I2C de mi tarjeta para el teclado: 0x38

- El código utiliza dos librerías de teclado la Keypad_I2C y la Keypad

- Las dos las puedes bajar de este enlace: Keypad-KeypadI2C.zip

- Además también están las librerías Wire y LiquidCrystal que puedes encontrar en el tutorial de 31.- Pantalla LCD.

- Esas librerías las debes copiar en la carpetar libraries de donde tengas instalado el IDE del Arduino.

jTeclado_LCD_Menu.ino

// Juan A. Villalpando.
// Abril 2018. KIO4.COM
// Teclado.
#include <Keypad_I2C.h>
#include <Keypad.h>
// Pantalla LCD
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

// Teclado
const byte ROWS = 4; 
const byte COLS = 4;
char key = ' ';

int tecla;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
 
byte rowPins[ROWS] = {0,1,2,3}; 
byte colPins[COLS] = {4,5,6,7};
 
int i2caddress = 0x38; // Direccion I2C teclado.
 
Keypad_I2C kpd = Keypad_I2C( makeKeymap(keys), rowPins, colPins, ROWS, COLS, i2caddress );

boolean humed = false;
boolean temperatu = false;
boolean lluvia = false;
boolean reloj = false;
boolean radiofrecuen = false;
boolean humo = false;
boolean ldr = false;

String humedad;
String temperatura;
String fecha;
String hora;
String infrar;
String distancia;
String humostring;
String valorA_lluvia_2;
String leer_ldr_2;

String humedad_old;
String temperatura_old;
String infrarojo_old;
String valorA_lluvia_old;
String distancia_old;
String humostring_old;
String leer_ldr_old;
 
void setup(){
  Serial.begin(9600);
  kpd.begin();
  lcd.begin(16,2);// Columnas y filas de LCD.
}
 
void loop(){
  key = kpd.getKey();
  if (key){
     if (key == 'B'){ // Ver humedad.
       humed = !humed;
       humedad_old = 999999;
       temperatu = false;
       reloj = false;
       lluvia = false;
       radiofrecuen = false;
       humo = false;
       ldr = false;
      }
      if (key == 'C'){ // Ver temperatura.
       temperatu = !temperatu;
       temperatura_old = 999999;
       humed = false;
       reloj = false;
       lluvia = false;
       radiofrecuen = false;
       humo = false;
       ldr = false;
      }
      if (key == 'D'){ // Ver RadioFrecuencia-Ultrasonido.
       radiofrecuen = !radiofrecuen;
       distancia_old = 999999;
       humed = false;
       reloj = false;
       temperatu = false;
       lluvia = false;
       humo = false;
       ldr = false;
      }
      if (key == '*'){ // Ver Reloj RTC.
       reloj = !reloj;
       humed = false;
       lluvia = false;
       temperatu = false;
       radiofrecuen = false;
       humo = false;
       ldr = false;     
      }
      if (key == '0'){ // Ver lluvia
       lluvia = !lluvia;
       valorA_lluvia_old = 999999;
       humed = false;
       reloj = false;
       temperatu = false;
       radiofrecuen = false;
       humo = false;
       ldr = false;
      }
      if (key == '1'){ // Ver Humo por Conexion I2C.
       humo = !humo;
       humostring_old = 999999;
       humed = false;
       reloj = false;
       temperatu = false;
       lluvia = false;
       radiofrecuen = false;
       ldr = false;
      }
      if (key == '2'){ // Ver LDR-PWM.
       ldr = !ldr;
       leer_ldr_old = 999999;
       humed = false;
       reloj = false;
       temperatu = false;
       lluvia = false;
       radiofrecuen = false;
       humo = false;
      }
  }
     if (humed){ver_humedad();}
     if (temperatu){ver_temperatura();}
     if (reloj){ver_reloj();} 
     if (lluvia){ver_lluvia();} 
     if (humo){ver_humo();} 
     if (ldr){ver_ldr();} 
     if (radiofrecuen){ver_radiofrecuencia();}     
} // FIN loop.

///////////// FUNCIONES ///////////////////////////
/////  Ver informacion humedad ///////////////////
void ver_humedad() {
  humedad = "87";
  if (humedad != humedad_old) { // Para que no parpadee.
  humedad_old = humedad;
  lcd.clear(); // Borra pantalla
  lcd.setCursor(0,0); // Inicio del cursor
  lcd.print("Humedad");
  lcd.setCursor(0,1); // Siguiente renglón.
  lcd.print(humedad);
  delay(50);
  }
 }
///////////////////////////////////////////////////
/////  Ver informacion temperatura ////////////////
void ver_temperatura() { 
  temperatura = "23";
  if (temperatura != temperatura_old) { // Para que no parpadee.
  temperatura_old = temperatura;
  lcd.clear(); // Borra pantalla
  lcd.setCursor(0,0); // Inicio del cursor
  lcd.print("Temperatura");
  lcd.setCursor(0,1); // Siguiente renglón.
  lcd.print(temperatura);
  delay(50);
  }
}
///////////////////////////////////////////////////
/////  Leer infrarojo ////////////////////////////
void infrarojo() {
  infrar = "1";
  if (infrar != infrarojo_old) { // Para que no parpadee.
    infrarojo_old = infrar;
  lcd.clear(); // Borra pantalla
  lcd.setCursor(0,0); // Inicio del cursor
  lcd.print("Infrarojo ");
  lcd.setCursor(0,1); // Siguiente renglón.
  lcd.print(infrar);
  delay(50);
  }
}
///////////////////////////////////////////////////
/////  Ver radiofrecuencia en LCD ////////////////
void ver_radiofrecuencia() {
  distancia = "1234";
  if (distancia != distancia_old) { // Para que no parpadee.
    distancia_old = distancia;
  lcd.clear(); // Borra pantalla
  lcd.setCursor(0,0); // Inicio del cursor
  lcd.print("Distancia (RF)");
  lcd.setCursor(0,1); // Siguiente renglón.
  lcd.print(distancia);
  delay(50);
  }
}
///////////////////////////////////////////////////
/////  Ver Reloj RTC en LCD ///////////////////////
void ver_reloj() {
  fecha = "12/05/2018";
  hora = "18:15:21";
  lcd.clear(); // Borra pantalla
  lcd.setCursor(0,0); // Inicio del cursor
  lcd.print(fecha);
  lcd.setCursor(0,1); // Siguiente renglón.;
  lcd.print(hora);
  delay(200);
}
//////////////////////////////////////////////////
/////// Ver lluvia en LCD ///////////////////////
void ver_lluvia() {
  valorA_lluvia_2 = "41";
  if (valorA_lluvia_2 != valorA_lluvia_old) { // Para que no parpadee.
    valorA_lluvia_old = valorA_lluvia_2;
    lcd.clear(); // Borra pantalla
    lcd.setCursor(0,0); // Inicio del cursor
    lcd.print("Lluvia");
    lcd.setCursor(0,1); // Siguiente renglón.
    lcd.print(valorA_lluvia_2);
    delay(50);
   }
}
///////////////////////////////////////////
/////  Leer HUMO I2C //////////////////////
void ver_humo() {
  humostring = "48";
  if (humostring != humostring_old) { // Para que no parpadee.
  humostring_old = humostring;
  lcd.clear(); // Borra pantalla
  lcd.setCursor(0,0); // Inicio del cursor
  lcd.print("Humo (I2C)");
  lcd.setCursor(0,1); // Siguiente renglón.
  lcd.print(humostring);
  delay(50); 
}
}
//////////////////////////////////////////////////
/////// Ver LDR PWM LED  ///////////////////////
void ver_ldr() {
  leer_ldr_2 = "45";
  if (leer_ldr_2 != leer_ldr_old) { // Para que no parpadee.
    leer_ldr_old = leer_ldr_2;
    lcd.clear(); // Borra pantalla
    lcd.setCursor(0,0); // Inicio del cursor
    lcd.print("LDR -> PWM");
    lcd.setCursor(0,1); // Siguiente renglón.
    lcd.print(leer_ldr_2);
    delay(50);
   }
}

______________________________________________________
- Comentarios.

- Has visto que muchas variables son de la forma distancia_old, esto lo he puesto para evitar el parpadeo.

- Si un valor es igual que el anterior, entonces no cambia la pantalla LCD de esta forma no parpadea.

- Ya que si el valor cambia, cambia la pantalla y se observa un pequeño parpadeo.

- El parpadeo es debido a que todo se realiza en un bucle loop, y cuando va a la LCD, hace un borrado con esta instrucción:

lcd.clear(); // Borra pantalla

- Ahí se crea el parpadeo.

- Observa que la función del Reloj, no tiene la variable _old ni la eliminación del parpadeo.

- Observa que cuando se visualiza el Reloj la pantalla parpadea.

______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________

2.- Código del menú simplificado.

- Si no te ha gustado lo de las variables booleanas ni las variables _old para evitar el parpadeo, aquí tienes un código más simplificado.

- Hace lo mismo que el anterior, pero es más fácil e intuitivo de aprender.

jTeclado_LCD_Menu_2.ino

// Juan A. Villalpando.
// Abril 2018. KIO4.COM
// Teclado.
#include <Keypad_I2C.h>
#include <Keypad.h>
// Pantalla LCD
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

// Teclado
const byte ROWS = 4; 
const byte COLS = 4;
char key = ' ';

int tecla;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
 
byte rowPins[ROWS] = {0,1,2,3}; 
byte colPins[COLS] = {4,5,6,7};
 
int i2caddress = 0x38; // Direccion I2C teclado.
 
Keypad_I2C kpd = Keypad_I2C( makeKeymap(keys), rowPins, colPins, ROWS, COLS, i2caddress );

String humedad;
String temperatura;
String fecha;
String hora;
String infrar;
String distancia;
String humostring;
String valorA_lluvia_2;
String leer_ldr_2;

void setup(){
  Serial.begin(9600);
  kpd.begin();
  lcd.begin(16,2);// Columnas y filas de LCD.
}
 
void loop(){
  key = kpd.getKey();
  if (key){
     if (key == 'B'){ // Ver humedad.
        ver_humedad();
      }
      if (key == 'C'){ // Ver temperatura.
        ver_temperatura();
      }
      if (key == 'D'){ // Ver RadioFrecuencia-Ultrasonido.
        ver_radiofrecuencia();
      }
      if (key == '*'){ // Ver Reloj RTC.
        ver_reloj();
      }
      if (key == '0'){ // Ver lluvia
        ver_lluvia();
      }
      if (key == '1'){ // Ver Humo por Conexion I2C.
        ver_humo();
      }
      if (key == '2'){ // Ver LDR-PWM.
        ver_ldr();
      }
  }      
} // FIN loop.

///////////// FUNCIONES ///////////////////////////
/////  Ver informacion humedad ///////////////////
void ver_humedad() {
  humedad = "87";
  lcd.clear(); // Borra pantalla
  lcd.setCursor(0,0); // Inicio del cursor
  lcd.print("Humedad");
  lcd.setCursor(0,1); // Siguiente renglón.
  lcd.print(humedad);
  delay(50);
 }
///////////////////////////////////////////////////
/////  Ver informacion temperatura ////////////////
void ver_temperatura() { 
  temperatura = "23";
  lcd.clear(); // Borra pantalla
  lcd.setCursor(0,0); // Inicio del cursor
  lcd.print("Temperatura");
  lcd.setCursor(0,1); // Siguiente renglón.
  lcd.print(temperatura);
  delay(50);
}
///////////////////////////////////////////////////
/////  Leer infrarojo ////////////////////////////
void infrarojo() {
  infrar = "1";
  lcd.clear(); // Borra pantalla
  lcd.setCursor(0,0); // Inicio del cursor
  lcd.print("Infrarojo ");
  lcd.setCursor(0,1); // Siguiente renglón.
  lcd.print(infrar);
  delay(50);
}
///////////////////////////////////////////////////
/////  Ver radiofrecuencia en LCD ////////////////
void ver_radiofrecuencia() {
  distancia = "1234";
  lcd.clear(); // Borra pantalla
  lcd.setCursor(0,0); // Inicio del cursor
  lcd.print("Distancia (RF)");
  lcd.setCursor(0,1); // Siguiente renglón.
  lcd.print(distancia);
  delay(50);
}
///////////////////////////////////////////////////
/////  Ver Reloj RTC en LCD ///////////////////////
void ver_reloj() {
  fecha = "12/05/2018";
  hora = "18:15:21";
  lcd.clear(); // Borra pantalla
  lcd.setCursor(0,0); // Inicio del cursor
  lcd.print(fecha);
  lcd.setCursor(0,1); // Siguiente renglón.;
  lcd.print(hora);
  delay(200);
}
//////////////////////////////////////////////////
/////// Ver lluvia en LCD ///////////////////////
void ver_lluvia() {
  valorA_lluvia_2 = "41";
    lcd.clear(); // Borra pantalla
    lcd.setCursor(0,0); // Inicio del cursor
    lcd.print("Lluvia");
    lcd.setCursor(0,1); // Siguiente renglón.
    lcd.print(valorA_lluvia_2);
    delay(50);
}
///////////////////////////////////////////
/////  Leer HUMO I2C //////////////////////
void ver_humo() {
  humostring = "48";
  lcd.clear(); // Borra pantalla
  lcd.setCursor(0,0); // Inicio del cursor
  lcd.print("Humo (I2C)");
  lcd.setCursor(0,1); // Siguiente renglón.
  lcd.print(humostring);
  delay(50); 
}
//////////////////////////////////////////////////
/////// Ver LDR PWM LED  ///////////////////////
void ver_ldr() {
    leer_ldr_2 = "45";
    lcd.clear(); // Borra pantalla
    lcd.setCursor(0,0); // Inicio del cursor
    lcd.print("LDR -> PWM");
    lcd.setCursor(0,1); // Siguiente renglón.
    lcd.print(leer_ldr_2);
    delay(50);
}

______________________________________________________
________________________________

 

- Mi correo:
juana1991@yahoo.com
- KIO4.COM - Política de cookies. Textos e imágenes propiedad del autor:
© Juan A. Villalpando
No se permite la copia de información ni imágenes.
Usamos cookies propias y de terceros que entre otras cosas recogen datos sobre sus hábitos de navegación y realizan análisis de uso de nuestro sitio.
Si continúa navegando consideramos que acepta su uso. Acepto    Más información