Table des matières

Logique métier

Nous allons demander à Python de générer une page web et d'y afficher nos données.

Structure du code

Nous sommes prêt à structurer plus proprement notre application en séparant :

Création d'un fichier capteur.py

Dans une démarche de développement propre, modulaire et réutilisable, on sépare la logique métier (la lecture des données et les calculs) de l’interface utilisateur (site web, affichage).

Le fichier capteur.py ne contient plus de boucle while True ni de traitement direct. Il est composé exclusivement de fonctions, que l’on pourra appeler depuis une autre application, ici app.py (notre serveur Flask).

Ce script agit comme une boîte à outils. Il regroupe :

Le projet final étant hors ligne, nous retirons la partie appel API d'openweather, cette partie du code n'avait qu'un but pédagogique.

Code pour le Raspberry Pi zéro :

#importations
import Adafruit_DHT
import math
from datetime import datetime

#definir le capteur et le port GPIO
DHT_SENSOR = Adafruit_DHT.DHT22
DHT_PIN = 4

def lire_donnees_capteur():
    humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)
    #attention, la fonction read_retry() retourne en premier l'humidité puis la temperature.
    if humidity is not None and temperature is not None:
        return round(humidity, 1), round(temperature, 1)
    else:
        return None, None

def calculer_point_de_rosee(temperature, humidity):
    #Formule pour calculer le point de rosée
    alpha = 17.27
    beta = 237.7
    gamma = (alpha * temperature) / (beta + temperature) + math.log(humidity / 100)
    point_de_rosee = (beta * gamma) / (alpha - gamma)
    return round(point_de_rosee, 1)

def calculer_humidex(temperature, point_de_rosee):
    #Formule pour calculer l'indice humidex
    humidex = temperature + (5/9) * (6.11 * math.exp(5417.7530 * ((1/273.16) - (1/273.15 + point_de_rosee))) - 10)
    return round(humidex, 1)

def recuperer_date_heure():
    return datetime.now().strftime("%d-%m-%Y %H:%M:%S")

Code pour le Raspberry Pi 5 :

#importations
import adafruit_dht
import board
import math
from datetime import datetime

def lire_donnees_capteur():
    try:
        dhtDevice = adafruit_dht.DHT22(board.D4)
        humidity = dhtDevice.humidity
        temperature = dhtDevice.temperature
        dhtDevice.exit()
        if humidity is not None and temperature is not None:
            return round(humidity, 1), round(temperature, 1)
        else:
            return None, None

    except RuntimeError as error:
        print("Erreur de lecture :", error)
        return None, None

    except Exception as error:
        dhtDevice.exit()
        raise error

def calculer_point_de_rosee(temperature, humidity):
    #Formule pour calculer le point de rosée
    alpha = 17.27
    beta = 237.7
    gamma = (alpha * temperature) / (beta + temperature) + math.log(humidity / 100)
    point_de_rosee = (beta * gamma) / (alpha - gamma)
    return round(point_de_rosee, 1)

def calculer_humidex(temperature, point_de_rosee):
    #Formule pour calculer l'indice humidex
    humidex = temperature + (5/9) * (6.11 * math.exp(5417.7530 * ((1/273.16) - (1/273.15 + point_de_rosee))) - 10)
    return round(humidex, 1)

def recuperer_date_heure():
    return datetime.now().strftime("%d-%m-%Y %H:%M:%S")

Commentaires sur la fonction lire_donnees_capteur() :

try:

dhtDevice = adafruit_dht.DHT22(board.D4)

humidity = dhtDevice.humidity temperature = dhtDevice.temperature

Ces lignes interrogent le capteur pour récupérer :

dhtDevice.exit()

if humidity is not None and temperature is not None:

return round(humidity, 1), round(temperature, 1)

Si les valeurs sont valides :

else: return None, None

Si le capteur n’a pas répondu correctement, la fonction renvoie None pour les deux mesures.

except RuntimeError as error:

except Exception as error:


Suite vers Application web