Il sensore BH1750 presente sul breakout GY-302 è in grado di trasformare l’intensità della luce, compresa in un range da 1 a 65.535 lux, in un segnale digitale disponibile tramite interfaccia I2C.
Per informazioni relative ad altri sensori di luce vedere l’articolo Panoramica dei moduli sensori di luce
Indice
Misurazione dell’illuminamento
Il sensore presentato in questo articolo, fornisce il valore in lux della luce che lo colpisce. Il lux (simbolo lx) è l’unità di misura per l’illuminamento.
Un lux è pari a un lumen su metro quadrato. Potremmo quindi definire il lux come il flusso luminoso per unità di superficie.
È un’unità di misura relativa alla luce visibile, dipende dalle caratteristiche dell’occhio umano, attraverso la curva di sensibilità dell’occhio alla radiazione luminosa.
Alcuni dati di illuminamento per dare un’idea di quanto vale un lux:
- la luce riflessa della Luna piena è pari a circa 1 lx;
- la luce del Sole mediamente varia tra i 32 000 lx e i 100 000 lx ;
- sotto i riflettori degli studi televisivi si hanno circa 1 000 lx ;
- in un campo di calcio (illuminazione notturna per riprese tv) tra i 500 lx e i 1200 lx;
- in un ufficio luminoso si hanno circa 400 lx;
- la luce di una stella luminosa è soltanto 0,00005 lx .
Descrizione del sensore BH1750FVI
[Traduzione della pagina relativa alla libreria Arduino del sensore fatta da Cristopher Laws ]
Il sensore di luce ambientale BH1750 montato sul modulo GY-302 ha sei diverse modalità di misurazione che sono divise in due gruppi: misurazioni continue e una tantum.
In modalità continua il sensore misura continuamente il valore di luminosità. In modalità singola, il sensore effettua una sola misurazione e poi passa alla modalità Spegnimento.
Impostazione precisione della misura
Ogni modalità ha tre diverse precisioni, vediamole:
- Bassa risoluzione – (4 lx di precisione, 16 ms di tempo di misurazione)
- Alta risoluzione – (precisione 1 lx, tempo di misurazione 120 ms)
- Alta risoluzione 2 – (precisione 0,5 lx, tempo di misurazione 120 ms)
Per impostazione predefinita, questa libreria utilizza la modalità ad alta risoluzione continua, ma è possibile cambiarla in una modalità diversa passando l’argomento mode a BH1750.begin().
Quando viene utilizzata la modalità One-Time, il sensore entrerà in modalità Spegnimento una volta completata la misurazione e dopo averla letta. Quando il sensore viene riacceso, torna alla modalità predefinita, il che significa che deve essere riconfigurato in modalità One-Time.
La libreria utilizzata è stata implementata per riconfigurare automaticamente il sensore al successivo tentativo di misurazione.
Impostazione risoluzione
Di solito si otterrà un valore intero che rappresenta l’equivalente in lux.
- Bassa risoluzione – (intervallo generico: 0,0 fino a 54612,5 lux)
- Alta risoluzione – (intervallo generico: 0,0 fino a 54612,5 lux)
- Alta risoluzione 2 – (intervallo generico: 0,0 fino a 27306,25 lux)
Il sensore stesso restituisce un intero senza segno a 16 bit. Pertanto il valore massimo è generalmente limitato. La conversione standard tra i cosiddetti “conteggi” in lux è 1/1.2, il che significa che si otterrà un valore inferiore. Poiché si usa float, se si verifica un errore otterrai un valore negativo.
-1 nessun dato valido è stato trasmesso dal sensore
-2 il dispositivo non è configurato. Altrimenti i conteggi misurati vengono convertiti in lux e restituiti. Se non vengono modificati parametri avanzati, il valore lux massimo è 54612,5 lx.
Poiché il sensore conta l’impatto della luce in un intervallo di tempo specifico, è possibile modificare questo intervallo di tempo. Ciò è necessario se si utilizza una finestra di sovrapposizione o si compensa l’influenza ambientale come l’oscurità. Questo lasso di tempo è definito da un registro chiamato MTreg.
Pertanto è possibile scegliere un valore compreso tra 32 e 254. Il valore predefinito è 69; tenere presente che il tempo di misurazione viene modificato di conseguenza.
Circuito elettrico del modulo GY-302
Per facilitare l’utilizzo del sensore di luce BH1750FVI è disponibile uno specifico modulo Breakout denominato GY-032.
Nello schema, oltre al sensore BH170 (datasheet) U1, troviamo il regolatore tipo CMOS a basso dropout tipo LM6206N – 662K (datasheet) U2 con relativi condensatori che fornisce l’alimentazione a 3.3V, quando il modulo viene alimentato dal pin VCC magari con la tensione 5V fornita da Arduino.
Il regolatore può fornire una corrente di uscita di 250 mA e consentire una tensione di ingresso fino a 6,5 V.
Troviamo due resistenze (R2 e R3 da 4,7 KΩ ) di pull-up sulle linee SCL e SDA bus I2C.
Il sensore può essere impostato per due indirizzi a seconda di come è collegato il pin 2 (ADDR):
- Se ADDR = LOW, l’indirizzo sarà 0x23
- Se ADDR = HIGH, l’indirizzo sarà 0x5C
Nel nostro caso essendo il pin connesso tramite la resistenza R4 da 4,7 KΩ a GND (LOW) l’indirizzo sarà 0x23.
Schema e PCB su https://oshwlab.com/
Caratteristiche del sensore
Ampio range (Lux): da 1 a 65.535
Alimentazione: da 3 VDC a 5 VDC
Temperatura di funzionamento: da -40°C a +85°C
Dimensioni (mm): 18,5×13,9×2,5 (connettori esclusi)
PINOUT del modulo sensore BH1750 GY-302
- VCC: ingresso alimentazione 2,7-5,5 VDC
- GND: massa alimentazione
- SCL: pin clock I2C
- SDA: pin DATA I2C
- ADDR: il pin viene utilizzato solo quando più BH1750 sono collegati a un Arduino.
Dove trovare il sensore?
Il Breakout GY-302 con sensore BH1750 può essere acquistato presso il sito FUTURA ELETTRONICA, il codice prodotto è 1606-GY302BH1750. Il suo costo, al momento della pubblicazione di questo articolo è di 4,20 €.
Contento del blister
Libreria di gestione del sensore
Per facilitare l’uso del sensore luce BH1750 è disponibile un’apposita libreria; questa funziona in unione alla libreria Wire.h che è già presente come libreria standard dell’IDE di Arduino che permette l’utilizzo del protocollo I2C
Per il caricamento occorre aprire sotto il menù Sketch, #include libreria, “Gestione Librerie..”
Nel campo ricerca si inserirà “BH1750”, trovata la libreria realizzata da Cristopher Laws , premendo su “More info..” apparirà il tasto “Installa” cliccare il tasto, la libreria verrà installata
Per altre informazioni vedere anche l’articolo Arduino – Tutorial, come installare una libreria
Collegamento di base del sensore
Vediamo prima di tutto il collegamento di base del sensore di luce BH1750 GY-302, in questo caso leggeremo i valori forniti dal sensore tramite il monitor seriale dell’IDE.
Materiale occorrente
Il materiale per realizzare il nostro Luxmetro è formato da:
Scheda Arduino UNO | Sensore BH1750 GY-302 |
Cavi colorati M/F |
Schema di collegamento
Sotto è riportato lo schema dei collegamenti tra Arduino e il modulo sensore
Test preliminare
Per verificare che il collegamento I2C è corretto e a quale indirizzo risponde il sensore, possiamo utilizzare lo Sketch i2c_scan che troveremo nella sezione “File” –> “Esempi” –> “Wire”–> “i2c_scanner” dell’IDE di Arduino.
Carichiamolo sulla nostra scheda ed apriamo il monitor seriale con il tasto
Il risultato sarà simile al seguente, che indica che il collegamento I2C è corretto e il suo indirizzo è 0x23.
Se ci fossero dei problemi di collegamento, provate a verificare se il modulo è correttamente collegato. Provare ad invertire i cavi SDA e SCL.
Programma/codice sorgente
Di seguito è riportato invece, il codice sorgente di base per la lettura del sensore. I valori potranno essere letti sempre tramite il monitor seriale dell’IDE. In questo caso dovreste visualizzare una schermata simile a questa.
Per il suo funzionamento sono necessarie le due librerie Wire e BH170
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <Wire.h> #include <BH1750.h> BH1750 lightMeter; void setup() { Serial.begin(9600); Wire.begin(); lightMeter.begin(); Serial.println("Lettura sensore di luce BH1750"); } void loop() { float lux = lightMeter.readLightLevel(); Serial.print("Intensità: "); Serial.print(lux, 1); Serial.println(" lx"); delay(1000); } |
Lettura sensore e dati mostrati su display OLED
Vediamo ora di completare il nostro Luxmetro inserendo un display OLED che ci permetterà di leggere il valore direttamente sul display.
Il display scelto è di tipo OLED da 0.96 ” con una risoluzione di 128×64 pixel, sfrutta il driver SSD1306 e si interfaccia tramite la connessioni I2C.
Il display ha la particolarità di avere una parte superiore con led gialli e quella inferiore di colore blu.
Per altre informazioni sul display vedere l’articolo Display bicolore OLED 0.96″ 128×64 – SSD1306
Materiale occorrente
Il materiale per realizzare il nostro Luxmetro è formato da:
Scheda Arduino UNO | Sensore BH1750 GY-302 |
Display OLED da 0.96 ” | Cavi colorati M/F |
Schema di collegamento
Sotto è riportato lo schema dei collegamenti tra Arduino e il modulo sensore
Librerie necessarie
Per utilizzare il display OLED è necessario installare l’apposita libreria. Può essere cercata tra le librerie installabili nell’IDE, basterà inserire nel campo di ricerca “Adafruit_SSD1306“.
Sarà anche mostrata una finestra che segnala che la libreria ha una dipendenza con la libreria grafica “Adafruit GFX Library“. Procedete premendo su “Install all”.
Per altre informazioni su come installare le librerie vedete l’articolo Arduino – Tutorial, come installare una libreria
Test preliminare
Per verificare che il collegamento I2C è corretto e a quale indirizzo rispondono sia il sensore che il display utilizzare lo Sketch i2c_scan che troveremo nella sezione “File” –> “Esempi” –> “Wire”–> “i2c_scanner” dell’IDE di Arduino. In questo caso il risultato dovrebbe essere quello sotto riportato, come vediamo l’indirizzo 0x23 è quello del sensore BH1750 GY-302, mentre 0x2C è quello del display OLED.
Programma/codice sorgente
Di seguito è riportato invece il codice sorgente di base per la lettura del sensore. In questo caso i valori letti di illuminamento saranno mostrati sul display con una tempo di campionamento di 1 secondo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | //Imposta sensore BH1750 #include <Wire.h> #include <BH1750.h> BH1750 lightMeter; //Imposta display OLED #include <Adafruit_SSD1306.h> #define OLED_ADDR 0x3C #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET 1 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); void setup() { //Inizializza monitor seriale Serial.begin(9600); // inizializza e cancella il display display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR); display.display(); delay(2000); display.clearDisplay(); // Inizializza il bus I2C e il sensore Wire.begin(); lightMeter.begin(); Serial.println(F("BH1750 Lettura sensore")); } void loop() { float lux = lightMeter.readLightLevel(); //Dati su monitor seriale Serial.print("Light: "); Serial.print(lux); Serial.println(" lx"); //Dati su display display.setTextColor(WHITE); display.setTextSize(2); display.setCursor(30, 0); display.println("BH1750"); display.setCursor(15, 20); display.print(lux, 1); display.println(" lx"); display.setTextSize(1); display.setCursor(15, 50); display.println("www.adrirobot.it"); display.display(); delay(1000); display.clearDisplay(); } |
Video del test del sensore
Altri sensori di luce
Sul sito nono disponibili altri tipi di sensori di luce, alcuni esempi