dimanche 24 février 2019

Capteur de lumière TSL2561 et Raspberry Pi

Le capteur de lumière TSL2561 permet de mesurer l'intensité lumineuse avec une très bonne précision. Il comporte en fait deux capteurs: un capteur large bande qui réagit à la lumière visible et à la lumière infrarouge, et un deuxième capteur qui ne réagit qu'à l'infrarouge. Au moyen des deux valeurs mesurées, il est possible de calculer l'éclairement en lux. Nous avons déjà eu l'occasion d'utiliser un de ces modules avec un Arduino mais voyons maintenant ce que nous pouvons en tirer si nous le connectons à un Raspberry Pi, que nous programmerons en Python

Connexion du module TSL2561 au Raspberry Pi


Puisqu'il s'agit d'un capteur I2C, nous utilisons les broches du Raspberry Pi qui sont dédiées à ce type de communication.

                                             Module TSL2561  ----------    Raspberry Pi
                                                         VCC   ---------------   Broche 1 (3,3 V)
                                                         GND   ---------------- Broche 6 (GND)
                                                         SCL     --------------   Broche 5 (GPIO3)
                                                         SDA    ---------------  Broche 3 (GPIO2)
                                                         INT      -------------    pas branché


Préparation du Raspberry Pi pour la communication i2c

La communication i2c doit avoir été activée sur votre Raspberry Pi. Pour ce faire, il s'agit d'aller dans le menu "Préférences / Configuration du Raspberry Pi".


On sélectionne ensuite "Activé" sur la ligne "I2C", et on redémarre le Raspberry Pi.


Si le module TSL2561 est correctement branché à votre Raspberry Pi, vous devriez le voir à l'adresse 39 en entrant la commande "i2cdetect -y 1" dans le Terminal.


Bibliothèque

Il n'est pas très difficile de récupérer les données brutes issues des deux capteurs du TSL2561, mais leur conversion en lux est assez délicate, et j'ai donc préféré utiliser une bibliothèque conçue par Keiichi Shima.  De tous ces fichiers présents dans cette collection, seuls tsl2561.py et sensorbase.py sont nécessaires.

Script 1: affichage des données dans le terminal

Commençons par un premier exemple minimaliste: une fois par seconde, l'intensité lumineuse mesurée par le capteur est affichée dans le terminal. Il est facile de faire varier la valeur affichée en couvrant le capteur, en le dirigeant vers une source lumineuse, etc.



#!/usr/bin/python
# -*- coding:utf-8 -*-
'''
Utilisation d'un capteur de lumière TSL2561 avec
un Raspberry Pi.
Chaque seconde, le terminal affiche l'intensité
lumineuse en lux.
Plus d'infos:
https://electroniqueamateur.blogspot.com/2019/02/capteur-de-lumiere-tsl2561-et-raspberry.html
'''
import smbus # pour la communication i2c
import time # pour le chronométrage du délai
import tsl2561 # https://github.com/keiichishima/RPiSensors
bus = smbus.SMBus(1) # bus i2c
capteur = tsl2561.Tsl2561(bus) #initialisation du capteur
while True:
print ("Intensite lumineuse : %0.3f lux" %capteur.lux)
time.sleep(1)


Script 2: affichage dans une fenêtre avec Tkinter (interface graphique)

Dans ce deuxième exemple, j'ai utilisé Tkinter afin d'afficher la valeur mesurée dans une fenêtre plus élégante. Grâce à la méthode "after" de Tkinter, la valeur affichée se met à jour chaque seconde.



#!/usr/bin/python
# -*- coding:utf-8 -*-
'''
Utilisation d'un capteur de lumière TSL2561 avec
un Raspberry Pi.
Version avec interface graphique: l'intensité
lumineuse est affichée dans une fenêtre, et
mise à jour chaque seconde.
Plus d'infos:
https://electroniqueamateur.blogspot.com/2019/02/capteur-de-lumiere-tsl2561-et-raspberry.html
'''
import smbus # pour la communication i2c
import time # pour le chronométrage du délai
from tkinter import * # pour l'interface graphique
import tsl2561 # https://github.com/keiichishima/RPiSensors
# initialisation du capteur
bus = smbus.SMBus(1) # bus i2c
capteur = tsl2561.Tsl2561(bus)
# création de la fenêtre
fenetre = Tk() # création d'une fenêtre
fenetre.geometry("300x100+150+150") # taille de la fenêtre et position initiale sur l'écran
fenetre.title("Luminosité") # titre de la fenêtre
label = Label(fenetre, text=" ") # ligne vide
label.pack()
label1 = Label(fenetre, fg="red", text="Intensité lumineuse:")
label1.pack()
label = Label(fenetre, text=" ") # ligne vide
label.pack()
label2 = Label(fenetre, text=" ") # contiendra la mesure totale
label2.pack()
def Majvaleur():
label2['text'] = "{0:0.3f}".format(capteur.lux) + " lux"
fenetre.after(1000, Majvaleur) # on recommence dans 1 seconde
fenetre.after(1000, Majvaleur)
fenetre.mainloop()

Script 3: datalogging dans un fichier csv

Finalement, ce troisième script consigne les mesures à l'intérieur d'un fichier intitulé "luminosité.csv", qui est créé dans le même répertoire que le script python, et qui peut ensuite être ouvert avec LibreOffice Calc.

La capture d'écran ci-dessus montre le résultat pendant que le soleil se lève, un matin d'hiver nuageux. La première colonne contient le moment de la mesure (en secondes), et la deuxième colonne contient la valeur mesurée en lux.




#!/usr/bin/python
# -*- coding:utf-8 -*-
'''
Utilisation d'un capteur de lumière TSL2561 avec
un Raspberry Pi.
Toutes les 20 secondes, l'intensité lumineuse est
enregisrée dans un fichier .csv
Plus d'infos:
https://electroniqueamateur.blogspot.com/2019/02/capteur-de-lumiere-tsl2561-et-raspberry.html
'''
import smbus # pour la communication i2c
import time # pour le chronométrage du délai
import tsl2561 # https://github.com/keiichishima/RPiSensors
# initialisation du capteur
bus = smbus.SMBus(1) # bus i2c
capteur = tsl2561.Tsl2561(bus)
print("Data logging en cours")
tailleEchantillon = 0;
while True:
# Ecriture des mesures dans le terminal
print ("Intensite lumineuse : %0.3f lux" %capteur.lux)
temps = round(time.time())
# écriture dans le fichier
fichier = open("luminosite.csv", "a")
fichier.write("\n" + str(temps) + ";" + str(capteur.lux))
fichier.close()
tailleEchantillon = tailleEchantillon + 1
print("Nombre de données consignées au fichier:" + str(tailleEchantillon))
time.sleep(20.0)

Yves Pelletier   (TwitterFacebook)

Aucun commentaire:

Enregistrer un commentaire