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)
INT ------------- pas branché
GND ---------------- Broche 6 (GND)
SDA --------------- Broche 3 (GPIO2)
SCL -------------- Broche 5 (GPIO3)
INT ------------- pas branché
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 (Twitter, Facebook)