Imaginem una classe en un institut o universitat: El professor fa una exposició sobre un tema i els alumnes quan tenen un dubte l'expressen en veu alta. Molt probablement el professor haurà de reprendre la seva exposició diverses vegades a causa de les interrupcions, o potser es perd alguna de les consultes perquè més d'un alumne parla alhora. Davant del desordre, el professor acorda amb els alumnes que per poder continuar de manera més ordenada: cada vegada que tinguin un dubte, han d'aixecar la mà i ell, quan tanqui la idea que està explicant, els dirà, en ordre, qui pot fer la consulta. Aquest acord que respecten ambdues parts, professor i alumnes, es pot definir com un protocol de comunicació.
Sovint en els nostres projectes haurem de comunicar-nos entre diversos dispositius (processadors i altres circuits integrats). Per tal que aquests circuits individuals intercanvien la seva informació, han de compartir un protocol de comunicació comú. S'han definit molts protocols de comunicació per aconseguir aquest intercanvi de dades i, essencialment, cada un pot ubicar-se en una de les dues categories: 1. Paral·lel o 2. Sèrie.
En les comunicacions paral·leles es transmeten múltiples bits simultàniament. En general, requereixen busos de dades que es transmeten a través de vuit, setze o més cables.
En canvi, en les comunicacions sèrie només es transmet un bit a la vegada. Aquestes interfícies poden operar amb tan sols un cable.
Al llarg dels anys, s'han creat dotzenes de protocols en sèrie per satisfer les necessitats particulars dels sistemes integrats. USB (Universal Serial Bus = Bus Sèrie Universal) i Ethernet són dos dels més coneguts. Altres molt comuns són SPI (de l'anglès Serial Peripheral Interface), I2C (de l'anglès Inter-Integrated Circuit) i el protocol sèrie estàndard TX/RX. Aquestes protocols sèrie es poden classificar en dos grups: sincrònic o asincrònic.
SPI i I2C són sincrònics. Una interfície sèrie sincrònica sempre necessita tenir un senyal de rellotge al costat de les línies de dades, de manera que tots els dispositius en un bus sèrie sincrònic comparteixen un pols comú de rellotge. Això fa que sigui una transferència en sèrie més directa, sovint més ràpida, també que es requereixi com a mínim un cable addicional entre els dispositius de comunicació.
TX/RX és asincrònic. Asincrònic significa que les dades es transfereixen sense el suport d'un senyal de rellotge connectat entre sistemes. Aquest mètode de transmissió és ideal per minimitzar els cables necessaris, i per tant la quantitat de pins utilitzats, però implica que hem de posar una mica d'esforç addicional a transferir i rebre dades de manera fiable.
La comunicació a través d'I2C es realitza a través de dos cables: un rellotge (normalment marcat com a SCL) i un canal de dades (normalment marcat SDA). Aquests s'han de connectar a pins específics del microcontrolador. Fes una ullada al diagrama de pins del teu microprocessador per veure quins pots utilitzar.
A nivell de programació, haurem d'importar la classe I2C del mòdul machine i crear objectes I2C definint quin és el pin SCL i SDA que utilitzem.
Les pantalles LCD (cristall líquid) es poden connectar al microcontrolador en paral·lel (8 cables de dades) o amb un adaptador I2C (1 cable de dades i 1 pel rellotge). Les LCD basades en I2C són, en general, molt més fàcils d'utilitzar i requereixen menys cablejat, però costen més que les paral·leles.
Encara que hi ha una gran varietat de display LCD, molts comparteixen el mateix xip controlador: el HD44780 de Hitachi. Hi ha pantalles de diferents mides però les més habituals són les de 2 files i 16 columnes. A nivell d'alimentació, les pantalles, en general, necessiten 5V per treballar correctament (usarem el pin Vin).
Programar una LCD és una tasca complexa que requereix una bona comprensió de les operacions internes dels controladors de l'LCD. Per sort, ja hi ha qui ha desenvolupat algunes llibreries que ens permeten simplificar la programació de les LCD, tant si estan connectades en paral·lel com en sèrie.
Per a aquest projecte necessitarem dues biblioteques: lcd_api.py i i2c_lcd.py . Copieu aquestes dues biblioteques i deseu-les al vostre dispositiu MicroPython amb els noms de fitxer respectius. Obre un fitxer nou a Thonny. Copieu les biblioteques des dels enllaços anteriors. Deseu-los a ESP32/ESP8266 amb els noms lcd_api.py i i2c_lcd.py a la carpeta lib.
El primer que haurem de fer és mirar a quina adreça del bus i2c tenim connectat el dispositiu amb el que ens volem comunicar, per fer-ho utilitzarem el mètode .scan() de l'objecte I2C.