Pantalla LCD 16×2 con I2C | Biblioteca PCF8574

16×2 LCD es una pantalla alfanumérica que puede mostrar hasta 32 caracteres en una sola pantalla. Puede mostrar más caracteres desplazando los textos uno por uno. Ya hemos visto cómo conectar la pantalla LCD directamente con el Arduino usando los modos de 4 y 8 bits en nuestro tutorial anterior. Pero esos dos modos utilizarán muchos pines GPIO de nuestro Arduino y tendríamos que terminar con menos pines para otros sensores y actuadores.

Para superar este problema, usamos una mochila LCD I2C con nuestra pantalla LCD. Esta mochila I2C utiliza el expansor de E/S remoto de 8 bits PCF8574. Traduce los datos recibidos del bus I2C en datos paralelos que se necesitan para la pantalla LCD.

I2C – Circuito Inter-Integrado:

El circuito interintegrado (en resumen, I2C) es un protocolo de comunicación de corta distancia de dos hilos. Puede usar varios dispositivos esclavos en los mismos dos cables con uno o más controladores maestros. Quizás se pregunte cómo identifica el maestro qué esclavo envía los datos. En I2C, los dispositivos externos tienen una dirección I2C para diferentes dispositivos externos como mochila LCD, pantalla OLED, etc. Al usar la dirección, los datos se envían al dispositivo específico conectado en el mismo bus I2C.

El mensaje se divide en dos marcos y se envía en serie a través del bus I2C. El primer marco contiene la dirección, una vez que la dirección coincida con cualquier dispositivo en el bus I2C, ese dispositivo enviará una señal de reconocimiento al maestro. Después de recibir el reconocimiento del esclavo, se envían los bits de datos. Por este método funciona un bus I2C.

Pantalla LCD de 16 × 2:

Una pantalla LCD de 16 × 2 significa que puede mostrar 16 caracteres por línea y hay 2 de esas líneas. En esta pantalla LCD, cada carácter se muestra en la matriz de 5×7 píxeles.

Distribución de pines LCD:

Hay un total de 16 pines en una pantalla LCD. Puede usar directamente todos los pines en modo de 8 bits con Arduino o 12 pines usando el modo de 4 bits. En este tutorial, usamos el módulo I2C para LCD y lo multiplexamos en solo 4 pines. Es posible que los detalles de este pin no sean útiles al usar el método I2C, pero estos son los detalles reales de todos los pines en la pantalla LCD.

Vcc – Fuente de alimentación (5v)

Vdd/GND – Tierra

V0 – Control de brillo usando potenciómetro

RS – Selección de registro. Especificar qué estamos enviando Comando o Datos. Se establece en 0 para el modo de comando como setCursor, LCD Clear, TurnOFF LCD. Establezca 1 para el modo de datos como enviar datos/caracteres.

L/E: lectura/escritura. Principalmente estamos escribiendo datos/caracteres en los registros.

E – Habilitar escritura en Registros.

D0 a D7: pines de datos. Envía datos de 4 bits/8 bits para mostrar caracteres. La biblioteca Arduino proporciona modo de 4 y 8 bits. Los datos estarán en formato ASCII.

A/LED+ – Ánodo (LED retroiluminado)

K/LED- – Cátodo (LED de retroiluminación)

Asignación de pines I2C:

La mochila LCD I2C solo tiene 4 pines. Ellos son

TIERRA – Tierra

VCC – Fuente de alimentación de 5V

SDA – Línea de datos

SCK – Línea de reloj

Diagrama de circuito:

La conexión es simple, solo conecte la mochila LCD como se muestra en la imagen (los pines salen hacia afuera). Conectar

GND – Tierra de Arduino

VCC – pin Arduino de 5V

SDA – Pin SDA de Arduino (mencionado en la parte trasera de Arduino)

SCL – Pin SCL de Arduino (mencionado en la parte trasera de Arduino)

Encontrar la dirección I2C de nuestra mochila:

Primero, necesitamos encontrar la dirección de nuestra Mochila LCD I2C. Para eso, usaremos el código del escáner I2C para mostrar la dirección en el monitor serial. Cargue el siguiente código, luego anote la dirección I2C del monitor serie.

