BH1750 (GY-302), mesurer la qualité de l’éclairage de votre habitation (Arduino/ESP8266/ESP32)

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. Nous utiliserons la luminosité mesurée pour construire un indicateur de qualité d’éclairage ambiant basé sur la norme Européenne EN 12464-1. 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.

github arduino library bh1750

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

ide arduino add ajouter librairie

Circuit

Le module GY-302 (BH1750) communique via le bus I2C avec l’Arduino ou l’ESP8266. Le câblage est très simple. Repérage des broches du GY-302. La documentation technique est disponible ici.

 

Broche Description
GND Ground
ADDR Sélection de l’adresse I2C (0x5C si alimenté en 3,3V, sinon 0x23)
SDA I2C SDA
SCL I2C SCL
VCC 3.3V

arduino ic2 BH1750 circuit

Pour vos schémas Fritzing, le composant est disponible sur GitHub ici

Sur un Arduino, relier la broche SDA sur la broche A4 et SCL sur la broche A5. Sur l’ESP8266 Wemos d1 mini, SDA est en D2 et SCL en D1. Pour d’autres cartes ESP8266, lisez cet article.

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 <Wire.h>

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

en 12464-1 niveau luminosite eclairage lux

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.h>
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 / 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 <Wire.h>
#include <BH1750.h>

/*
 * 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 ) {
    luxLevel = 1;
    luxMessage = LEVEL_TOOLOW;
  } else if ( lux > _TOOLOW && lux <= _LOW ) {
    luxLevel = 2;
    luxMessage = LEVEL_LOW;
  } else if ( lux > _LOW && lux <= _HIGH ) {
    luxLevel = 3;
    luxMessage = LEVEL_OPTIMAL;
  } else if ( 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);
}

Voilà. Une brique de plus terminée pour notre station de surveillance de la qualité de l’air (et du bien être).

Print Friendly, PDF & Email

Inscrivez-vous à la newsletter hebdomadaire

Aucun spam et aucun autre usage ne sera fait de votre email. Vous pouvez vous désinscrire à tout moment.

Comparateur de prix

Bons plans

Les offres suivantes se terminent bientôt. Utilisez le coupon indiqué pour profiter du prix promo

Tags:

Domotique et objets connectés à faire soi-même