Nota

¡Hola, bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi & Arduino & ESP32 en Facebook! Sumérgete en el mundo de Raspberry Pi, Arduino y ESP32 con otros entusiastas.

¿Por qué unirte?

  • Soporte de expertos: Resuelve problemas post-venta y desafíos técnicos con la ayuda de nuestra comunidad y equipo.

  • Aprende y comparte: Intercambia consejos y tutoriales para mejorar tus habilidades.

  • Acceso exclusivo: Obtén acceso anticipado a nuevos anuncios de productos y adelantos.

  • Descuentos especiales: Disfruta de descuentos exclusivos en nuestros productos más recientes.

  • Promociones festivas y sorteos: Participa en sorteos y promociones especiales de temporada.

👉 ¿Listo para explorar y crear con nosotros? Haz clic en [Aquí] y únete hoy mismo.

1.1.7 I2C LCD1602

Introducción

El LCD1602 es una pantalla de cristal líquido de tipo carácter, que puede mostrar 32 caracteres (16*2) al mismo tiempo.

Componentes

_images/list_i2c_lcd.png

Principio

LCD1602 I2C

_images/i2c_lcd1602.png
  • GND: Tierra

  • VCC: Fuente de voltaje, 5V.

  • SDA: Línea de datos serial. Conectar a VCC mediante una resistencia pull-up.

  • SCL: Línea de reloj serial. Conectar a VCC mediante una resistencia pull-up.

Como sabemos, aunque las pantallas LCD y otras enriquecen la interacción hombre-máquina, comparten una debilidad común: al conectarse a un controlador, ocupan múltiples pines de E/S, limitando otras funciones del controlador.

Por ello, el LCD1602 con un módulo I2C se desarrolló para resolver este problema. El módulo I2C tiene un chip I2C PCF8574 incorporado que convierte datos seriales I2C en datos paralelos para el LCD.

Dirección I2C

La dirección predeterminada es generalmente 0x27, aunque en algunos casos puede ser 0x3F.

Tomando la dirección predeterminada de 0x27 como ejemplo, la dirección del dispositivo se puede modificar uniendo los pines A0/A1/A2; en el estado predeterminado, A0/A1/A2 están en 1, y si el pin se une, A0/A1/A2 están en 0.

_images/i2c_address.jpg

Retroiluminación/Contraste

La retroiluminación se puede habilitar con un puente (jumper cap); quita el puente para desactivar la retroiluminación. El potenciómetro azul en la parte posterior se usa para ajustar el contraste (la relación entre el blanco más brillante y el negro más oscuro).

_images/back_lcd1602.jpg
  • Puente de conexión: La retroiluminación se puede activar con este puente; al retirarlo, la retroiluminación se desactiva.

  • Potenciómetro: Se usa para ajustar el contraste (la claridad del texto mostrado), que aumenta en dirección de las agujas del reloj y disminuye en sentido contrario.

Diagrama Esquemático

T-Board Name

physical

SDA1

Pin 3

SCL1

Pin 5

_images/schematic_i2c_lcd.png

Procedimientos Experimentales

Paso 1: Construye el circuito.

_images/image96.png

Paso 2: Configura I2C (consulta Configuración de I2C. Si ya has configurado I2C, omite este paso.)

Para Usuarios de Lenguaje C

Paso 3: Cambia de directorio.

cd ~/davinci-kit-for-raspberry-pi/c/1.1.7/

Paso 4: Compila.

gcc 1.1.7_Lcd1602.c -lwiringPi

Paso 5: Ejecuta.

sudo ./a.out

Después de ejecutar el código, verás «Greetings»,»From SunFounder» en el LCD.

Nota

  • Si aparece un error wiringPi.h: No such file or directory, consulta Instalar y Verificar wiringPi.

  • Si obtienes Unable to open I2C device: No such file or directory, consulta Configuración de I2C para habilitar I2C y verificar que el cableado sea correcto.

  • Si el código y el cableado están correctos pero el LCD no muestra contenido, ajusta el potenciómetro en la parte posterior para aumentar el contraste.

Código

#include <stdio.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>
#include <string.h>

int LCDAddr = 0x27;
int BLEN = 1;
int fd;

void write_word(int data){
    int temp = data;
    if ( BLEN == 1 )
        temp |= 0x08;
    else
        temp &= 0xF7;
    wiringPiI2CWrite(fd, temp);
}

void send_command(int comm){
    int buf;
    // Enviar bits 7-4 primero
    buf = comm & 0xF0;
    buf |= 0x04;                    // RS = 0, RW = 0, EN = 1
    write_word(buf);
    delay(2);
    buf &= 0xFB;                    // Hacer EN = 0
    write_word(buf);

    // Enviar bits 3-0 después
    buf = (comm & 0x0F) << 4;
    buf |= 0x04;                    // RS = 0, RW = 0, EN = 1
    write_word(buf);
    delay(2);
    buf &= 0xFB;                    // Hacer EN = 0
    write_word(buf);
}

