In questo tutorial imparerai come costruire un misuratore di indice UV con un sensore di luce UV VEML6070, un OLED e un Arduino Uno.
L’UV Index è una misura dell’intensità della radiazione ultravioletta (UV) proveniente dal sole. Lo scopo dell’indice UV è aiutare le persone a proteggersi dalla radiazione UV, che può causare scottature, invecchiamento della pelle, danni al DNA, cancro della pelle, immunosoppressione e danni agli occhi.
Il nostro misuratore di indice UV leggerà l’intensità della luce UV da un sensore VEML6070 e la visualizzerà insieme a un livello di rischio su uno schermo OLED per tenerti informato sul rischio UV attuale. Per contesto, le raccomandazioni del Cancer Council sono di controllare l’indice UV quando si è:
- pianificando o partecipando a un’attività o evento all’aperto
- svolgendo attività ricreative come corsa, nuoto, ciclismo o sport di squadra
- assistendo a uno sport da spettatore, come tennis o cricket
- lavorando all’aperto, o avendo responsabilità su lavoratori all’aperto, oppure
- responsabili di bambini piccoli e delle loro attività all’aperto.
Iniziamo con questo progetto e diamo prima un’occhiata alla lista dei componenti necessari.
Componenti necessari
Ho usato un Arduino Uno per questo progetto, ma qualsiasi altro Arduino o scheda ESP32/ESP8266 funzionerà altrettanto bene. Nota che i sensori VEML6070 possono essere piuttosto costosi. Ho elencato il più economico che ho trovato su Amazon, ma ti consiglio di fare un po’ di ricerca e confrontare i prezzi.

Sensore di luce UV VEML6070

Arduino Uno

Cavo USB per Arduino UNO

Set di fili Dupont

Breadboard

Display OLED
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
Il sensore di luce UV VEML6070
Il sensore di luce UV VEML6070 è un sensore digitale che misura l’intensità della luce ultravioletta (UV). Usa un fotodiodo per convertire la luce UV in un segnale elettrico, che viene poi elaborato da un circuito interno per fornire un’uscita digitale. Ha una sensibilità massima per la luce UVA a una lunghezza d’onda di 355nm. Il grafico sottostante mostra la risposta spettrale del VEML6070:

Il sensore VEML6070 è progettato per essere facilmente integrato in vari dispositivi elettronici e progetti grazie alle sue dimensioni ridotte e al basso consumo energetico. Ha una modalità di spegnimento che riduce il consumo a meno di 1 μA.
Diagramma a blocchi
Il sensore comunica con i microcontrollori tramite un’interfaccia I2C, rendendolo compatibile con schede di sviluppo popolari come Arduino e ESP32. L’immagine sottostante mostra il diagramma a blocchi dei componenti interni e i pin IO:

SDA e SCL sono i pin per l’interfaccia I2C. Vdd e GND sono per l’alimentazione e il sensore funziona da 2,7 V a 5,5 V. Il VEML6070 ha una compensazione della temperatura che garantisce una sensibilità lineare alla luce solare UV. La sensibilità può essere regolata tramite una resistenza esterna collegata a RSET. Il pin di acknowledge attivo (ACK) permette al sensore di inviare un segnale di allerta dell’indice UV se viene superata una soglia. Per maggiori dettagli consulta il datasheet:
Questo sensore è comunemente usato in applicazioni dove è importante monitorare l’esposizione alla luce UV, come dispositivi indossabili, misuratori di indice UV e sistemi di sterilizzazione UV. La sua alta sensibilità e precisione lo rendono uno strumento prezioso per misurare i livelli di luce UV sia in ambienti interni che esterni.
Scheda breakout
Se vuoi usare il sensore grezzo con un microcontrollore, avrai bisogno di qualche componente extra (resistenze, condensatori). Vedi il circuito tipico di applicazione del VEML6070 secondo il datasheet.

