<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>http://wiki.lesfabriquesduponant.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Etienne</id>
		<title>Les Fabriques du Ponant - Contributions de l’utilisateur [fr]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.lesfabriquesduponant.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Etienne"/>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Sp%C3%A9cial:Contributions/Etienne"/>
		<updated>2026-05-14T15:45:07Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34439</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34439"/>
				<updated>2025-05-26T09:58:56Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Visuel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
Technologies utilisées : &lt;br /&gt;
* WSGI Flask&lt;br /&gt;
* Serveur Web Apache&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Raspberry_Pi#Mod%C3%A8le_Zero_2_WH Raspberry Pi Zero 2 WH] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835 + ESP32]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Préparation de documents de suivi pour le client avant les rendez-vous.&lt;br /&gt;
&lt;br /&gt;
Choix d'utiliser la methode agile. Retour client et sprint hebdomadaire.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python). Tutoriel pas à pas [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/blob/main/serveur/README.md?ref_type=heads ici].&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Permet la connection réseau.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
* [https://github.com/Xinyuan-LilyGO/LilyGo-EPD47 LilyGo-EPD47] : Driver pour notre écran 4.7 pouces&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/SPI/ SPI] : Permet la communication via SPI (Serial Peripheral Interface)&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur. &amp;lt;br&amp;gt;&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
Mise en place des mises à jour quotidiennes via une tâche cron -&amp;gt; passer par systemd (Systemd Timer)&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
==== ecran e-ink ====&lt;br /&gt;
&lt;br /&gt;
Nous avons été incapable de faire fonctionner correctement l'écran à l'aide de l'IDE Arduino. Nous avons donc changé de logiciel pour [https://platformio.org/ PlatfromeIO].&amp;lt;br&amp;gt;&lt;br /&gt;
Library utilisée : [https://github.com/Xinyuan-LilyGO/LilyGo-EPD47 LilygoEPD47]&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
[https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/tree/main/serveur?ref_type=heads Le tuto pas à pas]&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
L'application python et le WSGI : [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/tree/main/serveur?ref_type=heads ici] &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;N'oubliez pas la liste des paquets utilisés&amp;lt;/span&amp;gt; : &lt;br /&gt;
[[Fichier:TN6 CARAE requirements python.txt|vignette|centré|Requirements python]]&lt;br /&gt;
&lt;br /&gt;
Le WSGI room212a.wsgi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
sys.path.insert(0, '/home/room/carae')&lt;br /&gt;
from room212a import app as application&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Application python room212a.py :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   from flask import Flask&lt;br /&gt;
import requests&lt;br /&gt;
import re&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
from bs4 import BeautifulSoup&lt;br /&gt;
&lt;br /&gt;
app = Flask(__name__)&lt;br /&gt;
&lt;br /&gt;
@app.route(&amp;quot;/&amp;quot;)&lt;br /&gt;
def hello() -&amp;gt; str:&lt;br /&gt;
&lt;br /&gt;
    URL = &amp;quot;votre url ici&amp;quot;&lt;br /&gt;
    page = requests.get(URL)&lt;br /&gt;
    &lt;br /&gt;
    # part 2 de la création du soup object&lt;br /&gt;
    # l'objet soup prend page.content as input&lt;br /&gt;
    # content plutot que text, on évite les soucis d'encodage&lt;br /&gt;
    # html.parser = class constructor&lt;br /&gt;
    soup = BeautifulSoup(page.content, &amp;quot;html.parser&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    #on cherche la balise &amp;lt;a&amp;gt; &amp;amp; l'élément id=afficherBoutonSelection1 pour récupérer le n° de la salle&lt;br /&gt;
    salle = soup.find('a', id='afficherBoutonSelection1')&lt;br /&gt;
    numero_salle = salle.get_text()&lt;br /&gt;
    &lt;br /&gt;
    #on cherche tous les éléments avec le mot &amp;quot;type.&amp;quot; (le . c'est pour n'importe quel caractère) pour récupérer la classe de la réservation&lt;br /&gt;
    elements = soup.find_all(&lt;br /&gt;
        class_=re.compile(r'\btype.\b')&lt;br /&gt;
     )&lt;br /&gt;
    #Objet unique pour la salle&lt;br /&gt;
    data_json = {&lt;br /&gt;
        &amp;quot;test&amp;quot;: &amp;quot;hello world&amp;quot;,&lt;br /&gt;
        &amp;quot;salle&amp;quot;: {&lt;br /&gt;
            &amp;quot;numero&amp;quot;: numero_salle&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;reservations&amp;quot;: []&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #array pour les réservations&lt;br /&gt;
    for data in elements:&lt;br /&gt;
        reservation = {&lt;br /&gt;
            &amp;quot;heure&amp;quot;: data.contents[0],&lt;br /&gt;
            # &amp;quot;service&amp;quot;: data.contents[2],&lt;br /&gt;
            &amp;quot;nom&amp;quot;: data.contents[4],&lt;br /&gt;
            # &amp;quot;outil&amp;quot;: data.contents[6],&lt;br /&gt;
        }&lt;br /&gt;
        data_json[&amp;quot;reservations&amp;quot;].append(reservation)&lt;br /&gt;
    #Ajout des données nom et heures extraites de la page dans le data_python&lt;br /&gt;
    return data_json&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    app.run(debug = True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|frameless|400px|center|Schéma dispositif]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
== Recommandation ==&lt;br /&gt;
# Travailler avec des distributions Linux &amp;lt;!-- Windows ça pue --&amp;gt;&lt;br /&gt;
# La partie serveur peut très bien être hébergée sur une VM dédiée&lt;br /&gt;
# Avant toute chose, vérifiez '''toujours''' que votre matériel fonctionne correctement&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34288</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34288"/>
				<updated>2025-05-22T13:04:40Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Recommandation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
Technologies utilisées : &lt;br /&gt;
* WSGI Flask&lt;br /&gt;
* Serveur Web Apache&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Raspberry_Pi#Mod%C3%A8le_Zero_2_WH Raspberry Pi Zero 2 WH] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835 + ESP32]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Préparation de documents de suivi pour le client avant les rendez-vous.&lt;br /&gt;
&lt;br /&gt;
Choix d'utiliser la methode agile. Retour client et sprint hebdomadaire.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python). Tutoriel pas à pas [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/blob/main/serveur/README.md?ref_type=heads ici].&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Permet la connection réseau.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
* [https://github.com/Xinyuan-LilyGO/LilyGo-EPD47 LilyGo-EPD47] : Driver pour notre écran 4.7 pouces&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/SPI/ SPI] : Permet la communication via SPI (Serial Peripheral Interface)&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur. &amp;lt;br&amp;gt;&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
Mise en place des mises à jour quotidiennes via une tâche cron -&amp;gt; passer par systemd (Systemd Timer)&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
==== ecran e-ink ====&lt;br /&gt;
&lt;br /&gt;
Nous avons été incapable de faire fonctionner correctement l'écran à l'aide de l'IDE Arduino. Nous avons donc changé de logiciel pour [https://platformio.org/ PlatfromeIO].&amp;lt;br&amp;gt;&lt;br /&gt;
Library utilisée : [https://github.com/Xinyuan-LilyGO/LilyGo-EPD47 LilygoEPD47]&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
[https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/tree/main/serveur?ref_type=heads Le tuto pas à pas]&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
L'application python et le WSGI : [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/tree/main/serveur?ref_type=heads ici] &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;N'oubliez pas la liste des paquets utilisés&amp;lt;/span&amp;gt; : &lt;br /&gt;
[[Fichier:TN6 CARAE requirements python.txt|vignette|centré|Requirements python]]&lt;br /&gt;
&lt;br /&gt;
Le WSGI room212a.wsgi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
sys.path.insert(0, '/home/room/carae')&lt;br /&gt;
from room212a import app as application&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Application python room212a.py :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   from flask import Flask&lt;br /&gt;
import requests&lt;br /&gt;
import re&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
from bs4 import BeautifulSoup&lt;br /&gt;
&lt;br /&gt;
app = Flask(__name__)&lt;br /&gt;
&lt;br /&gt;
@app.route(&amp;quot;/&amp;quot;)&lt;br /&gt;
def hello() -&amp;gt; str:&lt;br /&gt;
&lt;br /&gt;
    URL = &amp;quot;votre url ici&amp;quot;&lt;br /&gt;
    page = requests.get(URL)&lt;br /&gt;
    &lt;br /&gt;
    # part 2 de la création du soup object&lt;br /&gt;
    # l'objet soup prend page.content as input&lt;br /&gt;
    # content plutot que text, on évite les soucis d'encodage&lt;br /&gt;
    # html.parser = class constructor&lt;br /&gt;
    soup = BeautifulSoup(page.content, &amp;quot;html.parser&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    #on cherche la balise &amp;lt;a&amp;gt; &amp;amp; l'élément id=afficherBoutonSelection1 pour récupérer le n° de la salle&lt;br /&gt;
    salle = soup.find('a', id='afficherBoutonSelection1')&lt;br /&gt;
    numero_salle = salle.get_text()&lt;br /&gt;
    &lt;br /&gt;
    #on cherche tous les éléments avec le mot &amp;quot;type.&amp;quot; (le . c'est pour n'importe quel caractère) pour récupérer la classe de la réservation&lt;br /&gt;
    elements = soup.find_all(&lt;br /&gt;
        class_=re.compile(r'\btype.\b')&lt;br /&gt;
     )&lt;br /&gt;
    #Objet unique pour la salle&lt;br /&gt;
    data_json = {&lt;br /&gt;
        &amp;quot;test&amp;quot;: &amp;quot;hello world&amp;quot;,&lt;br /&gt;
        &amp;quot;salle&amp;quot;: {&lt;br /&gt;
            &amp;quot;numero&amp;quot;: numero_salle&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;reservations&amp;quot;: []&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #array pour les réservations&lt;br /&gt;
    for data in elements:&lt;br /&gt;
        reservation = {&lt;br /&gt;
            &amp;quot;heure&amp;quot;: data.contents[0],&lt;br /&gt;
            # &amp;quot;service&amp;quot;: data.contents[2],&lt;br /&gt;
            &amp;quot;nom&amp;quot;: data.contents[4],&lt;br /&gt;
            # &amp;quot;outil&amp;quot;: data.contents[6],&lt;br /&gt;
        }&lt;br /&gt;
        data_json[&amp;quot;reservations&amp;quot;].append(reservation)&lt;br /&gt;
    #Ajout des données nom et heures extraites de la page dans le data_python&lt;br /&gt;
    return data_json&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    app.run(debug = True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|frameless|400px|center|Schéma dispositif]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recommandation ==&lt;br /&gt;
# Travailler avec des distributions Linux &amp;lt;!-- Windows ça pue --&amp;gt;&lt;br /&gt;
# La partie serveur peut très bien être hébergée sur une VM dédiée&lt;br /&gt;
# Avant toute chose, vérifiez '''toujours''' que votre matériel fonctionne correctement&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34285</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34285"/>
				<updated>2025-05-22T12:33:03Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Python */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
Technologies utilisées : &lt;br /&gt;
* WSGI Flask&lt;br /&gt;
* Serveur Web Apache&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Raspberry_Pi#Mod%C3%A8le_Zero_2_WH Raspberry Pi Zero 2 WH] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835 + ESP32]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Préparation de documents de suivi pour le client avant les rendez-vous.&lt;br /&gt;
&lt;br /&gt;
Choix d'utiliser la methode agile. Retour client et sprint hebdomadaire.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python). Tutoriel pas à pas [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/blob/main/serveur/README.md?ref_type=heads ici].&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Permet la connection réseau.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
* [https://github.com/Xinyuan-LilyGO/LilyGo-EPD47 LilyGo-EPD47] : Driver pour notre écran 4.7 pouces&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/SPI/ SPI] : Permet la communication via SPI (Serial Peripheral Interface)&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur. &amp;lt;br&amp;gt;&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
Mise en place des mises à jour quotidiennes via une tâche cron -&amp;gt; passer par systemd (Systemd Timer)&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
==== ecran e-ink ====&lt;br /&gt;
&lt;br /&gt;
Nous avons été incapable de faire fonctionner correctement l'écran à l'aide de l'IDE Arduino. Nous avons donc changé de logiciel pour [https://platformio.org/ PlatfromeIO].&amp;lt;br&amp;gt;&lt;br /&gt;
Library utilisée : [https://github.com/Xinyuan-LilyGO/LilyGo-EPD47 LilygoEPD47]&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
[https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/tree/main/serveur?ref_type=heads Le tuto pas à pas]&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
L'application python et le WSGI : [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/tree/main/serveur?ref_type=heads ici] &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;N'oubliez pas la liste des paquets utilisés&amp;lt;/span&amp;gt; : &lt;br /&gt;
[[Fichier:TN6 CARAE requirements python.txt|vignette|centré|Requirements python]]&lt;br /&gt;
&lt;br /&gt;
Le WSGI room212a.wsgi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
sys.path.insert(0, '/home/room/carae')&lt;br /&gt;
from room212a import app as application&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Application python room212a.py :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   from flask import Flask&lt;br /&gt;
import requests&lt;br /&gt;
import re&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
from bs4 import BeautifulSoup&lt;br /&gt;
&lt;br /&gt;
app = Flask(__name__)&lt;br /&gt;
&lt;br /&gt;
@app.route(&amp;quot;/&amp;quot;)&lt;br /&gt;
def hello() -&amp;gt; str:&lt;br /&gt;
&lt;br /&gt;
    URL = &amp;quot;votre url ici&amp;quot;&lt;br /&gt;
    page = requests.get(URL)&lt;br /&gt;
    &lt;br /&gt;
    # part 2 de la création du soup object&lt;br /&gt;
    # l'objet soup prend page.content as input&lt;br /&gt;
    # content plutot que text, on évite les soucis d'encodage&lt;br /&gt;
    # html.parser = class constructor&lt;br /&gt;
    soup = BeautifulSoup(page.content, &amp;quot;html.parser&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    #on cherche la balise &amp;lt;a&amp;gt; &amp;amp; l'élément id=afficherBoutonSelection1 pour récupérer le n° de la salle&lt;br /&gt;
    salle = soup.find('a', id='afficherBoutonSelection1')&lt;br /&gt;
    numero_salle = salle.get_text()&lt;br /&gt;
    &lt;br /&gt;
    #on cherche tous les éléments avec le mot &amp;quot;type.&amp;quot; (le . c'est pour n'importe quel caractère) pour récupérer la classe de la réservation&lt;br /&gt;
    elements = soup.find_all(&lt;br /&gt;
        class_=re.compile(r'\btype.\b')&lt;br /&gt;
     )&lt;br /&gt;
    #Objet unique pour la salle&lt;br /&gt;
    data_json = {&lt;br /&gt;
        &amp;quot;test&amp;quot;: &amp;quot;hello world&amp;quot;,&lt;br /&gt;
        &amp;quot;salle&amp;quot;: {&lt;br /&gt;
            &amp;quot;numero&amp;quot;: numero_salle&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;reservations&amp;quot;: []&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #array pour les réservations&lt;br /&gt;
    for data in elements:&lt;br /&gt;
        reservation = {&lt;br /&gt;
            &amp;quot;heure&amp;quot;: data.contents[0],&lt;br /&gt;
            # &amp;quot;service&amp;quot;: data.contents[2],&lt;br /&gt;
            &amp;quot;nom&amp;quot;: data.contents[4],&lt;br /&gt;
            # &amp;quot;outil&amp;quot;: data.contents[6],&lt;br /&gt;
        }&lt;br /&gt;
        data_json[&amp;quot;reservations&amp;quot;].append(reservation)&lt;br /&gt;
    #Ajout des données nom et heures extraites de la page dans le data_python&lt;br /&gt;
    return data_json&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    app.run(debug = True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|frameless|400px|center|Schéma dispositif]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recommandation ==&lt;br /&gt;
# Travailler avec des distributions Linux &amp;lt;!-- Windows ça pue --&amp;gt;&lt;br /&gt;
# La partie serveur peut très bien être hébergée sur une VM dédiée&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34284</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34284"/>
				<updated>2025-05-22T12:31:11Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Python */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
Technologies utilisées : &lt;br /&gt;
* WSGI Flask&lt;br /&gt;
* Serveur Web Apache&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Raspberry_Pi#Mod%C3%A8le_Zero_2_WH Raspberry Pi Zero 2 WH] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835 + ESP32]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Préparation de documents de suivi pour le client avant les rendez-vous.&lt;br /&gt;
&lt;br /&gt;
Choix d'utiliser la methode agile. Retour client et sprint hebdomadaire.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python). Tutoriel pas à pas [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/blob/main/serveur/README.md?ref_type=heads ici].&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Permet la connection réseau.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
* [https://github.com/Xinyuan-LilyGO/LilyGo-EPD47 LilyGo-EPD47] : Driver pour notre écran 4.7 pouces&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/SPI/ SPI] : Permet la communication via SPI (Serial Peripheral Interface)&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur. &amp;lt;br&amp;gt;&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
Mise en place des mises à jour quotidiennes via une tâche cron -&amp;gt; passer par systemd (Systemd Timer)&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
==== ecran e-ink ====&lt;br /&gt;
&lt;br /&gt;
Nous avons été incapable de faire fonctionner correctement l'écran à l'aide de l'IDE Arduino. Nous avons donc changé de logiciel pour [https://platformio.org/ PlatfromeIO].&amp;lt;br&amp;gt;&lt;br /&gt;
Library utilisée : [https://github.com/Xinyuan-LilyGO/LilyGo-EPD47 LilygoEPD47]&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
[https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/tree/main/serveur?ref_type=heads Le tuto pas à pas]&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
L'application python et le WSGI : [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/tree/main/serveur?ref_type=heads ici]&lt;br /&gt;
N'oubliez pas la liste des paquets utilisés : &lt;br /&gt;
[[Fichier:TN6 CARAE requirements python.txt|vignette|centré|Requirements python]]&lt;br /&gt;
&lt;br /&gt;
Le WSGI room212a.wsgi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
sys.path.insert(0, '/home/room/carae')&lt;br /&gt;
from room212a import app as application&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Application python room212a.py :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   from flask import Flask&lt;br /&gt;
import requests&lt;br /&gt;
import re&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
from bs4 import BeautifulSoup&lt;br /&gt;
&lt;br /&gt;
app = Flask(__name__)&lt;br /&gt;
&lt;br /&gt;
@app.route(&amp;quot;/&amp;quot;)&lt;br /&gt;
def hello() -&amp;gt; str:&lt;br /&gt;
&lt;br /&gt;
    URL = &amp;quot;votre url ici&amp;quot;&lt;br /&gt;
    page = requests.get(URL)&lt;br /&gt;
    &lt;br /&gt;
    # part 2 de la création du soup object&lt;br /&gt;
    # l'objet soup prend page.content as input&lt;br /&gt;
    # content plutot que text, on évite les soucis d'encodage&lt;br /&gt;
    # html.parser = class constructor&lt;br /&gt;
    soup = BeautifulSoup(page.content, &amp;quot;html.parser&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    #on cherche la balise &amp;lt;a&amp;gt; &amp;amp; l'élément id=afficherBoutonSelection1 pour récupérer le n° de la salle&lt;br /&gt;
    salle = soup.find('a', id='afficherBoutonSelection1')&lt;br /&gt;
    numero_salle = salle.get_text()&lt;br /&gt;
    &lt;br /&gt;
    #on cherche tous les éléments avec le mot &amp;quot;type.&amp;quot; (le . c'est pour n'importe quel caractère) pour récupérer la classe de la réservation&lt;br /&gt;
    elements = soup.find_all(&lt;br /&gt;
        class_=re.compile(r'\btype.\b')&lt;br /&gt;
     )&lt;br /&gt;
    #Objet unique pour la salle&lt;br /&gt;
    data_json = {&lt;br /&gt;
        &amp;quot;test&amp;quot;: &amp;quot;hello world&amp;quot;,&lt;br /&gt;
        &amp;quot;salle&amp;quot;: {&lt;br /&gt;
            &amp;quot;numero&amp;quot;: numero_salle&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;reservations&amp;quot;: []&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #array pour les réservations&lt;br /&gt;
    for data in elements:&lt;br /&gt;
        reservation = {&lt;br /&gt;
            &amp;quot;heure&amp;quot;: data.contents[0],&lt;br /&gt;
            # &amp;quot;service&amp;quot;: data.contents[2],&lt;br /&gt;
            &amp;quot;nom&amp;quot;: data.contents[4],&lt;br /&gt;
            # &amp;quot;outil&amp;quot;: data.contents[6],&lt;br /&gt;
        }&lt;br /&gt;
        data_json[&amp;quot;reservations&amp;quot;].append(reservation)&lt;br /&gt;
    #Ajout des données nom et heures extraites de la page dans le data_python&lt;br /&gt;
    return data_json&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    app.run(debug = True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|frameless|400px|center|Schéma dispositif]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recommandation ==&lt;br /&gt;
# Travailler avec des distributions Linux &amp;lt;!-- Windows ça pue --&amp;gt;&lt;br /&gt;
# La partie serveur peut très bien être hébergée sur une VM dédiée&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:TN6_CARAE_requirements_python.txt&amp;diff=34283</id>
		<title>Fichier:TN6 CARAE requirements python.txt</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Fichier:TN6_CARAE_requirements_python.txt&amp;diff=34283"/>
				<updated>2025-05-22T12:30:39Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;les paquets et les différentes versions utilisées dans notre projet&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34282</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34282"/>
				<updated>2025-05-22T12:26:02Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Python */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
Technologies utilisées : &lt;br /&gt;
* WSGI Flask&lt;br /&gt;
* Serveur Web Apache&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Raspberry_Pi#Mod%C3%A8le_Zero_2_WH Raspberry Pi Zero 2 WH] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835 + ESP32]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Préparation de documents de suivi pour le client avant les rendez-vous.&lt;br /&gt;
&lt;br /&gt;
Choix d'utiliser la methode agile. Retour client et sprint hebdomadaire.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python). Tutoriel pas à pas [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/blob/main/serveur/README.md?ref_type=heads ici].&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Permet la connection réseau.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
* [https://github.com/Xinyuan-LilyGO/LilyGo-EPD47 LilyGo-EPD47] : Driver pour notre écran 4.7 pouces&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/SPI/ SPI] : Permet la communication via SPI (Serial Peripheral Interface)&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur. &amp;lt;br&amp;gt;&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
Mise en place des mises à jour quotidiennes via une tâche cron -&amp;gt; passer par systemd (Systemd Timer)&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
==== ecran e-ink ====&lt;br /&gt;
&lt;br /&gt;
Nous avons été incapable de faire fonctionner correctement l'écran à l'aide de l'IDE Arduino. Nous avons donc changé de logiciel pour [https://platformio.org/ PlatfromeIO].&amp;lt;br&amp;gt;&lt;br /&gt;
Library utilisée : [https://github.com/Xinyuan-LilyGO/LilyGo-EPD47 LilygoEPD47]&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
[https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/tree/main/serveur?ref_type=heads Le tuto pas à pas]&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
L'application python et le WSGI : [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/tree/main/serveur?ref_type=heads ici]&lt;br /&gt;
&lt;br /&gt;
Le WSGI room212a.wsgi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
sys.path.insert(0, '/home/room/carae')&lt;br /&gt;
from room212a import app as application&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Application python room212a.py :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   from flask import Flask&lt;br /&gt;
import requests&lt;br /&gt;
import re&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
from bs4 import BeautifulSoup&lt;br /&gt;
&lt;br /&gt;
app = Flask(__name__)&lt;br /&gt;
&lt;br /&gt;
@app.route(&amp;quot;/&amp;quot;)&lt;br /&gt;
def hello() -&amp;gt; str:&lt;br /&gt;
&lt;br /&gt;
    URL = &amp;quot;votre url ici&amp;quot;&lt;br /&gt;
    page = requests.get(URL)&lt;br /&gt;
    &lt;br /&gt;
    # part 2 de la création du soup object&lt;br /&gt;
    # l'objet soup prend page.content as input&lt;br /&gt;
    # content plutot que text, on évite les soucis d'encodage&lt;br /&gt;
    # html.parser = class constructor&lt;br /&gt;
    soup = BeautifulSoup(page.content, &amp;quot;html.parser&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    #on cherche la balise &amp;lt;a&amp;gt; &amp;amp; l'élément id=afficherBoutonSelection1 pour récupérer le n° de la salle&lt;br /&gt;
    salle = soup.find('a', id='afficherBoutonSelection1')&lt;br /&gt;
    numero_salle = salle.get_text()&lt;br /&gt;
    &lt;br /&gt;
    #on cherche tous les éléments avec le mot &amp;quot;type.&amp;quot; (le . c'est pour n'importe quel caractère) pour récupérer la classe de la réservation&lt;br /&gt;
    elements = soup.find_all(&lt;br /&gt;
        class_=re.compile(r'\btype.\b')&lt;br /&gt;
     )&lt;br /&gt;
    #Objet unique pour la salle&lt;br /&gt;
    data_json = {&lt;br /&gt;
        &amp;quot;test&amp;quot;: &amp;quot;hello world&amp;quot;,&lt;br /&gt;
        &amp;quot;salle&amp;quot;: {&lt;br /&gt;
            &amp;quot;numero&amp;quot;: numero_salle&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;reservations&amp;quot;: []&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #array pour les réservations&lt;br /&gt;
    for data in elements:&lt;br /&gt;
        reservation = {&lt;br /&gt;
            &amp;quot;heure&amp;quot;: data.contents[0],&lt;br /&gt;
            # &amp;quot;service&amp;quot;: data.contents[2],&lt;br /&gt;
            &amp;quot;nom&amp;quot;: data.contents[4],&lt;br /&gt;
            # &amp;quot;outil&amp;quot;: data.contents[6],&lt;br /&gt;
        }&lt;br /&gt;
        data_json[&amp;quot;reservations&amp;quot;].append(reservation)&lt;br /&gt;
    #Ajout des données nom et heures extraites de la page dans le data_python&lt;br /&gt;
    return data_json&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    app.run(debug = True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|frameless|400px|center|Schéma dispositif]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recommandation ==&lt;br /&gt;
# Travailler avec des distributions Linux &amp;lt;!-- Windows ça pue --&amp;gt;&lt;br /&gt;
# La partie serveur peut très bien être hébergée sur une VM dédiée&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34281</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34281"/>
				<updated>2025-05-22T12:24:43Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Python */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
Technologies utilisées : &lt;br /&gt;
* WSGI Flask&lt;br /&gt;
* Serveur Web Apache&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Raspberry_Pi#Mod%C3%A8le_Zero_2_WH Raspberry Pi Zero 2 WH] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835 + ESP32]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Préparation de documents de suivi pour le client avant les rendez-vous.&lt;br /&gt;
&lt;br /&gt;
Choix d'utiliser la methode agile. Retour client et sprint hebdomadaire.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python). Tutoriel pas à pas [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/blob/main/serveur/README.md?ref_type=heads ici].&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Permet la connection réseau.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
* [https://github.com/Xinyuan-LilyGO/LilyGo-EPD47 LilyGo-EPD47] : Driver pour notre écran 4.7 pouces&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/SPI/ SPI] : Permet la communication via SPI (Serial Peripheral Interface)&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur. &amp;lt;br&amp;gt;&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
Mise en place des mises à jour quotidiennes via une tâche cron -&amp;gt; passer par systemd (Systemd Timer)&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
==== ecran e-ink ====&lt;br /&gt;
&lt;br /&gt;
Nous avons été incapable de faire fonctionner correctement l'écran à l'aide de l'IDE Arduino. Nous avons donc changé de logiciel pour [https://platformio.org/ PlatfromeIO].&amp;lt;br&amp;gt;&lt;br /&gt;
Library utilisée : [https://github.com/Xinyuan-LilyGO/LilyGo-EPD47 LilygoEPD47]&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
[https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/tree/main/serveur?ref_type=heads Le tuto pas à pas]&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
L'application python et le WSGI : [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/tree/main/serveur?ref_type=heads ici]&lt;br /&gt;
&lt;br /&gt;
Application python :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   from flask import Flask&lt;br /&gt;
import requests&lt;br /&gt;
import re&lt;br /&gt;
import json&lt;br /&gt;
&lt;br /&gt;
from bs4 import BeautifulSoup&lt;br /&gt;
&lt;br /&gt;
app = Flask(__name__)&lt;br /&gt;
&lt;br /&gt;
@app.route(&amp;quot;/&amp;quot;)&lt;br /&gt;
def hello() -&amp;gt; str:&lt;br /&gt;
&lt;br /&gt;
    URL = &amp;quot;votre url ici&amp;quot;&lt;br /&gt;
    page = requests.get(URL)&lt;br /&gt;
    &lt;br /&gt;
    # part 2 de la création du soup object&lt;br /&gt;
    # l'objet soup prend page.content as input&lt;br /&gt;
    # content plutot que text, on évite les soucis d'encodage&lt;br /&gt;
    # html.parser = class constructor&lt;br /&gt;
    soup = BeautifulSoup(page.content, &amp;quot;html.parser&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    #on cherche la balise &amp;lt;a&amp;gt; &amp;amp; l'élément id=afficherBoutonSelection1 pour récupérer le n° de la salle&lt;br /&gt;
    salle = soup.find('a', id='afficherBoutonSelection1')&lt;br /&gt;
    numero_salle = salle.get_text()&lt;br /&gt;
    &lt;br /&gt;
    #on cherche tous les éléments avec le mot &amp;quot;type.&amp;quot; (le . c'est pour n'importe quel caractère) pour récupérer la classe de la réservation&lt;br /&gt;
    elements = soup.find_all(&lt;br /&gt;
        class_=re.compile(r'\btype.\b')&lt;br /&gt;
     )&lt;br /&gt;
    #Objet unique pour la salle&lt;br /&gt;
    data_json = {&lt;br /&gt;
        &amp;quot;test&amp;quot;: &amp;quot;hello world&amp;quot;,&lt;br /&gt;
        &amp;quot;salle&amp;quot;: {&lt;br /&gt;
            &amp;quot;numero&amp;quot;: numero_salle&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;reservations&amp;quot;: []&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #array pour les réservations&lt;br /&gt;
    for data in elements:&lt;br /&gt;
        reservation = {&lt;br /&gt;
            &amp;quot;heure&amp;quot;: data.contents[0],&lt;br /&gt;
            # &amp;quot;service&amp;quot;: data.contents[2],&lt;br /&gt;
            &amp;quot;nom&amp;quot;: data.contents[4],&lt;br /&gt;
            # &amp;quot;outil&amp;quot;: data.contents[6],&lt;br /&gt;
        }&lt;br /&gt;
        data_json[&amp;quot;reservations&amp;quot;].append(reservation)&lt;br /&gt;
    #Ajout des données nom et heures extraites de la page dans le data_python&lt;br /&gt;
    return data_json&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    app.run(debug = True)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|frameless|400px|center|Schéma dispositif]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recommandation ==&lt;br /&gt;
# Travailler avec des distributions Linux &amp;lt;!-- Windows ça pue --&amp;gt;&lt;br /&gt;
# La partie serveur peut très bien être hébergée sur une VM dédiée&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34280</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34280"/>
				<updated>2025-05-22T12:19:42Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Python */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
Technologies utilisées : &lt;br /&gt;
* WSGI Flask&lt;br /&gt;
* Serveur Web Apache&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Raspberry_Pi#Mod%C3%A8le_Zero_2_WH Raspberry Pi Zero 2 WH] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835 + ESP32]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Préparation de documents de suivi pour le client avant les rendez-vous.&lt;br /&gt;
&lt;br /&gt;
Choix d'utiliser la methode agile. Retour client et sprint hebdomadaire.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python). Tutoriel pas à pas [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/blob/main/serveur/README.md?ref_type=heads ici].&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Permet la connection réseau.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
* [https://github.com/Xinyuan-LilyGO/LilyGo-EPD47 LilyGo-EPD47] : Driver pour notre écran 4.7 pouces&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/SPI/ SPI] : Permet la communication via SPI (Serial Peripheral Interface)&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur. &amp;lt;br&amp;gt;&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
Mise en place des mises à jour quotidiennes via une tâche cron -&amp;gt; passer par systemd (Systemd Timer)&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
==== ecran e-ink ====&lt;br /&gt;
&lt;br /&gt;
Nous avons été incapable de faire fonctionner correctement l'écran à l'aide de l'IDE Arduino. Nous avons donc changé de logiciel pour [https://platformio.org/ PlatfromeIO].&amp;lt;br&amp;gt;&lt;br /&gt;
Library utilisée : [https://github.com/Xinyuan-LilyGO/LilyGo-EPD47 LilygoEPD47]&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
[https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/tree/main/serveur?ref_type=heads Le tuto pas à pas]&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
L'application python et le WSGI : [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/tree/main/serveur?ref_type=heads ici]&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|frameless|400px|center|Schéma dispositif]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recommandation ==&lt;br /&gt;
# Travailler avec des distributions Linux &amp;lt;!-- Windows ça pue --&amp;gt;&lt;br /&gt;
# La partie serveur peut très bien être hébergée sur une VM dédiée&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34279</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34279"/>
				<updated>2025-05-22T12:11:16Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Configuration Raspberry */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
Technologies utilisées : &lt;br /&gt;
* WSGI Flask&lt;br /&gt;
* Serveur Web Apache&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Raspberry_Pi#Mod%C3%A8le_Zero_2_WH Raspberry Pi Zero 2 WH] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835 + ESP32]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Préparation de documents de suivi pour le client avant les rendez-vous.&lt;br /&gt;
&lt;br /&gt;
Choix d'utiliser la methode agile. Retour client et sprint hebdomadaire.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python). Tutoriel pas à pas [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/blob/main/serveur/README.md?ref_type=heads ici].&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Permet la connection réseau.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
* [https://github.com/Xinyuan-LilyGO/LilyGo-EPD47 LilyGo-EPD47] : Driver pour notre écran 4.7 pouces&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/SPI/ SPI] : Permet la communication via SPI (Serial Peripheral Interface)&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur. &amp;lt;br&amp;gt;&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
Mise en place des mises à jour quotidiennes via une tâche cron -&amp;gt; passer par systemd (Systemd Timer)&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
==== ecran e-ink ====&lt;br /&gt;
&lt;br /&gt;
Nous avons été incapable de faire fonctionner correctement l'écran à l'aide de l'IDE Arduino. Nous avons donc changé de logiciel pour [https://platformio.org/ PlatfromeIO].&amp;lt;br&amp;gt;&lt;br /&gt;
Library utilisée : [https://github.com/Xinyuan-LilyGO/LilyGo-EPD47 LilygoEPD47]&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
[https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/tree/main/serveur?ref_type=heads Le tuto pas à pas]&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|frameless|400px|center|Schéma dispositif]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recommandation ==&lt;br /&gt;
# Travailler avec des distributions Linux &amp;lt;!-- Windows ça pue --&amp;gt;&lt;br /&gt;
# La partie serveur peut très bien être hébergée sur une VM dédiée&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34278</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34278"/>
				<updated>2025-05-22T11:59:18Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* ESP32 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
Technologies utilisées : &lt;br /&gt;
* WSGI Flask&lt;br /&gt;
* Serveur Web Apache&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Raspberry_Pi#Mod%C3%A8le_Zero_2_WH Raspberry Pi Zero 2 WH] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835 + ESP32]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Préparation de documents de suivi pour le client avant les rendez-vous.&lt;br /&gt;
&lt;br /&gt;
Choix d'utiliser la methode agile. Retour client et sprint hebdomadaire.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python). Tutoriel pas à pas [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/blob/main/serveur/README.md?ref_type=heads ici].&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Permet la connection réseau.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
* [https://github.com/Xinyuan-LilyGO/LilyGo-EPD47 LilyGo-EPD47] : Driver pour notre écran 4.7 pouces&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/SPI/ SPI] : Permet la communication via SPI (Serial Peripheral Interface)&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur. &amp;lt;br&amp;gt;&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
Mise en place des mises à jour quotidiennes via une tâche cron -&amp;gt; passer par systemd (Systemd Timer)&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
==== ecran e-ink ====&lt;br /&gt;
&lt;br /&gt;
Nous avons été incapable de faire fonctionner correctement l'écran à l'aide de l'IDE Arduino. Nous avons donc changé de logiciel pour [https://platformio.org/ PlatfromeIO].&amp;lt;br&amp;gt;&lt;br /&gt;
Library utilisée : [https://github.com/Xinyuan-LilyGO/LilyGo-EPD47 LilygoEPD47]&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|frameless|400px|center|Schéma dispositif]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recommandation ==&lt;br /&gt;
# Travailler avec des distributions Linux &amp;lt;!-- Windows ça pue --&amp;gt;&lt;br /&gt;
# La partie serveur peut très bien être hébergée sur une VM dédiée&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34277</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34277"/>
				<updated>2025-05-22T10:28:22Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* ESP32 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
Technologies utilisées : &lt;br /&gt;
* WSGI Flask&lt;br /&gt;
* Serveur Web Apache&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Raspberry_Pi#Mod%C3%A8le_Zero_2_WH Raspberry Pi Zero 2 WH] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835 + ESP32]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Préparation de documents de suivi pour le client avant les rendez-vous.&lt;br /&gt;
&lt;br /&gt;
Choix d'utiliser la methode agile. Retour client et sprint hebdomadaire.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python). Tutoriel pas à pas [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/blob/main/serveur/README.md?ref_type=heads ici].&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Permet la connection réseau.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
&lt;br /&gt;
* firasans.h&lt;br /&gt;
* utilities.h&lt;br /&gt;
* epd_driver.h&lt;br /&gt;
* Arduino.h&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur. &amp;lt;br&amp;gt;&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
Mise en place des mises à jour quotidiennes via une tâche cron -&amp;gt; passer par systemd (Systemd Timer)&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
==== ecran e-ink ====&lt;br /&gt;
&lt;br /&gt;
Nous avons été incapable de faire fonctionner correctement l'écran à l'aide de l'IDE Arduino. Nous avons donc changé de logiciel pour [https://platformio.org/ PlatfromeIO].&amp;lt;br&amp;gt;&lt;br /&gt;
Library utilisée : [https://github.com/Xinyuan-LilyGO/LilyGo-EPD47 LilygoEPD47]&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|frameless|400px|center|Schéma dispositif]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recommandation ==&lt;br /&gt;
# Travailler avec des distributions Linux &amp;lt;!-- Windows ça pue --&amp;gt;&lt;br /&gt;
# La partie serveur peut très bien être hébergée sur une VM dédiée&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34227</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34227"/>
				<updated>2025-05-19T11:49:31Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* ecran e-ink */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
Technologies utilisées : &lt;br /&gt;
* WSGI Flask&lt;br /&gt;
* Serveur Web Apache&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Raspberry_Pi#Mod%C3%A8le_Zero_2_WH Raspberry Pi Zero 2 WH] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835 + ESP32]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Préparation de documents de suivi pour le client avant les rendez-vous.&lt;br /&gt;
&lt;br /&gt;
Choix d'utiliser la methode agile. Retour client et sprint hebdomadaire.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python). Tutoriel pas à pas [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/blob/main/serveur/README.md?ref_type=heads ici].&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Permet la connection réseau.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/adafruit-gfx-library/ Adafruit] : Bibliothèque graphique pour l'affichage.&lt;br /&gt;
* [https://github.com/ZinggJM/GxEPD2 GXedp2] : Permet de dessiner sur notre écran e-ink.&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur. &amp;lt;br&amp;gt;&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
Mise en place des mises à jour quotidiennes via une tâche cron -&amp;gt; passer par systemd (Systemd Timer)&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
==== ecran e-ink ====&lt;br /&gt;
&lt;br /&gt;
Nous avons été incapable de faire fonctionner correctement l'écran à l'aide de l'IDE Arduino. Nous avons donc changé de logiciel pour [https://platformio.org/ PlatfromeIO].&amp;lt;br&amp;gt;&lt;br /&gt;
Library utilisée : [https://github.com/Xinyuan-LilyGO/LilyGo-EPD47 LilygoEPD47]&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|frameless|400px|center|Schéma dispositif]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recommandation ==&lt;br /&gt;
# Travailler avec des distributions Linux &amp;lt;!-- Windows ça pue --&amp;gt;&lt;br /&gt;
# La partie serveur peut très bien être hébergée sur une VM dédiée&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34226</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34226"/>
				<updated>2025-05-19T11:45:17Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Problèmes rencontrés */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
Technologies utilisées : &lt;br /&gt;
* WSGI Flask&lt;br /&gt;
* Serveur Web Apache&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Raspberry_Pi#Mod%C3%A8le_Zero_2_WH Raspberry Pi Zero 2 WH] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835 + ESP32]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Préparation de documents de suivi pour le client avant les rendez-vous.&lt;br /&gt;
&lt;br /&gt;
Choix d'utiliser la methode agile. Retour client et sprint hebdomadaire.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python). Tutoriel pas à pas [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/blob/main/serveur/README.md?ref_type=heads ici].&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Permet la connection réseau.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/adafruit-gfx-library/ Adafruit] : Bibliothèque graphique pour l'affichage.&lt;br /&gt;
* [https://github.com/ZinggJM/GxEPD2 GXedp2] : Permet de dessiner sur notre écran e-ink.&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur. &amp;lt;br&amp;gt;&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
Mise en place des mises à jour quotidiennes via une tâche cron -&amp;gt; passer par systemd (Systemd Timer)&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
==== ecran e-ink ====&lt;br /&gt;
&lt;br /&gt;
Nous avons été incapable de faire fonctionner correctement l'écran à l'aide de l'IDE Arduino. Nous avons donc changé de logiciel pour [https://platformio.org/ PlatfromeIO].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|frameless|400px|center|Schéma dispositif]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recommandation ==&lt;br /&gt;
# Travailler avec des distributions Linux &amp;lt;!-- Windows ça pue --&amp;gt;&lt;br /&gt;
# La partie serveur peut très bien être hébergée sur une VM dédiée&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34196</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34196"/>
				<updated>2025-05-15T11:46:38Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Matériel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://fr.wikipedia.org/wiki/Raspberry_Pi#Mod%C3%A8le_Zero_2_WH Raspberry Pi Zero 2 WH] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835 + ESP32]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python). Tutoriel pas à pas [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/blob/main/serveur/README.md?ref_type=heads ici].&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Permet la connection réseau.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/adafruit-gfx-library/ Adafruit] : Bibliothèque graphique pour l'affichage.&lt;br /&gt;
* [https://github.com/ZinggJM/GxEPD2 GXedp2] : Permet de dessiner sur notre écran e-ink.&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur. &amp;lt;br&amp;gt;&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
Mise en place des mises à jour quotidiennes via une tâche cron -&amp;gt; passer par systemd (Systemd Timer)&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|frameless|400px|center|Schéma dispositif]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recommandation ==&lt;br /&gt;
# Travailler avec des distributions Linux &amp;lt;!-- Windows ça pue --&amp;gt;&lt;br /&gt;
# La partie serveur peut très bien être hébergée sur une VM dédiée&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34189</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34189"/>
				<updated>2025-05-15T09:32:06Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Recommandation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://www.kubii.com/fr/cartes-nano-ordinateurs/2076-raspberry-pi-zero-wh-kubii-3272496009394.html Raspberry Pi Zero WH] + Câble d'alimentation&lt;br /&gt;
* [https://letmeknow.fr/fr/cartes-compatibles/1620-carte-de-developement-esp32-wroom-652733472090.html ESP32] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python). Tutoriel pas à pas [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/blob/main/serveur/README.md?ref_type=heads ici].&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Permet la connection réseau.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/adafruit-gfx-library/ Adafruit] : Bibliothèque graphique pour l'affichage.&lt;br /&gt;
* [https://github.com/ZinggJM/GxEPD2 GXedp2] : Permet de dessiner sur notre écran e-ink.&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur. &amp;lt;br&amp;gt;&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
Mise en place des mises à jour quotidiennes via une tâche cron -&amp;gt; passer par systemd (Systemd Timer)&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|frameless|400px|center|Schéma dispositif]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recommandation ==&lt;br /&gt;
# Travailler avec des distributions Linux &amp;lt;!-- Windows ça pue --&amp;gt;&lt;br /&gt;
# La partie serveur peut très bien être hébergée sur une VM dédiée&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34188</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34188"/>
				<updated>2025-05-15T09:30:01Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Bash */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://www.kubii.com/fr/cartes-nano-ordinateurs/2076-raspberry-pi-zero-wh-kubii-3272496009394.html Raspberry Pi Zero WH] + Câble d'alimentation&lt;br /&gt;
* [https://letmeknow.fr/fr/cartes-compatibles/1620-carte-de-developement-esp32-wroom-652733472090.html ESP32] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python). Tutoriel pas à pas [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/blob/main/serveur/README.md?ref_type=heads ici].&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Permet la connection réseau.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/adafruit-gfx-library/ Adafruit] : Bibliothèque graphique pour l'affichage.&lt;br /&gt;
* [https://github.com/ZinggJM/GxEPD2 GXedp2] : Permet de dessiner sur notre écran e-ink.&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur. &amp;lt;br&amp;gt;&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
Mise en place des mises à jour quotidiennes via une tâche cron -&amp;gt; passer par systemd (Systemd Timer)&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|frameless|400px|center|Schéma dispositif]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recommandation ==&lt;br /&gt;
# Travailler avec des distributions Linux &amp;lt;!-- Windows ça pue --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34187</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34187"/>
				<updated>2025-05-15T09:29:24Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Physique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://www.kubii.com/fr/cartes-nano-ordinateurs/2076-raspberry-pi-zero-wh-kubii-3272496009394.html Raspberry Pi Zero WH] + Câble d'alimentation&lt;br /&gt;
* [https://letmeknow.fr/fr/cartes-compatibles/1620-carte-de-developement-esp32-wroom-652733472090.html ESP32] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python). Tutoriel pas à pas [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/blob/main/serveur/README.md?ref_type=heads ici].&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Permet la connection réseau.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/adafruit-gfx-library/ Adafruit] : Bibliothèque graphique pour l'affichage.&lt;br /&gt;
* [https://github.com/ZinggJM/GxEPD2 GXedp2] : Permet de dessiner sur notre écran e-ink.&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur. &amp;lt;br&amp;gt;&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
Mise en place de la mise en veille via une tâche cron -&amp;gt; passer par systemd (Systemd Timer)&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|frameless|400px|center|Schéma dispositif]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recommandation ==&lt;br /&gt;
# Travailler avec des distributions Linux &amp;lt;!-- Windows ça pue --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34186</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34186"/>
				<updated>2025-05-15T09:28:11Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Raspberry pi */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://www.kubii.com/fr/cartes-nano-ordinateurs/2076-raspberry-pi-zero-wh-kubii-3272496009394.html Raspberry Pi Zero WH] + Câble d'alimentation&lt;br /&gt;
* [https://letmeknow.fr/fr/cartes-compatibles/1620-carte-de-developement-esp32-wroom-652733472090.html ESP32] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python). Tutoriel pas à pas [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique/-/blob/main/serveur/README.md?ref_type=heads ici].&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Permet la connection réseau.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/adafruit-gfx-library/ Adafruit] : Bibliothèque graphique pour l'affichage.&lt;br /&gt;
* [https://github.com/ZinggJM/GxEPD2 GXedp2] : Permet de dessiner sur notre écran e-ink.&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur.&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
Mise en place de la mise en veille via une tâche cron -&amp;gt; passer par systemd (Systemd Timer)&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|frameless|400px|center|Schéma dispositif]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recommandation ==&lt;br /&gt;
# Travailler avec des distributions Linux &amp;lt;!-- Windows ça pue --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34160</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34160"/>
				<updated>2025-05-13T12:23:54Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Recommandation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://www.kubii.com/fr/cartes-nano-ordinateurs/2076-raspberry-pi-zero-wh-kubii-3272496009394.html Raspberry Pi Zero WH] + Câble d'alimentation&lt;br /&gt;
* [https://letmeknow.fr/fr/cartes-compatibles/1620-carte-de-developement-esp32-wroom-652733472090.html ESP32] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python).&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Permet la connection réseau.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/adafruit-gfx-library/ Adafruit] : Bibliothèque graphique pour l'affichage.&lt;br /&gt;
* [https://github.com/ZinggJM/GxEPD2 GXedp2] : Permet de dessiner sur notre écran e-ink.&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur.&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
Mise en place de la mise en veille via une tâche cron -&amp;gt; passer par systemd (Systemd Timer)&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|frameless|400px|center|Schéma dispositif]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recommandation ==&lt;br /&gt;
# Travailler avec des distributions Linux &amp;lt;!-- Windows ça pue --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34159</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34159"/>
				<updated>2025-05-13T12:22:59Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Recommandation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://www.kubii.com/fr/cartes-nano-ordinateurs/2076-raspberry-pi-zero-wh-kubii-3272496009394.html Raspberry Pi Zero WH] + Câble d'alimentation&lt;br /&gt;
* [https://letmeknow.fr/fr/cartes-compatibles/1620-carte-de-developement-esp32-wroom-652733472090.html ESP32] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python).&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Permet la connection réseau.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/adafruit-gfx-library/ Adafruit] : Bibliothèque graphique pour l'affichage.&lt;br /&gt;
* [https://github.com/ZinggJM/GxEPD2 GXedp2] : Permet de dessiner sur notre écran e-ink.&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur.&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
Mise en place de la mise en veille via une tâche cron -&amp;gt; passer par systemd (Systemd Timer)&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|frameless|400px|center|Schéma dispositif]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recommandation ==&lt;br /&gt;
# Travailler avec des distributions Linux&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34158</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34158"/>
				<updated>2025-05-13T12:22:20Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Visuel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://www.kubii.com/fr/cartes-nano-ordinateurs/2076-raspberry-pi-zero-wh-kubii-3272496009394.html Raspberry Pi Zero WH] + Câble d'alimentation&lt;br /&gt;
* [https://letmeknow.fr/fr/cartes-compatibles/1620-carte-de-developement-esp32-wroom-652733472090.html ESP32] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python).&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Permet la connection réseau.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/adafruit-gfx-library/ Adafruit] : Bibliothèque graphique pour l'affichage.&lt;br /&gt;
* [https://github.com/ZinggJM/GxEPD2 GXedp2] : Permet de dessiner sur notre écran e-ink.&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur.&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
Mise en place de la mise en veille via une tâche cron -&amp;gt; passer par systemd (Systemd Timer)&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|frameless|400px|center|Schéma dispositif]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Recommandation ==&lt;br /&gt;
1. Travailler avec des distributions Linux&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34157</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34157"/>
				<updated>2025-05-13T12:20:59Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Bash */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://www.kubii.com/fr/cartes-nano-ordinateurs/2076-raspberry-pi-zero-wh-kubii-3272496009394.html Raspberry Pi Zero WH] + Câble d'alimentation&lt;br /&gt;
* [https://letmeknow.fr/fr/cartes-compatibles/1620-carte-de-developement-esp32-wroom-652733472090.html ESP32] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python).&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Permet la connection réseau.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/adafruit-gfx-library/ Adafruit] : Bibliothèque graphique pour l'affichage.&lt;br /&gt;
* [https://github.com/ZinggJM/GxEPD2 GXedp2] : Permet de dessiner sur notre écran e-ink.&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur.&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
Mise en place de la mise en veille via une tâche cron -&amp;gt; passer par systemd (Systemd Timer)&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|frameless|400px|center|Schéma dispositif]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34156</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34156"/>
				<updated>2025-05-13T12:17:01Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* ESP32 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://www.kubii.com/fr/cartes-nano-ordinateurs/2076-raspberry-pi-zero-wh-kubii-3272496009394.html Raspberry Pi Zero WH] + Câble d'alimentation&lt;br /&gt;
* [https://letmeknow.fr/fr/cartes-compatibles/1620-carte-de-developement-esp32-wroom-652733472090.html ESP32] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python).&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Permet la connection réseau.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/adafruit-gfx-library/ Adafruit] : Bibliothèque graphique pour l'affichage.&lt;br /&gt;
* [https://github.com/ZinggJM/GxEPD2 GXedp2] : Permet de dessiner sur notre écran e-ink.&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur.&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|frameless|400px|center|Schéma dispositif]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34155</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34155"/>
				<updated>2025-05-13T12:15:07Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Visuel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://www.kubii.com/fr/cartes-nano-ordinateurs/2076-raspberry-pi-zero-wh-kubii-3272496009394.html Raspberry Pi Zero WH] + Câble d'alimentation&lt;br /&gt;
* [https://letmeknow.fr/fr/cartes-compatibles/1620-carte-de-developement-esp32-wroom-652733472090.html ESP32] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python).&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Wifi.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/adafruit-gfx-library/ Adafruit] : Bibliothèque graphique pour l'affichage.&lt;br /&gt;
* [https://github.com/ZinggJM/GxEPD2 GXedp2] : Permet de dessiner sur notre écran e-ink.&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur.&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|frameless|400px|center|Schéma dispositif]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34154</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34154"/>
				<updated>2025-05-13T12:12:46Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Visuel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://www.kubii.com/fr/cartes-nano-ordinateurs/2076-raspberry-pi-zero-wh-kubii-3272496009394.html Raspberry Pi Zero WH] + Câble d'alimentation&lt;br /&gt;
* [https://letmeknow.fr/fr/cartes-compatibles/1620-carte-de-developement-esp32-wroom-652733472090.html ESP32] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python).&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Wifi.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/adafruit-gfx-library/ Adafruit] : Bibliothèque graphique pour l'affichage.&lt;br /&gt;
* [https://github.com/ZinggJM/GxEPD2 GXedp2] : Permet de dessiner sur notre écran e-ink.&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur.&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|300px|frameless|right|Schéma dispositif]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34153</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34153"/>
				<updated>2025-05-13T12:11:09Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Visuel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://www.kubii.com/fr/cartes-nano-ordinateurs/2076-raspberry-pi-zero-wh-kubii-3272496009394.html Raspberry Pi Zero WH] + Câble d'alimentation&lt;br /&gt;
* [https://letmeknow.fr/fr/cartes-compatibles/1620-carte-de-developement-esp32-wroom-652733472090.html ESP32] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python).&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Wifi.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/adafruit-gfx-library/ Adafruit] : Bibliothèque graphique pour l'affichage.&lt;br /&gt;
* [https://github.com/ZinggJM/GxEPD2 GXedp2] : Permet de dessiner sur notre écran e-ink.&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur.&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|500px|thumb|right|Schéma dispositif]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34152</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34152"/>
				<updated>2025-05-13T12:10:36Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Visuel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://www.kubii.com/fr/cartes-nano-ordinateurs/2076-raspberry-pi-zero-wh-kubii-3272496009394.html Raspberry Pi Zero WH] + Câble d'alimentation&lt;br /&gt;
* [https://letmeknow.fr/fr/cartes-compatibles/1620-carte-de-developement-esp32-wroom-652733472090.html ESP32] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python).&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Wifi.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/adafruit-gfx-library/ Adafruit] : Bibliothèque graphique pour l'affichage.&lt;br /&gt;
* [https://github.com/ZinggJM/GxEPD2 GXedp2] : Permet de dessiner sur notre écran e-ink.&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur.&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|500px|thumb|right]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34151</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34151"/>
				<updated>2025-05-13T12:05:49Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* ESP32 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://www.kubii.com/fr/cartes-nano-ordinateurs/2076-raspberry-pi-zero-wh-kubii-3272496009394.html Raspberry Pi Zero WH] + Câble d'alimentation&lt;br /&gt;
* [https://letmeknow.fr/fr/cartes-compatibles/1620-carte-de-developement-esp32-wroom-652733472090.html ESP32] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python).&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
* [https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/wifi/ WiFi] : Wifi.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
* [https://docs.arduino.cc/libraries/adafruit-gfx-library/ Adafruit] : Bibliothèque graphique pour l'affichage.&lt;br /&gt;
* [https://github.com/ZinggJM/GxEPD2 GXedp2] : Permet de dessiner sur notre écran e-ink.&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur.&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|500px|right]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34150</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34150"/>
				<updated>2025-05-13T12:05:13Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Raspberry pi */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://www.kubii.com/fr/cartes-nano-ordinateurs/2076-raspberry-pi-zero-wh-kubii-3272496009394.html Raspberry Pi Zero WH] + Câble d'alimentation&lt;br /&gt;
* [https://letmeknow.fr/fr/cartes-compatibles/1620-carte-de-developement-esp32-wroom-652733472090.html ESP32] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python).&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
* [https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
* [https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
* [https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
* [https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
[https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
&lt;br /&gt;
[https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
&lt;br /&gt;
[https://docs.arduino.cc/libraries/wifi/ WiFi] : Wifi.&lt;br /&gt;
&lt;br /&gt;
[https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
&lt;br /&gt;
[https://docs.arduino.cc/libraries/adafruit-gfx-library/ Adafruit] : Bibliothèque graphique pour l'affichage.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ZinggJM/GxEPD2 GXedp2] : Permet de dessiner sur notre écran e-ink.&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur.&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|500px|right]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34149</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34149"/>
				<updated>2025-05-13T12:04:45Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Raspberry pi */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://www.kubii.com/fr/cartes-nano-ordinateurs/2076-raspberry-pi-zero-wh-kubii-3272496009394.html Raspberry Pi Zero WH] + Câble d'alimentation&lt;br /&gt;
* [https://letmeknow.fr/fr/cartes-compatibles/1620-carte-de-developement-esp32-wroom-652733472090.html ESP32] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne avec la distribution Raspbian, des scripts Bash, un serveur web Apache et Flask ([https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI] python).&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
&lt;br /&gt;
[https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
&lt;br /&gt;
[https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
[https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
&lt;br /&gt;
[https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
&lt;br /&gt;
[https://docs.arduino.cc/libraries/wifi/ WiFi] : Wifi.&lt;br /&gt;
&lt;br /&gt;
[https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
&lt;br /&gt;
[https://docs.arduino.cc/libraries/adafruit-gfx-library/ Adafruit] : Bibliothèque graphique pour l'affichage.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ZinggJM/GxEPD2 GXedp2] : Permet de dessiner sur notre écran e-ink.&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur.&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|500px|right]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34148</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34148"/>
				<updated>2025-05-13T12:02:11Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* ESP32 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://www.kubii.com/fr/cartes-nano-ordinateurs/2076-raspberry-pi-zero-wh-kubii-3272496009394.html Raspberry Pi Zero WH] + Câble d'alimentation&lt;br /&gt;
* [https://letmeknow.fr/fr/cartes-compatibles/1620-carte-de-developement-esp32-wroom-652733472090.html ESP32] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne grâce à un script bash, avec apache et flask.&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
&lt;br /&gt;
[https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
&lt;br /&gt;
[https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, contrôle l'affichage sur notre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
[https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
&lt;br /&gt;
[https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
&lt;br /&gt;
[https://docs.arduino.cc/libraries/wifi/ WiFi] : Wifi.&lt;br /&gt;
&lt;br /&gt;
[https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
&lt;br /&gt;
[https://docs.arduino.cc/libraries/adafruit-gfx-library/ Adafruit] : Bibliothèque graphique pour l'affichage.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ZinggJM/GxEPD2 GXedp2] : Permet de dessiner sur notre écran e-ink.&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur.&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|500px|right]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34147</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34147"/>
				<updated>2025-05-13T11:48:48Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Raspberry pi */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://www.kubii.com/fr/cartes-nano-ordinateurs/2076-raspberry-pi-zero-wh-kubii-3272496009394.html Raspberry Pi Zero WH] + Câble d'alimentation&lt;br /&gt;
* [https://letmeknow.fr/fr/cartes-compatibles/1620-carte-de-developement-esp32-wroom-652733472090.html ESP32] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un micro-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix a été fait car la puissance de calcule et la mémoire RAM de l'esp32 étaient trop faibles, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avons choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne grâce à un script bash, avec apache et flask.&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner une application &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Cette application converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Cette application python utilise plusieurs bibliothèques : &lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
&lt;br /&gt;
[https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
&lt;br /&gt;
[https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, qui contrôle nôtre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs librairies : &lt;br /&gt;
&lt;br /&gt;
[https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
&lt;br /&gt;
[https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
&lt;br /&gt;
[https://docs.arduino.cc/libraries/wifi/ WiFi] : Wifi.&lt;br /&gt;
&lt;br /&gt;
[https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
&lt;br /&gt;
[https://docs.arduino.cc/libraries/adafruit-gfx-library/ Adafruit] : Libraire graphique pour l'affichage.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ZinggJM/GxEPD2 GXedp2] : Permet de dessiner sur notre écran e-ink.&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur.&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|500px|right]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34146</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34146"/>
				<updated>2025-05-13T11:41:25Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Raspberry pi */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* [https://www.kubii.com/fr/cartes-nano-ordinateurs/2076-raspberry-pi-zero-wh-kubii-3272496009394.html Raspberry Pi Zero WH] + Câble d'alimentation&lt;br /&gt;
* [https://letmeknow.fr/fr/cartes-compatibles/1620-carte-de-developement-esp32-wroom-652733472090.html ESP32] + Câble d'alimentation&lt;br /&gt;
* [https://wiki.dfrobot.com/ESP32_E_ink_Screen_4.7inch_SKU_DFR0835 E ink Screen 4.7inch SKU DFR0835]&lt;br /&gt;
* Boite : PLA, bois et vis&lt;br /&gt;
* 1 Petite breadboard&lt;br /&gt;
* 8 Câbles dupont M-F&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
Premier rendez-vous avec le client, prise d'infos et réalisation d'un cahier des charges.&lt;br /&gt;
&lt;br /&gt;
Beaucoup de R&amp;amp;D.&lt;br /&gt;
&lt;br /&gt;
Pour plus de précision techniques, n'hésitez pas à allez voir notre [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Le code ===&lt;br /&gt;
&lt;br /&gt;
==== Raspberry pi ====&lt;br /&gt;
&lt;br /&gt;
Il s'agit d'un nano-ordinateur Raspberry PI Zero 2 WH qui nous sert de serveur. Ce choix à été fait car la puissance de calcul et la mémoire RAM de l'esp32 était trop faible, nous avons donc décidé de réaliser le [https://parseur.com/fr/blog/parsing-de-donnees parsing] sur notre serveur. Nous avon choisi ce model de Raspberry car il possède un module Wifi et ne coûte pas trop cher. &lt;br /&gt;
&lt;br /&gt;
Notre serveur tourne grâce à un script bash, avec apache et flask.&lt;br /&gt;
&lt;br /&gt;
Sur ce raspberry, nous faisons tourner un script &amp;lt;b&amp;gt;python&amp;lt;/b&amp;gt; qui nous permet de récupérer (Parser) les informations provenant de la page web des réservations des salles CARAE à l'IMT. Ce Script converti les données bruts tirés de la page html en fichier JSON contenant la salle, l'heure et le nom des réservations.&lt;br /&gt;
(Exemple de fichier JSON : {salle : D02-121A [{heure : 10:00 à 11:00}{nom: Thierry Margoulin}]&lt;br /&gt;
&lt;br /&gt;
Ce script python utilise plusieurs librairies : &lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/requests/ requests] : Requêtes Http. &lt;br /&gt;
&lt;br /&gt;
[https://docs.python.org/3/library/re.html re ] : Expression régulière. &lt;br /&gt;
&lt;br /&gt;
[https://docs.python.org/fr/3/library/json.html json ] : Json. &lt;br /&gt;
&lt;br /&gt;
[https://pypi.org/project/beautifulsoup4/ beautifulsoup] : Parsing.&lt;br /&gt;
&lt;br /&gt;
==== ESP32 ====&lt;br /&gt;
Notre micro-controlleur, lui aussi équipé de la wifi, qui contrôle nôtre écran e-ink. Il reçoit les JSON de la Raspberry Pi et extrait les données pour les afficher sur notre écran E-Ink.&lt;br /&gt;
&lt;br /&gt;
Notre code est construit grâce à l'import de plusieurs librairies : &lt;br /&gt;
&lt;br /&gt;
[https://arduinojson.org/ ArduinoJson] : Permet à notre code Arduino de comprendre et de deserialiser (Découper) les données Jsons reçues.&lt;br /&gt;
&lt;br /&gt;
[https://docs.arduino.cc/language-reference/en/functions/communication/wire/ Wire] : Permet la communication.&lt;br /&gt;
&lt;br /&gt;
[https://docs.arduino.cc/libraries/wifi/ WiFi] : Wifi.&lt;br /&gt;
&lt;br /&gt;
[https://docs.arduino.cc/libraries/httpclient/ HTTPClient] : Permet les requêtes http.&lt;br /&gt;
&lt;br /&gt;
[https://docs.arduino.cc/libraries/adafruit-gfx-library/ Adafruit] : Libraire graphique pour l'affichage.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ZinggJM/GxEPD2 GXedp2] : Permet de dessiner sur notre écran e-ink.&lt;br /&gt;
&lt;br /&gt;
=== La boîte ===&lt;br /&gt;
&lt;br /&gt;
Après une ébauche faite sur [https://www.tinkercad.com/ Tinkercad]&lt;br /&gt;
Premier prototypage fait avec du carton. N'ayant pas encore reçu l'écran, nôtre affichage est fait avec un écran led de 16 colonnes et 2 lignes.&lt;br /&gt;
&lt;br /&gt;
Les découpes de cartons ont été faites grâce à une [https://wiki.lesfabriquesduponant.net/index.php?title=Trotec_Speedy_100R,_Laser découpeuse laser]&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur.&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Le nom de la class HTML des information qui nous intéresse est : Typex (le x est un variable correspondant à une lettre de l'alphabet)&lt;br /&gt;
*Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? Recherche des éléments 0,1,2,3 de l'array (tableau) MAIS il y a des balises &amp;lt;br&amp;gt; dans l'html qui compte pour un élément.&lt;br /&gt;
Pour trouver les données qu'il nous faut, il suffit de rechercher les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
* Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
[[Fichier:TN6 CARAE shema technique Excalidraw.jpg|500px|right]]&lt;br /&gt;
[[Fichier:TN6 CARAE shema boite Tinkercad.stl]]&lt;br /&gt;
&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34101</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34101"/>
				<updated>2025-05-12T12:00:18Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* Raspberry Pi Zero 2&lt;br /&gt;
* ESP32 E ink Screen 4.7inch SKU DFR0835&lt;br /&gt;
* Boite : PLA et vis&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur.&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
Afin d'éviter les problèmes d'incompatibilité dûs aux versions des logiciels veillez à vous mettre d'accord en amont. Le raspberry étant sous raspbian (dérivé de debian) la mise à jour des paquets évolue relativement lentement comparée à des distributions axées pour le developement (Par ex : Fedora)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? J'avais fait mon array avec 0,1,2,3, il y a des balises &amp;lt;br&amp;gt; dans l'html, du coup il fallait selectionner les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
todo : mettre une image/images du dispositif &amp;lt;br&amp;gt;&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
todo : mettre schema technique branchement &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34100</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34100"/>
				<updated>2025-05-12T11:52:09Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Physique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* Raspberry Pi Zero 2&lt;br /&gt;
* ESP32 E ink Screen 4.7inch SKU DFR0835&lt;br /&gt;
* Boite : PLA et vis&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
&amp;lt;font color=&amp;quot;#e31419&amp;quot;&amp;gt;Attention&amp;lt;/font&amp;gt; sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur.&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? J'avais fait mon array avec 0,1,2,3, il y a des balises &amp;lt;br&amp;gt; dans l'html, du coup il fallait selectionner les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
todo : mettre une image/images du dispositif &amp;lt;br&amp;gt;&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
todo : mettre schema technique branchement &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34099</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34099"/>
				<updated>2025-05-12T11:36:06Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* Raspberry Pi Zero 2&lt;br /&gt;
* ESP32 E ink Screen 4.7inch SKU DFR0835&lt;br /&gt;
* Boite : PLA et vis&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
Attention sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur.&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? J'avais fait mon array avec 0,1,2,3, il y a des balises &amp;lt;br&amp;gt; dans l'html, du coup il fallait selectionner les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
todo : mettre une image/images du dispositif &amp;lt;br&amp;gt;&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
todo : mettre schema technique branchement &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34098</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34098"/>
				<updated>2025-05-12T10:25:44Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Physique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* Raspberry Pi Zero 2&lt;br /&gt;
* ESP32 E ink Screen 4.7inch SKU DFR0835&lt;br /&gt;
* Boite : PLA et vis&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
Attention sur le Raspberry Pi zero 2 l'appareil ne boot pas si il est branché en usb sur un PC. Veillez à l'alimenter (sur le bon port 5v) via une prise secteur.&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
&lt;br /&gt;
Raspberry PI : aucun soucis, (Cf Etienne : &amp;quot;Je suis trop fort&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Astuce : ne pas chercher le&amp;quot;typeG&amp;quot;, mais passer par regex pour chercher \btype.\ (le . permet de rechercher n'importe quel caractère)&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? J'avais fait mon array avec 0,1,2,3, il y a des balises &amp;lt;br&amp;gt; dans l'html, du coup il fallait selectionner les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
==== Esp 32 ====&lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
todo : mettre une image/images du dispositif &amp;lt;br&amp;gt;&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
todo : mettre schema technique branchement &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34094</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34094"/>
				<updated>2025-05-12T10:15:19Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Visuel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* Raspberry Pi Zero 2&lt;br /&gt;
* ESP32 E ink Screen 4.7inch SKU DFR0835&lt;br /&gt;
* Boite : PLA et vis&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
&lt;br /&gt;
Raspberry PI : &lt;br /&gt;
&lt;br /&gt;
==== Bash ====&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
* Soucis de conversion en js pourquoi ? J'avais fait mon array avec 0,1,2,3, il y a des balises &amp;lt;br&amp;gt; dans l'html, du coup il fallait selectionner les éléments 0,2,4,6.&lt;br /&gt;
&lt;br /&gt;
Esp 32 : &lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
TODO : se mettre d'accord pour une nomenclature des noms de fichier (ex : TN6_CARAE_shema_boite_01.png )&lt;br /&gt;
todo : mettre une image/images du dispositif &amp;lt;br&amp;gt;&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
todo : mettre schema technique branchement &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34090</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34090"/>
				<updated>2025-05-12T10:10:55Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Etapes de réalisations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* Raspberry Pi Zero 2&lt;br /&gt;
* ESP32 E ink Screen 4.7inch SKU DFR0835&lt;br /&gt;
* Boite : PLA et vis&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Étapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
&lt;br /&gt;
Raspberry PI : &lt;br /&gt;
&lt;br /&gt;
Esp 32 : &lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
todo : mettre une image/images format web du dispositif &amp;lt;br&amp;gt;&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
todo : mettre schema technique branchement &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34089</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34089"/>
				<updated>2025-05-12T10:10:04Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Source */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* Raspberry Pi Zero 2&lt;br /&gt;
* ESP32 E ink Screen 4.7inch SKU DFR0835&lt;br /&gt;
* Boite : PLA et vis&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Etapes de réalisations ==&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
&lt;br /&gt;
Raspberry PI : &lt;br /&gt;
&lt;br /&gt;
Esp 32 : &lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
todo : mettre une image/images format web du dispositif &amp;lt;br&amp;gt;&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
todo : mettre schema technique branchement &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Catégorie==&lt;br /&gt;
[[Catégorie:Arduino]]&lt;br /&gt;
[[Catégorie:Conception 3D]]&lt;br /&gt;
[[Catégorie:ESP32]]&lt;br /&gt;
[[Catégorie:Fabrication]]&lt;br /&gt;
[[Catégorie:Raspberry Pi]]‏‎ &lt;br /&gt;
[[Catégorie:Tn6]]&lt;br /&gt;
[[Catégorie:Tutoriel]]&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34087</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34087"/>
				<updated>2025-05-12T10:01:10Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Langages utilisés : &lt;br /&gt;
* Arduino&lt;br /&gt;
* Bash&lt;br /&gt;
* Python&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* Raspberry Pi Zero 2&lt;br /&gt;
* ESP32 E ink Screen 4.7inch SKU DFR0835&lt;br /&gt;
* Boite : PLA et vis&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
&lt;br /&gt;
Raspberry PI : &lt;br /&gt;
&lt;br /&gt;
Esp 32 : &lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
todo : mettre une image/images format web du dispositif &amp;lt;br&amp;gt;&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
todo : mettre schema technique branchement &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34084</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34084"/>
				<updated>2025-05-12T09:50:56Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Déployement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
&lt;br /&gt;
Raspberry PI : &lt;br /&gt;
&lt;br /&gt;
Esp 32 : &lt;br /&gt;
* Soucis d'import du code de Arduino IDE vers l'esp 32 : &lt;br /&gt;
Télécharger le driver de l'ESP32 en DEV mode&lt;br /&gt;
Impossible d'importer le code -&amp;gt; L'esp32 n'est pas en mode téléchargement. Solution : Appuyer physiquement sur le bouton boot de l'esp32 pendant l'upload du code&lt;br /&gt;
&lt;br /&gt;
* Compilation du code très long : hardware personnel vetuste -&amp;gt; temps de compilation très long&lt;br /&gt;
* Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le RaspberryPI (Server side)&lt;br /&gt;
&lt;br /&gt;
* Interprétation des données reçues sur l'esp : ça marche pas. Solution :&lt;br /&gt;
  .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* soucis pour récupérer les infos dans un nested array (3eme niveau) solution : &lt;br /&gt;
      for (int i = 0; i &amp;lt;= 3; i++) {&lt;br /&gt;
        String reservation = doc[&amp;quot;reservations&amp;quot;][i].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String heure = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;heure&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        String nom = doc[&amp;quot;reservations&amp;quot;][i][&amp;quot;nom&amp;quot;].as&amp;lt;String&amp;gt;();&lt;br /&gt;
        if (reservation == &amp;quot;null&amp;quot;) break;&lt;br /&gt;
        &lt;br /&gt;
* i = on augmente de manière incrémentale pour chercher chaque &amp;quot;réservations&amp;quot;, on va chercher l'élément dans le 3eme niveau de l'objet json.&lt;br /&gt;
  [&amp;quot;reservations&amp;quot;](niveau 1)[i](niveau 2)[&amp;quot;heure&amp;quot;](niveau3)&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* Raspberry Pi Zero 2&lt;br /&gt;
* ESP32 E ink Screen 4.7inch SKU DFR0835&lt;br /&gt;
* Boite : PLA et vis&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
Le raspberry contient un serveur web (apache) et une application python communiquant via [https://fr.wikipedia.org/wiki/Web_Server_Gateway_Interface WSGI].&amp;lt;br&amp;gt;&lt;br /&gt;
L'ESP32 en tant que client demande (requête http)  les éléments à afficher (au format JSON) au serveur. Il se charge ensuite de les afficher sur l'écran e-ink. Le tout en language Arduino.&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
todo : mettre une image/images format web du dispositif &amp;lt;br&amp;gt;&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
todo : mettre schema technique branchement &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34072</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34072"/>
				<updated>2025-05-12T09:36:47Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Contraintes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
** Status libre/occupée&lt;br /&gt;
** Date&lt;br /&gt;
** Horaires&lt;br /&gt;
** Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
** mise à jour &lt;br /&gt;
** anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
&lt;br /&gt;
Raspberry PI : &lt;br /&gt;
&lt;br /&gt;
Esp 32 : Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le Raspberry&lt;br /&gt;
&lt;br /&gt;
* interprétation des données reçues sur l'esp : ça marche pas. Pourquoi? Soucis de récupération des infos : solution -&amp;gt; .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* Raspberry Pi Zero 2&lt;br /&gt;
* ESP32 E ink Screen 4.7inch SKU DFR0835&lt;br /&gt;
* Boite : PLA et vis&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
todo : mettre une image/images format web du dispositif &amp;lt;br&amp;gt;&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
todo : mettre schema technique branchement &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34071</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34071"/>
				<updated>2025-05-12T09:36:12Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Contraintes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
* Faible consommation électrique&lt;br /&gt;
* Lisibilité des informations : &lt;br /&gt;
  * Status libre/occupée&lt;br /&gt;
  * Date&lt;br /&gt;
  * Horaires&lt;br /&gt;
  * Nom de la personne ayant réservée&lt;br /&gt;
* Sécurité du dispositif&lt;br /&gt;
  * mise à jour &lt;br /&gt;
  * anti-vol (accroché au mur)&lt;br /&gt;
* Solidité&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
=== Physique ===&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
=== Code ===&lt;br /&gt;
&lt;br /&gt;
Raspberry PI : &lt;br /&gt;
&lt;br /&gt;
Esp 32 : Mémoire limitéd (512ko) -&amp;gt; on déporte un maximum de calculs sur le Raspberry&lt;br /&gt;
&lt;br /&gt;
* interprétation des données reçues sur l'esp : ça marche pas. Pourquoi? Soucis de récupération des infos : solution -&amp;gt; .as&amp;lt;String&amp;gt; (dans le code arduino) sinon soucis de format (String salle = doc[&amp;quot;salle&amp;quot;][&amp;quot;numero&amp;quot;].as&amp;lt;String&amp;gt;();)&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* Raspberry Pi Zero 2&lt;br /&gt;
* ESP32 E ink Screen 4.7inch SKU DFR0835&lt;br /&gt;
* Boite : PLA et vis&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
todo : mettre une image/images format web du dispositif &amp;lt;br&amp;gt;&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
todo : mettre schema technique branchement &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34067</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34067"/>
				<updated>2025-05-12T09:29:45Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Matériel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
mettre cahier des charges&lt;br /&gt;
public :&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* Raspberry Pi Zero 2&lt;br /&gt;
* ESP32 E ink Screen 4.7inch SKU DFR0835&lt;br /&gt;
* Boite : PLA et vis&lt;br /&gt;
&lt;br /&gt;
Budget ≈ 250€&lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
todo : mettre une image/images format web du dispositif &amp;lt;br&amp;gt;&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
todo : mettre schema technique branchement &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34062</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34062"/>
				<updated>2025-05-12T09:26:47Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Visuel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
mettre cahier des charges&lt;br /&gt;
public :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Sécurité physique de la boîte :     &lt;br /&gt;
* anti vol : accroché au mur&lt;br /&gt;
* anti intrusion : port micro usb inaccessibles ( voir modèle boite ) &lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* Raspberry Pi Zero 2&lt;br /&gt;
* ESP32 E ink Screen 4.7inch SKU DFR0835&lt;br /&gt;
* Boite : PLA et vis &lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
todo : mettre une image/images format web du dispositif &amp;lt;br&amp;gt;&lt;br /&gt;
todo : mettre schema boite &amp;lt;br&amp;gt;&lt;br /&gt;
todo : mettre schema technique branchement &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34061</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34061"/>
				<updated>2025-05-12T09:26:21Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Visuel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
mettre cahier des charges&lt;br /&gt;
public :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Sécurité physique de la boîte :     &lt;br /&gt;
* anti vol : accroché au mur&lt;br /&gt;
* anti intrusion : port micro usb inaccessibles ( voir modèle boite ) &lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* Raspberry Pi Zero 2&lt;br /&gt;
* ESP32 E ink Screen 4.7inch SKU DFR0835&lt;br /&gt;
* Boite : PLA et vis &lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
todo : mettre une image/images format web du dispositif&lt;br /&gt;
todo : mettre schema boite&lt;br /&gt;
todo : mettre schema technique branchement&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34060</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34060"/>
				<updated>2025-05-12T09:24:26Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Contraintes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
mettre cahier des charges&lt;br /&gt;
public :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
Sécurité physique de la boîte :     &lt;br /&gt;
* anti vol : accroché au mur&lt;br /&gt;
* anti intrusion : port micro usb inaccessibles ( voir modèle boite ) &lt;br /&gt;
&lt;br /&gt;
Delai de livraison : Ecran E-ink 10 jours&lt;br /&gt;
&lt;br /&gt;
== Problèmes rencontrés ==&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* Raspberry Pi Zero 2&lt;br /&gt;
* ESP32 E ink Screen 4.7inch SKU DFR0835&lt;br /&gt;
* Boite : PLA et vis &lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
todo : mettre une image/images format web du dispositif&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34057</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34057"/>
				<updated>2025-05-12T09:22:40Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Déployement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
mettre cahier des charges&lt;br /&gt;
public :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* Raspberry Pi Zero 2&lt;br /&gt;
* ESP32 E ink Screen 4.7inch SKU DFR0835&lt;br /&gt;
* Boite : PLA et vis &lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== Visuel ==&lt;br /&gt;
todo : mettre une image/images format web du dispositif&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34056</id>
		<title>Système d'affichage dynamique</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Syst%C3%A8me_d%27affichage_dynamique&amp;diff=34056"/>
				<updated>2025-05-12T09:21:34Z</updated>
		
		<summary type="html">&lt;p&gt;Etienne : /* Source */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
Dans le cadre du tremplin numérique n°6 nous réalisons un projet professionnel du 22/04/2025 au 28/05/2025. Celui-ci est issu d'un appel à projet lancé par l'association les Petits Débrouillards Grand Ouest (antenne de Brest) aux entreprises locales (plus ou moins) afin que nous (les stagiaires) répondions au mieux aux besoins exprimés.&amp;lt;br&amp;gt;&lt;br /&gt;
La commande consiste à fournir un moniteur d'affichage du planning des salles de travail du CARAE afin de savoir rapidement si celles-ci sont réservées ou libres.Le moniteur sera dans un boîtier fixé au mur dans le couloir du [https://www.imt-atlantique.fr/fr/formation/dynamique-pedagogique/carae CARAE].&lt;br /&gt;
&lt;br /&gt;
== Contraintes ==&lt;br /&gt;
mettre cahier des charges&lt;br /&gt;
public :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problèmes d'alimentations : Prix de la pose de prise de courant à l'IMT&lt;br /&gt;
&lt;br /&gt;
Problèmes d'accès internet : Prix de la pose d'un câble RJ45 POE, problème de sécurité si Wifi&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
* Raspberry Pi Zero 2&lt;br /&gt;
* ESP32 E ink Screen 4.7inch SKU DFR0835&lt;br /&gt;
* Boite : PLA et vis &lt;br /&gt;
&lt;br /&gt;
== Déployement ==&lt;br /&gt;
&lt;br /&gt;
=== Serveur : raspberry pi ===&lt;br /&gt;
&lt;br /&gt;
==== Configuration Raspberry ====&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
==== Python ====&lt;br /&gt;
&lt;br /&gt;
todo : fichier à telecharger sur le wiki&lt;br /&gt;
&lt;br /&gt;
=== Client : ESP32 ===&lt;br /&gt;
&lt;br /&gt;
==== Programation ====&lt;br /&gt;
&lt;br /&gt;
==== Affichage E-INK ====&lt;br /&gt;
&lt;br /&gt;
== License ==&lt;br /&gt;
Ce projet est sous license [https://www.gnu.org/licenses/gpl-3.0.txt GNU GPL v3].&lt;br /&gt;
&lt;br /&gt;
==Auteurs==&lt;br /&gt;
- Corto 🍓 &amp;lt;br&amp;gt;&lt;br /&gt;
- Etienne 🐧 &amp;lt;br&amp;gt;&lt;br /&gt;
- Jean-Jacques ⭐&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source ==&lt;br /&gt;
&lt;br /&gt;
* [https://gitlab.imt-atlantique.fr/tn6_c_e_jj/carae_systeme_affichage_dynamique Gitlab] &amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Etienne</name></author>	</entry>

	</feed>