PCF8574P interfaccia i2C per display LCD

Qualche giorno fa Matteo Canetto mi ha scritto un’email raccontandomi il suo progetto e di alcuni test eseguiti con il PCF8574P interfaccia I2C per display LCD paralleli.

PCF8574P pinout

Ho chiesto a Matteo di raccontare e condividere la sua esperienza ed ho ricevuto via email la sua guida all’uso del PCF8574P, dei display LCD e tutte le foto che trovi in questo articolo.

Matteo sta lavorando ad un progetto ben più complesso del semplice controllo di un display LCD parallelo mediante connessione i2c, lo ha chiamato DomoticOne e spero presto possa ultimarlo e inviare foto, video e sketch del suo progetto.

Il progetto di Matteo con il PCF8574P

La guida scritta da Matteo è così ben fatta che la riporto senza interventi, buona lettura.

Oggi andremo a conosce l’integrato Pcf8574:

pcf8574

molto spesso sul nostro microcontrollore siamo a corto di pin.

Per risolvere questo problema ci sono vari modi,una buona soluzione è ricorrere a quei circuiti integrati chiamati IO Expander la cui funzione è quella di aumentare il numero di I/O a disposizione.

Il PCF8574 è un 8 bit e utilizza il protocollo I2C, che comunica utilizzando un’interfaccia a 2 fili seriale, in cui un filo è un clock seriale (SCL) e l’altro per i dati seriali (SDA).

Con questo IC, è possibile utilizzare solo 2 pin di Arduino per controllare fino a 8 ingressi o uscite digitali.

PCF8574P pinout

In questo tutorial vedremo come far comunicare il nostro display lcd ( io uso un 20×4  compatibile come  i classici 16×2 hd44780 )

PCF8574P 2004A-B-W102

Per fare tutto ciò abbiamo bisogno delle librerie appropriare chiamate  LiquidCrystal_I2C, dove all’interno troveremo tutto il necessario per collegare il display lcd dal datasheet dei componenti allo schema di montaggio, ad alcuni esempi per lo sketch.

Componenti:

  • di certo non deve mancare la nostra scheda arduino
  • l’integrato della famiglia PCF85743
  • un transistor BC557 con opportune resistenze ( la prima collegata al piedino b da 1KW e la seconda dipende dallo schema del lcd)
  • Il classico potenziometro usato per regolare il contrasto del display
Schema di montaggio:
questo è lo schema presente nella libreria, con una prova di montaggio fatta da me:
PCF8574 LCD
Mentre questo per semplificare ancora di più le cose l’ho creato io con Fritzing e con un editor di immagini:
PCF8574P i2c lcd schema
Come potete notare le due immagini sono nettamente differenti, ma portano allo stesso scopo.

Riassumendo lo schema vediamo che l’integrato ai pin 1-2-3-8 è collegato a GND, mentre 4-5-6-7 sono collegati al display ai pin 11-12-13-14, di seguito abbiamo pin 9-10-11 sempre collegati al display con i pin 6-5-4.

Colleghiamo il pin 12 alla resistenza da un 1KW, a sua volta collegata col transistor tramite il pin b con il pin c a +5V e il pin e col pin 15 del display. Per la comunicazione usiamo i pin 14 e 15 collegati ad arduino su gli ingressi analogici A5 e A4, il potenziometro collegato al pin 3 del display,e concludiamo con il pin 16 del PCF a +5v e pin 16 del display collegato a GND.

Con questa configurazione otterremo (con un classico PCF8574A) l’address 0x20, mentre con un PCF8574AP (come quello di questa guida) avremmo 0x38.

L’address ci serve per individuare il nostro integrato, perché volendo possiamo collegare 8 PCF tutti assieme ognuno con 8 ingressi o uscite, per un complessivo di ben 64 pin digitali I/O in più sul nostro arduino!!

Che ne dite?

Come integrato è molto utile.

