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





















Poiché in ambito didattico mi occupo anche di probematiche legate alla formazione di allievi diversamente abili ho la necessità di realizzare nelle prossime settimane per un allievo un dispositivo che mi permetta di scrivere del testo su un display molto grande, il testo deve poter essere scritto mediante una normalissima tastiera PS2, stavo incominciando a progettare il dispositivo, quando una ricerca su web mi ha regalato la soluzione e guarda caso proprio su uno dei miei siti preferiti