Comment construire une station météo Raspberry Pi ?

By Julien

Comment est le temps ? Avec ce projet, vous aurez toujours une réponse très précise. Bien sûr, vous pouvez consulter des sites Web ou des applications pour smartphone, mais pourquoi laisser passer la chance de construire une station météo Raspberry Pi ? Ce projet est un excellent moyen de s’habituer à utiliser le Sense HAT, les scripts Python et même les applications d’hébergement Web. Nous vous présentons tout cela ci-dessous.

Il s’agit d’un projet simple, mais vous aurez besoin de plus qu’un simple appareil Raspberry Pi pour construire une station météo Raspberry Pi. Aucun modèle de Raspberry Pi n’est livré avec les capteurs dont nous aurons besoin pour connaître la température ou l’humidité. Heureusement, il est très facile d’ajouter ces capteurs. Il suffit de prendre un Sense HAT.

Le Sense HAT est un périphérique Raspberry Pi qui a été conçu à l’origine pour la mission Astro Pi, au cours de laquelle certains projets éducatifs Raspberry Pi ont été exécutés sur la Station spatiale internationale. La grille de LED et les divers capteurs du Sense HAT ont également des applications plus terrestres, et nous allons en explorer quelques-unes aujourd’hui.

Avec le Sense HAT, nous pouvons détecter la température et l’humidité. Nous pouvons appeler ces informations sur notre moniteur à l’aide d’un script, et nous pouvons même les afficher sur la grille de LED du Sense HAT. Si nous nous sentons vraiment aventureux, nous pouvons même connecter notre Raspberry Pi à notre réseau et afficher ces informations météorologiques dans un navigateur Web.

Nous allons vous montrer ci-dessous comment faire ces trois choses. Mais d’abord, voici ce dont vous aurez besoin pour ce projet :

  • Raspberry Pi avec 40 broches GPIO (RPi 3, RPi 4) exécutant Raspbian
  • Alimentation du Raspberry Pi
  • Câble HDMI compatible (et un moniteur ou une télévision pour le connecter)
  • Carte microSD avec image disque Raspbian installée
  • HAT sensé

Si vous avez tout cela, vous êtes prêt à commencer ! C’est parti !

Construction d’une station météo Raspberry Pi en Python

Il y a plusieurs façons d’afficher les informations météorologiques que nous voulons, mais toutes commencent par l’utilisation de Sense HAT pour obtenir les mesures. Notre première série d’instructions étape par étape se concentre sur la configuration du Sense HAT, la détection des informations et la vérification de notre travail en affichant tout sur notre terminal dans Raspbian.

Étape 1 : Fixer votre Sense HAT à votre Raspberry Pi

Le Sense HAT utilise les broches GPIO du Raspberry Pi pour envoyer et recevoir des informations (pour en savoir plus sur les broches GPIO du Raspberry Pi, consultez notre tutoriel complet sur les broches GPIO du Raspberry Pi). Pour fixer votre Sense HAT à votre Raspberry Pi, commencez par tout éteindre et débrancher. Ensuite, faites glisser avec précaution les fentes GPIO du Sense HAT sur les broches GPIO de votre Raspberry Pi. C’est une bonne idée d’installer également les petits supports fournis avec la Sense HAT.

Si vous disposez d’un kit de dépannage GPIO, vous pouvez l’utiliser pour éloigner un peu plus votre Sense HAT du CPU de votre Raspberry Pi, qui peut chauffer et perturber nos lectures. L’utilisation d’un dissipateur thermique sur la puce de votre Pi peut également être utile.

Une fois que tout est correctement fixé, vous pouvez rallumer votre Raspberry Pi. Si vous avez bien fait, vous devriez voir un arc-en-ciel s’afficher sur la matrice de LED de la Sense HAT.

Étape 2 : obtenons des mises à jour

Les bricoleurs expérimentés de Raspberry Pi savent qu’effectuer une vérification des mises à jour est une façon intelligente de commencer n’importe quel projet. C’est ce que nous allons faire. Ouvrez un Terminal dans Raspbian et entrez cette commande :

sudo apt-get update
sudo apt-get upgrade

Une fois que vous êtes à jour, vérifiez que vous avez le paquet Sense HAT :

sudo apt-get install sense-hat

Raspbian est livré avec le paquet Sense HAT déjà à bord, mais cela ne fait jamais de mal de revérifier.

Étape 3 : Écrire un script qui détecte la température et l’humidité avec votre Sense HAT

À l’aide du terminal, ouvrez un nouveau fichier avec un éditeur de texte. Nous vous recommandons d’utiliser nano, un excellent éditeur de texte intégré à Raspbian. Vous pouvez le faire en entrant une commande comme celle-ci dans le terminal :

