1. Introduction

Ne pas avoir pu complétement terminer smartasse et avoir dû le rendre ainsi n’a pas été plaisant. J’avais peut-être été un peu optmiste au début, et ai dû faire des compromis qui ont quand même fonctionnés, malgré que ce ne soit pas mon idée initiale. Pour améliorer mon projet, je souhaiterais donc démarrer un serveur web sur le Rapberry Pi afin d’y voir a) l’état du système et b) un tableau des dix dernières lectures du capteur de températures (ces valeurs me seront utiles pour une autre amélioration expliquée plus bas). Je compte utiliser une base de données MySQL pour stocker les données. La difficulté est ici de faire en sorte que mon scripte Python puisse alimenter la base de données. Il s'agit donc de les faire communiquer l'un avec l'autre. Le contenu de la page web provient de la base de données via un scripte PHP.

Pour finir, j’aimerais trouver une solution au problème de la lecture de la température. En effet, je recevais 2 notfications lorsque je trempais mon capteur dans l’eau : une lorsque la température augmente, ce qui peut s’avérer dangereux pour l’utlisateur, puis une deuxième lorsque l’eau refroidissait. Je voudrais limiter les notfications à cette dernière en utlisant un tableau. Pour se faire je souhaiterais que mon scripte en choisisse une dizaine puis les compare, afin de déterminer si la températue est en train d'augmenter ou de diminuer, et qu'il envoie une notification uniquement dans ce cas.

Pour la partie hardware, il s'agit aussi d’ajouter des LEDs vertes et rouges connectées au Raspberry Pi qui s’allument (de la couleur correspondante) si le Raspberry Pi est connecté à Internet et si le Raspberry Pi capte le capteur de température. Si possible, je souhaite utliser deux LEDs bicolores car cela estplus explicite, et plus esthétique, que 4 LEDs. Après réflexion, j'ai décidé d'opter pour 2 LED RGB (venant du gymnase et disponibles ici)

2. Matériel et méthodes

2.1 Matériel

Le matériel est donc :

  • Un Raspberry Pi 3 (Model B) avec accès internet
  • Une breadboard
  • Un câble plat pour connecter la breadboard au Raspberry Pi
  • Un capteur de température DS18B20 Temperature
  • Service Pushover de notifications sur mobile
  • Un ordinateur pour programmer en python
  • Un Samsung Galaxy S7 (mon téléphone)
  • 2 LEDs RGB
  • Des câbles

2.2 Fonctionnement

Pour la partie de base, il s'agit de mon premier projet Smartasse dont la description et le développement se trouvent ici Pour mes améliorations, cela commence par un serveur web sur mon raspberry qui hébèrge un site internet sur lequel on peut trouver un historique des dernières températures (et donc la température actuelle) ainsi que l'état des LEDs, c'est-à-dire si le raspberry Pi a bien une connexion à internet qui lui permette d'envoyer des notifications, et que ce dernier capte le capteur de température (pour être sûr de ne pas faire tout cela dans le vide). Je pense que cela va de soit, mais la première LED est celle correspondant à la connexion Internet est devient verte si c'est le cas, rouge si non. Il en va de même pour la deuxième LED, celle du capteur, qui est verte si le raspberry voit le capteur, rouge si non. Pour le hardware, j'ai uniquement ajouté 2 LEDs RGB sur ma breadboard.

2.3 Interface graphique

Pour commencer, je voulais pouvoir utiliser une intérface graphique avec le raspberry Pi plutôt que d'utiliser le terminal, simplement pour me faciliter la chose. Pour se faire je voulait installer VNC, qui m'avait été recommandé, mais il se trouvait déjà sur le RPI. J'ai alors du aller chercher un client VNC capable de se connecter sur le serveur VNC du Raspberry Pi. J'ai trouvé realVNC et l'ai installé depuis cet article.Maintenant que j'ai un bureau, il me suffit juste de scanner le réseau pour avoir l'adresse IP du raspberry Pi, la rentrer dans la console et je suis connectée à distance. De plus, pour encore plus faciliter le codage j'ai installé VSCode, qui m'a à nouveau été recommandé. Avec VSCode je pouvais coder en Python et PHP au même endroit, ce qui a été très pratique. Je l'ai trouvé sur ce site. Cepandant, il m'était impossible de le faire fonctionner après l'avoir installé, et j'ai appris que ce problème pouvait être réglé: en effet il fallait installer une version moins récente de VSCode (la solution se trouve dans la sections des commentaires de l'article ci-dessus).

