|     Inicio    |   |         |  |   FOROS      |  |      |      
   Elastix - VoIP B4A (Basic4Android) App inventor 2 PHP - MySQL
  Estación meteorológica   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
Translate:
Búsqueda en este sitio:


Nuevo concurso para España, Argentina, Brasil, Chile, Colombia, Ecuador, México, Perú y Portugal.

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

-- Tutorial de iniciación a Arduino --

Volver al índice del tutorial

____________________________

31.- Pantalla LCD.

Nuestra pantalla LCD tiene dos formas de funcionamiento: sin I2C y con I2C.

- Sin el módulo I2C

- La pantalla tiene acoplado por detrás un módulo I2C, si le quitamos ese módulo podrá funcionar correctamente, pero necesitará mucho cableado de conexión como se indica en el siguiente dibujo.
- Además será complicado poner varias pantallas.
- Aquí tienes el código para conectarlo sin I2C.

- Con el módulo I2C.

- La mejor forma de utilizarlo es con el módulo I2C, la tarjeta marrón que se ve en la siguiente imagen, este módulo suele venir con la compra de la pantalla.

- Si te vas a comprar una pantalla LCD de este tipo, asegúrate que tenga este módulo I2C.

___________
1.- I2C

- Esta es la mejor forma de conexión, se observa el módulo I2C marrón acoplado a la pantalla en su parte posterior.

- Es la forma que utilizaremos.

- Además es conveniente que tenga las direcciones A0, A1 y A2 como he marcado en el dibujo, para más adelante poder estudiar más a fondo el bus I2C.

- Tiene un potenciómetro para ajustar el brillo de pantalla.

- Atención, cuidado con la dirección, en la mayoría de los tutoriales encontrarás que la dirección por defecto es 0x27, pero en algunos modelos no tienen esa dirección, tienen por ejemplo 0x3F.

NOTA IMPORTANTE: a veces haces pruebas y no se ven las letras escritas, una de las razones puede ser que la pantalla tenga mucho contraste, para solucionarlo mueve un poco la resistencia ajustable azul que hay sobre el módulo.

_____________________
2.- Conexiones.

Los Arduino UNO R3 tienen en la parte indicada terminales de conexión SCL y SDA.

En caso que no tengamos este modelo, simplemente conectamos:

el SDA a la ANALOG IN A4 y
el SCL a la ANALOG IN A5,


como indico en el dibujo. Fíjate la sencillez de la conexión I2C, solo necesitamos 4 cables.

- STOP.
______________________________________

- Problemas con las direcciones del módulo I2C.
- Consulta la dirección de tu pantalla.

Compré una pantalla LCD con módulo I2C, creía que tenía de dirección: 0x27, la que viene en la mayoría de los ejemplos, pero... no me funcionaba.

Así que sospeché y busqué su dirección verdadera. Cargué este programa, obtenido aquí.

Establecí el Serial Monitor en 115200 y lo consulté, obteniendo las direcciones del I2C:

Indicará las direcciones de los dispositivos I2C encontrados, por ejemplo...

I2C scanner. Scanning ...
Found address: 63 (0x3F)
Done.
Found 1 device(s).

- Así que mi pantalla LCD tiene una dirección de 0x3F en vez de la 0x27

Código para ver direcciones I2C
#include <Wire.h>

void setup() {
  Serial.begin (115200);

  // Leonardo: wait for serial port to connect
  while (!Serial)
    {
    }

  Serial.println ();
  Serial.println ("I2C scanner. Scanning ...");
  byte count = 0;
 
  Wire.begin();
  for (byte i = 1; i < 120; i++)
  {
    Wire.beginTransmission (i);
    if (Wire.endTransmission () == 0)
      {
      Serial.print ("Found address: ");
      Serial.print (i, DEC);
      Serial.print (" (0x");
      Serial.print (i, HEX);
      Serial.println (")");
      count++;
      delay (1);  // maybe unneeded?
      } // end of good response
  } // end of for loop
  Serial.println ("Done.");
  Serial.print ("Found ");
  Serial.print (count, DEC);
  Serial.println (" device(s).");
}  // end of setup

void loop() {}

_________________
3.- Código sencillo.

- Necesita la librería LiquidCrystal_I2C.zip

Código
#include <Wire.h>                 
#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); void setup() { lcd.begin(16,2);// Columnas y filas de LCD } void loop() { lcd.clear(); // Borra pantalla lcd.setCursor(0,0); // Inicio del cursor lcd.print(" Bienvenidos."); delay (2000); lcd.clear(); lcd.setCursor(3,1); // Siguiente renglón. lcd.print("KIO4.COM"); delay (1000); }

________________________
4
.- Códigos para 16 caracteres en 2 líneas.

Desde el Serial Monitor le podremos enviar mensajes.
Serial Monitor en No hay fin de línea (No Lone Ending).
Serial Monitor en 9600

Código
#include <Wire.h>  
#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); void setup() { Serial.begin(9600); lcd.begin(16,2); // 2 filas y 16 columnas // Parpaea tres veces for(int i = 0; i< 3; i++) { lcd.backlight(); delay(250); lcd.noBacklight(); delay(250); } lcd.backlight(); lcd.setCursor(0,0); lcd.print(" Hola a todos."); delay(1000); lcd.setCursor(0,1); lcd.print(" KIO4.COM"); delay(8000); lcd.clear(); lcd.setCursor(0,0); lcd.print("Escribe en el"); lcd.setCursor(0,1); lcd.print("Serial Monitor"); } void loop() { { // Si hay caracteres disponibles... if (Serial.available()) { delay(100); lcd.clear(); while (Serial.available() > 0) { lcd.write(Serial.read()); } } } }

Necesita la librería Wire, pero ya debe estar instalada en la carpeta libraries del IDE del Arduino.

______________________

5.- Desplazamientos. Varios ejemplos.

Desplazamiento a derecha
#include <Wire.h>  
#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);

void setup() 
{
Serial.begin(9600); 
lcd.begin(16,2); // 2 filas y 16 columnas
}

void loop() 
{
for(int i = 0; i< 16; i++)
{
lcd.setCursor(i,0); 
lcd.print("Hola a todos.");
delay(500);
lcd.clear();
} 
}

 

Desplazamiento izquierda y derecha
#include <Wire.h>  
#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);

void setup() 
{
Serial.begin(9600); 
lcd.begin(16,2); // 2 filas y 16 columnas
lcd.setCursor(0,0); 
lcd.print("Hola a todos");
lcd.setCursor(2,1); 
lcd.print("KIO4.COM");
}


void loop() {
// scroll 13 positions (string length) to the left 
// to move it offscreen left:
for (int positionCounter = 0; positionCounter < 13; positionCounter++) {
// scroll one position left:
lcd.scrollDisplayLeft(); 
// wait a bit:
delay(150);
}

// scroll 29 positions (string length + display length) to the right
// to move it offscreen right:
for (int positionCounter = 0; positionCounter < 29; positionCounter++) {
// scroll one position right:
lcd.scrollDisplayRight(); 
// wait a bit:
delay(150);
}

// scroll 16 positions (display length + string length) to the left
// to move it back to center:
for (int positionCounter = 0; positionCounter < 16; positionCounter++) {
// scroll one position left:
lcd.scrollDisplayLeft(); 
// wait a bit:
delay(150);
}

// delay at the end of the full loop:
delay(1000);

}

_____________________________________________________

https://www.arduino.cc/en/pmwiki.php?n=Tutorial/LiquidCrystalAutoscroll

Desplazamiento

#include <Wire.h>  
#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);
void setup() {
// set up the LCD's number of columns and rows: 
lcd.begin(16,2);
}

void loop() {
// set the cursor to (0,0):
lcd.setCursor(0, 0);
// print from 0 to 9:
for (int thisChar = 0; thisChar < 10; thisChar++) {
lcd.print(thisChar);
delay(500);
}

// set the cursor to (16,1):
lcd.setCursor(16,1);
// set the display to automatically scroll:
lcd.autoscroll();
// print from 0 to 9:
for (int thisChar = 0; thisChar < 10; thisChar++) {
lcd.print(thisChar);
delay(500);
}
// turn off automatic scrolling
lcd.noAutoscroll();

// clear screen for the next loop:
lcd.clear();
}

 

Desplazamiento contínuo

// http://forum.arduino.cc/index.php?topic=263627.0
// Adaptado por Juan Antonio Villalpando.
// KIO4.COM
#include <Wire.h>  
#include <LiquidCrystal_I2C.h>
#define N_CHARS  ((sizeof(MessageOut)/sizeof(MessageOut[0]))-1)
#define N_CHARS2  ((sizeof(MessageOut2)/sizeof(MessageOut2[0]))-1)
// 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);

char MessageOut[21];
char MessageOut2[35];

int index = 19, index2 = 0;
unsigned long oldTime = 0, oldTime2 = 0;

void setup()
{
lcd.clear();
lcd.begin(16,2); // 2 filas y 16 columnas
}

void loop() 
{
setHeadingRight("Hola amigos.", 0, 1000); // message, row, duration
setHeadingLeft("Bienvenidos a la web de KIO4.COM ", 1, 500);
}

void setHeadingRight(char * msg, byte row, unsigned long duration) 
{
strncpy(MessageOut, msg, sizeof(MessageOut));
if(millis() - oldTime > duration) // Duración.
{
oldTime = millis(); // update oldTime with the current time
if(index >= 0) // make sure the index does not go under 0
{ 
index--; // decrecment index by 1
for (int i = 0; i < N_CHARS; i++) // this part here displays the message on the display
{
lcd.setCursor(i,row); // set the column to show the element in the array
if(index == N_CHARS) index = 0; // set index back to 0 if the index has reached the arrays max size.

if(MessageOut[index++] != NULL) // if the element @ index is anything but NULL, show it.
lcd.print(MessageOut[index-1]);
else 
lcd.print(' '); // if the element @ index is NULL, display a space. 
}
}
else index = 19; // if index is less than 0, then set it back to 19
}
}

