====== 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 : * la **logique capteur/météo** (lecture, calculs, API), * l’**application web** (routes, affichage), ===== 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 : * * la lecture du capteur DHT22, * le calcul du point de rosée, * le calcul de l’indice humidex, * la récupération de la date et heure actuelles. //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() :===== * Cette fonction permet de lire la température et l’humidité à partir du capteur DHT22 connecté au GPIO4 du Raspberry Pi. * Elle renvoie ces deux valeurs sous forme de nombres arrondis à une décimale. * Si la lecture échoue, elle retourne None, None. **try:** * On démarre un bloc qui va tenter de réaliser la lecture. * Si une erreur survient, Python basculera dans le bloc except. **dhtDevice = adafruit_dht.DHT22(board.D4)** * Cette ligne crée un objet capteur, ici un DHT22, branché sur le GPIO4 (représenté par board.D4). * 💡 👉 C’est une étape indispensable pour communiquer avec le capteur. **humidity = dhtDevice.humidity temperature = dhtDevice.temperature** Ces lignes interrogent le capteur pour récupérer : * humidity → le taux d’humidité. * temperature → la température. **dhtDevice.exit()** * Cette commande est **très importante** : elle **libère les ressources GPIO** utilisées par le capteur. * Cela évite les erreurs fréquentes sur Raspberry Pi telles que : "//Lost access to message queue//". **if humidity is not None and temperature is not None:** * On vérifie que le capteur a bien répondu avec des données valides. * Les capteurs DHT peuvent parfois échouer à donner une valeur. **return round(humidity, 1), round(temperature, 1)** Si les valeurs sont valides : * On les arrondit à une décimale pour un affichage plus lisible. * Puis on les renvoie sous la forme de deux nombres. **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:** * Gestion des erreurs courantes dues aux capteurs DHT (perte temporaire de lecture). * On affiche l’erreur mais le programme continue de fonctionner. **except Exception as error:** * Gestion des erreurs plus graves (problème matériel, GPIO bloqué, etc.). * On ferme proprement le capteur avec dhtDevice.exit() avant de relancer l’erreur (raise error) pour éventuellement arrêter le programme. ---- Suite vers [[jardin_application_web|Application web]]