BH1750. Sensore di luce ambientale con bus I2C.

BH1750. Sensore di luce ambientale con bus I2C.

BH1750. Sensore di luce ambientale con bus I2C.

Il BH1750 è un sensore di illuminazione ambientale con risoluzione e sensibilità ragionevolmente elevate. Si comporta di fronte alla luce visibile in modo paragonabile a quello dell'occhio umano e non viene influenzato dalle radiazioni infrarosse né dipende dalla temperatura colore del tipo di illuminazione, cioè funziona bene con la luce naturale e con diversi tipi di illuminazione artificiale. Comunica digitalmente con il microcontrollore, con il Bus I2C, quindi è resistente ai disturbi se posto ad una certa distanza dal circuito che lo legge. Il suo tempo di risposta è piuttosto basso, inferiore a 200 ms nelle circostanze più sfavorevoli.

Sommario

    BH1750 Sensore di luce ambientale

    Dal punto di vista elettronico, la sua implementazione è molto semplice. Basta collegare l'alimentazione (tra 2,4 V e 3,6 V) e il Bus I2C. Opzionalmente, l'indirizzo del bus può essere modificato per collegare due dispositivi (con ADDR a livello basso è 0B0100011 o 0x23 e con ADDR a livello alto è 0B1011100 o 0x5C) e la linea VDI può essere utilizzata per la funzione di reset con il microcontrollore.

    Per collegare il BH1750 a Arduino, oltre ad essere alimentato dall'uscita a 3,3 V, è più corretto utilizzare un convertitore di livello in aggiunta al resistenze di pull-up per Bus I2C. Sebbene il componente supporterà una connessione diretta al bus Bus I2C Non è consigliabile dimensionare un circuito senza considerare la conversione del livello.

    Sensore di illuminazione ambientale BH1750. Circuito applicativo

    A causa della sua popolarità, dovuta al fatto che è molto economico in rapporto alla precisione, esistono diversi moduli, come ad esempio il noto GY-30, che si vede all'inizio nella foto. Per collegarli più comodamente durante la prototipazione con un microcontrollore, solitamente includono convertitori di livello per Bus I2C e regolatori di tensione per alimentarli con una tensione maggiore (fino a 5 V) invece dell'uscita 3,3 V di Arduino.

    Il BH1750 ha due modalità di lettura, continua e individuale, che corrispondono a due stati, attivo e basso consumo o sospensione. Mentre se viene utilizzata la modalità di lettura continua, il BH1750 rimane attivo dopo il campionamento, dopo aver eseguito una misurazione individuale entra automaticamente nella modalità di sospensione e di basso consumo. La prima lettura in modalità continua dura al massimo 180 ms e le successive tra 16 ms e 120 ms a seconda della risoluzione.

    Il sensore è in grado di misurare a intervalli (risoluzione) di 4 lux, 1 lux e 0,5 lux. Il BH1750 consiglia nella sua scheda tecnica di utilizzare la risoluzione di 1 lux, che permette di distinguere illuminazioni inferiori a 10 lux (che corrispondono al crepuscolo) ed è più immune ai disturbi che potrebbero influenzare la misurazione.

    Le risoluzioni di 1 lux e 4 lux utilizzano i 16 bit di dati per rappresentare la parte intera in modo da poter ottenere una misurazione massima di 65535 lux (giornata soleggiata senza luce diretta). La modalità 0,5 lux utilizza per la parte decimale il bit meno significativo (misura da 0,5 lux a 0,5 lux) quindi con i restanti 15 bit è possibile rappresentare un valore massimo di 32767 lux (esterno senza luce diretta)

    Illuminazione solare teorica rispetto alla capacità media del BH1750
    Illuminazione solare teorica del luogo e del giorno in cui è stato scritto l'articolo (ora legale, non solare) rispetto alla capacità media del BH1750 a 1 lux

    Normalmente, la finestra ottica secondo la quale viene misurata la luce ambientale corrisponde all'intero spettro visibile e l'obiettivo è ottenere in esso una distribuzione della sensibilità paragonabile a quella umana. Se la finestra ottica viene ridotta (la luce viene misurata in un intervallo di lunghezze d'onda inferiore) la sensibilità del BH1750 può essere aumentata (fino a 0,11 lux) con una modalità di annullamento della regolazione dell'influenza della finestra ottica aumentando la lettura del tempo in proporzione. Dato che in questa modalità speciale (sovradimensionata) si effettuano letture separate, il contesto deve consentirlo senza alterare particolarmente le condizioni di misura (ad esempio il sensore deve rimanere molto stabile, non deve spostarsi in una zona con condizioni di illuminazione diverse)

    Codici operativi BH1750

    Stato
    5>

    • 0B00000000 (0x00) Modalità a basso consumo o inattiva.

    • 0B00000001 (0x01) Acceso.

    • 0B00000111 (0x07) Ripristina. Cancella i registri dati del BH1750.

    Risoluzione
    5>

    • 0B00010011 (0x13) Misurazione continua con risoluzione 4 lux (tra 16 ms e tempo di lettura)

    • 0B00010000 (0x10) Misura continua con risoluzione 1 lux (tempo di lettura 120 ms)

    • 0B00010001 (0x11) Misura continua con risoluzione 0,5 lux (tempo di lettura 120 ms)

    • 0B00100011 (0x23) Una misurazione con risoluzione 4 lux (tempo di lettura 16 ms)

    • 0B00100000 (0x20) Una misurazione con risoluzione 1 lux (tempo di lettura 120 ms)

    • 0B00100001 (0x21) Una misurazione con risoluzione 0,5 lux (tempo di lettura 120 ms)

    Regolazione per modifica della finestra ottica
    5>

    • 0B011MT [0,1,2,3,4] Bit basso del registro MTREG (Measurement Time REGister).

    • 0B01000MT [5,6,7] Bit alto del registro MTREG.

    Leggi il BH1750 da Arduino

    Per misurare l'illuminazione ambientale con il BH1750 di Arduino viene utilizzata la biblioteca Wire che gestisce le comunicazioni con il Bus I2C. Il procedimento è quello consueto in questo tipo di comunicazioni, prima vengono attivate (una volta nel programma) con Wire.begin(), la comunicazione con il BH1750 inizia con Wire.beginTransmission() e il tuo indirizzo I2C (0x5C o 0x23 a seconda che ADDR sia rispettivamente alto o basso), si configura inviando il codice corrispondente con Wire.write() e l'autobus viene rilasciato con Wire.endTransmission()

    Se viene utilizzata una delle modalità di lettura continua, viene utilizzato Wire.beginTransmission() per ottenere i dati con l'indirizzo I2C corrispondente all'accesso al BH1750, vengono richiesti due byte (la risoluzione è di 16 bit) con Wire.requestFrom() che vengono letti, utilizzando Wire.read()e vengono caricati in un numero intero senza segno, ruotando il primo byte di 8 bit. L'autobus viene successivamente rilasciato con Wire.endTransmission(). Il risultato finale si ottiene dividendo il valore restituito per il fattore di precisione (1,2 se la finestra ottica non viene modificata)

    Se si utilizza la modalità letture individuali, il BH1750 entra in modalità sleep, per tornare alla modalità attiva è possibile inviare una configurazione (la stessa modalità di lettura o una nuova) o il codice di accensione (0x01). Il codice di spegnimento (1750x0) può essere utilizzato per forzare il BH00 in modalità sospensione.

    È importante rispettare il tempo di lettura del sensore, che dipende dalla risoluzione. Se l'attesa non è critica, può essere unificata in un valore per tutti i casi che può essere leggermente maggiore del massimo previsto per garantire il completamento della lettura.

    Per rendere più comoda la scrittura del codice per il BH1750 Arduino, i codici operazione più rilevanti si trovano nel seguente documento di intestazione.

    Il seguente codice di esempio mostra la modalità di lettura più comune nel sensore di luce I2C BH1750. La risoluzione è di 1 lux e la modalità di lettura è continua. L'esempio mostra l'utilizzo della console seriale Arduino, ciascun risultato ottenuto dal valore misurato.

    Come ho detto sopra, entrambe le modalità di risoluzione 1 lux e 4 lux utilizzano i 16 bit di dati per esprimere la misurazione come numero intero. Nella modalità 0,5 lux, invece, l'ultimo bit rappresenta una parte decimale, cioè il valore che concorre alla misura totale viene spostato di una potenza di due verso destra. In modalità 1 lux o 4 lux l'ultimo bit (LSB) vale 20, il penultimo 21, i successivi 22…in modalità 0,5 lux l'ultimo bit (LSB) vale 2-1, il penultimo 20, i successivi 21...

    Secondo questa struttura dei dati e considerando che devono essere effettuate due letture I2C di un byte, per ottenere il valore a 16 bit è necessario caricare i bit più significativi del byte, i primi ad essere letti, e ruotarli di 8 bit verso sinistra in modalità risoluzione 1 lux e in modalità risoluzione 4 lux e solo 7 bit nello 0,5 lux. Per unificare il modo di lettura nella modalità 0,5 lux è possibile caricare il byte più significativo in un intero senza segno, ruotare di 8 bit a sinistra, caricare il byte meno significativo e ruotare l'intero intero senza segno di 1 bit a destra, preservando il valore della parte decimale che indica il LSB (bit meno significativo) per applicarlo successivamente.

    Logicamente, per le modalità 1 lux o 4 lux è necessario utilizzare numeri interi senza segno (unsigned int) per che cosa Arduino non prenotare il MSB (bit più significativo) per il segno e poter operare direttamente con il vero valore della misura, non con un numero negativo. In Arduino Duetto non è necessario poiché gli interi usano 32 bit, ma lo stesso programma funzionerà anche se utilizzato unsigned int.

    Il codice seguente mostra come verrebbe utilizzata la modalità 0,5 lux

    Scarica i documenti con gli esempi di misurazione della luce ambientale con il sensore BH1750 e Arduino.

    Invia commento

    Potresti aver perso