Nota

Ciao, benvenuto nella community di appassionati di SunFounder Raspberry Pi, Arduino e ESP32 su Facebook! Esplora a fondo Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.

Perché unirsi?

  • Supporto esperto: Risolvi i problemi post-vendita e le sfide tecniche con l’aiuto della nostra community e del nostro team.

  • Impara e Condividi: Scambia consigli e tutorial per migliorare le tue abilità.

  • Anteprime esclusive: Accedi in anteprima agli annunci di nuovi prodotti.

  • Sconti speciali: Approfitta di sconti esclusivi sui nostri prodotti più recenti.

  • Promozioni e Regali: Partecipa a promozioni festive e concorsi con premi.

👉 Pronto a esplorare e creare insieme a noi? Clicca su [Qui] e unisciti oggi stesso!

1.1.7 LCD1602 I2C

Introduzione

LCD1602 è un display a cristalli liquidi che può visualizzare contemporaneamente 32 caratteri (16*2).

Componenti

../_images/list_i2c_lcd1.png

Principio

LCD1602 I2C

../_images/i2c_lcd16022.png
  • GND: Massa

  • VCC: Alimentazione, 5V.

  • SDA: Linea dati seriale. Collegare a VCC tramite una resistenza pull-up.

  • SCL: Linea di clock seriale. Collegare a VCC tramite una resistenza pull-up.

Gli LCD e altri display migliorano l’interazione uomo-macchina, ma condividono una debolezza comune: collegandoli a un controller, occupano molte porte IO, limitando altre funzionalità.

Per risolvere questo problema, LCD1602 è stato sviluppato con un modulo I2C. Questo modulo ha un chip PCF8574 integrato che converte i dati I2C seriali in dati paralleli per il display LCD.

Indirizzo I2C

L’indirizzo predefinito è solitamente 0x27, in alcuni casi può essere 0x3F.

Prendendo come esempio l’indirizzo 0x27, questo può essere modificato cortocircuitando i ponticelli A0/A1/A2; allo stato predefinito, A0/A1/A2 è impostato su 1, e se cortocircuitato è impostato su 0.

../_images/i2c_address2.jpg

Retroilluminazione/Contrasto

La retroilluminazione può essere attivata con un cappuccio jumper; rimuoverlo per disattivarla. Il potenziometro blu sul retro regola il contrasto (rapporto di luminosità tra bianco e nero).

../_images/back_lcd16022.jpg
  • Cappuccio Jumper: Abilita la retroilluminazione; rimuoverlo per disattivarla.

  • Potenziometro: Serve per regolare il contrasto (nitidezza del testo), aumentabile in senso orario e riducibile in senso antiorario.

Schema a Blocchi

T-Board Name

Physical

SDA1

Pin 3

SCL1

Pin 5

../_images/schematic_i2c_lcd1.png

Procedura Sperimentale

Passo 1: Monta il circuito.

../_images/image961.png

Passo 2: Configura I2C (vedi Configurazione I²C. Se I2C è già impostato, salta questo passo.)

Passo 3: Cambia la directory.

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

Passo 4: Compila.

gcc 1.1.7_Lcd1602.c -lwiringPi

Passo 5: Esegui.

sudo ./a.out

Dopo l’esecuzione del codice, sul display LCD appariranno le scritte «Greetings» e «From SunFounder».

Nota

  • Se appare l’errore wiringPi.h: No such file or directory, consulta Installazione e verifica di WiringPi.

  • Se ricevi l’errore Unable to open I2C device: No such file or directory, consulta Configurazione I²C per abilitare I2C e controlla il cablaggio.

  • Se il codice e il cablaggio sono corretti, ma l’LCD non visualizza nulla, regola il potenziometro sul retro per aumentare il contrasto.

Spiegazione del Codice

#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;
    // Invia i bit 7-4 per primi
    buf = comm & 0xF0;
    buf |= 0x04;                    // RS = 0, RW = 0, EN = 1
    write_word(buf);
    delay(2);
    buf &= 0xFB;                    // Imposta EN = 0
    write_word(buf);

    // Invia i bit 3-0 per secondi
    buf = (comm & 0x0F) << 4;
    buf |= 0x04;                    // RS = 0, RW = 0, EN = 1
    write_word(buf);
    delay(2);
    buf &= 0xFB;                    // Imposta EN = 0
    write_word(buf);
}

void send_data(int data){
    int buf;
    // Invia i bit 7-4 per primi
    buf = data & 0xF0;
    buf |= 0x05;                    // RS = 1, RW = 0, EN = 1
    write_word(buf);
    delay(2);
    buf &= 0xFB;                    // Imposta EN = 0
    write_word(buf);

    // Invia i bit 3-0 per secondi
    buf = (data & 0x0F) << 4;
    buf |= 0x05;                    // RS = 1, RW = 0, EN = 1
    write_word(buf);
    delay(2);
    buf &= 0xFB;                    // Imposta EN = 0
    write_word(buf);
}

void init(){
    send_command(0x33);     // Inizializza a modalità a 8 bit
    delay(5);
    send_command(0x32);     // Inizializza a modalità a 4 bit
    delay(5);
    send_command(0x28);     // 2 Linee & punti 5*7
    delay(5);
    send_command(0x0C);     // Abilita display senza cursore
    delay(5);
    send_command(0x01);     // Pulisci schermo
    wiringPiI2CWrite(fd, 0x08);
}

void clear(){
    send_command(0x01);     // Pulisci schermo
}

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;

    // Sposta il cursore
    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");
}

Spiegazione delle Funzioni

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[]){……}

Queste funzioni servono per controllare l’LCD1602 I2C con codice open source. Ci permettono di utilizzare facilmente l’LCD1602 I2C. Tra queste funzioni, init() viene usata per l’inizializzazione, clear() per pulire lo schermo, write() per scrivere ciò che deve essere mostrato, mentre le altre funzioni supportano le precedenti.

fd = wiringPiI2CSetup(LCDAddr);

Questa funzione inizializza il sistema I2C con il dispositivo specificato. Il prototipo della funzione è:

int wiringPiI2CSetup(int devId);

Il parametro devId è l’indirizzo del dispositivo I2C, reperibile tramite il comando i2cdetect (vedi Appendice); solitamente devId per LCD1602 I2C è 0x27.

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

In questa funzione, data[] è il testo da stampare sul display LCD, mentre i parametri x e y determinano la posizione di stampa (riga y+1, colonna x+1 come posizione di partenza del testo da stampare).