bureau_raspPi_PC.png

Figure #1 bureau de l'interface graphique

2.4 Serveur web

En faisant mes recherches, j'ai appris qu'il existait de nombreuses façons de créer un serveur web sur un RPI, mais la méthode qui revenait le plus, et qui semblait la moins compliquée, est celle d'installer Apache, qui est un des serveurs web les plus utilisés sur le marché. Il s'agit de la partie software qui analyse les requêtes de l'utilisateur sous forme http et qui rend les fichiers ou dossier qui correspondent à la demande de l'utilisateur. Une des raisons supplémentaires pour laquelle j'ai décidé d'utiliser Apache est que c'est extrêmement populaire et que cela mène à une quantité d'informations disponibles sur le sujet, et que j'en avais déjà entendu parler avant. Après avoir installé Apach sur mon RPI, il fallait maintenant installer PHP, qui est un language de programmation extrêmement utile est répendu. Pour vérifier qu'il s'était correctement installé j'ai tapé la commande phpinfo(); dans le fichier index.php qui se trouvait dans /var/www/html, car lorsque l'on tape l'adresse IP du RPI dans un navigateur, il affichera en priorité les fichiers tels que index.html, index.py ou index.php. Ce que le navigateur affiche alors est la documentation de php. Mais tout ce que je viens d'expliquer ici est expliqué dans l'article de blog cité plus bas. J'ai ensuite installé MySQL, qui me permet d'avoir une base de données sur mon RPI. J'ai configuré un mot de passe pour l'utilisateur root (en utilisant la commande mysql_secure_installation) pour accéder à ma base, puis ajouté un nouvel utilisateur (ici se trouve l'article que j'ai utilisé). Les commandes utilisées sont:
GRANT ALL PRIVILEGES ON *.* TO 'mael'@'localhost' IDENTIFIED BY '*****';
GRANT ALL PRIVILEGES ON *.* TO 'smartasse'@'localhost' IDENTIFIED BY '*****';

Pour finir, j'ai installé PHPMyAdmin pour rendre les manipulations et le codage de la base de données (beaucoup) plus faciles et plus efficaces. Pour faire tout cela, j'ai suivi les indications de cet article qui décrit comment tout installer et, le plus important, s'assurer que tout fonctionne comme on le veux.

2.5 Base de données

L'entierté des manipulations de mes bases de données à été faite sur PHPMyAdmin. J'ai d'abord créé une base de données appelée Smartasse dans laquelle j'ai créé deux autres tables. D'abord une pour les LEDs avec deux entrées : LED (qui peut être soit Internet soir Sensor) et le statut (soit 0 soit 1). La deuxième est également une table a deux entrées appelée "Températures" avec une entrée "température" et une autre "date". Voici le résultat en format SQL:

 CREATE DATABASE IF NOT EXISTS `Smartasse` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
 USE `Smartasse`;
 CREATE TABLE `LEDs` (
   `LED` tinytext COLLATE utf8mb4_unicode_ci NOT NULL,
   `Status` tinyint(1) NOT NULL
 )
 CREATE TABLE `Temperatures` (
   `temperature` float NOT NULL,
   `date` datetime NOT NULL
 )

2.6 LEDs RGB