Un piccolo consiglio per l’acquisto, troverete diverse sigle sui PCF a 16 pin come appunto A-AP-N-P ecc, praticamente sono tutti uguali, solo piccole variazioni tra costruttori riportati sui datasheet.

Un immagine che può tornare utile è quella qua sotto se si vuole conoscere i vari address, come noterete la nostra configurazione è L-L-L per ottenere 0x20 oppure 0x38 a seconda dell’integrato.

Faccio notare che L sta per GND mentre H sta per +5V.

PCF8574P configurazione indirizzo

Passiamo allo sketch, come detto prima abbiamo vari esempi all’interno della libreria, noi prenderemo quello chiamato “Hello World” e se necessario vi apporteremo varie modifiche come appunto l’address o il tipo del display, come noterete è assai semplice:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x20,16,2);  //    16x2 e il tipo del lcd - address 0x20 

void setup()
{
  lcd.init();                      // inizializza  lcd 

  // Stampa il messaggio su LCD.
  lcd.backlight();
  lcd.print("Hello, world!");
}
void loop()
{
}

Bene, siamo al termine di questo tutorial, come vedete il PCF8574 è un integrato molto versatile utile e compatto.

Ho realizzato una piccola shield per un mio progetto (il DomoticONE, progetto ancora da finire), l’intero circuito è racchiuso in appena 5x4cm ma volendo si fa può rimpicciolire:

DomoticOne

Spero di essere stato utile a tutti voi, mi resta solo che augurarvi di fare ancora una ottima esperienza col nostro arduino e con i PCF8574.

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/pcf8574p-interfaccia-i2c-display-lcd.html

44 comments

1 ping