void setHeadingLeft(char * msg, byte row, unsigned long duration2) 
{
strncpy(MessageOut2, msg, sizeof(MessageOut2));
if(millis() - oldTime2 > duration2)
{
oldTime2 = millis();
if(index2 < 34) // check to see if index2 is under the array max size
{
index2++; // increment index
for (int i = 0; i < N_CHARS2; i++) // same as above
{
lcd.setCursor(i,row);
if(index2 == N_CHARS2) index2 = 0;

if(MessageOut2[index2++] != NULL)
lcd.print(MessageOut2[index2-1]);
else 
lcd.print(' '); 
}
}
else index2 = 0; // otherwise set it back to 0
}
}

______________________

6.- Potenciómetro y pantalla LCD.

- Al mover el potenciómetro visualizamos en la pantalla un valor entre 0 y 1023.
- Además hacemos un cambio de base lineal, mapear, es decir cuando el valor cambie de 0 a 1023,
 la variable x, cambia linealmente de 0 a 100.
- Se presentan los dos datos en la pantalla.

Código
// Juan Antonio Villalpando
// kio4.com

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); 
int entrada = A2; // Centro del potenciómetro a ANALOG IN A2
int x;
 
void setup()
{
  lcd.begin(16,2);
  lcd.home ();
  lcd.print("  KIO4.COM  ");
  delay(1500);
}
 
void loop()
{
  int valor = analogRead(entrada);
  x = map(valor, 0, 1023,0,100);
  lcd.setCursor(0, 1);
  lcd.print("V= "); lcd.print(valor); lcd.print("   X= ");lcd.print(x);
  lcd.print("                  ");
  delay (200);
}

___________________________________________
___________________________________________
___________________________________________

7.- Bus I2C. Conexión de varias pantallas LCD.

Vamos a conectar tres pantallas LCD al Bus I2C como indica el dibujo.

No hace falta poner resistencias de 4K7 pull-up entre SDL y positivo y SDA y positivo, porque el módulo ya la tiene.

Atención, muchas LCD tienen estas direcciones (la de defecto 0x27), pero otras no. Instala el programa que verás más abajo para ver la dirección de tu pantalla.

______________________________

Para que el Arduino distinga a cada una de las tres pantallas, cada una debe tener una dirección distinta.

Aquí vemos el módulo de control I2C:

Según cortocircuitemos la pareja de conexión de cada A, así se le asignará una dirección.

La dirección por defecto es la 0x27 corresponde a la configuración de la foto.


0x27

 

Las direcciones se configuran mediante uniones en: A0, A1 y A2

Hay fabricantes que establecen estas direcciones.
Poniendo la de fábrica en 0x27

 

 

Las direcciones se configuran mediante uniones en: A0, A1 y A2

Otros fabricantes establecen estas otras direcciones.
Poniendo la de fábrica en 0x3F

 


0x26

0x25

_________________________________

____________________________
7B.- Código para varias pantallas.

- Por fin llegamos al código para varias pantallas...

Código para ver varias pantallas en bus I2C
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd1(0x3F,16,2); // Dirección de una pantalla
LiquidCrystal_I2C lcd2(0x3E,16,2); // Dirección de otra pantalla
LiquidCrystal_I2C lcd3(0x3D,16,2); // Dirección de otra pantalla void setup() { lcd1.init(); lcd2.init();
lcd3.init(); lcd1.backlight(); lcd1.print("Pantalla 1"); lcd2.backlight(); lcd2.print("Pantalla 2"); lcd3.backlight(); lcd3.print("Pantalla 3"); } void loop() { }

 

_______________________

Interface I2C para la pantalla

- Bajar la hoja de datos del PCF8574A

Errores

error: 'lcd' was not declared in this scope

esto no es error de código ni de conexión ni de librería, es otro tipo de error. Es más bien un problema de IDE. Para evitarlo cerramos los IDE que tengamos abierto de Arduino. Entramos en un nuevo IDE de Arduino y desde el IDE mediante Archivos / Abrir localizamos de nuevo el programa.ino que queremos utilizar.

______________________

8.- Sensores de temperatura 18B20.

- En el tutorial Sensor de temperatura 18B20, veremos otra aplicación de este tipo de pantalla LCD, se verá la manera de mostrar en la pantalla el valor de varios sensores de temperatura, en ese caso no se utilizará bus I2C.


- En este caso la información hacia la pantalla LCD se envía por el bus I2C y la información desde los sensores al Arduino se envía mediante un hilo de cable (one wire).

______________________

9.- Más usos de esta pantalla.

- En el tutorial del giroscopio, humedad,... volveremos a ver esta pantalla.

________________________________

 

- 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