Joy-PI Leçon #06 : Détecteur de luminosité

Cette fois, c’est un détecteur de luminosité qui est utilisé. L’utilisation de celui-ci est différente du détecteur de sons dans la méthode utilisée, car ce capteur n’utilise pas une broche GPIO, mais le bus I2C. Le capteur (BH1750FVI) fournit une valeur allant de 1 à 65535 lux (lx), les données sont accessibles à l’adresse 0x5C du bus I2C.
Voici à quoi ressemble ce capteur dans votre mallette, il est situé juste au-dessus du détecteur de son utilisé dans la leçon 5.

Commutateurs :

La position des commutateurs est sans importance, car on utilise le bus I2C.

Le logiciel

Cet exemple utilisera une classe python, il est repris du site raspberry-spy.co.uk, dont l’auteur est Matt Hawkins.
De plus, la version proposée utilise la librairie smbus (classe SMBus), qui est un sous-ensemble de la librairie I2C.

Le pseudo-code :

  • Importation des librairies
  • Contrôle la bonne utilisation du bus SMBus
  • Définition d’une classe LigntSensor
  • Dans une boucle infinie (arrêt avec CTRL-C)
    • Affiche la lumière lue
    • Attente

En python :

#import necessary libraries
import RPi.GPIO as GPIO
import time
import smbus

#check RPI card revision
if(GPIO.RPI_REVISION == 1):
    bus = smbus.SMBus(0)
else:
    bus = smbus.SMBus(1)

#The LightSensor class
class LightSensor():
    def __init__(self):
        #define some constants from the datasheet
        self.DEVICE = 0x5c #default device I2C address
        self.POWER_DOWN = 0x00 #no active state
        self.POWER_ON = 0x01 #power on
        self.RESET = 0x07 #reset data register value
        #start measurement at 4 Lux
        self.CONTINUOUS_LOW_RES_MODE = 0x13
        #start measurement at 1 Lux
        self.CONTINUOUS_HIGH_RES_MODE_1 = 0x10
        #start measurement at 0.5 Lux
        self.CONTINUOUS_HIGH_RES_MODE_2 = 0x11
        #start measurement at 1 Lux
        #device is automatically set to power down mode after measurement
        self.ONE_TIME_HIGH_RES_MODE_1 = 0x20
        #start measurement at 0.5 Lux
        #device is automatically set to power down mode after measurement
        self.ONE_TIME_HIGH_RES_MODE_2 = 0x21
        #start measurement at 4 Lux
        #device is automatically set to power down mode after measurement
        self.ONE_TIME_LOW_RES_MODE = 0x23
        
    def convertToNumber(self, data):
        #Simple function to convert 2 Bytes of data
        #into a decimal number
        return ((data[1] + (256 * data[0])) / 1.2)
    
    def readLight(self):
    
        data = bus.read_i2c_block_data(self.DEVICE,self.ONE_TIME_HIGH_RES_MODE_1)
        return self.convertToNumber(data)

#main code
def main():
    sensor = LightSensor()
    try:
        while True:
            print("Light Level : " + str(sensor.readLight()) + " lx")
            time.sleep(0.5)
    except KeyboardInterrupt:
        pass
    
if __name__ == "__main__":
    main()

Laisser un commentaire