Pour rappel, je souhaite faire en sorte qu'une LED indique si le RPI est connécté à Internet, et qu'une autre LED indique si le RPI capte le capteur de température. En effet, de mon point de vue, ces deux composantes sont celles qui sont le plus susceptibles d'empêcher le bon fonctionnement de la Smartasse. Et comme mentionné plus haut, j'ai décidé d'utiliser 2 LEDs RGB plutôt que 4 LEDs. En effet, non seulement cela était plus intéressant puisque je n'en avais jamais utilisé avant, cela avait l'avantage de prendre bien moins de place sur la breadboard. Voici une photo du montage.

20190515_194828.jpg Figure #2 Montage

20190515_194853.jpg Figure #3 Montage

J'ai décidé d'utiliser 6 pins consécutifs pour les LEDs. Il fallait maintenant calculer la résistance nécessaire pour les diférentes couleurs. Pour se faire j'ai utilisé la documentation des LEDs ainsi que "U = R*I"

2019-05-16 14_26_51-Patrick Zwahlen · Wire.png Figure #4 Courant

2019-05-16 14_27_33-Patrick Zwahlen · Wire.png Figure #5 Voltage

J'ai donc calculé que la résistance pour le rouge serait d'environ (3.3V-1.6V)/35mA = 50 Ohms et d'environ (3.3V-2,8V)/0.035 =15 Ohms pour le vert et le bleu. Seulement je n'avais pas de si petites résistances avec moi alors j'ai utilisé celles du kit (330 Ohms) et les LEDs s'allument tout de même très fortement, alors j'ai pris la décison de ne pas les changer.

Je voulais maintenant que la LED numéro 0 s'allume en vert si le RPI est connecté au réseau, ou en rouge si non. Pour se faire, j'ai lu qu'il existait un service appelé Timeloop (que l'on peut télécharger ici) qui permets d'exécuter certaines tâches (appelés "jobs") périodiquement après une certaine intervalle, ici 3 secondes. Il s'agit exactement de ce dont j'avais besoin.

Pour vérifier la connexion Internet, inspiré de cet article, je fais une requête HTTP (donc sur le port 80) sur le site de Pushover et attends pour une réponse pendant au maximum 3 secondes. S'il y en a une, il définit le statut de la LED à True. Et, s'il ne reçoit pas de réponse, il définit la LED 0 à False. Elle devient donc rouge. Dans les deux cas, il met à jour la table LEDs. En effet, je me contente seulement de vérifier que le site de Pushover fonctionne, puisque c'est uniquement cela qui m'intéresse et qui requiert une connexion Internet.

Pour la LED numéro 1, il s'agit de celle qui vérifie la connexion avec le capteur de température. Pour se faire, je suis retournée dans le code que j'avais écrit pour Smartasse et ai utilisé la même chose que dans mon premier projet. Mon code va ouvrir le fichier de mon capteur de température, lis les deux lignes et regarde si les 3 dernier caractères de la première sont "YES". Si ce n'est pas le cas, il attribue à la LED 1 False et met à jour la table LEDs. Si la ligne se termine par "YES", il lui attribue True, et la LED s'allume donc en vert (toujours inspiré par le même article). Ensuite, il va voir dans quelle partie de l'output se trouve la température et la met dans la base de données, ainsi que la date et l'heure à laquelle elle a été prise. Il a été particulièrement difficile de faire fonctionner la syntaxe de la commande cursor.execute("INSERT INTO Temperatures (temperature, date) VALUES ('%s', NOW());", (temp_c,)) et mais ai trouvé la solution ici.

2.7 Mise à jour de la base de données

Pour pouvoir mettre les valeurs obtenues (soit la LED, son statut, la température et la date) j'ai du installer une extension qui permet à Python et MySQL de communiquer entre eux. Pour cela j'ai trouvé python3-mysqldb que j'ai installé avec la commande sudo apt install python3-mysqldb. J'ai ensuite créé une connexion vers la base de données et utilisé un database cursor. D'après ce que j'ai compris, il s'agit d'une sorte de pointeur qui indique une zone en particuilier de la table à modifler, mais je n'en suis pas certaine. Pour la première insertion de données dans la table LEDs, j'ai dû commencer par une commande INSERT (depuis PHPMyAdmin) puisque la table est initiallement vide. Par la suite seuls des UPDATE sont nécessaires, puisque le nombres d'enregistrements (lignes) dans la table ne change plus: il y aura toujours deux LEDs différentes et deux résultats possible pour le statut (True or False ). D'où ces commandes : cursor.execute("UPDATE LEDs SET Status='0' WHERE LED='internet';") et cursor.execute("UPDATE LEDs SET Status='0' WHERE LED='sensor';")