#include <Wire.h> void setup() {   Wire.begin();    Serial.begin(9600);   while (!Serial);             // Leonardo: wait for serial monitor   Serial.println("nI2C Scanner"); }  void loop() {   byte error, address;   int nDevices;    Serial.println("Scanning...");    nDevices = 0;   for(address = 1; address < 127; address++ )    {     // The i2c_scanner uses the return value of     // the Write.endTransmisstion to see if     // a device did acknowledge to the address.     Wire.beginTransmission(address);     error = Wire.endTransmission();      if (error == 0)     {       Serial.print("I2C device found at address 0x");       if (address<16)          Serial.print("0");       Serial.print(address,HEX);       Serial.println("  !");        nDevices++;     }     else if (error==4)      {       Serial.print("Unknown error at address 0x");       if (address<16)          Serial.print("0");       Serial.println(address,HEX);     }       }   if (nDevices == 0)     Serial.println("No I2C devices foundn");   else     Serial.println("donen");    delay(5000);           // wait 5 seconds for next scan }

En mi caso, es 0x27. Node hacia abajo la dirección que se muestra para usted. En su mayoría, será solo 0x27. En caso de que tenga otro dispositivo I2C conectado en el mismo bus, también mostrará esa dirección.

Ahora usaremos esta dirección en nuestro código.

Descargue e instale la biblioteca LiquidCrystal_I2C:

Descargue la biblioteca .zip LiquidCrystal_I2C de Frank de Brabander desde aquí e instálela en IDE navegando Sketch>Include Library>Add .zip library y elija el archivo de biblioteca LiquidCrystal_I2C.zip descargado.

Ahora la biblioteca LCD I2C está instalada. Necesitamos definir e inicializar la biblioteca usando sus funciones asociadas. Los pasos son los siguientes. O puede copiar el código que se proporciona a continuación para imprimir el ejemplo de Hello World.

Declare la biblioteca LiquidCrystal_I2C.h usando la siguiente línea

#include <LiquidCrystal_I2C.h>

Configure la dirección que copiamos del código del escáner I2C. La dirección que obtuve es 0x27, así que la reemplacé por 0x27 en la siguiente línea

LiquidCrystal_I2C lcd(0x27, 16, 2);

Dentro de la función de configuración, inicialice la pantalla LCD usando la siguiente función

lcd.begin();

Código de ejemplo para imprimir ‘Hello World’:

#include <Wire.h>  #include <LiquidCrystal_I2C.h>  // Set the LCD address to 0x27 for a 16 chars and 2 line display LiquidCrystal_I2C lcd(0x27, 16, 2);  void setup() {  // initialize the LCD  lcd.begin();   // Turn on the blacklight and print a message.  lcd.backlight();  lcd.print("Hello, world!"); }  void loop() {  // Do nothing here... }

En el código anterior, hemos creado un objeto LCD para ‘LiquidCrystal_I2C’. Por lo tanto, puede usar directamente las funciones LCD regulares para trabajar con I2C como lcd.begin(), lcd.print(“”), etc.

Funciones de la pantalla LCD de uso frecuente:

Para imprimir una cadena, usamos la función lcd.print() con una cadena en sus parámetros. Esto imprime la cadena ‘Factory’ en la primera fila y ‘Forward’ en la segunda fila.

Nota importante: la posición de las columnas y filas comienza con la ubicación 0.

Ejemplo: la séptima columna y la segunda fila se mencionan como (6, 1).

lcd.imprimir():

Esta función se utiliza para imprimir un mensaje en la pantalla LCD.

lcd.print("Factory"); // Prints "Factory" on first row  delay(2000); // 2 seconds delay

lcd.setCursor(columna,fila):

Esta función coloca el cursor en la séptima columna y la segunda fila. La impresión de la cadena se mostrará desde esta ubicación en la pantalla LCD.

 lcd.setCursor(6,1); // Sets cursor column and row position   lcd.print("Forward"); //Prints ‘Forward’ on 7th column of 2nd row.

lcd.claro():

La pantalla LCD mantendrá los datos anteriores en sus registros. Debe borrarlo manualmente usando la función lcd.clear().

lcd.clear();

Cursor completo parpadeante:

Usando la función lcd.blink() podemos hacer que el cursor parpadee en la pantalla LCD. Para apagar el cursor parpadeante usamos la función lcd.noBlink().

lcd.blink(); //Blinking cursor  lcd.noBlink();  //Turns OFF blinking cursor

Cursores de subrayado:

Utilice la función lcd.cursor() para imprimir un símbolo de subrayado. También se utiliza para notificar a los usuarios que introduzcan algunos valores.

lcd.cursor(); // Prints an underscore symbol  lcd.noCursor(); Clears the underscore only.