Code :
[== Indéfini ==]
#!/usr/bin/python
# -*- coding=utf-8 -*-
# Thermopi - Station Meteo, horloge et date
# Par El Wared - Juin 2015
# Necessite les librairies Adafruit_DHT et RPi_I2C_driver trouvees sur le net
# imports divers
import RPi_I2C_driver
import time
from time import sleep
from datetime import datetime
import os
import sys
from subprocess import *
import locale
locale.setlocale(locale.LC_ALL, 'fr_FR')
# Mise en variable de la bibliotheque du lcd
lcd = RPi_I2C_driver.lcd()
# Fonction qui permet de passer une commande OS
def run_cmd(cmd):
p = Popen(cmd, shell=True, stdout=PIPE)
output = p.communicate()[0]
return output
# Definition des caracteres perso, fais avec http://www.quinapalus.com/hd44780udg.html
fontdata1 = [
# Char 0 - thermometre
[ 0x4, 0xa, 0xa, 0xe, 0xe, 0x1f, 0x1f, 0xe],
# Char 1 - goutte
[ 0x4, 0x4, 0xa, 0xa, 0x11, 0x11, 0x11, 0xe],
# Char \x02 - degre celcius
[0x18, 0x18, 0x0, 0x0, 0x3, 0x4, 0x4, 0x3],
# Char \x03 - pourcent
[0x0 ,0x18 ,0x19 ,0x2 ,0x4 ,0x8 ,0x13 ,0x3],
# Char \x04 - barre char de gauche
[0x0,0x0,0x0,0x1f,0x0,0x0,0x0,0x0],
# barre du millieu
[0x0,0x0,0x0,0x1f,0x4,0x4,0x4,0x4],
# barre verticale
[0x4,0x4,0x4,0x4,0x4,0x4,0x4,0x4],
]
# Import des caracteres perso
lcd.lcd_load_custom_chars(fontdata1)
# Mise en variable des GPIO associes au sondes DHT22
sonde1 = 14
sonde2 = 23
sonde3 = 15
# Mise en variable la commande OS dans les variables lire_*
lire_temp1 = "sudo nice -20 ./Adafruit_DHT 22 %d |grep Temp |awk '{ print $3 }'" % (sonde1)
lire_hum1 = "sudo nice -20 ./Adafruit_DHT 22 %d |grep Temp |awk '{ print $7 }'" % (sonde1)
lire_temp2 = "sudo nice -20 ./Adafruit_DHT 22 %d |grep Temp |awk '{ print $3 }'" % (sonde2)
lire_hum2 = "sudo nice -20 ./Adafruit_DHT 22 %d |grep Temp |awk '{ print $7 }'" % (sonde2)
lire_temp3 = "sudo nice -20 ./Adafruit_DHT 22 %d |grep Temp |awk '{ print $3 }'" % (sonde3)
lire_hum3 = "sudo nice -20 ./Adafruit_DHT 22 %d |grep Temp |awk '{ print $7 }'" % (sonde3)
# Creation d'une variable contenant l'heure actuelle
heure = datetime.now().strftime('%H:%M %d %b')
# Creation des variables des temperatures et humidites pour chaque sonde
t1 = 0
t2 = 0
t3 = 0
h1 = 0
h2 = 0
h3 = 0
# Creation de la fonction qui va aller lire les valeurs des sondes
def acq_valeurs() :
# Definition des variables t* et h* comme des variables globales
global t1, t2, t3, h1, h2, h3
# Creation d'une boucle...
while True :
# ... qui va lire les valeurs de la sonde
t1 = run_cmd(lire_temp1)
h1 = run_cmd(lire_hum1)
try:
# Permet de supprimer un caractere indesirable en fin de chaine http://www.developpez.net/forums/d1527828/autres-langages/python-zope/general-python/affichage-variable-caractere-indesirable/
t1, h1 = float(t1), float(h1)
# Test des valeurs pour verifier que ce sont des "float"
float(t1) and float(h1)
# Si c'est le cas la boule est cassée et passe au prochain bloc
break
# En cas d'erreur...
except ValueError:
# ... attente d'une seconde et retour a la lecture des valeurs
sleep(1)
# Bloc identique a celui du dessus pour la sonde 2
while True :
t2 = run_cmd(lire_temp2)
h2 = run_cmd(lire_hum2)
try:
t2, h2 = float(t2), float(h2)
float(t2) and float(h2)
break
except ValueError:
sleep(1)
# Bloc identique a celui du dessus pour la sonde 2
while True :
t3 = run_cmd(lire_temp3)
h3 = run_cmd(lire_hum3)
try:
float(t3) and float(h3)
t3, h3 = float(t3), float(h3)
break
except ValueError:
sleep(1)
# Creation de la fonction qui va afficher sur le lcd avec les valeurs des sondes en parametre
def affichage(t1, t2, t3, h1, h2, h3):
# Bloc d affichage du LCD ligne par ligne
# Affichage de la date et heure sur la 1ere ligne
lcd.lcd_display_string(datetime.now().strftime('%H:%M %d %b'), 1),
# Affichage de la ligne 2
lcd.lcd_display_string(" Piece\x05Salon\x05Ch.1 " , 2),
# Affichage de la ligne 3 avec t°
lcd.lcd_display_string("\x00 :%s\x02\x06%s\x02\x06%s\x02" %(t1, t2, t3) , 3),
# Affichage de la ligne 3 avec hum
lcd.lcd_display_string("\x01 :%s\x03\x06%s\x03\x06%s\x03"%(h1, h2, h3) , 4),
# Affichage du lcd avec les valeurs a zero
affichage(t1, t2, t3, h1, h2, h3)
# Boucle principale d'acquisition et d'affichage
while 1:
# Lecture des sondes via la fonction acq_valeurs()
acq_valeurs()
# Boucle de test d'heure et d'affichage
while 1:
# Mise en variable de l'heure actuelle...
heure2 = datetime.now().strftime('%H:%M %d %b')
# ... et tester si "heure" est different de "heure2"
# Permet de changer l'heure a chaque minute (fonction horloge du lcd)
if heure != heure2 :
# Si la minute courante est differente, affichage des valeurs mise en variable precedement...
# ... avec la fonction affichage
affichage(t1, t2, t3, h1, h2, h3)
# Mise en variable de l heure courante...
heure = datetime.now().strftime('%H:%M %d %b')
# ... et la boucle est cassee et retourne a la lecture des sondes via la fonction acq_valeurs()
break
# Autrement (si heure est egale a heure2)...
else :
# Boucle qui permet de laisser passer le temps pour ne renouveller les valeurs que
# si l'heure courante a change
while 1:
# Mise en variable de l heure courante...
heure2 = datetime.now().strftime('%H:%M %d %b')
# ... et si heure est egal a heure2
if heure == heure2 :
# Attente de 2 secondes
sleep(2)
# Autrement (heure different de heure2)
else:
# Affichage des valeurs...
affichage(t1, t2, t3, h1, h2, h3)
# et la boucle est cassee et retourne a la lecture des sondes via la fonction acq_valeurs()
break
grosso modo j'ai de la chance quand j'ai ce genre de sorti à l'ecran...