Skip to comment form

    • alberto on 5 aprile 2013 at 10:48
    • Reply

    Ciao mauro, ero da tempo che cercavo una guida del genere, ora che matteo ha fatto questa guida sono riuscito a risolvere un problema che da giorni avevo con pochissimi soldi e una grande facilità.
    Saluti Alberto

    1. Grazie Alberto per il tuo commento.
      Sono certo che Matteo sarà contento di leggere i tuoi complimenti
      e stimolato a scrivere degli altri articoli interessanti.

      Mauro

    • Matteo on 6 maggio 2013 at 23:05
    • Reply

    Ciao Mauro,
    Grazie per questo e per tante altre utili guide che ho trovato su mauroalfieri.it
    Ho iniziato un progetto di domotica e gestione con arduino (ma sono principiante assoluto) e grazie a te ho trovato la soluzione a diversi problemi. Grazie!

    Matteo

    1. ciao Matteo,
      Il blog é quí anche per questo.

      Mauro

    • Andrea on 24 ottobre 2013 at 23:53
    • Reply

    Ciao 🙂 vorrei sapere se usando display di diversa grandezza, ad esempio il 20 x 4, che tipo di indirizzo di selezione I2C bisogna inserire. So che il 16×2 è il 0x20 e gli altri tipi di lcd ? esite una tabella ?
    Grazie 🙂

    1. Ciao Andrea,
      se leggi bene l’articolo vedrai che l’indirizzo da inserire non dipende dal tipo di display ma dalla configurazione dei pin A0,A1 e A2 presenti sul PCF8574

      Mauro

    • Andrea on 25 ottobre 2013 at 13:02
    • Reply

    ahhh ok ora ho capito… 🙂 ma per il 16×2 è obbligatorio inserire il 0x20? Grazie 🙂
    Niente mi rispondo da solo …. ho visto il tuo articolo 🙂 volevo chiederti invece se hai mai usato la shield Easy VR Grazie 🙂

    1. Ciao Andrea,
      personalmente no, c’è un ottimo tutorial nel mio blog dedicato alla Easy Vr, scritto da due ragazzi appassionati arduino.

      Mauro

    • Andrea on 25 ottobre 2013 at 17:40
    • Reply

    ok Grazie ancora 🙂

    • nicola on 2 dicembre 2013 at 17:22
    • Reply

    Ciao, stavo proprio cercando un circuito per pilotare un display 20×4 tramite I2C con Arduino e ho trovato il tuo articolo molto interessante. Visto però che tratti principalmente il display 16×2 (anche se dici che tu utilizzi un 20×4) mi sorge una domanda: per pilotare un display 20×4 il circuito elettrico è lo stesso o occorrono delle modifiche?
    Grazie
    nicola

    1. Ciao Nicola,
      se possiedi un circuito 24×4 con integrata già la parte I2C puoi utilizzare le librerie per qual tipo di display.
      Se vuoi realizzare tu il circuito con il PCF8574P assicurati che il display sia controllabile in modalità 4bit come i 16×2 e che il chip di gestione del display sia compatibile con il PCF8574

      Mauro

        • nicola on 3 dicembre 2013 at 11:23
        • Reply

        grazie per le tue indicazioni
        nicola

    • Andrea on 22 gennaio 2014 at 12:30
    • Reply

    Ciao e complimenti per il tuo blog…
    Quando un progetto amplifica le porte I/O del nostro Arduino è sempre un qualcosa di MOLTO positivo.
    Per quando abbia guardato su internet non riesco a reperire il transistor BC557, posso usarne qualcuno di equivalente?
    Grazie!

    1. Ciao Andrea,
      nella configurazione attuale anche il più semplice BC547 può andar bene.
      Mauro

      • Andrea on 22 gennaio 2014 at 19:12
      • Reply

      Proprio ora mi sono accorto che grazie all’acquisto del kit beginner Arduino originale sono in possesso di ben 5 bc547b, è equivalente?

      1. Ciao Andrea,
        in questa configurazione, come ti ho scritto, si.

        Mauro

          • Claudio on 1 agosto 2015 at 16:12
          • Reply

          Ciao, nel disegno dello schema elettrico l’emettitore del transistor è messo in posizione errata in quanto deve essere sul + 5 volts … sempre che si tratti di un BC557 …
          … se invece si tratta di un BC547, la posizione della freccia dell’emettitore è corretta ma invertita perché deve essere uscente …. tutto questo poiché il BC 547 ed il BC557 non sono equivalenti in quanto il primo è un NPN ed il secondo è PNP …
          sono utilizzabili entrambi apportando però le opportune modifiche al circuito ed al codice poiché NPN va in saturazione con uno stato logico High sulla base, mentre PNP va in saturazione con uno stato logico Low …

          Il post è datato, tuttavia ti segnalo questo poiché qualcuno potrebbe comunque usufruire delle tue preziose indicazioni …
          Ciao.

          1. Ciao Claudio,
            grazie mille delle precisazioni sono sempre utilissime e di grande aiuto.
            Non mi ero accorto dell’errore, non avendo disegnato io il progetto non ne possiedo il disegno originale per correggerlo.
            Lascio all’autore dell’articolo la possibilità di mandarmi la correzione, eventualmente la disegnerò personalmente per non lasciare errori a chi desidera seguire questa guida.

            Grazie.

    • valerio on 2 febbraio 2014 at 14:23
    • Reply

    Ciao e scusate la domanda sciocca, ma con questa configurazione il backlight ha la funzionalità on off o si può anche fare una sorta di regolazione?
    Grazie

    1. Ciao Valerio,
      con questa configurazione non penso sia possibile a causa della mancanza del controllo di tipo PWM sul pin a cui è collegata la retro illuminazione. Se colleghi la retro illuminazione ad un pin PWM di arduino potresti controllarla se il tuo display la supporta.

      Mauro

        • valerio on 3 febbraio 2014 at 21:18
        • Reply

        Grazie mille della risposta. Ok allora attacchero il controllo D11 e farò un comando apparte.
        Grazie di nuovo.

        1. Ottimo Valerio.

            • valerio on 8 febbraio 2014 at 22:34

            Scusa di nuovo, ma se io volessi mettere una resistenza variabile in serie a R1 (R1 -> resistenza variabile pin 1 e pin2 -> pin15 e il pin 3 scollegato).
            Ho provato con una resistenza variabile da 470 ma non varia abbastanza ho provato con una da 4K7 ma non a variazione.
            Sbaglio o devo provare con valori tipo 1K o ?

          1. Ciao Valerio,
            per resistenza variabile intendi un potenziometro?
            Io utilizzo il classico 10k ma penso che anche il tuo 4,7k possa andar bene per regolare il contrasto.

            Mauro

    • Valerio on 10 febbraio 2014 at 18:26
    • Reply

    Grazie mille ma non per il contrasto; R1 e la retroilluminazione.
    Avendo un R1=470 e in serie un potenziometro da 4K7 collegato solo tra il pin 1 e il 2 (tenendo il 3 pin scollegato) va bene o ho fatto errore e rischio di rompere tutto per le correnti che girano? Sono un aggeggione, ma non tanto pratico, scusa di nuovo.

    1. Ciao Valerio,
      ad occhio penso che danni non dovresti farne, tuttavia è solo una via teorica non avendo io in mano ne i tuoi componenti ne la possibilità di fare dei test con degli strumenti specifici prima di collegare il tutto.

      Mauro

        • Valerio on 11 febbraio 2014 at 18:13
        • Reply

        Grazie mille, ho provato e per ora funziona.
        Grazie di tutto.

        1. Ottimo Valerio.

          Mauro

    • Andrea on 30 marzo 2014 at 13:24
    • Reply

    Ciao Mauro,
    finalmente sono riuscito a reperire tutti i componenti anche io ho usato un PCF8574AP, un transistor BC547B e un LCD 16×2, questi ultimi componenti reperiti dal kit beginner di Arduino.

    Ho montato il progetto ed inserito la resistenza da 1k tra il pin 13 del PCF e il centrale del transistor, inoltre ho inserito la resistenza da 220 tra il pin 15 dell’lcd e il pin e del transistor come specificato.

    Essendo un AP ho usato l’address 0x38.

    Funziona tutto alla grande solo una cosa è anomala:
    l’istruzione lcd.backlight() spegne la retroilluminazione invece di accenderla!!!

    Quale errore ho commesso?

      • Andrea on 30 marzo 2014 at 13:34
      • Reply

      logicamente l’istruzione lcd.noBacklight() fa accendere la retroilluminazione.
      Non è un problema, basta tenerne condo nel proprio progetto, volevo solo correggere un mio eventuale errore!
      Grazie

      1. Si Andrea, comprendo l’interesse.

    1. Ciao Andrea,
      non ho provato a utilizzare il metodo lcd.blacklight() probabilmente porta il pin LOW invece di portarlo HIGH.
      Oppure potresti aver collegato il transistor in modo che agisca sul pin negativo della retroilluminazione.

    • Matteo on 2 febbraio 2016 at 22:35
    • Reply

    Ciao Mauro,
    Innanzitutto ti faccio i complimenti per la tua guida.
    Io ho un problema con un display 16×2 comandato con i2c.
    Utilizzando un qualsiasi sketch, anche il più semplice, il display mi mostra solamente la prima lettera della parola.
    Per intenderci se gli dico di scrivere “Ciao”, lui scrive solo la “C”. Questo vale anche per i numeri. Mentre invece tutte le altre funzioni tipo clear, cursor o backlight funzionano correttamente.
    Il mio display è pilotato da un PCF8574AT.

    Secondo te a cosa può essere dovuto?
    Potrebbe essere un problema di librerie?

    Ti ringrazio anticipatamente.
    Ciao.

    1. Ciao Matteo,
      non sei il primo che segnala questo comportamento, se leggi nei commenti devo aver già dato più di un suggerimento da seguire.

      • Masismo on 15 gennaio 2017 at 20:44
      • Reply

      ciao, hai risolto il tuo problema, dalla descrizione ne ho uno uguale.
      ho provato a leggere i commenti passati come dice Mauro, ma io non ho trovato spiegazioni per la risoluzione del problema.
      Grazie per l’aiuto che mi puoi dare

      1. Ciao Masismo,
        lascio il commento per Matteo.

    • Masismo on 15 gennaio 2017 at 21:46
    • Reply

    Ciao, io ho risolto il problema.
    con l’ide 1.6.9 sono andato dulla gestione delle librerie ed ho installato la libreria liquidcrista_i2c di frank brabander. cliccando sul tasto more info ti apre questa pagina web.
    https://github.com/marcoschwartz/LiquidCrystal_I2C

    spero di essere stato d’aiuto

    1. Ciao Masismo,
      si la libreria di Marco S. è quella ufficiale inclusa nell’IDE arduino.
      Io consiglio di scaricarla direttamente dall’IDE.

    • Seby on 12 aprile 2017 at 23:20
    • Reply

    Ciao come posso fare a capire se il mio lcd può supportare il modulo i2C?
    L’ho acquistato da poco ma non riesco a farlo funzionare.

    1. Ciao Seby,
      perdonami ma non ho capito la domanda 🙂
      Hai un display di che tipo, con che driver di controllo? l’I2C è a parte o integrato?

  1. Ciao Mauro, mi chiamo Fabiano e sono un appassionato di elettronica. Sto realizzando una scheda con arduino nano che mi gestisce un diplay LCD con interfaccia I2C, gestita tramite la libreria LiquidCrystal_I2C e che funziona perfettamente con il PCF8574AT. Ora vorrei inserire nello stesso bus, IC PCF8574T per gestire 4 uscite e leggere 4 ingressi digitali, ma non riesco a configurare il secondo IC sia per leggere che per scrivere le uscite.
    Il Display è configurato con ADRESS ( 0x38 ) A0=Vdd-A1=gnd-A2=gnd, mentre il secondo IC ADRESS ( 0x20 ) A0=gnd-A1=gnd-A2=gnd.
    Nel Setup di Arduino ho inizializzato il dispalay
    ( LiquidCrystal_I2C lcd(0x39,16,2); // set the LCD address to 0x39 for a 16 chars and 2 line

    Wire.begin

    e nel Loop() visualizzo dati sul display.
    Vorrei anche leggere lo stato degli ingressi e di conseguenza attivare le uscite con delle logiche.

    Parte di codice che ho scritto : queste due funzioni vengono richiamata dal main loop().

    Mi potresti dare consigli in merito ? Grazie anticipatamente.

    [[ codice rimosso in automatico ]]

    1. Ciao Fabiano,
      in primo luogo ti invito alla lettura e rispetto delle regole del blog scritte in fondo ad ogni articolo.
      In merito alla tua richiesta non ho capito alcune cose:
      1. “Il Display è configurato con ADRESS ( 0x38 )” e poi mi scrivi “LiquidCrystal_I2C lcd(0x39,16,2)” dov’è l’errore?
      2. “Parte di codice che ho scritto : queste due funzioni vengono richiamata dal main loop().” e non funzionano? che errori ti danno? il monitor seriale ti da qualche info su cosa accade?

      1. Ciao Mauro, ti ringrazio per la risposta al mio post.
        Ho finalmente sistemato il mio problema e ti spiego : Il display è configurato con ADDRESS ( 0x38 ) nel codice avevo provato a cambiare indirizzo del display pensando che andassero in conflitto con il secondo IC.

        L’errore del non funzionamento stava nel PCB che ho realizzato in quanto il comune dei Jumper che impostano l’indirizzo al PCF8574T/3 era solo collegati tra di loro e non verso massa, quindi l’intergato con aveva ADDRESS !.
        Sistemato questo collegamento ha subito iniziato a funzionare la parte del I/O Expander.
        GRazie

        1. Grazie Fabiano per la condivisione, sarà di certo utile ad altri.

  1. […] in passato ho pubblicato un articolo scritto da Matteo, un appassionato arduino, in cui un display lcd 1602 collegato ad un pcf8574p potevi controllarlo […]

Lascia un commento

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.