Come anticipato nelle scorse lezioni vediamo in questo tutorial come visualizzare il livello di una grandezza fisica mediante una barra incrementale sulla matrice LED dell’Arduino UNO R4 WiFi.
Gli esempi mostrati possono essere adattati per qualsiasi tipologia di sensore, per semplicità e rapidità di realizzazione ho scelto di rilevare l’intensità luminosa mediante un LDR. Lascio a voi correzioni e miglioramenti a quanto ho scritto.
La matrice, come sapete è costituita da 8 righe di LED, Il numero di linee LED attive sarà proporzionale all’intensità luminosa rilevata:
- Livello minimo di intensità = accensione della sola riga 7
- Livello massimo di intensità = accensione di tutte le righe della matrice
I 6 sketch di esempio che seguono sono molto simili, tutti eseguono la calibrazione del sensore, basata sullo sketch standard che trovate all’interno degli esempi dell’IDE di Arduino. Il codice di calibrazione prevede 5 secondi di analisi che permettono di impostare il livello minimo e massimo della grandezza da misurare. Ho aggiunto per ognuno dei 6 esempi alternative diverse per mostrare sulla matrice di LED il timer di 5 secondi.
Il funzionamento di ogni parte del codice dei 6 sketch, è dettagliato mediante commenti, se avete necessità di chiarimenti non esitate a contattarmi.
Circuito
Il circuito prevede l’utilizzo di:
- Arduino UNO R4 WiFi
- LDR
- Resitore da 10 KOhm
Esempio 01
Il trascorrere del tempo di calibrazione è mostrato dall’accensione sequenziale dei primi 5 LED posti sulla riga n. 7, terminata la fase di calibrazione, dopo 0,5 secondi l’array della matrice viene azzerato e viene poi avviata la rilevazione.
sketch01
// Prof. Maffucci Michele // 31/07/23 // Visualizzazione livello luminoso su matrice LED Uno R4 WiFi // con calibrazione sensore e visualizzazione timer di calibrazione // con l'accensione di 5 LED della matrice // Esercizio 01 // inclusione della libreria per la gestione della matrice #include "Arduino_LED_Matrix.h" // creazione dell’oggetto matrix ArduinoLEDMatrix matrix; // inizializzazione dell'array per inizializzare lo stato della matrice uint8_t frame[8][12] = { 0 }; // pin a cui collegare il sensore int pinSensore = A0; // variabile in cui memorizzare il valore letto dal sensore int valoreSensore = 0; // variabili per calibrazione lovello minimo e massimo luce ambiente int sensoreMin = 1023; // valore minimo sensore int sensoreMax = 0; // valore massimo sensore // contatore passi di calibrazione int contatore = 0; // valore del millis al passo precedente unsigned long millisPrecedente = 0; // valore del millis attuale unsigned long millisCorrente = 0; // intervallo in millisecondi per l'accensione di una riga di LED const long intervallo = 1000; // riga LED precedentemente accesa int precedenteLivello = 0; void setup() { // inizializzazione della velocità della serial monitor Serial.begin(115200); // avvio della matrice di LED matrix.begin(); // calibrazione del sensore nei primi 5 secondi di avvio di Arduino while (millis() < 5000) { // memorizzazione dle valore attuale del millis millisCorrente = millis(); // lettura valore valoreSensore = analogRead(pinSensore); // registra il valore massimo rilevato dal sensore if (valoreSensore > sensoreMax) { sensoreMax = valoreSensore; } // registra il valore minimo rilevato dal sensore if (valoreSensore < sensoreMin) { sensoreMin = valoreSensore; } // timer if (millisCorrente - millisPrecedente >= intervallo) { millisPrecedente = millisCorrente; frame[7][contatore] = 1; matrix.renderBitmap(frame, 8, 12); contatore++; } } // accensione dell'ultimo LED al 5' secondo frame[7][4] = 1; matrix.renderBitmap(frame, 8, 12); // attesa di 0,5 secondi prima di spegnere tutti i LED delay(500); // spegnimento di tutti i LED della matrice uint8_t frame[8][12] = { 0 }; matrix.renderBitmap(frame, 8, 12); } // Accensione linee matrice (dalla riga 7) // maggiore e' il valore numeriico di "livello" (riga LED) più bassa sarà l'intensità luminosa // minore e' e' il valore numeriico di "livello" (riga LED) più alta sarà l'intensità luminosa // Livello minimo di intensità = accensione della sola riga 7 // Livello massimo di intensità = accensione di tutte le linee della matrice void barra(int livello) { // spegnimento della riga "livello" if (livello > precedenteLivello) { for (int y = livello; y >= precedenteLivello; y--) { // spegnimento dei 12 LED della riga "livello" for (int x = 0; x < 12; x++) { frame[y][x] = 0; } matrix.renderBitmap(frame, 8, 12); delay(1); } // accensione della riga "livello" } else { for (int y = 7; y >= precedenteLivello; y--) { for (int x = 0; x < 12; x++) { frame[y][x] = 1; } matrix.renderBitmap(frame, 8, 12); delay(1); } } precedenteLivello = livello; } void loop() { // per evitare sprechi di memoria viene utilizzata usata una stessa variabile: valoreSensore // per memorizzare ad ogni passo valori diversi // lettura del valore del sensore valoreSensore = analogRead(pinSensore); // Forzare il valore all'interno del valore minimo e del massimo nel caso di errori di lettura. // Nel caso non si aggiungesse il "constrain" nel caso di errore si blocca l'esecuzione valoreSensore = constrain(valoreSensore, sensoreMin, sensoreMax); // Il valore minimo di lettura è associato all'accensione della riga 7 // quindi si rimappa tra 7 e 0 valoreSensore = map(valoreSensore, sensoreMin, sensoreMax, 7, 0); // barra(valoreSensore) è la funzione che gestisce l'accensione delle linee di LED barra(valoreSensore); }
Esempio 02
L’esempio che segue differisce solamente per la visualizzazione sulla serial monitor del numero di riga di LED acceso.
sketch02
// Prof. Maffucci Michele // 31/07/23 // Visualizzazione livello luminoso su matrice LED Uno R4 WiFi // con calibrazione sensore e visualizzazione timer di calibrazione // con l'accensione di 5 LED della matrice // Stampa sulla serial monitor del livello della riga LED acceso // Esercizio 02 // inclusione della libreria per la gestione della matrice #include "Arduino_LED_Matrix.h" // creazione dell’oggetto matrix ArduinoLEDMatrix matrix; // inizializzazione dell'array per inizializzare lo stato della matrice uint8_t frame[8][12] = { 0 }; // pin a cui collegare il sensore int pinSensore = A0; // variabile in cui memorizzare il valore letto dal sensore int valoreSensore = 0; // variabili per calibrazione lovello minimo e massimo luce ambiente int sensoreMin = 1023; // valore minimo sensore int sensoreMax = 0; // valore massimo sensore // contatore passi di calibrazione int contatore = 0; // valore del millis al passo precedente unsigned long millisPrecedente = 0; // valore del millis attuale unsigned long millisCorrente = 0; // intervallo in millisecondi per l'accensione di una riga di LED const long intervallo = 1000; // riga LED precedentemente accesa int precedenteLivello = 0; void setup() { // inizializzazione della velocità della serial monitor Serial.begin(115200); // avvio della matrice di LED matrix.begin(); // calibrazione del sensore nei primi 5 secondi di avvio di Arduino while (millis() < 5000) { // memorizzazione dle valore attuale del millis millisCorrente = millis(); // lettura valore valoreSensore = analogRead(pinSensore); // registra il valore massimo rilevato dal sensore if (valoreSensore > sensoreMax) { sensoreMax = valoreSensore; } // registra il valore minimo rilevato dal sensore if (valoreSensore < sensoreMin) { sensoreMin = valoreSensore; } // timer if (millisCorrente - millisPrecedente >= intervallo) { millisPrecedente = millisCorrente; frame[7][contatore] = 1; matrix.renderBitmap(frame, 8, 12); contatore++; } } // accensione dell'ultimo LED al 5' secondo frame[7][4] = 1; matrix.renderBitmap(frame, 8, 12); // attesa di 0,5 secondi prima di spegnere tutti i LED delay(500); // spegnimento di tutti i LED della matrice uint8_t frame[8][12] = { 0 }; matrix.renderBitmap(frame, 8, 12); } // Accensione linee matrice (dalla riga 7) // maggiore e' il valore numeriico di "livello" (riga LED) più bassa sarà l'intensità luminosa // minore e' e' il valore numeriico di "livello" (riga LED) più alta sarà l'intensità luminosa // Livello minimo di intensità = accensione della sola riga 7 // Livello massimo di intensità = accensione di tutte le linee della matrice void barra(int livello) { // spegnimento della riga "livello" if (livello > precedenteLivello) { for (int y = livello; y >= precedenteLivello; y--) { // spegnimento dei 12 LED della riga "livello" for (int x = 0; x < 12; x++) { frame[y][x] = 0; } matrix.renderBitmap(frame, 8, 12); delay(1); } // accensione della riga "livello" } else { for (int y = 7; y >= precedenteLivello; y--) { for (int x = 0; x < 12; x++) { frame[y][x] = 1; } matrix.renderBitmap(frame, 8, 12); delay(1); } } precedenteLivello = livello; } void loop() { // per evitare sprechi di memoria viene utilizzata usata una stessa variabile: valoreSensore // per memorizzare ad ogni passo valori diversi // lettura del valore del sensore valoreSensore = analogRead(pinSensore); // Forzare il valore all'interno del valore minimo e del massimo nel caso di errori di lettura. // Nel caso non si aggiungesse il "constrain" nel caso di errore si blocca l'esecuzione valoreSensore = constrain(valoreSensore, sensoreMin, sensoreMax); // Il valore minimo di lettura è associato all'accensione della riga 7 // quindi si rimappa tra 7 e 0 valoreSensore = map(valoreSensore, sensoreMin, sensoreMax, 7, 0); // barra(valoreSensore) è la funzione che gestisce l'accensione delle linee di LED barra(valoreSensore); // stampa sulla Serial Monitor del livello della riga LED Serial.print("Valore letto dal sensore = "); Serial.println(valoreSensore); delay(2); }
Esempio 03
Rispetto all’esempio precedente, in questo caso il timer di calibrazione viene visualizzato mediante l’accensione delle prime 5 colonne di LED (partendo da sinistra).
sketch03
// Prof. Maffucci Michele // 31/07/23 // Visualizzazione livello luminoso su matrice LED Uno R4 WiFi // con calibrazione sensore e visualizzazione timer di calibrazione // con incremento dell'accensione di 5 colonne della matrice di LED // Stampa sulla serial monitor del livello della riga LED acceso // Esercizio 03 // inclusione della libreria per la gestione della matrice #include "Arduino_LED_Matrix.h" // creazione dell’oggetto matrix ArduinoLEDMatrix matrix; // inizializzazione dell'array per inizializzare lo stato della matrice uint8_t frame[8][12] = { 0 }; // pin a cui collegare il sensore int pinSensore = A0; // variabile in cui memorizzare il valore letto dal sensore int valoreSensore = 0; // variabili per calibrazione lovello minimo e massimo luce ambiente int sensoreMin = 1023; // valore minimo sensore int sensoreMax = 0; // valore massimo sensore // contatore passi di calibrazione int contatore = 0; // valore del millis al passo precedente unsigned long millisPrecedente = 0; // valore del millis attuale unsigned long millisCorrente = 0; // intervallo in millisecondi per l'accensione di una riga di LED const long intervallo = 1000; // riga LED precedentemente accesa int precedenteLivello = 0; void setup() { // inizializzazione della velocità della serial monitor Serial.begin(115200); // avvio della matrice di LED matrix.begin(); // calibrazione del sensore nei primi 5 secondi di avvio di Arduino while (millis() < 5000) { // memorizzazione dle valore attuale del millis millisCorrente = millis(); // lettura valore valoreSensore = analogRead(pinSensore); // registra il valore massimo rilevato dal sensore if (valoreSensore > sensoreMax) { sensoreMax = valoreSensore; } // registra il valore minimo rilevato dal sensore if (valoreSensore < sensoreMin) { sensoreMin = valoreSensore; } // timer if (millisCorrente - millisPrecedente >= intervallo) { millisPrecedente = millisCorrente; colonnaOn(contatore); contatore++; } } // accensione 5 colonna colonnaOn(4); // attesa di 0,5 secondi prima di spegnere tutti i LED delay(500); // spegnimento di tutti i LED della matrice uint8_t frame[8][12] = { 0 }; matrix.renderBitmap(frame, 8, 12); } // accensione colonna SX>DX (dalla colonna 0) void colonnaOn(int barre) { for (int y = 0; y < 8; y++) { frame[y][barre] = 1; } matrix.renderBitmap(frame, 8, 12); delay(1); } // Accensione linee matrice (dalla riga 7) // maggiore e' il valore numeriico di "livello" (riga LED) più bassa sarà l'intensità luminosa // minore e' e' il valore numeriico di "livello" (riga LED) più alta sarà l'intensità luminosa // Livello minimo di intensità = accensione della sola riga 7 // Livello massimo di intensità = accensione di tutte le linee della matrice void barra(int livello) { // spegnimento della riga "livello" if (livello > precedenteLivello) { for (int y = livello; y >= precedenteLivello; y--) { // spegnimento dei 12 LED della riga "livello" for (int x = 0; x < 12; x++) { frame[y][x] = 0; } matrix.renderBitmap(frame, 8, 12); delay(1); } // accensione della riga "livello" } else { for (int y = 7; y >= precedenteLivello; y--) { for (int x = 0; x < 12; x++) { frame[y][x] = 1; } matrix.renderBitmap(frame, 8, 12); delay(1); } } precedenteLivello = livello; } void loop() { // per evitare sprechi di memoria viene utilizzata usata una stessa variabile: valoreSensore // per memorizzare ad ogni passo valori diversi // lettura del valore del sensore valoreSensore = analogRead(pinSensore); // Forzare il valore all'interno del valore minimo e del massimo nel caso di errori di lettura. // Nel caso non si aggiungesse il "constrain" nel caso di errore si blocca l'esecuzione valoreSensore = constrain(valoreSensore, sensoreMin, sensoreMax); // Il valore minimo di lettura è associato all'accensione della riga 7 // quindi si rimappa tra 7 e 0 valoreSensore = map(valoreSensore, sensoreMin, sensoreMax, 7, 0); // barra(valoreSensore) è la funzione che gestisce l'accensione delle linee di LED barra(valoreSensore); // stampa sulla Serial Monitor del livello della riga LED Serial.print("Valore letto dal sensore = "); Serial.println(valoreSensore); delay(2); }
Esempio 04
In questo caso la visualizzazione del trascorrere del tempo di calibrazione avviene mediante di 4 colonne costituite ciascuna da 3 colonne di LED.
sketch04
// Prof. Maffucci Michele // 31/07/23 // Visualizzazione livello luminoso su matrice LED Uno R4 WiFi // con calibrazione sensore e visualizzazione timer di calibrazione // con incremento dell'accensione di 4 colonne LED della matrice costrituite ciascuna da 3 colonne da 1 LED // Stampa sulla serial monitor del livello della riga LED acceso // Esercizio 04 // inclusione della libreria per la gestione della matrice #include "Arduino_LED_Matrix.h" // creazione dell’oggetto matrix ArduinoLEDMatrix matrix; // inizializzazione dell'array per inizializzare lo stato della matrice uint8_t frame[8][12] = { 0 }; // pin a cui collegare il sensore int pinSensore = A0; // variabile in cui memorizzare il valore letto dal sensore int valoreSensore = 0; // variabili per calibrazione lovello minimo e massimo luce ambiente int sensoreMin = 1023; // valore minimo sensore int sensoreMax = 0; // valore massimo sensore // contatore passi di calibrazione int contatore = 1; // valore del millis al passo precedente unsigned long millisPrecedente = 0; // valore del millis attuale unsigned long millisCorrente = 0; // intervallo in millisecondi per l'accensione di una riga di LED const long intervallo = 1000; // riga LED precedentemente accesa int precedenteLivello = 0; void setup() { // inizializzazione della velocità della serial monitor Serial.begin(115200); // avvio della matrice di LED matrix.begin(); // calibrazione del sensore nei primi 5 secondi di avvio di Arduino while (millis() < 5000) { // memorizzazione dle valore attuale del millis millisCorrente = millis(); // lettura valore valoreSensore = analogRead(pinSensore); // registra il valore massimo rilevato dal sensore if (valoreSensore > sensoreMax) { sensoreMax = valoreSensore; } // registra il valore minimo rilevato dal sensore if (valoreSensore < sensoreMin) { sensoreMin = valoreSensore; } // timer if (millisCorrente - millisPrecedente >= intervallo) { millisPrecedente = millisCorrente; colonnaOn(contatore); contatore++; } } // attesa di 0,5 secondi prima di spegnere tutti i LED delay(500); // spegnimento di tutti i LED della matrice uint8_t frame[8][12] = { 0 }; matrix.renderBitmap(frame, 8, 12); } // accensione colonna SX>DX (dalla colonna 0) void colonnaOn(int barre) { for (int colonna = 1; colonna <= barre*3; colonna++) { for (int y = 0; y < 8; y++) { frame[y][colonna-1] = 1; } matrix.renderBitmap(frame, 8, 12); delay(1); } } // Accensione linee matrice (dalla riga 7) // maggiore e' il valore numeriico di "livello" (riga LED) più bassa sarà l'intensità luminosa // minore e' e' il valore numeriico di "livello" (riga LED) più alta sarà l'intensità luminosa // Livello minimo di intensità = accensione della sola riga 7 // Livello massimo di intensità = accensione di tutte le linee della matrice void barra(int livello) { // spegnimento della riga "livello" if (livello > precedenteLivello) { for (int y = livello; y >= precedenteLivello; y--) { // spegnimento dei 12 LED della riga "livello" for (int x = 0; x < 12; x++) { frame[y][x] = 0; } matrix.renderBitmap(frame, 8, 12); delay(1); } // accensione della riga "livello" } else { for (int y = 7; y >= precedenteLivello; y--) { for (int x = 0; x < 12; x++) { frame[y][x] = 1; } matrix.renderBitmap(frame, 8, 12); delay(1); } } precedenteLivello = livello; } void loop() { // per evitare sprechi di memoria viene utilizzata usata una stessa variabile: valoreSensore // per memorizzare ad ogni passo valori diversi // lettura del valore del sensore valoreSensore = analogRead(pinSensore); // Forzare il valore all'interno del valore minimo e del massimo nel caso di errori di lettura. // Nel caso non si aggiungesse il "constrain" nel caso di errore si blocca l'esecuzione valoreSensore = constrain(valoreSensore, sensoreMin, sensoreMax); // Il valore minimo di lettura è associato all'accensione della riga 7 // quindi si rimappa tra 7 e 0 valoreSensore = map(valoreSensore, sensoreMin, sensoreMax, 7, 0); // barra(valoreSensore) è la funzione che gestisce l'accensione delle linee di LED barra(valoreSensore); // stampa sulla Serial Monitor del livello della riga LED Serial.print("Valore letto dal sensore = "); Serial.println(valoreSensore); delay(2); }
Esempio 05
In questo esempio sono stati realizzati, mediante il LED Matrix Editor, 5 numeri rappresentati ciascuno dal proprio array inclusi all’interno del codice.
sketch05
// Prof. Maffucci Michele // 31/07/23 // Visualizzazione livello luminoso su matrice LED Uno R4 WiFi // con calibrazione sensore e visualizzazione timer di calibrazione // Timer realizzato con numeri disegnati con il LED Matrix Editor // I numeri sono inclusi nel codice // Stampa sulla serial monitor del livello della riga LED acceso // Esercizio 05 // inclusione della libreria per la gestione della matrice #include "Arduino_LED_Matrix.h" // creazione dell’oggetto matrix ArduinoLEDMatrix matrix; // inizializzazione dell'array per inizializzare lo stato della matrice uint8_t frame[8][12] = { 0 }; // pin a cui collegare il sensore int pinSensore = A0; // variabile in cui memorizzare il valore letto dal sensore int valoreSensore = 0; // variabili per calibrazione lovello minimo e massimo luce ambiente int sensoreMin = 1023; // valore minimo sensore int sensoreMax = 0; // valore massimo sensore // contatore passi di calibrazione int contatore = 0; // valore del millis al passo precedente unsigned long millisPrecedente = 0; // valore del millis attuale unsigned long millisCorrente = 0; // intervallo in millisecondi per l'accensione di una riga di LED const long intervallo = 1000; // riga LED precedentemente accesa int precedenteLivello = 0; void setup() { // inizializzazione della velocità della serial monitor Serial.begin(115200); // avvio della matrice di LED matrix.begin(); // calibrazione del sensore nei primi 5 secondi di avvio di Arduino while (millis() < 5000) { // memorizzazione dle valore attuale del millis millisCorrente = millis(); // lettura valore valoreSensore = analogRead(pinSensore); // registra il valore massimo rilevato dal sensore if (valoreSensore > sensoreMax) { sensoreMax = valoreSensore; } // registra il valore minimo rilevato dal sensore if (valoreSensore < sensoreMin) { sensoreMin = valoreSensore; } // timer if (millisCorrente - millisPrecedente >= intervallo) { millisPrecedente = millisCorrente; numero(contatore); contatore++; } } // stampa del n. 5 numero(4); // attesa di 0,5 secondi prima di spegnere tutti i LED delay(500); // spegnimento di tutti i LED della matrice uint8_t frame[8][12] = { 0 }; matrix.renderBitmap(frame, 8, 12); } // numeri da 1 a 5 const uint32_t uno[] = { // 1 0x400c014, 0x400400, 0x400400e0, 66 }; const uint32_t due[] = { // 2 0xf001002, 0x400800, 0x800800f0, 66 }; const uint32_t tre[] = { // 3 0xf001002, 0x400200, 0x100100f0, 66 }; const uint32_t quattro[] = { // 4 0x1002004, 0x801001, 0x200f0020, 66 }; const uint32_t cinque[] = { // 5 0xf808008, 0xf00080, 0x80080f0, 66 }; // selezione della cifra per il timer void numero(int cifra) { switch (cifra) { case 0: matrix.loadFrame(uno); break; case 1: matrix.loadFrame(due); break; case 2: matrix.loadFrame(tre); break; case 3: matrix.loadFrame(quattro); break; case 4: matrix.loadFrame(cinque); break; default: break; } } // Accensione linee matrice (dalla riga 7) // maggiore e' il valore numeriico di "livello" (riga LED) più bassa sarà l'intensità luminosa // minore e' e' il valore numeriico di "livello" (riga LED) più alta sarà l'intensità luminosa // Livello minimo di intensità = accensione della sola riga 7 // Livello massimo di intensità = accensione di tutte le linee della matrice void barra(int livello) { // spegnimento della riga "livello" if (livello > precedenteLivello) { for (int y = livello; y >= precedenteLivello; y--) { // spegnimento dei 12 LED della riga "livello" for (int x = 0; x < 12; x++) { frame[y][x] = 0; } matrix.renderBitmap(frame, 8, 12); delay(1); } // accensione della riga "livello" } else { for (int y = 7; y >= precedenteLivello; y--) { for (int x = 0; x < 12; x++) { frame[y][x] = 1; } matrix.renderBitmap(frame, 8, 12); delay(1); } } precedenteLivello = livello; } void loop() { // per evitare sprechi di memoria viene utilizzata usata una stessa variabile: valoreSensore // per memorizzare ad ogni passo valori diversi // lettura del valore del sensore valoreSensore = analogRead(pinSensore); // Forzare il valore all'interno del valore minimo e del massimo nel caso di errori di lettura. // Nel caso non si aggiungesse il "constrain" nel caso di errore si blocca l'esecuzione valoreSensore = constrain(valoreSensore, sensoreMin, sensoreMax); // Il valore minimo di lettura è associato all'accensione della riga 7 // quindi si rimappa tra 7 e 0 valoreSensore = map(valoreSensore, sensoreMin, sensoreMax, 7, 0); // barra(valoreSensore) è la funzione che gestisce l'accensione delle linee di LED barra(valoreSensore); // stampa sulla Serial Monitor del livello della riga LED Serial.print("Valore letto dal sensore = "); Serial.println(valoreSensore); delay(2); }
Esempio 06
Rispetto all’esempio precedente è stato creato un file esterno, numeri.h, che rappresenta la lista degli array che rappresentano i numeri. Questo file è stato generato con il LED Matrix Editor.
numeri.h
const uint32_t numeri[][4] = { { // 1 0x400c014, 0x400400, 0x400400e0, 66 }, { // 2 0xf001002, 0x400800, 0x800800f0, 66 }, { // 3 0xf001002, 0x400200, 0x100100f0, 66 }, { // 4 0x1002004, 0x801001, 0x200f0020, 66 }, { // 5 0xf808008, 0xf00080, 0x80080f0, 66 } };
sketch 06
// Prof. Maffucci Michele // 31/07/23 // Visualizzazione livello luminoso su matrice LED Uno R4 WiFi // con calibrazione sensore e visualizzazione timer di calibrazione // Timer realizzato con numeri disegnati con il LED Matrix Editor // I numeri vengono inclusi mediante il file numeri.h // Stampa sulla serial monitor del livello della riga LED acceso // Esercizio 06 // inclusione della libreria per la gestione della matrice #include "Arduino_LED_Matrix.h" #include "numeri.h" // creazione dell’oggetto matrix ArduinoLEDMatrix matrix; // inizializzazione dell'array per inizializzare lo stato della matrice uint8_t frame[8][12] = { 0 }; // pin a cui collegare il sensore int pinSensore = A0; // variabile in cui memorizzare il valore letto dal sensore int valoreSensore = 0; // variabili per calibrazione lovello minimo e massimo luce ambiente int sensoreMin = 1023; // valore minimo sensore int sensoreMax = 0; // valore massimo sensore // contatore passi di calibrazione int contatore = 0; // valore del millis al passo precedente unsigned long millisPrecedente = 0; // valore del millis attuale unsigned long millisCorrente = 0; // intervallo in millisecondi per l'accensione di una riga di LED const long intervallo = 1000; // riga LED precedentemente accesa int precedenteLivello = 0; void setup() { // inizializzazione della velocità della serial monitor Serial.begin(115200); // avvio della matrice di LED matrix.begin(); // calibrazione del sensore nei primi 5 secondi di avvio di Arduino while (millis() < 5000) { // memorizzazione dle valore attuale del millis millisCorrente = millis(); // lettura valore valoreSensore = analogRead(pinSensore); // registra il valore massimo rilevato dal sensore if (valoreSensore > sensoreMax) { sensoreMax = valoreSensore; } // registra il valore minimo rilevato dal sensore if (valoreSensore < sensoreMin) { sensoreMin = valoreSensore; } // timer if (millisCorrente - millisPrecedente >= intervallo) { millisPrecedente = millisCorrente; numero(contatore); contatore++; } } // stampa del n. 5 matrix.loadFrame(numeri[4]); // attesa di 0,5 secondi prima di spegnere tutti i LED delay(500); // spegnimento di tutti i LED della matrice uint8_t frame[8][12] = { 0 }; matrix.renderBitmap(frame, 8, 12); } // selezione della cifra per il timer void numero(int cifra) { switch (cifra) { case 0: matrix.loadFrame(numeri[0]); break; case 1: matrix.loadFrame(numeri[1]); break; case 2: matrix.loadFrame(numeri[2]); break; case 3: matrix.loadFrame(numeri[3]); break; case 4: matrix.loadFrame(numeri[4]); break; default: break; } } // Accensione linee matrice (dalla riga 7) // maggiore e' il valore numeriico di "livello" (riga LED) più bassa sarà l'intensità luminosa // minore e' e' il valore numeriico di "livello" (riga LED) più alta sarà l'intensità luminosa // Livello minimo di intensità = accensione della sola riga 7 // Livello massimo di intensità = accensione di tutte le linee della matrice void barra(int livello) { // spegnimento della riga "livello" if (livello > precedenteLivello) { for (int y = livello; y >= precedenteLivello; y--) { // spegnimento dei 12 LED della riga "livello" for (int x = 0; x < 12; x++) { frame[y][x] = 0; } matrix.renderBitmap(frame, 8, 12); delay(1); } // accensione della riga "livello" } else { for (int y = 7; y >= precedenteLivello; y--) { for (int x = 0; x < 12; x++) { frame[y][x] = 1; } matrix.renderBitmap(frame, 8, 12); delay(1); } } precedenteLivello = livello; } void loop() { // per evitare sprechi di memoria viene utilizzata usata una stessa variabile: valoreSensore // per memorizzare ad ogni passo valori diversi // lettura del valore del sensore valoreSensore = analogRead(pinSensore); // Forzare il valore all'interno del valore minimo e del massimo nel caso di errori di lettura. // Nel caso non si aggiungesse il "constrain" nel caso di errore si blocca l'esecuzione valoreSensore = constrain(valoreSensore, sensoreMin, sensoreMax); // Il valore minimo di lettura è associato all'accensione della riga 7 // quindi si rimappa tra 7 e 0 valoreSensore = map(valoreSensore, sensoreMin, sensoreMax, 7, 0); // barra(valoreSensore) è la funzione che gestisce l'accensione delle linee di LED barra(valoreSensore); // stampa sulla Serial Monitor del livello della riga LED Serial.print("Valore letto dal sensore = "); Serial.println(valoreSensore); delay(2); }
Buon Making a tutti 🙂