Per evitare complicazioni, puoi acquistare schede breakout che hanno già integrati questi componenti. L’immagine sottostante mostra una tipica scheda breakout per il VEML6070, con interfaccia I2C (SCL, SDA), alimentazione (VCC, GND) e uscita acknowledge (ACK).

Nel seguito useremo una scheda breakout di questo tipo per collegare il sensore VEML6070 a un Arduino.
Collegare il VEML6070 all’Arduino
Grazie all’interfaccia I2C, collegare il sensore VEML6070 a un Arduino Uno è molto semplice. Basta collegare i pin SCL e SDA della scheda breakout VEML6070 ai corrispondenti pin sulla scheda Arduino come mostrato sotto.

Successivamente, collega massa e VCC. Puoi usare 5V o 3.3V per VCC; io ho scelto 3.3V.
E questo è tutto ciò che serve per collegare il sensore.
Codice per leggere l’indice UV dal VEML6070
In questa sezione scriveremo un piccolo codice per testare il sensore. Prima dobbiamo installare una libreria adatta.
Ci sono tre librerie per leggere i dati dal sensore VEML6070. C’è la libreria Adafruit_VEML6070, la libreria Seeed_VEML6070 e la libreria arduino-VEML6070. Ho usato quest’ultima, perché è facile da usare e calcola indice e livello di rischio. Puoi installarla come al solito tramite il Library Manager e dopo l’installazione dovrebbe apparire così:

Ora possiamo scrivere un po’ di codice. Il seguente esempio molto semplice legge l’intensità UV misurata dal sensore VEML6070 e la stampa sul Monitor Seriale:
#include "VEML6070.h"
void setup() {
Serial.begin(9600);
VEML.begin();
}
void loop() {
uint16_t uvs = VEML.read_uvs_step();
Serial.print("UVS:");
Serial.println(uvs);
delay(1000);
}
Se carichi questo codice e apri il Serial Plotter, dovresti vedere apparire una curva per UVS. E quando esponi il sensore a una fonte luminosa (es. una torcia), dovresti vedere un picco:

Come vedi, leggere i dati dal sensore VEML6070 è molto semplice. Per rendere le cose un po’ più interessanti, aggiungeremo un OLED nella sezione successiva.
Aggiungere un OLED
Invece di visualizzare i dati di intensità UV sul Monitor Seriale, sarebbe più bello mostrarli su un display separato. Questo ci permetterebbe di costruire un misuratore di indice UV portatile. In questa sezione aggiungiamo quindi un OLED al circuito e visualizziamo i dati UV su di esso.
Collegare l’OLED all’Arduino
Poiché l’OLED è anch’esso un dispositivo I2C, il collegamento è semplice. Colleghiamo semplicemente SDA e SCL agli stessi pin a cui è collegato il sensore VEML6070. Poiché l’OLED funziona a 3.3V, possiamo anche condividere le linee di alimentazione. L’immagine sottostante mostra il cablaggio completo.

Se hai difficoltà con l’OLED, dai un’occhiata al tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino.
Ecco come appare il circuito funzionante nella realtà 😉

Codice per mostrare l’indice UV sull’OLED
In questa sezione scriveremo il codice per mostrare i dati UV sull’OLED. Per controllare l’OLED useremo la libreria Adafruit_SSD1306. Dovrai installarla tramite il Library Manager e dopo l’installazione dovrebbe apparire così:

Ecco il codice completo. Dagli prima un’occhiata e poi ne discutiamo i dettagli.
#include "VEML6070.h"
#include "Adafruit_SSD1306.h"
Adafruit_SSD1306 oled(128, 64, &Wire, -1);
void oled_init() {
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
oled.clearDisplay();
oled.setTextSize(2);
oled.setTextColor(WHITE);
}
void centered(const char* text, int y) {
int16_t x1, y1;
uint16_t w, h;
oled.getTextBounds(text, 0, 0, &x1, &y1, &w, &h);
oled.setCursor(64 - w / 2, y);
oled.print(text);
}
void display_uvs() {
static char text[30];
uint16_t uvs = VEML.read_uvs_step();
int risk_level = VEML.convert_to_risk_level(uvs);
char* risk = VEML.convert_to_risk_char(risk_level);
oled.clearDisplay();
centered(risk, 15);
sprintf(text, "%d", uvs);
centered(text, 45);
oled.display();
}
void setup() {
oled_init();
VEML.begin();
}
void loop() {
display_uvs();
delay(1000);
}
Il codice sopra legge l’intensità della luce UV dal sensore e la visualizza insieme a un livello di rischio sullo schermo OLED, dove i livelli di radiazione UV sono:
- basso (1-2)
- moderato (3-5)
- alto (6-7)
- molto alto (8-10)
- estremo (11 e oltre).
Librerie e inizializzazione del display
Iniziamo includendo le librerie necessarie per il sensore VEML6070 e il display OLED Adafruit SSD1306. Poi inizializziamo il display OLED nella funzione oled_init(). Questa funzione configura il display, lo pulisce, imposta la dimensione del testo e il colore.
#include "VEML6070.h"
#include "Adafruit_SSD1306.h"
Adafruit_SSD1306 oled(128, 64, &Wire, -1);
void oled_init() {
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
oled.clearDisplay();
oled.setTextSize(2);
oled.setTextColor(WHITE);
}
Nota che l’indirizzo I2C per il display OLED è impostato su 0x3C in oled.begin(). La maggior parte di questi piccoli OLED usa questo indirizzo, ma il tuo potrebbe essere diverso. Se non vedi nulla sull’OLED, probabilmente ha un indirizzo I2C differente e dovrai cambiare l’indirizzo passato a oled.begin(). Se non conosci l’indirizzo I2C, dai un’occhiata al tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino.
Funzioni di visualizzazione
La funzione centered() viene usata per stampare testo centrato sul display OLED a una coordinata y specificata. La funzione display_uvs() legge l’intensità della luce UV dal sensore, calcola il livello di rischio e lo visualizza insieme all’intensità UV sullo schermo OLED.
void centered(const char* text, int y) {
// Function to center text on OLED display
}
void display_uvs() {
// Function to display UV index and risk level on OLED display
}
Funzione di setup
Nella funzione setup() inizializziamo la comunicazione seriale per il debug, inizializziamo il display OLED e avviamo la comunicazione con il sensore VEML6070.
void setup() {
oled_init();
VEML.begin();
}
Funzione loop
La funzione loop() chiama continuamente la funzione display_uvs() per aggiornare e visualizzare l’indice UV e il livello di rischio sullo schermo OLED. Poi aggiunge un ritardo di 1 secondo prima del prossimo aggiornamento.
void loop() {
display_uvs();
delay(1000);
}
Output sull’OLED
Se carichi il codice, dovresti vedere il seguente output sull’OLED. La riga superiore mostra il livello di rischio e il numero sotto è l’intensità UV.

Conclusioni
Questo tutorial ti ha mostrato come costruire un misuratore di indice UV con un sensore di luce UV VEML6070. Abbiamo usato un Arduino Uno e uno schermo OLED in questo progetto. Ma potresti facilmente usare un ESP32 alimentato a batteria e un display e-Paper per costruire un misuratore di indice UV portatile e a basso consumo.
In alternativa, un misuratore di indice UV sarebbe anche un’ottima aggiunta a una stazione meteorologica per avvisare di un’elevata esposizione alla luce UV. Per dettagli tecnici su come realizzarlo, dai un’occhiata ai tutorial Simple ESP32 Internet Weather Station e Weather Station on e-Paper Display.
Infine, se vuoi solo misurare la luce (e non specificamente la luce UV), puoi usare il sensore BH1750. Come usarlo è descritto nel tutorial: Ambient Light Sensor BH1750 with Arduino.
Se hai altre domande, sentiti libero di chiedere.
Buon divertimento con il fai-da-te ; )

