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); }