Skip to Content

Sensore di luce ambientale BH1750 con Arduino

Sensore di luce ambientale BH1750 con Arduino

In questo tutorial imparerai come utilizzare il sensore di luce ambientale BH1750, un OLED e un Arduino Uno per misurare e visualizzare l’intensità luminosa.

Sebbene tu possa usare un semplice resistore dipendente dalla luce ( LDR ) per rilevare la luce, le letture di quel sensore non sono calibrate su un’unità standard definita di intensità luminosa. Il sensore BH1750, invece, misura l’intensità luminosa in lux e quindi offre misurazioni molto più comparabili.

Se vuoi saperne di più, continua a leggere.

Componenti necessari

Ho usato un Arduino Uno per questo progetto, ma qualsiasi altro Arduino o scheda ESP32/ESP8266 funzionerà altrettanto bene. Per il sensore di luce, ho utilizzato la breakout board elencata qui sotto, ma esiste anche un BH1750 sensore con un cappuccio protettivo, che potrebbe essere migliore per alcune applicazioni pratiche.

Sensore di luce ambientale BH1750

Arduino

Arduino Uno

USB Data Sync cable Arduino

Cavo USB per Arduino UNO

Dupont wire set

Set di fili Dupont

Half_breadboard56a

Breadboard

OLED display

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 ambientale BH1750

Il sensore di luce ambientale BH1750 è un sensore digitale che misura l’intensità della luce nell’ambiente circostante. Fornisce un’interfaccia I2C per comunicare con microcontrollori come Arduino ed ESP32. Il sensore ha un’ampia gamma di sensibilità luminosa da 1 a 65535 lux, rendendolo adatto a varie condizioni di illuminazione.

Una delle caratteristiche principali del sensore BH1750 è il suo basso consumo energetico (corrente in power-down 0,01 µA), che lo rende ideale per dispositivi alimentati a batteria. Ha anche un’alta risoluzione e può fornire letture accurate dell’intensità luminosa. Il sensore è facile da usare e può essere integrato in diversi progetti fai-da-te come sistemi di illuminazione automatica, agricoltura intelligente e stazioni meteorologiche. Per maggiori dettagli consulta il datasheet:

Internamente, il chip del sensore contiene un fotodiodo (PD) come rilevatore di luce, un amplificatore di segnale (AMP), un convertitore analogico-digitale a 16 bit (ADC) e una logica per convertire il valore ADC in una misura di intensità luminosa e inviarla tramite I2C. L’immagine seguente mostra il diagramma a blocchi:

Block Diagram of BH1750
Diagramma a blocchi del BH1750 ( source )

Breakout board del sensore BH1750

Il chip del sensore è molto piccolo e per i progetti Arduino si usa tipicamente una breakout board che ha pin più grandi, un regolatore di tensione e resistori di pull-up per l’interfaccia I2C. Il regolatore di tensione permette di alimentare il sensore a 3,3V o 5V. L’immagine sotto mostra il fronte e il retro di una tipica breakout board BH1750:

Front and back of breakout board for BH1750
Fronte e retro della breakout board per BH1750

Si possono vedere i pin di alimentazione (VCC, GND), l’interfaccia I2C (SCL, SDA) e un pin ADDR. Il pin ADDR può essere usato per impostare l’indirizzo I2C del sensore. Se colleghi ADDR a VCC, l’indirizzo sarà 0x5C. Altrimenti l’indirizzo I2C (di default) è 0x23.

Misurazioni in lux

Il sensore misura l’intensità luminosa in lux, che secondo Wikipedia è definito come segue:

Il  lux  (simbolo:  lx ) è l’unità di misura di  illuminance , o  luminous flux  per unità di superficie, nel sistema  International System of Units  (SI). È pari a un  lumen  per metro quadrato. In  photometry , questo è usato come misura dell’intensità, percepita dall’occhio umano, della  light  che colpisce o attraversa una superficie.

La tabella seguente mostra i livelli di lux per diverse condizioni di illuminazione. Se usi il sensore BH1750 per misurare i livelli di lux, tieni presente che l’angolo della luce incidente influenzerà la misurazione.

Lux Levels
Livelli di Lux ( source )

Il datasheet contiene la curva di risposta spettrale per il BH1750 e si può vedere che il sensore è più sensibile alla luce nella gamma di lunghezze d’onda da 500nm a 600nm.

Spectral Response of BH1750
Risposta spettrale del BH1750 ( source )

Collegare il BH1750 ad Arduino

Grazie all’interfaccia I2C, collegare il sensore di luce BH1750 ad Arduino è molto semplice. Prima, collega i pin SCL e SDA della breakout board BH1750 ai corrispondenti pin sulla scheda Arduino come mostrato sotto. Poi collega massa e VCC.

Wiring of BH1750 sensor with Arduino
Collegamento del sensore BH1750 con Arduino

Poiché la breakout board funziona a 5V o 3,3V, puoi usare uno dei due per il VCC; io ho scelto 3,3V. Nella sezione successiva scriveremo del codice per testare il funzionamento del sensore.

Codice per misurare la luce ambientale con BH1750

Iniziamo implementando un semplice codice di test che stampa l’intensità luminosa misurata dal sensore BH1750.

#include "Wire.h"
#include "BH1750.h"

BH1750 luxMeter;

void setup(){
  Serial.begin(9600);
  Wire.begin();
  luxMeter.begin();
}

void loop() {
  float lux = luxMeter.readLightLevel();
  Serial.print("Light:");
  Serial.print(lux);
  Serial.println(" lx");
  delay(1000);
}

Il codice inizia includendo le librerie necessarie. La Wire library è una libreria standard che fa parte del core Arduino, ma la BH1750 library dovrai installarla. Basta aprire il Library Manager, cercare BH1750 e installare la BH1750 library di Christopher Laws come mostrato sotto:

BH1750 library by Christopher Laws in Library Manager
Libreria BH1750 nel Library Manager

Esistono diverse altre librerie, e la BH1750 library di Rob Tillaart è un’alternativa interessante, poiché offre funzioni aggiuntive per compensazione della temperatura, correzione dell’angolo e misurazione asincrona.

Nella funzione setup inizializziamo la comunicazione seriale, la comunicazione I2C tramite Wire e il sensore BH1750. Nota che devi chiamare Wire.begin() , anche usando i pin I2C di default. Tuttavia, se vuoi usare pin diversi per SDA e SCL, puoi usare Wire.begin() per impostarli.

Nella funzione loop, ogni secondo leggiamo il livello di luce dal BH1750 in lux e stampiamo il valore sul Serial Monitor. Se apri il Serial Plotter ed esponi il sensore a una fonte luminosa, dovresti vedere un picco nel grafico:

Serial Plotter showing light response of BH1750
Serial Plotter che mostra la risposta luminosa del BH1750

Aggiungere un OLED

Invece di visualizzare i dati sul Serial Monitor, sarebbe più comodo mostrarli su un display separato. Questo ci permetterebbe di costruire un Lux Meter portatile. In questa sezione aggiungiamo quindi un OLED al circuito e visualizziamo l’intensità luminosa su di esso.

Collegare l’OLED ad Arduino

Poiché l’OLED è anch’esso un dispositivo I2C, il collegamento è semplice. Colleghiamo SDA e SCL agli stessi pin a cui è collegato il sensore BH1750. Poiché l’OLED funziona a 3,3V, possiamo condividere anche le linee di alimentazione. L’immagine sotto mostra il cablaggio completo.

Connecting OLED and BH1750 with Arduino
Collegamento di OLED e BH1750 con Arduino

Se hai difficoltà con l’OLED, dai un’occhiata al tutorial How to Interface the SSD1306 I2C OLED Graphic Display With Arduino . L’immagine sotto mostra il cablaggio completo su una breadboard reale.

Wiring of OLED and BH1750 with Arduino
Cablaggio di OLED e BH1750 con Arduino

Codice per visualizzare i dati BH1750 su OLED

In questa sezione imparerai come visualizzare l’intensità luminosa misurata dal BH1750 su uno schermo OLED. Per scrivere sull’OLED useremo la libreria Adafruit_SSD1306 . Puoi installarla tramite il Library Manager come al solito:

Adafruit_SSD1306 library installed in Library Manager
Libreria Adafruit_SSD1306 installata nel Library Manager

Il codice sotto legge la misura di luce dal sensore BH1750 e visualizza il valore in lux sull’OLED. Dai un’occhiata al codice completo prima di discuterne i dettagli.

#include "BH1750.h"
#include "Adafruit_SSD1306.h"

BH1750 luxMeter;
Adafruit_SSD1306 oled(128, 64, &Wire, -1);

void oled_init() {
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  oled.clearDisplay();
  oled.setTextSize(3);
  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_lux() {
  static char text[30];
  float lux = luxMeter.readLightLevel();

  oled.clearDisplay();
  sprintf(text, "%.0f", lux);
  centered(text, 25);
  oled.display();
}

void setup() {
  oled_init();
  Wire.begin();
  luxMeter.begin();
}

void loop() {
  display_lux();
  delay(1000);
}

Librerie e inizializzazione del display

Iniziamo includendo le librerie necessarie per il sensore BH1750 e per 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 "BH1750.h"
#include "Adafruit_SSD1306.h"

BH1750 luxMeter;
Adafruit_SSD1306 oled(128, 64, &Wire, -1);

void oled_init() {
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  oled.clearDisplay();
  oled.setTextSize(3);
  oled.setTextColor(WHITE);
}

Nota che l’indirizzo I2C per il display OLED è impostato a 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 devi 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_lux() legge l’intensità luminosa in lux dal sensore e la visualizza sullo schermo OLED.

void centered(const char* text, int y) {
  // Function to center text on OLED display
}

void display_lux() {
  // Function to display light intensity on OLED display
}

Funzione setup

Nella funzione setup() inizializziamo la comunicazione seriale per il debug, inizializziamo il display OLED e avviamo la comunicazione con il sensore BH1750. Se cambi i pin I2C a cui è collegato il sensore, Wire.begin() è il punto dove devi fare la modifica.

void setup() {
  oled_init();
  Wire.begin();
  luxMeter.begin();
}

Funzione loop

La funzione loop() chiama continuamente la funzione display_lux() per aggiornare e visualizzare il valore sullo schermo OLED. Poi aggiunge un ritardo di 1 secondo prima del prossimo aggiornamento.

void loop() {
  display_lux();
  delay(1000);
}

Output su OLED

Se carichi ed esegui il codice, dovresti vedere l’intensità luminosa in lux visualizzata sull’OLED.

BH1750 Output on OLED
Output BH1750 su OLED

Ed ecco un bel luxmetro che puoi usare per misurare l’intensità luminosa!

Conclusioni

In questo tutorial hai imparato come usare il sensore di luce ambientale BH1750, un OLED e un Arduino Uno per costruire un luxmetro.

Poiché il BH1750 ha una modalità a basso consumo e funziona a 3,3V, sarebbe particolarmente adatto per costruire un luxmetro portatile alimentato a batteria usando un ESP32. Dai un’occhiata al Simple ESP32 Internet Weather Station , dove usiamo un ESP32 alimentato a batteria, per dettagli tecnici.

Inoltre, se usi il luxmetro principalmente all’aperto, ti consiglierei un display e-Paper invece di un OLED, poiché sarà molto più leggibile alla luce diretta del sole. Il tutorial Weather Station on e-Paper Display potrebbe esserti utile.

Infine, se vuoi misurare specificamente la luce UV, abbiamo anche un tutorial su questo: UV Index Meter With VEML6070 and Arduino

Se hai domande, non esitare a chiedere.

Buon divertimento con il fai-da-te ; )