Le GY-302 de CJMCU est une carte I2C qui permet de mesurer la quantité de lumière à l’aide du photo-détecteur BH1750. On pourra par exemple utiliser la mesure du capteur pour calculer la qualité d’éclairage d’une pièce suivant la norme Européenne EN 12464-1.
Tutoriel actualisé le 23 mai 2020
Il est très facile d’intégrer la capteur GY-302 dans un projet Arduino ou ESP8266 à l’aide de la librairie développée par Christopher Laws. Elle est disponible sur cette page GitHub. Le GY-302 coûte moins d’un euro.
Sommaire
Ajouter la librairie BH1750 à l’IDE Arduino
Téléchargez l’archive ZIP de la librairie depuis GitHub sans la décompresser.
Depuis l’IDE Arduino, allez dans le menu puis Ajouter la bibliothèque .ZIP
Circuit
Le module GY-302 (BH1750) communique via le bus I2C avec un micro-contrôleur (Arduino, ESP8266, ESP32, STM32) ou un Raspberry Pi. Le câblage est très simple. Repérage des broches du GY-302. La documentation technique est disponible ici.
Broche | Description | Arduino | ESP8266 | ESP32 | Raspberry Pi |
---|---|---|---|---|---|
GND | Masse | GND | GND | GND | Pin 9 |
ADDR | Sélection de l’adresse I2C, par défaut 0x23 0x5C si alimenté en 3,3V |
||||
SDA | Broche I2C SDA | A4 | D2 | GPIO21 | Pin 2 (GPIO2) |
SCL | Broche I2C SCL | A5 | D1 | GPIO22 | Pin 5 (GPIO3) |
VCC | 3.3V | 3V3 | 3V3 | 3V3 | Pin 1 |
Il est possible d’attribuer manuellement les broches du bus I2C à l’aide de la librairie Wire.h. Au début du programme, on déclare la librairie
#include
puis dans la fonction setup()
Wire.begin(broche SDA, broche SCL);
Voilà, tous les périphériques I2C sont déroutés vers les nouvelles broches.
Comment mesurer la qualité de l’éclairage ?
En Europe, la norme EN 12464-1 (synthèse en Français et en anglais) définit les niveaux d’éclairement minimum moyen en fonction du poste de travail occupé.
Source : La revue de l’éclairage LUX n°228 mai/juin 2004 disponible en ligne.
Dans une habitation, il n’y a pas de norme précise (à ma connaissance). Keria, un spécialiste des luminaires à publié sur son site quelques intensités lumineuses courantes. Voici un extraits des recommandations pour quelques pièces de la maison (ou pour obtenir une certaine ambiance : intime, conviviale, jeu, travail).
Pièce et ambiance recherchée | Intensité lumineuse | Couleur recommandée |
Salon, salle à manger, chambre d’adulte. Ambiance tamisée, intime. | 25-50 lux | Blanc chaud |
Salon, salle à manger, cuisine, chambre d’adulte, bureau. Ambiance conviviale, moments de détente. | 100-150 lux | Blanc chaud |
Bureau, bibliothèque, chambre d’enfant, salle de jeux. Ambiance de travail, de jeux. | 200-250 lux | Blanc neutre |
Ambiance technique : espaces de forte activité (bureau, atelier) et de circulation (couloirs, entrée) | 350-500 lux | Blanc froid |
Source : https://www.keria.com/guides/comment-calculer-la-quantite-declairage-necessaire-dans-une-piece
A partir de ces différentes données, j’ai construit un indicateur à 5 niveaux (trop bas, bas, idéal, élevé, trop élevé). Vous pouvez ajuster les valeurs en fonction de vos habitudes et de vos besoins.
#define _TOOLOW 25
#define _LOW 50
#define _HIGH 500
#define _TOOHIGH 750
#define LEVEL_TOOLOW "Trop bas"
#define LEVEL_LOW "Bas"
#define LEVEL_OPTIMAL "Idéal"
#define LEVEL_HIGH "Elevé"
#define LEVEL_TOOHIGH "Trop élevé"
Fonctionnement de la librairie BH1750
La librairie BH1750 s’utilise de façon très similaire à la librairie BME280 (ou BMP180). En début de programme, on appel la librairie et on initialise l’objet lightMeter en indiquant l’adresse du BH1750 sur le bus I2C. Par défaut le BH1750 se trouve à l’adresse 0x23. Si vous avez un conflit avec un autre composant, vous pouvez attribuer l’adresse 0x5C en alimentant la broche addr en 3,3V.
#include
BH1750 lightMeter(0x23);
La librairie prend en charge les 6 modes de fonctionnement du capteur. Le capteur peut mesurer la luminosité en continue
- BH1750_CONTINUOUS_LOW_RES_MODE : mesure rapide (16ms) en basse résolution (4 lux de précision)
- BH1750_CONTINUOUS_HIGH_RES_MODE (mode par défaut) : mesure haute résolution (1 lux de précision). Le temps de mesure est de 120ms
- BH1750_CONTINUOUS_HIGH_RES_MODE_2 :mesure très haute résolution (0,5 lux de précision). Temps de mesure 120ms
Ces trois autres modes permettent de réaliser une seule mesure (One_Time) et ensuite de mettre le capteur en économie d’énergie. La précision et le temps de mesure est identique.
- BH1750_ONE_TIME_LOW_RES_MODE
- BH1750_ONE_TIME_HIGH_RES_MODE
- BH1750_ONE_TIME_HIGH_RES_MODE_2
Dans le setup, on démarre l’objet lightMeter à l’aide de la fonction begin(uint8_t mode) en lui passant comme paramètre le mode de mesure. La fonction configure(uint8_t mode) est (appelée par begin) est également exposée.
void setup(){
lightMeter.begin(BH1750_CONTINUOUS_HIGH_RES_MODE);
}
La méthode readLightLevel() permet de lire à tout moment l’intensité lumineuse mesurée par le BH1750. La fonction retourne directement la mesure en Lux.
uint16_t lux = lightMeter.readLightLevel();
Code Arduino compatible ESP8266
Voici le code complet de l’application qu’il vous suffit de téléverser. Il fonctionne indifféremment sur Arduino, ESP8266 ou ESP32.
/*
Mesurer la qualité d'éclairage de votre habitation à l'aide d'un capteur GY-302 (BH1750)
Measure the lighting quality of your home with a GY-30 (BH1750) sensor
Code basé sur la librairie Arduino de Christopher Laws disponible sur GitHub
Based on the Arduino library of Christopher Laws abailable on GitHub https://github.com/claws/BH1750
Connection:
VCC -> 5V (3V3 on Arduino Due, Zero, MKR1000, etc)
GND -> GND
SCL -> SCL (A5 on Arduino Uno, Leonardo, etc or 21 on Mega and Due)
SDA -> SDA (A4 on Arduino Uno, Leonardo, etc or 20 on Mega and Due)
ADD -> GND or VCC (see below)
ADD pin uses to set sensor I2C address. If it has voltage greater or equal to
0.7VCC voltage (as example, you've connected it to VCC) - sensor address will be
0x5C. In other case (if ADD voltage less than 0.7 * VCC) - sensor address will
be 0x23 (by default).
https://projetsdiy.fr - https://diyprojects.io
*/
#include
#include
/*
* Niveau d'éclairage définit à partir de la norme EN 12464-1
* Lighting level defined from the standard EN 12464-1
* http://www.afe-eclairage.fr/docs/362-ext.pdf
*/
#define _TOOLOW 25
#define _LOW 50
#define _HIGH 500
#define _TOOHIGH 750
#define LEVEL_TOOLOW "Trop bas" // Too low
#define LEVEL_LOW "Bas" // Low
#define LEVEL_OPTIMAL "Idéal" // Ideal
#define LEVEL_HIGH "Elevé" // High
#define LEVEL_TOOHIGH "Trop élevé" // Too High
uint16_t lux = 250;
int luxLevel = 3;
String luxMessage = LEVEL_OPTIMAL;
/*
BH1750 can be physically configured to use two I2C addresses:
- 0x23 (most common) (if ADD pin had < 0.7VCC voltage)
- 0x5C (if ADD pin had > 0.7VCC voltage)
Library use 0x23 address as default, but you can define any other address.
If you had troubles with default value - try to change it to 0x5C.
*/
BH1750 lightMeter(0x23);
void setup(){
Serial.begin(115200);
/*
Each mode, has three different precisions:
- Low Resolution Mode - (4 lx precision, 16ms measurment time)
- High Resolution Mode - (1 lx precision, 120ms measurment time)
- High Resolution Mode 2 - (0.5 lx precision, 120ms measurment time)
Full mode list:
BH1750_CONTINUOUS_LOW_RES_MODE
BH1750_CONTINUOUS_HIGH_RES_MODE (default)
BH1750_CONTINUOUS_HIGH_RES_MODE_2
BH1750_ONE_TIME_LOW_RES_MODE
BH1750_ONE_TIME_HIGH_RES_MODE
BH1750_ONE_TIME_HIGH_RES_MODE_2
*/
lightMeter.begin(BH1750_CONTINUOUS_HIGH_RES_MODE);
Serial.println(F("BH1750 Test"));
}
void loop() {
lux = lightMeter.readLightLevel();
if ( lux _TOOLOW && lux _LOW && lux _HIGH && lux < _TOOHIGH ) {
luxLevel = 4;
luxMessage = LEVEL_HIGH;
} else {
luxLevel = 5;
luxMessage = LEVEL_TOOHIGH;
}
Serial.print("Light: ");
Serial.print(lux);
Serial.print(" lx, level: ");
Serial.print(luxLevel);
Serial.print(" , quality: ");
Serial.println(luxMessage);
delay(1000);
}
Une brique de plus terminée pour développer votre station de surveillance de la qualité de l’air.
Le sujet vous intéresse, voici d’autres capteurs pour surveiller la qualité de l’air
Avez-vous aimé cet article ?