nano weatherstation.py

Cela indique à nano d’ouvrir le fichier (ou de le créer, s’il est nouveau) et que nous travaillons sur un script Python.

Voici à quoi va ressembler notre script. (Il existe plusieurs façons de rendre ce script plus soigné, dont nous parlerons dans un instant).

from sense_hat import SenseHat
sense = SenseHat()
sense.clear()
temp = sense.get_temperature()
cTemp = round(temp, 1)
fTemp = round(temp * 1.8 + 32, 1)
print("Il fait {} degrés Celsius".format(cTemp))
print("Il fait {} degrés Fahrenheit".format(fTemp))
humidity = round(sense.get_humidity(), 1)
print("L'humidité relative est de {}%".format(humidity))

Quittez nano et sauvegardez votre progression en appuyant sur Ctrl+X, puis Y, et enfin Entrée.

Vous pouvez maintenant exécuter votre script en tapant ceci dans le Terminal :

sudo python weatherstation.py

Notre station météo Raspberry Pi a fonctionné !

Pourquoi cette chaleur ? Notre Raspberry Pi génère lui-même un peu de chaleur. Un dissipateur thermique sur le CPU du Raspberry Pi ou un kit de rupture GPIO vous aidera à éviter ce problème.

Très cool ! Mais cela n’explique pas totalement comment nous en sommes arrivés là, alors prenons un peu de recul.

Étape 4 : Décomposer notre code

Voici une décomposition ligne par ligne de notre code, ainsi que quelques conseils pour l’améliorer.

from sense_hat import SenseHAT

Ici, nous importons la bibliothèque Sense HAT afin que notre interpréteur Python sache quoi faire avec certaines commandes lorsque nous exécutons notre programme. Python peut faire beaucoup de choses dès sa sortie de l’emballage, mais il peut faire encore plus lorsque nous ajoutons des “bibliothèques”, qui sont des ensembles de commandes et de fonctionnalités supplémentaires. Il ne serait pas vraiment logique qu’un ensemble de commandes spécifiques à la HAT des sens se trouve par défaut dans Python, il n’est donc pas surprenant de les trouver dans une bibliothèque.

sense = SenseHat()

Les fans de Python reconnaîtront cela comme une “instanciation d’objet”. Nous prenons une classe de commandes – la classe SenseHat() – et les nommons avec une variable. Maintenant, nous pourrons appeler les commandes de cette classe en ajoutant “sense” et un opérateur point (alias un point) devant la commande.

sense.clear()

…et c’est exactement ce que nous faisons ici. Cette commande appelle la commande clear() de la classe SenseHat(), ce qui permet d’effacer tout ce que notre Sense HAT était en train de faire pour que nous puissions commencer à détecter des températures.

temp = sense.get_temperature()

Ici, nous déclarons notre première variable : temp, que nous identifions comme la température que le Sense HAT détecte.

cTemp = round(temp, 1)

La variable tempC sera notre température en Celsius. Par défaut, le Sense HAT mesure la température en degrés Celsius, mais le nombre qu’il stocke est plein de décimales. Simplifions les choses en utilisant la commande round() et en spécifiant que le nombre de décimales que nous voulons est 1.

fTemp = round(temp * 1.8 + 32, 1)

Passons maintenant aux Fahrenheit. Comme notre mesure initiale est en Celsius, nous devons utiliser une formule de conversion.

print("Il fait {} degrés Celsius".format(cTemp))

Nous pourrions supposer que tout s’est bien passé jusqu’à présent, mais il ne sert à rien de mesurer la température si nous ne pouvons pas voir les résultats. Ici, nous imprimons la température sur l’écran de notre terminal. Nous avons utilisé la commande format() pour placer notre nombre au milieu de notre texte, tout en douceur.

print("Il fait {} degrés Fahrenheit".format(fTemp))

C’est la même chose ici.

humidity = round(sense.get_humidity(), 1)

Nous sommes prêts pour la température, mais qu’en est-il de l’humidité ? Ici, nous définissons une variable appelée humidité. Nous utilisons sense.get_humidity() pour trouver notre chiffre, puis nous le plaçons dans la commande round() en précisant que nous voulons une décimale.

Avec cette ligne, nous avons révélé quelque chose d’inefficace dans notre code. Puisque nous pouvons sentir les choses et les arrondir dans la même ligne de code, nous n’avons jamais eu besoin de définir la variable temp. Nous pourrions simplement supprimer la ligne définissant temp et redéfinir cTemp et fTemp comme round(sense.get_temperature(), 1) et round(sense.get_temperature() * 1.8 + 32, 1) respectivement. Et, en fait, c’est exactement ce que vous devriez faire – si vous voulez respecter les meilleures pratiques de codage, en tout cas.

print("L'humidité relative est de {}%".format(humidity))

Cette ligne imprime notre taux d’humidité.

Affichage des informations météorologiques sur la matrice de LED de la Sense HAT

Le Sense HAT n’a pas que des capteurs. Il possède également une grille de LEDs que nous pouvons programmer pour afficher des informations. Faisons fonctionner notre station météo sans moniteur !

Étape 1 : Notre nouveau code

Cette version du code Python de notre station météo Raspberry Pi imprimera nos résultats sur la matrice LED du Sense HAT.

Vous pouvez modifier votre ancien code si vous le souhaitez, mais nous allons créer un nouveau fichier afin de rester organisés :

nano LEDweather.py

Voici le code que nous utilisons cette fois-ci :

from sense_hat import SenseHat
sense = SenseHat()
sense.clear()
cTemp = round(sense.get_temperature(), 1)
fTemp = round(sense.get_temperature() * 1.8 + 32, 1)
humidity = round(sense.get_humidity(), 1)
sense.show_message("Il fait {} degrés  Celsius".format(cTemp))
sense.show_message("Il fait {} degrés  Fahrenheit".format(fTemp))
sense.show_message("L'humidité relative est de {}%".format(humidity))

Vous pouvez exécuter ce code en utilisant cette commande dans le Terminal :

sudo python LEDweather.py

Vous devriez voir les informations météorologiques défiler glorieusement sur l’écran LED de votre Sense HAT.

Étape 2 : Comment cela fonctionne-t-il ?

Pour l’essentiel, ce code fonctionne exactement comme le dernier script que nous avons écrit. Nous avons nettoyé nos variables (nous ne définissons plus une variable temp, car nous pouvons utiliser la commande sense.get_temperature() à la place), mais le seul grand changement est l’ajout de ces lignes :

sense.show_message("Il fait {} degrés Celsius".format(cTemp))
sense.show_message("Il fait  {} degrés Fahrenheit".format(fTemp))
sense.show_message("L'humidité relative est de {}%".format(humidity))

Vous pouvez probablement comprendre comment elles fonctionnent. La commande sense.show_message() imprime des messages sur l’écran LED de la Sense HAT. Elle fonctionne à peu près comme print() dans notre dernier script.

Création d’une station météo Raspberry Pi en ligne

Nous avons utilisé notre sense HAT pour vérifier la température et l’humidité, et nous avons pu recueillir ces informations de deux manières jusqu’à présent : dans notre fenêtre Terminal et via la matrice de LED du sense HAT. Essayons une troisième voie. Voici comment obtenir vos informations météorologiques sur le web.

Étape 1 : Un autre script Python

Vous n’avez pas besoin d’investir dans un nom de domaine et un hébergement pour réaliser ce projet. Nous pouvons simplement héberger notre propre petit site en utilisant Flask, un framework d’application web en Python. Flask devrait déjà être installé grâce à Raspbian, mais vérifions à nouveau :

sudo apt-get install python3-flask

Une fois que vous êtes sûr que tout est prêt, ouvrez un nouveau fichier Python dans nano :

nano weatherapp.py

…et remplissez-le avec du nouveau code. Voici ce que nous entrons dans notre nouveau fichier Python :

from flask import Flask, render_template
from sense_hat import SenseHat
app = Flask(__name__)
@app.route("/")
def index():
sense = SenseHat()
cTemp = round(sense.get_temperature(), 1)
fTemp = round(sense.get_temperature() * 1.8 + 32, 1)
humidity = round(sense.get_humidity(), 1)
return render_template("weathersite.html", cTemp=cTemp, fTemp=fTemp, humidity=humidity)
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0")

Étape 2 : Qu’est-ce qu’on vient de faire ?

Certaines parties de ce code devraient vous être familières. Une fois de plus, nous importons des bibliothèques, faisons une petite instanciation d’objet et utilisons notre Sense HAT pour définir les variables cTemp, fTemp et humidity. Mais il y a aussi quelques nouvelles lignes.

app = Flask(__name__)

A ce stade de notre code, nous avons déjà importé Flask. Maintenant, nous allons appeler une seule instance de Flask. Nous utilisons __name__ ici car le nom de notre module peut changer selon qu’il s’agit ou non du programme principal en cours d’exécution – nous y reviendrons dans un instant.

@app.route("/")

Ceci indique à Flask quelle URL va déclencher notre fonction. Nous avons juste besoin de “/” ici, mais vous pourriez écrire des choses pour “/home” ou “/index” si vous le souhaitez.

