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()