projet crepp_git/crepp-projects/le-pot-qui-pense · branche main
LUX_LIB.py Voir sur GitLab
#
# Librairie permettant de gerer le capteur de luminosite
# BH1750
# Tester sur Wemos D1 mini
#
# Auteur : iTechnoFrance
#

from machine import I2C, Pin
import time

BH1750_ADDRESS_ADD_LOW  = 0x5C
BH1750_ADDRESS_ADD_HIGH = 0x23
BH1750_POWER_DOWN = 0x00  # Mise en veille
BH1750_POWER_ON = 0x01  # Attente pour une commande
BH1750_RESET = 0x07  # Mise à 0 du registre de données seulement en mode POWER_ON
# Mesure continue, résolution 1 Lux, temps de mesure 120ms
MODE_CONTINU_HAUTE_RESOLUTION = 0x10
# Mesure continue, résolution 0.5 Lux, temps de mesure 120ms
MODE_2_CONTINU_HAUTE_RESOLUTION = 0x11
# Mesure continue, résolution 4 Lux, temps de mesure 16ms
MODE_CONTINU_BASSE_RESOLUTION = 0x13
# 1 mesure puis passe en veille, résolution 1 Lux, temps de mesure 120ms
MODE_UNE_MESURE_HAUTE_RESOLUTION = 0x20
# 1 mesure puis passe en veille, résolution 0.5 Lux, temps de mesure 120ms
MODE_2_UNE_MESURE_HAUTE_RESOLUTION = 0x21
# 1 mesure puis passe en veille, résolution 4 Lux, temps de mesure 16ms
MODE_UNE_MESURE_BASSE_RESOLUTION = 0x23 

class BH1750():
       
    def __init__(self, i2c):
        self.i2c = i2c
        if self.detect():
            self.reset()
        
    def detect(self):
        detect_bh1750 = False
        i2c_peripheriques = self.i2c.scan()
        for i2c_peripherique in i2c_peripheriques:    
            if (i2c_peripherique == BH1750_ADDRESS_ADD_LOW):
                self.adresse = BH1750_ADDRESS_ADD_LOW
                detect_bh1750 = True
            if (i2c_peripherique == BH1750_ADDRESS_ADD_HIGH):
                self.adresse = BH1750_ADDRESS_ADD_HIGH
                detect_bh1750 = True
        return detect_bh1750
    
    def reset(self):
        self.data = bytearray(1)
        self.data[0] = BH1750_POWER_ON
        self.i2c.writeto(self.adresse, self.data)  
        time.sleep(0.01)  # delai de 10ms
        self.data[0] = BH1750_RESET
        self.i2c.writeto(self.adresse, self.data)  
        time.sleep(0.01)  # delai de 10ms
    
    def lecture_lumiere(self, mode_mesure): 
        self.BH1750_MODE = mode_mesure
        self.mode_mesure_ok = False
        self.luminosite = 0
        self.data_mode = bytearray(1)
        self.lux = bytearray(2)
        self.delai = 0
        # configuration du mode de mesure
        if (self.BH1750_MODE == MODE_CONTINU_HAUTE_RESOLUTION):
            self.mode_mesure_ok = True
        if (self.BH1750_MODE == MODE_2_CONTINU_HAUTE_RESOLUTION):
            self.mode_mesure_ok = True
        if (self.BH1750_MODE == MODE_CONTINU_BASSE_RESOLUTION):
            self.mode_mesure_ok = True
        if (self.BH1750_MODE == MODE_UNE_MESURE_HAUTE_RESOLUTION):
            self.mode_mesure_ok = True
            self.delai = 0.120
        if (self.BH1750_MODE == MODE_2_UNE_MESURE_HAUTE_RESOLUTION):
            self.mode_mesure_ok = True
            self.delai = 0.120
        if (self.BH1750_MODE == MODE_UNE_MESURE_BASSE_RESOLUTION):
            self.mode_mesure_ok = True
            self.delai = 0.016
        if (self.mode_mesure_ok):
            self.data_mode[0] = self.BH1750_MODE
            self.i2c.writeto(self.adresse, self.data_mode)
            time.sleep(self.delai)
            self.i2c.readfrom_into(self.adresse, self.lux)
            self.lux = self.lux[0] * 256 + self.lux[1]
            self.lux = int(float(self.lux) / 1.2)  # Voir la documentation du capteur
            return(self.lux)
        else:
            print("Erreur : mode invalide")