void send_data(int data){
    int buf;
    // Enviar bits 7-4 primero
    buf = data & 0xF0;
    buf |= 0x05;                    // RS = 1, RW = 0, EN = 1
    write_word(buf);
    delay(2);
    buf &= 0xFB;                    // Hacer EN = 0
    write_word(buf);

    // Enviar bits 3-0 después
    buf = (data & 0x0F) << 4;
    buf |= 0x05;                    // RS = 1, RW = 0, EN = 1
    write_word(buf);
    delay(2);
    buf &= 0xFB;                    // Hacer EN = 0
    write_word(buf);
}

void init(){
    send_command(0x33);     // Inicializar en modo de 8 líneas primero
    delay(5);
    send_command(0x32);     // Luego inicializar en modo de 4 líneas
    delay(5);
    send_command(0x28);     // 2 Líneas y puntos 5*7
    delay(5);
    send_command(0x0C);     // Activar pantalla sin cursor
    delay(5);
    send_command(0x01);     // Limpiar pantalla
    wiringPiI2CWrite(fd, 0x08);
}

void clear(){
    send_command(0x01);     // Limpiar pantalla
}

void write(int x, int y, char data[]){
    int addr, i;
    int tmp;
    if (x < 0)  x = 0;
    if (x > 15) x = 15;
    if (y < 0)  y = 0;
    if (y > 1)  y = 1;

    // Mover cursor
    addr = 0x80 + 0x40 * y + x;
    send_command(addr);

    tmp = strlen(data);
    for (i = 0; i < tmp; i++){
        send_data(data[i]);
    }
}


void main(){
    fd = wiringPiI2CSetup(LCDAddr);
    init();
    write(0, 0, "Greetings!");
    write(1, 1, "From SunFounder");
}

Explicación del Código

void write_word(int data){……}
void send_command(int comm){……}
void send_data(int data){……}
void init(){……}
void clear(){……}
void write(int x, int y, char data[]){……}

Estas funciones se utilizan para controlar el código fuente abierto del I2C LCD1602. Nos permiten usar fácilmente el I2C LCD1602. Entre estas funciones, init() se utiliza para la inicialización, clear() para limpiar la pantalla, write() para escribir lo que se muestra, y las demás funciones brindan soporte a las anteriores.

fd = wiringPiI2CSetup(LCDAddr);

Esta función inicializa el sistema I2C con el dispositivo especificado. La función tiene el siguiente prototipo:

int wiringPiI2CSetup(int devId);

El parámetro devId es la dirección del dispositivo I2C, que se puede encontrar a través del comando i2cdetect (ver el Apéndice). Generalmente, el devId del I2C LCD1602 es 0x27.

void write(int x, int y, char data[]){}

En esta función, data[] es el carácter que se imprimirá en el LCD, y los parámetros x e y determinan la posición de impresión (la línea y+1, columna x+1 es la posición inicial del carácter a imprimir).

Para Usuarios de Python

Paso 3: Cambiar de directorio.

cd ~/davinci-kit-for-raspberry-pi/python/

Paso 4: Ejecutar.

sudo python3 1.1.7_Lcd1602.py

Después de ejecutar el código, puedes ver "Saludos","De SunFounder" en el LCD.

Nota

  • Si obtienes el error FileNotFoundError: [Errno 2] No such file or directory: '/dev/i2c-1', debes consultar Configuración de I2C para habilitar el I2C.

  • Si obtienes el error ModuleNotFoundError: No module named 'smbus2', por favor ejecuta sudo pip3 install smbus2.

  • Si aparece el error OSError: [Errno 121] Remote I/O, significa que el módulo está mal conectado o está dañado.

  • Puedes intentar ajustar el potenciómetro en la parte posterior si el código y el cableado están correctos, pero el LCD aún no muestra el contenido.

Código

Nota

Puedes Modificar/Restablecer/Copiar/Ejecutar/Detener el código a continuación. Antes de eso, debes ir a la ruta del código fuente como davinci-kit-for-raspberry-pi/python.

import LCD1602
import time

def setup():
    LCD1602.init(0x27, 1)   # init(dirección del esclavo, luz de fondo)
    LCD1602.write(0, 0, 'Greetings!!')
    LCD1602.write(1, 1, 'from SunFounder')
    time.sleep(2)

def destroy():
    LCD1602.clear()

if __name__ == "__main__":
    try:
        setup()
    except KeyboardInterrupt:
        destroy()

Explicación del Código

import LCD1602

Este archivo es un archivo de código abierto para controlar el I2C LCD1602. Nos permite usar fácilmente el I2C LCD1602.

LCD1602.init(0x27, 1)

La función inicializa el sistema I2C con el dispositivo designado. El primer parámetro es la dirección del dispositivo I2C, que se puede detectar a través del comando i2cdetect (consulta el Apéndice para más detalles). Generalmente, la dirección del I2C LCD1602 es 0x27.

LCD1602.write(0, 0, 'Greetings!!')

Dentro de esta función, '¡Saludos!' es el texto que se imprimirá en la fila 0+1, columna 0+1 en el LCD. Ahora puedes ver "¡Saludos! De SunFounder" en el LCD.

Imagen del Fenómeno

_images/image97.jpeg