def index():

Maintenant nous définissons notre fonction.

Après avoir défini nos variables, nous fermons notre fonction avec :

return render_template("weathersite.html", cTemp=cTemp, fTemp=fTemp, humidity=humidity)

Voici une partie importante de notre code. Nous choisissons notre modèle (weathersite.html, que nous n’avons pas encore créé) et nous nous assurons que les variables de notre modèle ont des valeurs provenant de notre fonction.

if __name__ == "__main__":

Il s’agit d’une fonction Python qui détermine essentiellement si notre script Python est exécuté en tant que programme principal. Lorsque nous exécutons ce script directement (en tapant “sudo python weatherapp.py” dans le Terminal, par exemple), notre interpréteur Python définira __name__ comme étant “__main__” – ceci devrait donc être vrai, et notre dernière ligne devrait être exécutée.

app.run(debug=True, host='0.0.0.0')

Cela lance Flask et met en route notre petite opération d’hébergement web.

Étape 3 : Créer une page web

Vous pourriez exécuter weatherapp.py maintenant, mais il ne ferait pas grand chose pour vous. Il utilise le modèle weathersite.html, qui n’existe pas – encore.

Créons un répertoire de modèles :

mkdir templates

…et maintenant mettons-y un nouveau fichier HTML et ouvrons-le dans nano.

nano templates/weathersite.html

Nous avons maintenant un nouveau document HTML ouvert. Voici ce que nous allons taper dans ce document :

<!doctype html>

<html>
   <head>
      <title>Station météo</title>
   </head>

   <body>
      <h1>Quel temps fait-il ??</h1>

      <h2>Temperature</h2>
         <p><strong>{{ cTemp }}</strong> degrés Celsius</p>
         <p><strong>{{ fTemp }}</strong> degrés Fahrenheit</p>

      <h2>Humidité</h2>
         <p><strong>{{ humidity }}%</strong> humidité relative</p>
      </body>
</html>

Maintenant, quand nous lançons notre script Python, il devrait héberger cette page HTML et fournir les variables que nous avons mentionnées dans le HTML.

Nous n’allons pas nous embêter avec la décomposition, puisque le HTML est assez facile à lire. Notez simplement l’utilisation des variables entre {{ parenthèses }} – ce sont les mêmes que celles que nous avons définies dans notre script weatherapp.py et envoyées au modèle à la neuvième ligne de ce script.

Étape 4 : Démarrez votre serveur et rendez visite à votre site.

Notre script Python et notre modèle HTML sont tous deux terminés. Voyons comment ils fonctionnent ! Dans le Terminal de notre Raspberry Pi, nous allons entrer cette commande :

sudo python weatherapp.py

Ouvrez le navigateur web de votre Pi et naviguez vers l’adresse indiquée par le code ci-dessus : 0.0.0.0:5000 (ou 127.0.0.1:5000 – même chose).

Vous devriez voir votre station météo !

Vous pouvez accéder à ce même écran depuis d’autres appareils sur votre réseau en utilisant un navigateur web et en naviguant vers l’adresse IP locale de votre Raspberry Pi suivie de :5000. Mais vous ne pourrez pas accéder à votre site depuis l’extérieur de votre réseau domestique, à moins que vous ne configuriez une redirection de port.

Étape 5 : configurer la redirection de port

Si vous voulez pouvoir consulter votre station météo Raspberry Pi de n’importe où, vous devez franchir une étape supplémentaire.

Pour configurer la redirection de port, vous devez accéder à votre routeur. Tapez l’adresse IP de votre routeur (elle doit être imprimée sur un autocollant situé quelque part sur le routeur) et connectez-vous avec vos informations d’identification d’administrateur (là encore, elles doivent figurer sur l’autocollant – à moins que vous ne les ayez changées, ce qui est une bonne idée). Votre routeur peut également vous permettre de modifier les paramètres à l’aide d’une application ou d’un autre type de configuration d’accès/de connexion.

Trouvez les options de transfert de port de votre routeur et configurez-les comme suit :

Service port: 80

Internal port: 5000

IP address: [set this to your Raspberry Pi’s IP address]

Protocol: TCP

Votre station météo Raspberry Pi devrait maintenant être accessible depuis l’extérieur de votre réseau domestique. Il suffit d’exécuter le script weatherapp.py sur votre Raspberry Pi, puis de saisir l’adresse IP publique de votre Raspberry Pi dans la barre d’adresse d’un navigateur Web. (Si vous ne connaissez pas l’adresse IP publique de votre Pi, vous pouvez demander à Google.) Vous devriez voir le site Web de votre station météorologique !

Laisser un commentaire