Débuter avec le BH1750 (GY-302), mesurer la qualité de l'éclairage de votre habitation (Arduino/ESP8266/ESP32) • Domotique et objets connectés à faire soi-même

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.

Ajouter la librairie BH1750 à l’IDE Arduino

Téléchargez l’archive ZIP de la librairie depuis GitHub sans la décompresser.

8qqetvsdipyjsx5svgw2-1771699

Depuis l’IDE Arduino, allez dans le menu puis Ajouter la bibliothèque .ZIP

lsqwwmyz8wcvtwddmzvy-1765999

Circuit

dpvtlag7edxf2fusshyt-5722367Le 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

zwi5ci5ssxy2xwnrg168-9314184

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é.

agohzjyckyuhmaqkgszw-2453478

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 ?