Nous avons vu dans letutoriel sur la sonde DS18B20comment mesurer la température à l'aide d'un Raspberry. Le projet que je vous présente aujourd'hui explique comment on peut, à partir de ces données, créer une courbe de température consultable à l'aide d'un navigateur, simplement en utilisant Python et la librairieflask.
Voici un aperçu de ce que l'on va faire :
Prérequis
Pour ce projet, il faut le même matériel que dans le tutoriel sur la mesure de température, rien de plus. Ce qui donne dans le détail :
Une fois tout le matériel réunis, on peut passer au branchement.
Branchement de la sonde
Ici encore, rien de nouveau, on garde le même branchement que dans le tuto, soit :
Maintenant que la sonde est branchée, on essaie de mesurer la température via le terminal pour tester la liaison. (Voir le III. du tuto sur la sonde)
Installation de Flask et premiers pas
Important ! Tout au long du projet, il faudra exécuter le fichier app.py avec la commande suivante :
sudo python3 app.py
Si l'on n'indique pas la version de Python 3, le script ne s'exécutera pas.
Pour commencer, il va falloir installer la librairie flask qui va nous permettre de faire de notre Raspberry Pi un serveur Web. Entrez simplement la commande suivante dans le terminal :
sudo apt-get install python3-flask
Maintenant que la librairie est installée, voyons les notions de base de Flask. Voici le code le plus simple utilisant la librairie que l'on peut écrire :
En exécutant ce code, on devrait voir s'écrire dans le terminal ceci :
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger pin code: xxx-xxx-xxx
Cela signifie que le serveur est démarré, et qu’on peut y accéder en entrant l'IP du Raspberry Pi, suivi de :5000, qui est le numéro du port. Si on accède à cette page, on verra s'afficher Hello World. Pour tester, entrer ceci dans le champ URL d'un navigateur : xxx.xxx.x.xxx:5000, où xxx.xxx.x.xxx est l'adresse IP du Raspberry Pi. Si vous ne connaissez pas l'adresse IP de votre Raspberry Pi, entrez dans une console ceci :
hostname -I
(et n'oubliez pas de redémarrer le serveur)
Plutôt que de renvoyer un simple texte, Flask peut retourner une page HTML. Pour se faire, il suffit de changer le return 'Hello world' de la fonction appelée en celui-ci : return render_template('index.html'). La page index.html sera donc affichée sur le navigateur lorsque la fonction est appelée. Pour transférer des variables entre le script Python et la page HTML, on ajoute simplement l'élément à transférer comme ceci : return render_template('index.html', valeur="2"). Pour récupérer la donnée transférée, il suffira d'écrire {{ valeur }} entre des balises HTML.
Prenons un exemple : Créez les fichiers et répertoires comme ceci sur votre Raspberry Pi :
Enfin, changez le style d'écriture ou tout autre élément graphique dans le fichier css si vous le souhaitez. Pour faire le lien entre les documents HTML & CSS avec Flask, ajouter cette ligne dans la balise <head> du code HTML :
En exécutant le code Python et en se rendant à l'adresse IPRaspberry:5000, on obtient ceci :
On a donc les bases pour commencer par afficher la température sur une page Web.
Afficher la température
Avec ce que l'on vient de voir et ce que l'on a déjà vu dans tutoriel sur la sonde DS18B20, il n'est pas compliqué d'afficher la température sur une page HTML, il suffit de modifier un tout petit peu le code précédent.
#!/usr/bin/env python3
fromflaskimportFlask, render_template
importRPi.GPIOasGPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
app=Flask(__name__)
# Fonction : Retourner la temperature actuelle et ordonner ou non son enregistrement
defgetTemp(sauvegardeStatus):
# On ouvre le fichier de la sonde. Remplacer les X par le numero de la sonde
En executant le code avec ce CSS, on obtient ceci :
Enregistrer les températures
Pour construire un graphique de température, on va avoir besoin de données, il va falloir enregistrer les températures à intervalle de temps régulier. On va pour se faire créer une fonction supplémentaire à notre code, que l'on va nommer enregistrement(temperature). Cette fonction va être appelée lorsque l'on fait un getTemp. Elle va enregistrer la température donnée en paramètre dans un fichier texte ayant pour nom la date du jour. Le fichier contiendra sur chaque ligne l'heure et la température associée. Les fichiers contenant les données de température seront de cette forme :
Information J'ai déjà pensé à utiliser une base de donnée pour enregistrer les températures, mais le temps de chargement du graphique était beaucoup plus long que lorsque l'on vient lire le contenu des fichiers.
Voici la fonction enregistrement(temp), que j'explique juste après.
#Ajouter les imports suivants en debut de fichier
fromdatetimeimportdatetime, timedelta
importos
# Entree : temperature; Fonction : enregistrer la temperature dans un fichier, au bon endroit
defenregistrement(temperature):
d=datetime.now()
# On recupere de datetime.now l'annee & le jour et on le stocke
Cette fonction prend la température en paramètre. Tout d'abord, elle ouvre le fichier dans lequel la température va être enregistrée. Si le fichier n'existe pas déjà, on ouvre en mode w(write) : On crée le fichier et on écrit la première température dedans. Sinon, si le fichier existe déjà, (donc des températures ont déjà été enregistrées ce jour), en ouvre le fichier en mode a(add). Une fois le fichier ouvert ou créé, on écrit l'heure suivie de la température sur une nouvelle ligne
Pourquoi ouvrir en add plutot qu'en write ? Si on ouvre le fichier en write, tout le contenu qui existait déjà serait écrasé. Il faut donc d'abord vérifier l'existence du fichier pour savoir si l'on utilise le mode add ou write. De plus, on ne peut pas être en mode add si le fichier n'existe pas déjà.
Personnellement, j'enregistre la température toutes les 15 minutes. Modifions un peu la fonction getTemp en lui ajoutant un argument ordonnant ou non l'enregistrement de la température.
Pourquoi ne pas enregistrer la température à chaque getTemp ? Car plus tard, on va calculer la moyenne de température de la journée et on va la comparer. Il faut donc avoir le même nombre de températures chaque jour, donc il faut qu'elle soit enregistrée seulement toutes les 15 minutes : Lorsque l'on va consulter la courbe, la température sera affichée mais pas enregistrée.
Voici donc le nouveau code après modifications :
#!/usr/bin/env python3
fromflaskimportFlask, render_template
importRPi.GPIOasGPIO
fromdatetimeimportdatetime, timedelta
importos
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
app=Flask(__name__)
# Entree : statut de sauvegarde; Fonction : Retourner la temperature actuelle et ordonner ou non son enregistrement
defgetTemp(sauvegardeStatus):
# On ouvre le fichier de la sonde. Remplacer les X par le numero de la sonde
Il faut maintenant demander au Raspberry Pi de charger la page IPRasp:5000/getTemp?sauvegarde=True à intervalle régulier, je choisis 15 minutes mais vous pouvez choisir une autre fréquence évidemment. Pour se faire, on va modifier le fichier crontab. Entrez donc la commande suivante dans le terminal :
sudo crontab -e
Information
Le fichier devrait ressembler à ceci :
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.L71rF1/crontab installed on Tue May 29 20:57:03 2018)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
Une fois le fichier ouvert en édition, ajoutez les lignes suivantes à la fin puis enregistrez et quittez. (la première ligne permet d'executer le programme dès le démarage du Raspberry Pi)
Grace à ces lignes, le Raspberry Pi exécutera le script app.py à chaque démarrage et enregistrera la température toutes les 15 minutes.
Google Charts permet de réaliser assez facilement un tas de graphique de tous types : Circulaires, histogrammes, cartes, courbes... Pour notre projet, nous allons utiliser le module de courbes : Line Chart
Pour commencer, on va créer une fonction fichierVersListe(cheminFich) qui va transformer les lignes contenues dans le fichier de température en deux listes qui vont nous servir plus tard pour la courbe et les statistiques.
fichierVersListe(cetExemple)[1] Cette liste permet de trouver très facilement la température max, min et moyenne.
[18.625, 18.437, 18.312, 18.125, 18.0]
On va maintenant se servir de tout ça en créant la fonction graphTemp(date) qui renverra sur la page HTML qui s'occupera de dessiner le graphe. La fonction est la fin du code final, tout est commenté et expliqué :
#!/usr/bin/env python3
fromflaskimportFlask, render_template
importRPi.GPIOasGPIO
fromdatetimeimportdatetime, timedelta
importos
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
app=Flask(__name__)
# Entree : statut de sauvegarde; Fonction : Retourner la temperature actuelle et ordonner ou non son enregistrement
defgetTemp(sauvegardeStatus):
# On ouvre le fichier de la sonde. Remplacer les X par le numero de la sonde
Enfin, voici le code HTML qui permet de transformer toutes les données transférées en un beau graphique, grâce à Google charts. Ce code est à enregistrer dans le fichier templates/graphTemp.html.
En laissant tourner le programme, la journée, on obtient des courbes comme ceci (avec un Raspberry à l'extérieur) :
PS : J'ai ajouté une statistique "année précédente" dans mon programme car j'enregistre les températures avec mon Raspberry Pi depuis plusieurs années déjà ! :)
Voilà, ce projet est maintenant terminé, n'hésitez pas à laisser un commentaire pour dire si tout a bien marché, ou si vous avez quelques soucis. C'est le premier projet que j'explique entièrement, j'ai hâte de lire vos retours ! Ce projet peut évidemment être amélioré, avec des statistiques plus poussées, etc. La seule limite sera votre imagination !
Introduction en douceur à l'algorithme d'optimisation Adam pour le Deep Learning Le choix de l'algorithme d'optimisation pour votre modèle d'apprentissage en profondeur peut faire la différence entre de bons résultats en minutes, heures et jours. L' algorithme d'optimisation Adam est une extension de la descente de gradient stochastique qui a récemment été plus largement adoptée pour les applications d'apprentissage en profondeur dans la vision par ordinateur et le traitement du langage naturel. Dans cet article, vous obtiendrez une introduction en douceur à l'algorithme d'optimisation Adam à utiliser dans l'apprentissage en profondeur. Après avoir lu cet article, vous saurez: Qu'est-ce que l'algorithme Adam et certains avantages de l'utilisation de la méthode pour optimiser vos modèles. Comment fonctionne l'algorithme d'Adam et en quoi il est différent des méthodes associées d'AdaGrad et de RMSProp. Comment l'al
Vue d'ensemble Architecture d'un CNN traditionnel Les réseaux de neurones convolutionnels (en anglais Convolutional neural networks ), aussi connus sous le nom de CNNs, sont un type spécifique de réseaux de neurones qui sont généralement composés des couches suivantes : La couche convolutionnelle et la couche de pooling peuvent être ajustées en utilisant des paramètres qui sont décrites dans les sections suivantes. Types de couche Couche convolutionnelle (CONV) La couche convolutionnelle (en anglais convolution layer ) (CONV) utilise des filtres qui scannent l'entrée I I suivant ses dimensions en effectuant des opérations de convolution. Elle peut être réglée en ajustant la taille du filtre F F et le stride S S . La sortie O O de cette opération est appelée feature map ou aussi activation map . Remarque : l'étape de convolution peut aussi être généralisée dans les cas 1D et 3D. Pooling (POOL) La couche de pooling (en anglais pooling layer ) (POOL) est une o
Qu'est-ce que PlantUML ? PlantUML est un outil de création de diagramme simple qui utilise un simple langage de texte brut pour générer des diagrammes visuels. Cet outil est incroyable car il vous permet de stocker vos diagrammes sous forme de texte dans le contrôle de source, ce qui vous permet de voir les changements dans vos diagrammes au fil du temps. Exemple de composants de diagramme PlantUML Un diagramme UML Plant simple aura un composant texte et un composant image : Exemple de code PlantUML Bob-> Alice : Hello! Exemple de diagramme visuel PlantUML Le code répertorié ci-dessus est renvoyé à ceci : Ajout de la prise en charge de PlantUML au code Visual Studio Maintenant que nous avons une compréhension de base de ce qu'est PlantUML, ajoutons sa prise en charge dans Visual Studio Code. Installer l'extension PlantUML dans Visual Studio Code Ouvrez l'onglet extensions dans VS Code et recherchez PlantUML , nous voulons installer l' extension PlantUML par je
Commentaires
Enregistrer un commentaire