Pour la table Temperatures, il s'agit uniquement d'INSERT, puisque j'ai décidé de garder toutes les mesures du capteur dans ma base de données. Il s'agissait donc de rajouter de nouvelles données à chaque fois à l'aide de la commande cursor.execute("INSERT INTO Temperatures (temperature, date) VALUES ('%s', NOW());", (temp_c,))

2.8 Page web

Le scripte de la page web se trouve dans le fichier index.php dont voici le chemin absolu : /home/pi/Desktop/gyreoci1819/Source/maelie.zwahlen/projet/p/www/index.php Le code de cette page web vient de , avec quelques modifications pour l'adapter à mon projet. Sur ma page web, je désir premièrement afficher les dix dernières valeurs de la température, et deuxièmement afficher le statut des LEDs. Le code de index.php est documenté.

3. Résultats

Globalement, j'ai réussi à compléter la plus grande partie de mon projet, c'est à dire la mise en place des deux LEDs, de la page web et son contenu. Par manque de temps, je n'ai pas pu créer de style sheet CSS (ce dont la page aurait grandement besoin).

2019-05-16 14_28_03-Patrick Zwahlen · Wire.png
Figure #6 Capture d'écran de la page web ainsi que de son contenu


Et comme mentionné plus haut, les deux LEDs fonctionnent parfaitement:


Média #6 Vidéo démonstrative du fonctionnement des deux LEDs. On peut voir que je déconnecte un câble du capteur et que la LED devient rouge.

4. Discussion et conclusion

Ce projet fut beaucoup plus difficle à réaliser que ce que je pensais. Il m'a fallut beaucoup de temps de réflexion pour planifier dans quel ordre j'allais faire les choses, ainsi que beaucoup, beaucoup, beaucoup de recherches sur les services et extensions à utiliser. Je reconnais avoir du demander de l'aide à plusieur reprises, mais des avis externes n'ont fait que renforcer ma compréhension du sujet. En effet, j'ai beaucoup appris sur la manière de procéder sur des bases de données MySQL. De plus, je pense que ce projet fut "a safe bet" quant aux compétences aquises, qui me seront définitivement utiles. Malgré le fait que je ne comprend pas tous les détails des codes que j'ai trouvé, en particulier cette histoire de "curseur" ... Ce projet p n'est qu'une évolution là ou le projet h fut une révolution.

Références

https://www.raspberrypi.org/documentation/remote-access/vnc/ https://www.realvnc.com/en/connect/download/viewer/windows/ https://pimylifeup.com/raspberry-pi-visual-studio-code/ https://howtoraspberrypi.com/how-to-install-web-server-raspberry-pi-lamp/ http://pi.bek.no/autostartProgramOnBoot/ https://www.a2hosting.com/kb/developer-corner/mysql/managing-mysql-databases-and-users-from-the-command-line https://raspberrypi.stackexchange.com/questions/84892/run-python-script-at-startup-with-systemd-service https://www.howtoforge.com/setting-changing-resetting-mysql-root-passwords https://www.instructables.com/id/Using-a-RPi-to-Control-an-RGB-LED/ https://www.raspberrypi-spy.co.uk/2015/10/how-to-autorun-a-python-script-on-boot-using-systemd/ https://stackoverflow.com/questions/20463333/mysqldb-python-insert-d-and-s https://stackoverflow.com/questions/3764291/checking-network-connection https://github.com/sankalpjonn/timeloop