Domotica Arduino Integr disp generici Display
From Aino Wiki
Contents
Display a segmenti
(Segment Led Display oppure Digial Tube LED Display) Sono utilizzati per rappresentare dei caratteri più che altro numerici. I più semplici sono a 7 segmenti, altrimenti ad 8 dove l'ottavo è per illuminare un punto che ha la funzione della virgola.Ad esempio, il display con 8 led usa 10 pin disposti in parallelo, sul lato più lungo del dispositivo oppure sul più corto e comunque la colonna centrale di due pin (posti uno di fronte l'altro nelle due file opposte) ha l'+ anodo o il - catodo in comune (dipende dal modello).Suponendo di volerlo collegare ad Arduino Uno, indipendentemente dal anodo\canodo comune stando le cose come esposto dovremmo usare ben 8 pin per rappresentare un carattere, c'è una alternativa ovvero usare un chip che faccia da "driver di pilotaggio". I chip da usare potrebbero essere SN7447 avendo l'anodo in comune oppure il CD4511 se è il catodo in comune, entrambi sono componenti logici che effettuano la traduzuione decimale-binario (BCD Binary-coded Decimal).
Uso del SN7447
Chip della serie 74xx adatto per i display a led di 7 segmenti per mostrare i numeri da 0 a 9.Ad esempio il modello 5611BH ha in comune l'anodo, il +, supponendo di collegare il circuito integrato SN7447. Video di Paolo Aliverti qui
La seguente tabella dovrebbe agevolare il lavoro tracciando pin del display con i pin del driver di pilotaggio SN7447, i colori sono quelli usati per il collegamento:
| Pin del display | Colore filo | Pin del SN7447 | Descrizione |
|---|---|---|---|
| 1 - e | Rosso | 9 | |
| 2 - d | Giallo | 10 | |
| 3 | - | non collegato | E' dell'alimentazione ma è comunque collegato sul pin 8. |
| 4 - c | Arancione | 11 | |
| 5 - DP | - | non collegato | Sarebbe il punto in basso a destra ma in questo esempio non lo usiamo. |
| 6 - b | Verde | 12 | |
| 7 - a | Blu | 13 | |
| 8 - Vcc | - | non collegato | Alimentazione 5V collegato direttamente a dispositivo di alimentazione. |
| 9 - f | Nero | 15 | |
| 10 - g | Bianco | 14 |
Collegandolo ad un Arduino useremo 4 pin digitali ovvero da 10 a 13 più un GND da collegare al piedino 8 del chip SN7447. Arduino accenderà un elemento per volta la lo fa così rapido che sembrerà che tutti segmenti si accendino contemporaneamente. Una variante è quella di collegare un transistor bipolare BC327' di tipo PNP, esso agirà come un interrittore sul display collegando la (B)ase ad es ad un pin di arduino attraverso una resistenza, l'(E)mettitore ai 5V e il (C)ollettore all'anodo comune.
Per capire come il SN7447 accenderà i segmenti per rappresentare i numeri da 0 a 9 seguire la seguente tabella:
Dalla colonna A all D sono gli input al chip proveniente dai pin di Arduino da 10 a 13, sulla colonna Display abbiamo il numero da rappresentare
| linea D | linea C | linea B | linea A | Display |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 1 | 1 |
| 0 | 0 | 1 | 0 | 2 |
| 0 | 0 | 1 | 1 | 3 |
| 0 | 1 | 0 | 0 | 4 |
| 0 | 1 | 0 | 1 | 5 |
| 0 | 1 | 1 | 0 | 6 |
| 0 | 1 | 1 | 1 | 7 |
| 1 | 0 | 0 | 0 | 8 |
| 1 | 0 | 0 | 1 | 9 |
Test di funzionamento codifica numeri
Prima di collegare Arduino potremmo fare delle prove\verifiche usando 3 pin del driver di pilotaggio SN7447 che non useremo a regime; sono quelli etichettati con DT (o LT lamp test), BO e BI.
| Numero da testare | Pin SN7447 a 5V | Pin SN7447 a GND |
|---|---|---|
| 1 | 7 - linea A | Tutti i restatnti |
| 2 | 1 - linea B | Tutti i restatnti |
| 3 | 1 - linea B + 7 linea A | Tutti i restatnti |
| 4 | 2 - linea C | |
| 5 | 2 - linea C + 7 linea A | |
| 6 | 1 - linea B + 2 - linea C | |
| 7 | 1 - linea B + 2 linea C + 7 linea A | |
| 8 | 6 - linea D | |
| 9 | 6 - linea D + 7 - linea A | |
| 0 | Nessuno | Tutti |
Sketch
La scrittura di 10 numeri avviene grazie ad un ciclo su una variabile globale int count che assumerà valori da 0 a 15, di questi 16 valori decimali estrarremo i primi 4 bit che saranno in parallelo gli input ai 4 pin del chip SN7447 ovvero A,B,C,D come nella tabella di prima, così rappresenteremo i 10 numeri.
Per leggere i bit sulla variabile count useremo la funzione:
byte val = bitRead(numero, bit_da_leggere); Legge un singolo bit di un numero, la posizione si legge dal meno significativo (più a dx) muovendosi verso sx.
#include <Arduino.h> int count = 0 ; // variabile globale per generare le cifre da visualizzare void setup() { Serial.begin(9600); while (!Serial) { } // Imposto i pin di uscita: pinMode(10, OUTPUT); // Pin A del chip SN7447 pinMode(11, OUTPUT); // Pin B del chip SN7447 pinMode(12, OUTPUT); // Pin C del chip SN7447 pinMode(13, OUTPUT); // Pin D del chip SN7447 } void loop() { /* Estraggo i primi 4 bit della variabile count come da seguente tabella: Count | D C B A 0 | 0 0 0 0 1 | 0 0 0 1 2 | 0 0 1 0 3 | 0 0 1 1 4 | 0 1 0 0 5 | 0 1 0 1 */ Serial.print("Count: "); Serial.println(count); // bitRead restituisce il valore del bit in posiz specificata del nr decimanle count // si parte dal bit in posiz da 0, bit meno significativo (tutto a dx) muovendosi verso sx int a = bitRead(count, 0); // Estrazione del bit A int b = bitRead(count, 1); // Estrazione del bit B int c = bitRead(count, 2); // Estrazione del bit C int d = bitRead(count, 3); // Estrazione del bit D Serial.print("A: "); Serial.print(a); Serial.print(" B: "); Serial.print(b); Serial.print(" C: "); Serial.print(c); Serial.print(" D: "); Serial.println(d); // Invio dei valori ai pin di uscita di Arduino: digitalWrite(10, a); digitalWrite(11, b); digitalWrite(12, c); digitalWrite(13, d); count++; if (count = 10) { // Resetto sull'ultimo numero utile alla rappresentazione count = 0; Serial.println("Reset count to 0"); } delay(1000); }
Progetto:
Risultato finale:
Evoluzione
Esistono display a segmenti più grandi e con ulteriori funzionalità e semplificazioni.
Materiale:
- Tra i modelli disponibili c'è il 5641BH, ATA8041AB;
- Tutorial per il collegamento ad Arduino del ATA8041AB, da instructables.com.
Display
Usare un display LCD (Compatibile Hitachi 44780 16 colonne per 2 righe) (video di Paolo Aliverti)
Documentazione ufficiale arduino.cc
Risultato finale di un esempio basico:
Come si vede nella foto si è usato un Arduino R4 clone ma la configurazione è identica anche con un Arduino R3.
| Pin Display | Pin Arduino | Descrizione pin del display |
|---|---|---|
| 1 - GND o VSS | GND | Al pin GN di Arduino |
| 2 - VDD-VCC | 5V | Al pin 5V per alimentare il display |
| 3 - V0 (Contrasto) | Trimmer da 10KΩ | Il trimmer è posto tra 5V e GND, consiglio tenerlo al massimo ovvero > tensione. |
| 4 - RS (Register Select) | 12 | Determina il comportamento del display, nello stato basso (LOW) il display è in "command mode" altrimenti è allo stato alto (HIGH) e nella modalità "data mode". Lo gestirà la libreria (LiquidCrystal.h) di Arduino in modo trasparente. |
| 5 - RW (Read/Write) | GND | Se collegato a GND, corrente in stato LOW, il display è in "write mode" quindi riceve dati da scrivere, se collegato a 5V è in modalità "read mode" per leggere quel che il display stà visualizzando (caso raro). |
| 6 - E (Clock enable) | 11 | Il display può elaborare dati solo il clock interno è abilitato e "da il tempo al chip", quindi alla fine questo PIN abilita o disabilita il display. |
| 7-8 - DB0-DB7 | 4,3,2,1 | Sono i pin dei dati per le operazioni di scrittura. |
| 9-10 ? | - | ? Sono i pin dei dati. |
| 15 - LED+ | 5V | Regola la retro illuminazione, riceve 5V. |
| 16 - LED- | GND | Per la retro illuminazione si collega al negativo. |
Schema di collegamento:
Sketch
Prima di creare il seguente sketch di esempio, includere la libreria standardLiquidCrystal:#include <LiquidCrystal.h> // Setup con i corrispondenti pin di Arduino: lcd(RegisterSelect,ClockEnable, D4,D5,D6,D7) LiquidCrystal lcd(12,11, 5,4,3,2); int contatore = 0; void setup() { // Display tipico 216 colonne x 2 righe // compatibile Hitachi 44780 lcd.begin(16,2); lcd.print("Conteggio:"); } void loop() { lcd.setCursor(0,1); lcd.print(contatore); contatore++; delay(1000); }
Adattatore I2C
Nel collegare dispositivi I2C per semplificare i collegamenti e ridurre i pin necessari su Arduino si potrà usare il seguente adattatore interfaccia seriale PCF8574 della Texas Instruments. (Guida estrapolata da lastminuteengineers.com lastminuteengineers.com). Questo adattatore accanto al display ha un chip che converte i dati I2C da Arduino in dati in parallelo per la comunicazione, in questo caso, col display LCD.- Su una estremità della scheda c'è un ponticello/jumper su due pin per far sì che sia alimentata la retroilluminazione.
- Poiché è previsto che ci possan essere più adattatori (per I2C device) insieme allora sarà necessario, per ciascuno definire l'indirizzo di riferimento e questo si fa agendo su una delle tre coppie di jumpers (etichettati con A0, A1, A2 e che sono accanto al trimmer) mettendoli in corto (unendo i due punti). Se è l'unico adattatore non si fa nulla.
Collegamenti
| Adattatore con PCF8574 | Arduino R4 | Arduino R4 o R3 |
|---|---|---|
| VCC | 5V | 5V |
| GND | GND | GND |
| SCL | SCL | A5 (pin anaologico) |
| SDA | SDA | A4 (pin anaologico) |
NOTA al primo caricamento potrebbe capitare di:
- aver invertito qualche filo, non succede nulla al più si vedranno dei caratteri strani sul display.
- altra cosa importante regolare il contrasto perché se non si vedesse nulla il problema potrebbe essere questo * altro motivo per non vedere nulla o avere il display spento potrebbe essere la assenza del ponticello sui due pin laterali.
- infine, se avete sbagliato indirizzo al primo parametro nella istanziazione della libreria il display rimarrà bianco.
Determinare l'indirizzo I2C
Sketch
Determinare l'indirizzo I2C
Per scrivere sul display occrre un indirizzo di memoria da fornire nello sketch e potrebbe variare da 0x27 a 0x3F (il default dovrebbe essere 0x27, sostanzialmente le posizioni decimali da 1 a 126). Questa informazione dovrebbe esser fornita nelle istruzioni ma non è un problema in quanto si può procedere per tentativi con uno "scanner" software come nel seguente:
// -------------------- SCANNER ! ------------------------ // Codice PREZIOSO nel caso il canale I2C e condiviso // ovvero SCL e SDA sono condivisi tra più dispositivi !!! #include <Wire.h> void setup() { Wire.begin(); Serial.begin(9600); while (!Serial); // Leonardo: wait for serial monitor Serial.println("\nI2C Scanner"); } void loop() { int nDevices = 0; while (!Serial); // Leonardo: wait for serial monitor Serial.println("Scanning..."); for (byte address = 1; address < 127; ++address) { //Serial.print(address); //Serial.print(", "); // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire.beginTransmission(address); byte 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(" !"); Serial.print("Ovverosia alla pos decimale: "); Serial.println(address, DEC); ++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 found\n"); } else { Serial.println("done\n"); } delay(10000); // Wait 5 seconds for next scan }
Es. collegamento ad un Display
Sketch
Sketch semplice
La libreria installlata in questo esempio è la libreria dal repository Arduino "LiquidCrystal_I2C":
L'ho un po' complicato per capire se l'elaborazione continua indipendentemente da eventuali errori di visualizzaizone, quindi si usa la seriale al solo scopo di produrre un output certo.
#include <LiquidCrystal_I2C.h> int i = 0; LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display void setup() { Serial.begin(9600); lcd.init(); lcd.clear(); lcd.backlight(); // Make sure backlight is on // Print a message on both lines of the LCD. lcd.setCursor(2,0); //Set cursor to character 2 on line 0 lcd.print("Hello world!"); lcd.setCursor(2,1); //Move cursor to character 2 on line 1 lcd.print("LCD Tutorial"); while (!Serial); Serial.println("Conteggio..."); } void loop() { Serial.println(i); delay(1000); if (i = 1) { lcd.clear(); lcd.setCursor(0,0); lcd.print("Conteggio..."); } lcd.setCursor(0,1); lcd.print(i); i++; }
Sketch con il testo scorrevole
#include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); void setup() { lcd.init(); lcd.clear(); lcd.backlight(); // Make sure backlight is on // Print a message lcd.print("Giuseppe AINO..."); delay(1000); // pause to read the message initially } void loop() { lcd.scrollDisplayLeft(); // scroll everything to the left by one position delay(300); // small delay for visible scrolling speed }
(Mappa e Link)
Integrazioni tipiche | Arduino indice | Arduino Progetti | Arduino C++
C++ Info fondamentali | ESP32 indice | ESP8266 | Domotica | Dizionario Elettronica | Elettronica | Elettronica Appunti
Parole chiave:



