<?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=Julienrat</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=Julienrat"/>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=Sp%C3%A9cial:Contributions/Julienrat"/>
		<updated>2026-05-15T10:49:09Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=POCL_:_Poke&amp;diff=28137</id>
		<title>POCL : Poke</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=POCL_:_Poke&amp;diff=28137"/>
				<updated>2024-11-14T14:50:11Z</updated>
		
		<summary type="html">&lt;p&gt;Julienrat : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Résumé du Projet==&lt;br /&gt;
Le POCL: Poke est un POCL communautaire interactif. Sa fonction est d'envoyer et recevoir un message, nommé &amp;quot;pokou&amp;quot; vers ou provenant des autres POCL: Poke.&lt;br /&gt;
&lt;br /&gt;
Le projet a été réalisé par Alma, Wing-Anh, Tony, Antony, Gaelle&lt;br /&gt;
&lt;br /&gt;
Il envoie un message à la communauté de ses homomorphes, qui réagissent par une ou des actions perceptibles par leurs possesseurs (signal lumineux, vibration etc...)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:POCL-equipe-poke.JPG|400px]] [[Fichier:POCL-equipe-poke2.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
==Prototype réalisés ==&lt;br /&gt;
4 prototypes différents ont été réalisés, chacun apportant une évolution/modification supplémentaire.&lt;br /&gt;
* Le premier prototype est fait, en plus de l'électronique, de carton et de papier.&lt;br /&gt;
* Le deuxième prototype consiste en du bois découpé au laser pour remplacer le carton et mieux emprisonner le papier. Cette deuxième génération donnera la forme générale quasiment finale.&lt;br /&gt;
* Le troisième prototype a intégré un bouton dans la structure d'un couvercle pour pouvoir interagir réellement avec les autres POCL.&lt;br /&gt;
* Le quatrième et dernier prototype s'est vu octroyer trois boutons supplémentaires pour pouvoir envoyer plus de &amp;quot;pokous&amp;quot;, ainsi que d'un &amp;quot;maintien d'élégance&amp;quot; pour permettre aux fils d'en sortir sans détériorer le papier sur la durée.&lt;br /&gt;
==Fabrication d'un POCL: Poke==&lt;br /&gt;
La construction d'un POCL: Poke se fera sur la base du prototype le plus à jour, c'est-à-dire le quatrième.&amp;lt;br&amp;gt;&lt;br /&gt;
Attention, les photos du montage proviennent des deuxième et troisième prototypes&lt;br /&gt;
===Proto===&lt;br /&gt;
[[Fichier:POCL-Prototype-poke.JPG|400px]] [[Fichier:POCL-PrototypePoke2.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Y'a un truc à voir ici : https://www.youtube.com/watch?v=0ZCrEbmvCAQ&lt;br /&gt;
===Matériel===&lt;br /&gt;
* 1 D1 Mini&lt;br /&gt;
* 1 Ruban de LED ou autre objet au choix permettant un stimulus sensoriel pour l'utilisateur&lt;br /&gt;
* 1 Bouton poussoir (4 s'il est prévu d'augmenter la capacité de pokous)&lt;br /&gt;
* Fils conducteurs&lt;br /&gt;
* Découpeuse laser&lt;br /&gt;
* Planches de bois de 5mm d'épaisseur (ou carton facile à découper)&lt;br /&gt;
* Papier fin (des feuilles A4 font parfaitement l'affaire)&lt;br /&gt;
* Colle à bois (optionnel)&lt;br /&gt;
* Connexion internet&lt;br /&gt;
* Ciseaux&lt;br /&gt;
===Découpe du bois===&lt;br /&gt;
Découper le bois à la découpeuse laser&lt;br /&gt;
==Schémas==&lt;br /&gt;
[[Media:Pock PDFMontage.pdf|Télécharger la notice de montage]]&lt;br /&gt;
&lt;br /&gt;
[[Media:Pock-Elv5-decoupelaser.pdf|Télécharger le fichier pour la découpe laser]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pock-Elv5Imagedecoupelaser.png|800px|link=https://www.wiki.lesfabriquesduponant.net/images/5/56/Pock-Elv5-decoupelaser.pdf]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pock model 0.png|400px]] [[Fichier:Pock model 1.png|400px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pock model 2.png|400px]] [[Fichier:Pock model 3.png|400px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pock model 4.png|400px]] [[Fichier:Pock model 5.png|400px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pock model 6.png|400px]] [[Fichier:Pock model 7.png|400px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pock model 8.png|400px]]&lt;br /&gt;
&lt;br /&gt;
===Découpe papier===&lt;br /&gt;
Découper le papier en une bande large de 6 cm et longue de 28 cm (27.4 cm pour une feuille A4) &lt;br /&gt;
====Prélude====&lt;br /&gt;
La boîte est un cylindre dont le matériau laisse passer la lumière de façon diffuse comme le papier.&lt;br /&gt;
&lt;br /&gt;
Les extrémités du cylindre sont faites de bois découpé au laser afin de renforcer la structure. Le carton peut le remplacer si besoin.&lt;br /&gt;
&lt;br /&gt;
Pour une meilleure apparence finale, les gravures des pièces doivent être orientées vers l'extérieur de l'objet.&lt;br /&gt;
&lt;br /&gt;
====Étape 1====&lt;br /&gt;
Prendre l'anneau troué, et enfoncer dedans les piliers dédiés, le côté épais orienté vers l'intérieur de la pièce&lt;br /&gt;
&lt;br /&gt;
(Photo)&lt;br /&gt;
&lt;br /&gt;
====Étape 2====&lt;br /&gt;
Enrouler la bande de papier autour de l'ossature précédemment créée.&lt;br /&gt;
&lt;br /&gt;
Un chevauchement des deux bouts est attendu, et utile pour la suite&lt;br /&gt;
&lt;br /&gt;
(Photo)&lt;br /&gt;
====Étape 3====&lt;br /&gt;
Insérer les deux anneaux de renforts (les plus grands et fins) autour du papier afin de le pincer avec l'ossature. Les garder à un tiers de la distance de chaque bord pour l'instant.&lt;br /&gt;
&lt;br /&gt;
(Photo)&lt;br /&gt;
====Étape 4====&lt;br /&gt;
Insérer le disque troué sur les piliers pour entièrement bloquer le papier et fermer le cylindre d'un côté.&lt;br /&gt;
&lt;br /&gt;
Il s'agit de l'étape la plus délicate du montage, prendre son temps et y aller par petits pas est vivement recommandé.&lt;br /&gt;
&lt;br /&gt;
Note: la photo montre un anneau troué, mais la pièce est bien pleine dans le plan.&lt;br /&gt;
&lt;br /&gt;
Note: Il est conseillé pour des raisons de simplification de la tâche d'insérer préalablement les boutons poussoir dans les 4 trous centraux et de les raccorder à des fils pour faciliter les connexions futures.&lt;br /&gt;
&lt;br /&gt;
(Photo)&lt;br /&gt;
&lt;br /&gt;
====test du montage du POCL====&lt;br /&gt;
début 16h50&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Électronique====&lt;br /&gt;
[[Fichier:POCL-Poke-etape2.JPG|400px]] [[Fichier:POCL-Poke-etape3.JPG|400px]] [[Fichier:POCL-Poke-etape.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
====MQTT====&lt;br /&gt;
L'interaction entre les POCL passe par un serveur MQTT (Message Queuing Telemetry Transport)&lt;br /&gt;
* voir [[MQTT]]&lt;br /&gt;
&lt;br /&gt;
Ce serveur est basé sur le broker libre [https://mosquitto.org/ Mosquitto].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Le Broker MQTT Shiftr.io (obsolète)=====&lt;br /&gt;
 Devant les limitation de la démo de ce broker, nous avons monté notre propre server MQTT&lt;br /&gt;
* Service proposé par https://cloud.shiftr.io/welcome&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aller sur cette page pour trouver le bouton permettant d'envoyer des pokous (en phase de test, ne laissez pas trop vos POCL branchés, à cause de la liitation du sevreur Shifter.io) :&lt;br /&gt;
&lt;br /&gt;
===Arduino===&lt;br /&gt;
Le code Arduino présenté correspond à celui du quatrième modèle&lt;br /&gt;
* Il faut installer le [https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino gestionnaire de carte ESP8266 pour piloter le D1 mini]&lt;br /&gt;
* Il faut installer la bibliothèque MQTT de Joël Gähwiler (voir image plus bas)&lt;br /&gt;
* bibliothèque Adafruit Néopixel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BibliothequeMQTTPOCL.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot; line&amp;gt;&lt;br /&gt;
/////////////////////////&lt;br /&gt;
//      POCL Poke      //&lt;br /&gt;
/////////////////////////&lt;br /&gt;
/*&lt;br /&gt;
 * Un POCL imaginé et réalisé au Hackathon POCL à l'édulab Rennes 2 les 9 et 10 décembre 2021.&lt;br /&gt;
 * &lt;br /&gt;
 * Difficultés :&lt;br /&gt;
 * Configurez le logiciel Arduino pour gérer la carte D1 mini (ESP8266).&lt;br /&gt;
 * Intégrer les biobliothèues requises par le projet :&lt;br /&gt;
 ** #include &amp;lt;MQTT.h&amp;gt; -&amp;gt; pour gérer le protocole de communication c'est la bibliothèque MQTT de Joël Gähwiler : https://github.com/256dpi/arduino-mqtt&lt;br /&gt;
 ** #include &amp;lt;Adafruit_NeoPixel.h&amp;gt; -&amp;gt; pour gérer les rubans de led&lt;br /&gt;
 * &lt;br /&gt;
 *                                      BROCHAGE                            &lt;br /&gt;
                                _________________                        &lt;br /&gt;
                               /     D1 mini     \                       &lt;br /&gt;
                           -  |[ ]RST        TX[ ]| -                    &lt;br /&gt;
                           -  |[ ]A0  -GPIO  RX[ ]| -                    &lt;br /&gt;
                              |[ ]D0-16    5-D1[ ]| -                    &lt;br /&gt;
                              |[ ]D5-14    4-D2[ ]| -                    &lt;br /&gt;
                    Bouton -  |[X]D6-12    0-D3[X]| - ruban de leds             &lt;br /&gt;
                           -  |[ ]D7-13    2-D4[ ]| LED_BUILTIN          &lt;br /&gt;
                           -  |[ ]D8-15     GND[X]| - GND (Boutons, ruban de leds)             &lt;br /&gt;
                           -  |[ ]3V3 .      5V[X]| - ruban de Led        &lt;br /&gt;
                              |       +---+       |                     &lt;br /&gt;
                              |_______|USB|_______|                      &lt;br /&gt;
&lt;br /&gt;
Matériel :&lt;br /&gt;
- des fils dupont.&lt;br /&gt;
- un ruban de led RGB WS28B12&lt;br /&gt;
- D1 mini (Wemos, LOLIN,...)&lt;br /&gt;
- bouton poussoir&lt;br /&gt;
- une alimentation 5V&lt;br /&gt;
*/&lt;br /&gt;
/*&lt;br /&gt;
 * Un travail d'équipe de :&lt;br /&gt;
 * Alma Oskouei&lt;br /&gt;
 * Gaëlle Bescond&lt;br /&gt;
 * Tony Vanpoucke&lt;br /&gt;
 * Wing-Anh Luy&lt;br /&gt;
 * Antony Le Goïc-Auffret&lt;br /&gt;
   ___&lt;br /&gt;
 / ___ \&lt;br /&gt;
|_|   | |&lt;br /&gt;
     /_/ &lt;br /&gt;
     _   ___   _ &lt;br /&gt;
    |_| |___|_| |_&lt;br /&gt;
         ___|_   _|&lt;br /&gt;
        |___| |_|&lt;br /&gt;
Les petits Débrouillards - décembre 2021 CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/&lt;br /&gt;
// Programme inspiré de celui par Joël Gähwiler&lt;br /&gt;
// https://github.com/256dpi/arduino-mqtt&lt;br /&gt;
*/&lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;MQTT.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
const char ssid[] = &amp;quot;LeNomDeVotreReseauWifi&amp;quot;;&lt;br /&gt;
const char pass[] = &amp;quot;LeCodeDeVotreWifi&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
WiFiClient net;&lt;br /&gt;
MQTTClient client;&lt;br /&gt;
#define BROKER_IP &amp;quot;debrouillards.ddns.net&amp;quot; //IP du serveur sur lequel est installé le Broker MQTT&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
&lt;br /&gt;
//=============élément pour le ruban de led et le bouton===============&lt;br /&gt;
&lt;br /&gt;
// Broche de connexion du ruban de LED&lt;br /&gt;
#define PIN D3 // &lt;br /&gt;
&lt;br /&gt;
int brocheBouton = 12; //GPIO de la broche D6&lt;br /&gt;
&lt;br /&gt;
// Nombre de Led RDGB dans votre ruban&lt;br /&gt;
#define NUMPIXELS 13 &lt;br /&gt;
&lt;br /&gt;
// on configurer un riban nommé &amp;quot;pixels&amp;quot;&lt;br /&gt;
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);&lt;br /&gt;
&lt;br /&gt;
#define T 1 // temps pour gérer le fade du ruban&lt;br /&gt;
//==============================================================&lt;br /&gt;
&lt;br /&gt;
void connect() {&lt;br /&gt;
  Serial.print(&amp;quot;checking wifi...&amp;quot;);&lt;br /&gt;
  while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
    Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;\nconnecting...&amp;quot;);&lt;br /&gt;
  //connection au serveur MQTT : identifiant, User, mot de passe&lt;br /&gt;
  while (!client.connect(&amp;quot;LeNomDeVotrePOCL&amp;quot;, &amp;quot;poclpokou&amp;quot;, &amp;quot;pokou&amp;quot;)) {&lt;br /&gt;
    Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;\nconnected!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// on s'abonne au sujet (topic) &amp;quot;/Poke&amp;quot; &lt;br /&gt;
  client.subscribe(&amp;quot;/Poke&amp;quot;); // Attention à la casse !! La casse c'est maj ou minuscule&lt;br /&gt;
  // client.unsubscribe(&amp;quot;/Poke&amp;quot;);// Pour se désiscrire&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void messageReceived(String &amp;amp;topic, String &amp;amp;payload) {&lt;br /&gt;
  digitalWrite(LED_BUILTIN, HIGH);&lt;br /&gt;
  fade();&lt;br /&gt;
  Serial.println(&amp;quot;incoming: &amp;quot; + topic + &amp;quot; - &amp;quot; + payload);&lt;br /&gt;
  if (payload == &amp;quot;pokou&amp;quot;){&lt;br /&gt;
    Serial.println(&amp;quot;clic !&amp;quot;);&lt;br /&gt;
    digitalWrite(LED_BUILTIN, LOW);&lt;br /&gt;
    delay(100);&lt;br /&gt;
    digitalWrite(LED_BUILTIN, HIGH);&lt;br /&gt;
  }&lt;br /&gt;
  // Note: Do not use the client in the callback to publish, subscribe or&lt;br /&gt;
  // unsubscribe as it may cause deadlocks when other things arrive while&lt;br /&gt;
  // sending and receiving acknowledgments. Instead, change a global variable,&lt;br /&gt;
  // or push to a queue and handle it in the loop after calling `client.loop()`.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fade() {&lt;br /&gt;
  for (int sig=0; sig&amp;lt;3; sig++){&lt;br /&gt;
  for (int b=0; b&amp;lt;255; b++){&lt;br /&gt;
  pixels.setBrightness(b);&lt;br /&gt;
  &lt;br /&gt;
  for(int i=0; i&amp;lt;NUMPIXELS; i++) {&lt;br /&gt;
    pixels.setPixelColor(i, pixels.Color(250, 150, b));&lt;br /&gt;
  }&lt;br /&gt;
  pixels.show();   // On allume les rubans&lt;br /&gt;
  delay(T);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (int b=255; b&amp;gt;1; b--){ //boucle de gestion de la brillance&lt;br /&gt;
  pixels.setBrightness(b);&lt;br /&gt;
  &lt;br /&gt;
  // n'oubliez pas que le premier pixel porte le Numéro 0&lt;br /&gt;
  for(int i=0; i&amp;lt;NUMPIXELS; i++) { // Pour chaque pixel...&lt;br /&gt;
&lt;br /&gt;
    // pixels.Color() prends les valeurs RGB de 0,0,0 jusqu'à 255,255,255&lt;br /&gt;
    pixels.setPixelColor(i, pixels.Color(b, 50, 255));&lt;br /&gt;
  }&lt;br /&gt;
  pixels.show();   // on affiche les pixels&lt;br /&gt;
  delay(T);&lt;br /&gt;
  }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  pixels.begin(); //on initialise le ruban &amp;quot;pixels&amp;quot;&lt;br /&gt;
  pinMode(brocheBouton,INPUT_PULLUP);&lt;br /&gt;
  &lt;br /&gt;
  pinMode(LED_BUILTIN, OUTPUT);&lt;br /&gt;
  digitalWrite(LED_BUILTIN, HIGH);&lt;br /&gt;
  WiFi.begin(ssid, pass);&lt;br /&gt;
&lt;br /&gt;
  // on se connecte au client&lt;br /&gt;
  client.begin(BROKER_IP, 1883, net); // (IP, port,je ne sais pas à quoi correspond &amp;quot;net&amp;quot;)&lt;br /&gt;
  client.onMessage(messageReceived);&lt;br /&gt;
&lt;br /&gt;
  connect();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  pixels.clear(); // Set all pixel colors to 'off'&lt;br /&gt;
  pixels.show();&lt;br /&gt;
  &lt;br /&gt;
  client.loop();&lt;br /&gt;
  delay(10);  // &amp;lt;- fixes some issues with WiFi stability&lt;br /&gt;
&lt;br /&gt;
  if (!client.connected()) {&lt;br /&gt;
    connect();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // publish a message roughly every second.&lt;br /&gt;
&lt;br /&gt;
  if ( digitalRead(brocheBouton) == LOW ){&lt;br /&gt;
  Serial.println(&amp;quot;Appuis Bouton&amp;quot;); &lt;br /&gt;
  client.publish(&amp;quot;/Poke&amp;quot;, &amp;quot;pokou&amp;quot;);&lt;br /&gt;
  delay(250);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et la Version pour ESP32 !&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot; line&amp;gt;&lt;br /&gt;
/////////////////////////&lt;br /&gt;
//      POCL Poke      //&lt;br /&gt;
/////////////////////////&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Un POCL imaginé et réalisé au Hackathon POCL à l'édulab Rennes 2 les 9 et 10 décembre 2021.&lt;br /&gt;
 * &lt;br /&gt;
 * Difficultés :&lt;br /&gt;
 * Configurez le logiciel Arduino pour gérer la ESP32.&lt;br /&gt;
 * Intégrer les biobliothèues requises par le projet :&lt;br /&gt;
 ** #include &amp;lt;MQTT.h&amp;gt; -&amp;gt; pour gérer le protocole de communication c'est la bibliothèque MQTT de Joël Gähwiler : https://github.com/256dpi/arduino-mqtt&lt;br /&gt;
 ** #include &amp;lt;Adafruit_NeoPixel.h&amp;gt; -&amp;gt; pour gérer les rubans de led&lt;br /&gt;
 * &lt;br /&gt;
 *                                      BROCHAGE                            &lt;br /&gt;
                                _________________                        &lt;br /&gt;
                               /     ESP32 WROOM \                       &lt;br /&gt;
                           -  |[ ]RST        TX[ ]| -                    &lt;br /&gt;
                           -  |[ ]A0  -GPIO  RX[ ]| -                    &lt;br /&gt;
                              |[ ]   16    5   [ ]| -                    &lt;br /&gt;
                              |[ ]   14    4   [ ]| -                    &lt;br /&gt;
                    Bouton -  |[X]12       0   [X]| - ruban de leds             &lt;br /&gt;
                           -  |[ ]   13    2   [ ]| LED_BUILTIN          &lt;br /&gt;
                           -  |[ ]   15     GND[X]| - GND (Boutons, ruban de leds)             &lt;br /&gt;
                           -  |[ ]3V3 .      5V[X]| - ruban de Led        &lt;br /&gt;
                              |       +---+       |                     &lt;br /&gt;
                              |_______|USB|_______|                      &lt;br /&gt;
&lt;br /&gt;
Matériel :&lt;br /&gt;
- des fils dupont.&lt;br /&gt;
- un ruban de led RGB WS28B12&lt;br /&gt;
- D1 mini (Wemos, LOLIN,...)&lt;br /&gt;
- bouton poussoir&lt;br /&gt;
- une alimentation 5V&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 * Un travail d'équipe de :&lt;br /&gt;
 * Alma Oskouei&lt;br /&gt;
 * Gaëlle Bescond&lt;br /&gt;
 * Tony Vanpoucke&lt;br /&gt;
 * Wing-Anh Luy&lt;br /&gt;
 * Antony Le Goïc-Auffret&lt;br /&gt;
&lt;br /&gt;
   ___&lt;br /&gt;
 / ___ \&lt;br /&gt;
|_|   | |&lt;br /&gt;
     /_/ &lt;br /&gt;
     _   ___   _ &lt;br /&gt;
    |_| |___|_| |_&lt;br /&gt;
         ___|_   _|&lt;br /&gt;
        |___| |_|&lt;br /&gt;
&lt;br /&gt;
Les petits Débrouillards - décembre 2021 CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/&lt;br /&gt;
&lt;br /&gt;
// Programme inspiré de celui par Joël Gähwiler&lt;br /&gt;
&lt;br /&gt;
// Pour tester sur un PC avec mosquito d'installé (sudo apt install -y mosquitto mosquitto-clients)&lt;br /&gt;
// mosquitto_pub -h 86.223.98.89 -p 1883 -u &amp;quot;poclpokou&amp;quot; -P &amp;quot;pokou&amp;quot; -m &amp;quot;pokou&amp;quot; -t /Poke&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// https://github.com/256dpi/arduino-mqtt&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;MQTT.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
const char ssid[] = &amp;quot;SSID&amp;quot;;&lt;br /&gt;
const char pass[] = &amp;quot;Mot de passe&amp;quot;;&lt;br /&gt;
WiFiClient net;&lt;br /&gt;
MQTTClient client;&lt;br /&gt;
#define BROKER_IP &amp;quot;debrouillards.ddns.net&amp;quot;  //IP du serveur sur lequel est installé le Broker MQTT&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
&lt;br /&gt;
//=============élément pour le ruban de led et le bouton===============&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Broche de connexion du ruban de LED&lt;br /&gt;
&lt;br /&gt;
#define PIN 0  //&lt;br /&gt;
int brocheBouton = 12;  //GPIO de la broche 12&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Nombre de Led RDGB dans votre ruban&lt;br /&gt;
#define NUMPIXELS 13&lt;br /&gt;
&lt;br /&gt;
// on configurer un riban nommé &amp;quot;pixels&amp;quot;&lt;br /&gt;
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);&lt;br /&gt;
&lt;br /&gt;
#define T 1  // temps pour gérer le fade du ruban&lt;br /&gt;
//==============================================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void connect() {&lt;br /&gt;
  Serial.print(&amp;quot;checking wifi...&amp;quot;);&lt;br /&gt;
  while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
    Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;\nconnecting...&amp;quot;);&lt;br /&gt;
  //connection au serveur MQTT : identifiant, User, mot de passe&lt;br /&gt;
  while (!client.connect(&amp;quot;LeNomDeVotrePOCL&amp;quot;, &amp;quot;poclpokou&amp;quot;, &amp;quot;pokou&amp;quot;)) {&lt;br /&gt;
    Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;\nconnected!&amp;quot;);&lt;br /&gt;
  // on s'abonne au sujet (topic) &amp;quot;/Poke&amp;quot;&lt;br /&gt;
  client.subscribe(&amp;quot;/Poke&amp;quot;);  // Attention à la casse !! La casse c'est maj ou minuscule&lt;br /&gt;
  // client.unsubscribe(&amp;quot;/Poke&amp;quot;);// Pour se désiscrire&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void messageReceived(String &amp;amp;topic, String &amp;amp;payload) {&lt;br /&gt;
  digitalWrite(2, HIGH);&lt;br /&gt;
  fade();&lt;br /&gt;
  Serial.println(&amp;quot;incoming: &amp;quot; + topic + &amp;quot; - &amp;quot; + payload);&lt;br /&gt;
  if (payload == &amp;quot;pokou&amp;quot;) {&lt;br /&gt;
    Serial.println(&amp;quot;clic !&amp;quot;);&lt;br /&gt;
    digitalWrite(2, LOW);&lt;br /&gt;
    delay(100);&lt;br /&gt;
    digitalWrite(2, HIGH);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Note: Do not use the client in the callback to publish, subscribe or&lt;br /&gt;
  // unsubscribe as it may cause deadlocks when other things arrive while&lt;br /&gt;
  // sending and receiving acknowledgments. Instead, change a global variable,&lt;br /&gt;
  // or push to a queue and handle it in the loop after calling `client.loop()`.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void fade() {&lt;br /&gt;
  for (int sig = 0; sig &amp;lt; 3; sig++) {&lt;br /&gt;
    for (int b = 0; b &amp;lt; 255; b++) {&lt;br /&gt;
      pixels.setBrightness(b);&lt;br /&gt;
&lt;br /&gt;
      for (int i = 0; i &amp;lt; NUMPIXELS; i++) {&lt;br /&gt;
        pixels.setPixelColor(i, pixels.Color(250, 150, b));&lt;br /&gt;
      }&lt;br /&gt;
      pixels.show();  // On allume les rubans&lt;br /&gt;
      delay(T);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    for (int b = 255; b &amp;gt; 1; b--) {  //boucle de gestion de la brillance&lt;br /&gt;
      pixels.setBrightness(b);&lt;br /&gt;
&lt;br /&gt;
      // n'oubliez pas que le premier pixel porte le Numéro 0&lt;br /&gt;
      for (int i = 0; i &amp;lt; NUMPIXELS; i++) {  // Pour chaque pixel...&lt;br /&gt;
&lt;br /&gt;
        // pixels.Color() prends les valeurs RGB de 0,0,0 jusqu'à 255,255,255&lt;br /&gt;
        pixels.setPixelColor(i, pixels.Color(b, 50, 255));&lt;br /&gt;
      }&lt;br /&gt;
      pixels.show();  // on affiche les pixels&lt;br /&gt;
      delay(T);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  pixels.begin();  //on initialise le ruban &amp;quot;pixels&amp;quot;&lt;br /&gt;
  pinMode(brocheBouton, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  pinMode(2, OUTPUT);&lt;br /&gt;
  digitalWrite(2, HIGH);&lt;br /&gt;
&lt;br /&gt;
  WiFi.begin(ssid, pass);&lt;br /&gt;
&lt;br /&gt;
  // on se connecte au client&lt;br /&gt;
  client.begin(BROKER_IP, 1883, net);  // (IP, port,je ne sais pas à quoi correspond &amp;quot;net&amp;quot;)&lt;br /&gt;
  client.onMessage(messageReceived);&lt;br /&gt;
&lt;br /&gt;
  connect();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  pixels.clear();  // Set all pixel colors to 'off'&lt;br /&gt;
  pixels.show();&lt;br /&gt;
&lt;br /&gt;
  client.loop();&lt;br /&gt;
  delay(10);  // &amp;lt;- fixes some issues with WiFi stability&lt;br /&gt;
&lt;br /&gt;
  if (!client.connected()) {&lt;br /&gt;
    connect();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // publish a message roughly every second.&lt;br /&gt;
  if (digitalRead(brocheBouton) == LOW) {&lt;br /&gt;
    Serial.println(&amp;quot;Appuis Bouton&amp;quot;);&lt;br /&gt;
    client.publish(&amp;quot;/Poke&amp;quot;, &amp;quot;pokou&amp;quot;);&lt;br /&gt;
    delay(250);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Retours d'expérience==&lt;br /&gt;
ça marche !&lt;br /&gt;
&lt;br /&gt;
shiftr.io, le service MQTT utilisé pour le prototype a une limitation : au bout de 6 heures d'utilisations, le service s'arrête pendant 15 minute !!&lt;br /&gt;
&lt;br /&gt;
==Déjà fait==&lt;br /&gt;
* 18/12/2021 créer notre propre serveur MQTT&lt;br /&gt;
* 20/12/2021 mettre wifimanager pour gérer la configuration de connexion&lt;br /&gt;
* 21/12/2021 site web de sélection de la couleur&lt;br /&gt;
* 22/12/2021 mémorisation de la couleur sélectionnée, publication du code sur Github : https://github.com/antonydbzh/POCLpokou/blob/main/README.md&lt;br /&gt;
&lt;br /&gt;
==Piste de développement à faire pour une V2==&lt;br /&gt;
* évaluer les questions de sécurité&lt;br /&gt;
* imaginer des fonctionnalités supplémentaires (du son façon R2D2, du mouvement )&lt;br /&gt;
* un système de configuration de la couleur (via MQTT et une interface web ?)&lt;br /&gt;
&lt;br /&gt;
===Configuration via MQTT===&lt;br /&gt;
* chaque D1 mini dispose d'un identifiant unique.&lt;br /&gt;
* il est possible de créer un topic MQTT avec cet identifiant qui serait le canal de configuration.&lt;br /&gt;
* le POCL est abonné à ce topic et reçoit donc les infos de configuration qu'il peut stocker dans la mémoire.&lt;br /&gt;
* on peut créer une page web dans laquelle on renseigne l'identifiant et la couleur (ou tout autre paramètre à configurer).&lt;br /&gt;
* la page web envoie la config au topic.&lt;br /&gt;
&lt;br /&gt;
===Mieux, Configuration via la fonctionnalité &amp;quot;Point d'Accès&amp;quot;===&lt;br /&gt;
* rajouter un sélecteur (interrupteur) qui activé, met le D1 mini en mode config.&lt;br /&gt;
* une interface web qui demande la config : wifi, couleur, fonctionnalité,....&lt;br /&gt;
&lt;br /&gt;
===Question de sécurité===&lt;br /&gt;
* le système est très facilement &amp;quot;spamable&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Sources d'infos===&lt;br /&gt;
* www.martyncurrey.com/esp8266-and-C-arduino-ide-part-5-adding-wifimanager/&lt;br /&gt;
* Voir exemple de la bib WiFiManager AutoconnectwithFSparamaters&lt;br /&gt;
&lt;br /&gt;
==Usages==&lt;br /&gt;
* Mobiliser les concepts de Many-to-many au lieu de one-to-one&lt;br /&gt;
* concept de POCL communautaire&lt;br /&gt;
* Un POCL qui a des heures d'ouverture ? (8h à 20h par exemple) ?&lt;br /&gt;
* Conserver le fait d'avoir reçu un pokou ?&lt;br /&gt;
&lt;br /&gt;
==pour tester à partir d'une application==&lt;br /&gt;
l'appli multiplateforme MQTTX : https://mqttx.app/ permet de recevoir et d'envoyer des pokous&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:POCL]]&lt;br /&gt;
[[Catégorie:led]][[Catégorie:ruban de led]][[Catégorie:WS1812B]]&lt;/div&gt;</summary>
		<author><name>Julienrat</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=POCL_:_Poke&amp;diff=28136</id>
		<title>POCL : Poke</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=POCL_:_Poke&amp;diff=28136"/>
				<updated>2024-11-14T14:26:13Z</updated>
		
		<summary type="html">&lt;p&gt;Julienrat : Ajout du code pour esp32&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Résumé du Projet==&lt;br /&gt;
Le POCL: Poke est un POCL communautaire interactif. Sa fonction est d'envoyer et recevoir un message, nommé &amp;quot;pokou&amp;quot; vers ou provenant des autres POCL: Poke.&lt;br /&gt;
&lt;br /&gt;
Le projet a été réalisé par Alma, Wing-Anh, Tony, Antony, Gaelle&lt;br /&gt;
&lt;br /&gt;
Il envoie un message à la communauté de ses homomorphes, qui réagissent par une ou des actions perceptibles par leurs possesseurs (signal lumineux, vibration etc...)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:POCL-equipe-poke.JPG|400px]] [[Fichier:POCL-equipe-poke2.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
==Prototype réalisés ==&lt;br /&gt;
4 prototypes différents ont été réalisés, chacun apportant une évolution/modification supplémentaire.&lt;br /&gt;
* Le premier prototype est fait, en plus de l'électronique, de carton et de papier.&lt;br /&gt;
* Le deuxième prototype consiste en du bois découpé au laser pour remplacer le carton et mieux emprisonner le papier. Cette deuxième génération donnera la forme générale quasiment finale.&lt;br /&gt;
* Le troisième prototype a intégré un bouton dans la structure d'un couvercle pour pouvoir interagir réellement avec les autres POCL.&lt;br /&gt;
* Le quatrième et dernier prototype s'est vu octroyer trois boutons supplémentaires pour pouvoir envoyer plus de &amp;quot;pokous&amp;quot;, ainsi que d'un &amp;quot;maintien d'élégance&amp;quot; pour permettre aux fils d'en sortir sans détériorer le papier sur la durée.&lt;br /&gt;
==Fabrication d'un POCL: Poke==&lt;br /&gt;
La construction d'un POCL: Poke se fera sur la base du prototype le plus à jour, c'est-à-dire le quatrième.&amp;lt;br&amp;gt;&lt;br /&gt;
Attention, les photos du montage proviennent des deuxième et troisième prototypes&lt;br /&gt;
===Proto===&lt;br /&gt;
[[Fichier:POCL-Prototype-poke.JPG|400px]] [[Fichier:POCL-PrototypePoke2.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Y'a un truc à voir ici : https://www.youtube.com/watch?v=0ZCrEbmvCAQ&lt;br /&gt;
===Matériel===&lt;br /&gt;
* 1 D1 Mini&lt;br /&gt;
* 1 Ruban de LED ou autre objet au choix permettant un stimulus sensoriel pour l'utilisateur&lt;br /&gt;
* 1 Bouton poussoir (4 s'il est prévu d'augmenter la capacité de pokous)&lt;br /&gt;
* Fils conducteurs&lt;br /&gt;
* Découpeuse laser&lt;br /&gt;
* Planches de bois de 5mm d'épaisseur (ou carton facile à découper)&lt;br /&gt;
* Papier fin (des feuilles A4 font parfaitement l'affaire)&lt;br /&gt;
* Colle à bois (optionnel)&lt;br /&gt;
* Connexion internet&lt;br /&gt;
* Ciseaux&lt;br /&gt;
===Découpe du bois===&lt;br /&gt;
Découper le bois à la découpeuse laser&lt;br /&gt;
==Schémas==&lt;br /&gt;
[[Media:Pock PDFMontage.pdf|Télécharger la notice de montage]]&lt;br /&gt;
&lt;br /&gt;
[[Media:Pock-Elv5-decoupelaser.pdf|Télécharger le fichier pour la découpe laser]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pock-Elv5Imagedecoupelaser.png|800px|link=https://www.wiki.lesfabriquesduponant.net/images/5/56/Pock-Elv5-decoupelaser.pdf]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pock model 0.png|400px]] [[Fichier:Pock model 1.png|400px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pock model 2.png|400px]] [[Fichier:Pock model 3.png|400px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pock model 4.png|400px]] [[Fichier:Pock model 5.png|400px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pock model 6.png|400px]] [[Fichier:Pock model 7.png|400px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pock model 8.png|400px]]&lt;br /&gt;
&lt;br /&gt;
===Découpe papier===&lt;br /&gt;
Découper le papier en une bande large de 6 cm et longue de 28 cm (27.4 cm pour une feuille A4) &lt;br /&gt;
====Prélude====&lt;br /&gt;
La boîte est un cylindre dont le matériau laisse passer la lumière de façon diffuse comme le papier.&lt;br /&gt;
&lt;br /&gt;
Les extrémités du cylindre sont faites de bois découpé au laser afin de renforcer la structure. Le carton peut le remplacer si besoin.&lt;br /&gt;
&lt;br /&gt;
Pour une meilleure apparence finale, les gravures des pièces doivent être orientées vers l'extérieur de l'objet.&lt;br /&gt;
&lt;br /&gt;
====Étape 1====&lt;br /&gt;
Prendre l'anneau troué, et enfoncer dedans les piliers dédiés, le côté épais orienté vers l'intérieur de la pièce&lt;br /&gt;
&lt;br /&gt;
(Photo)&lt;br /&gt;
&lt;br /&gt;
====Étape 2====&lt;br /&gt;
Enrouler la bande de papier autour de l'ossature précédemment créée.&lt;br /&gt;
&lt;br /&gt;
Un chevauchement des deux bouts est attendu, et utile pour la suite&lt;br /&gt;
&lt;br /&gt;
(Photo)&lt;br /&gt;
====Étape 3====&lt;br /&gt;
Insérer les deux anneaux de renforts (les plus grands et fins) autour du papier afin de le pincer avec l'ossature. Les garder à un tiers de la distance de chaque bord pour l'instant.&lt;br /&gt;
&lt;br /&gt;
(Photo)&lt;br /&gt;
====Étape 4====&lt;br /&gt;
Insérer le disque troué sur les piliers pour entièrement bloquer le papier et fermer le cylindre d'un côté.&lt;br /&gt;
&lt;br /&gt;
Il s'agit de l'étape la plus délicate du montage, prendre son temps et y aller par petits pas est vivement recommandé.&lt;br /&gt;
&lt;br /&gt;
Note: la photo montre un anneau troué, mais la pièce est bien pleine dans le plan.&lt;br /&gt;
&lt;br /&gt;
Note: Il est conseillé pour des raisons de simplification de la tâche d'insérer préalablement les boutons poussoir dans les 4 trous centraux et de les raccorder à des fils pour faciliter les connexions futures.&lt;br /&gt;
&lt;br /&gt;
(Photo)&lt;br /&gt;
&lt;br /&gt;
====test du montage du POCL====&lt;br /&gt;
début 16h50&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Électronique====&lt;br /&gt;
[[Fichier:POCL-Poke-etape2.JPG|400px]] [[Fichier:POCL-Poke-etape3.JPG|400px]] [[Fichier:POCL-Poke-etape.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
====MQTT====&lt;br /&gt;
L'interaction entre les POCL passe par un serveur MQTT (Message Queuing Telemetry Transport)&lt;br /&gt;
* voir [[MQTT]]&lt;br /&gt;
&lt;br /&gt;
Ce serveur est basé sur le broker libre [https://mosquitto.org/ Mosquitto].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Le Broker MQTT Shiftr.io (obsolète)=====&lt;br /&gt;
 Devant les limitation de la démo de ce broker, nous avons monté notre propre server MQTT&lt;br /&gt;
* Service proposé par https://cloud.shiftr.io/welcome&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aller sur cette page pour trouver le bouton permettant d'envoyer des pokous (en phase de test, ne laissez pas trop vos POCL branchés, à cause de la liitation du sevreur Shifter.io) :&lt;br /&gt;
&lt;br /&gt;
===Arduino===&lt;br /&gt;
Le code Arduino présenté correspond à celui du quatrième modèle&lt;br /&gt;
* Il faut installer le [https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino gestionnaire de carte ESP8266 pour piloter le D1 mini]&lt;br /&gt;
* Il faut installer la bibliothèque MQTT de Joël Gähwiler (voir image plus bas)&lt;br /&gt;
* bibliothèque Adafruit Néopixel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BibliothequeMQTTPOCL.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot; line&amp;gt;&lt;br /&gt;
/////////////////////////&lt;br /&gt;
//      POCL Poke      //&lt;br /&gt;
/////////////////////////&lt;br /&gt;
/*&lt;br /&gt;
 * Un POCL imaginé et réalisé au Hackathon POCL à l'édulab Rennes 2 les 9 et 10 décembre 2021.&lt;br /&gt;
 * &lt;br /&gt;
 * Difficultés :&lt;br /&gt;
 * Configurez le logiciel Arduino pour gérer la carte D1 mini (ESP8266).&lt;br /&gt;
 * Intégrer les biobliothèues requises par le projet :&lt;br /&gt;
 ** #include &amp;lt;MQTT.h&amp;gt; -&amp;gt; pour gérer le protocole de communication c'est la bibliothèque MQTT de Joël Gähwiler : https://github.com/256dpi/arduino-mqtt&lt;br /&gt;
 ** #include &amp;lt;Adafruit_NeoPixel.h&amp;gt; -&amp;gt; pour gérer les rubans de led&lt;br /&gt;
 * &lt;br /&gt;
 *                                      BROCHAGE                            &lt;br /&gt;
                                _________________                        &lt;br /&gt;
                               /     D1 mini     \                       &lt;br /&gt;
                           -  |[ ]RST        TX[ ]| -                    &lt;br /&gt;
                           -  |[ ]A0  -GPIO  RX[ ]| -                    &lt;br /&gt;
                              |[ ]D0-16    5-D1[ ]| -                    &lt;br /&gt;
                              |[ ]D5-14    4-D2[ ]| -                    &lt;br /&gt;
                    Bouton -  |[X]D6-12    0-D3[X]| - ruban de leds             &lt;br /&gt;
                           -  |[ ]D7-13    2-D4[ ]| LED_BUILTIN          &lt;br /&gt;
                           -  |[ ]D8-15     GND[X]| - GND (Boutons, ruban de leds)             &lt;br /&gt;
                           -  |[ ]3V3 .      5V[X]| - ruban de Led        &lt;br /&gt;
                              |       +---+       |                     &lt;br /&gt;
                              |_______|USB|_______|                      &lt;br /&gt;
&lt;br /&gt;
Matériel :&lt;br /&gt;
- des fils dupont.&lt;br /&gt;
- un ruban de led RGB WS28B12&lt;br /&gt;
- D1 mini (Wemos, LOLIN,...)&lt;br /&gt;
- bouton poussoir&lt;br /&gt;
- une alimentation 5V&lt;br /&gt;
*/&lt;br /&gt;
/*&lt;br /&gt;
 * Un travail d'équipe de :&lt;br /&gt;
 * Alma Oskouei&lt;br /&gt;
 * Gaëlle Bescond&lt;br /&gt;
 * Tony Vanpoucke&lt;br /&gt;
 * Wing-Anh Luy&lt;br /&gt;
 * Antony Le Goïc-Auffret&lt;br /&gt;
   ___&lt;br /&gt;
 / ___ \&lt;br /&gt;
|_|   | |&lt;br /&gt;
     /_/ &lt;br /&gt;
     _   ___   _ &lt;br /&gt;
    |_| |___|_| |_&lt;br /&gt;
         ___|_   _|&lt;br /&gt;
        |___| |_|&lt;br /&gt;
Les petits Débrouillards - décembre 2021 CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/&lt;br /&gt;
// Programme inspiré de celui par Joël Gähwiler&lt;br /&gt;
// https://github.com/256dpi/arduino-mqtt&lt;br /&gt;
*/&lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;MQTT.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
const char ssid[] = &amp;quot;LeNomDeVotreReseauWifi&amp;quot;;&lt;br /&gt;
const char pass[] = &amp;quot;LeCodeDeVotreWifi&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
WiFiClient net;&lt;br /&gt;
MQTTClient client;&lt;br /&gt;
#define BROKER_IP &amp;quot;debrouillards.ddns.net&amp;quot; //IP du serveur sur lequel est installé le Broker MQTT&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
&lt;br /&gt;
//=============élément pour le ruban de led et le bouton===============&lt;br /&gt;
&lt;br /&gt;
// Broche de connexion du ruban de LED&lt;br /&gt;
#define PIN D3 // &lt;br /&gt;
&lt;br /&gt;
int brocheBouton = 12; //GPIO de la broche D6&lt;br /&gt;
&lt;br /&gt;
// Nombre de Led RDGB dans votre ruban&lt;br /&gt;
#define NUMPIXELS 13 &lt;br /&gt;
&lt;br /&gt;
// on configurer un riban nommé &amp;quot;pixels&amp;quot;&lt;br /&gt;
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);&lt;br /&gt;
&lt;br /&gt;
#define T 1 // temps pour gérer le fade du ruban&lt;br /&gt;
//==============================================================&lt;br /&gt;
&lt;br /&gt;
void connect() {&lt;br /&gt;
  Serial.print(&amp;quot;checking wifi...&amp;quot;);&lt;br /&gt;
  while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
    Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;\nconnecting...&amp;quot;);&lt;br /&gt;
  //connection au serveur MQTT : identifiant, User, mot de passe&lt;br /&gt;
  while (!client.connect(&amp;quot;LeNomDeVotrePOCL&amp;quot;, &amp;quot;poclpokou&amp;quot;, &amp;quot;pokou&amp;quot;)) {&lt;br /&gt;
    Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;\nconnected!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// on s'abonne au sujet (topic) &amp;quot;/Poke&amp;quot; &lt;br /&gt;
  client.subscribe(&amp;quot;/Poke&amp;quot;); // Attention à la casse !! La casse c'est maj ou minuscule&lt;br /&gt;
  // client.unsubscribe(&amp;quot;/Poke&amp;quot;);// Pour se désiscrire&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void messageReceived(String &amp;amp;topic, String &amp;amp;payload) {&lt;br /&gt;
  digitalWrite(LED_BUILTIN, HIGH);&lt;br /&gt;
  fade();&lt;br /&gt;
  Serial.println(&amp;quot;incoming: &amp;quot; + topic + &amp;quot; - &amp;quot; + payload);&lt;br /&gt;
  if (payload == &amp;quot;pokou&amp;quot;){&lt;br /&gt;
    Serial.println(&amp;quot;clic !&amp;quot;);&lt;br /&gt;
    digitalWrite(LED_BUILTIN, LOW);&lt;br /&gt;
    delay(100);&lt;br /&gt;
    digitalWrite(LED_BUILTIN, HIGH);&lt;br /&gt;
  }&lt;br /&gt;
  // Note: Do not use the client in the callback to publish, subscribe or&lt;br /&gt;
  // unsubscribe as it may cause deadlocks when other things arrive while&lt;br /&gt;
  // sending and receiving acknowledgments. Instead, change a global variable,&lt;br /&gt;
  // or push to a queue and handle it in the loop after calling `client.loop()`.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fade() {&lt;br /&gt;
  for (int sig=0; sig&amp;lt;3; sig++){&lt;br /&gt;
  for (int b=0; b&amp;lt;255; b++){&lt;br /&gt;
  pixels.setBrightness(b);&lt;br /&gt;
  &lt;br /&gt;
  for(int i=0; i&amp;lt;NUMPIXELS; i++) {&lt;br /&gt;
    pixels.setPixelColor(i, pixels.Color(250, 150, b));&lt;br /&gt;
  }&lt;br /&gt;
  pixels.show();   // On allume les rubans&lt;br /&gt;
  delay(T);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (int b=255; b&amp;gt;1; b--){ //boucle de gestion de la brillance&lt;br /&gt;
  pixels.setBrightness(b);&lt;br /&gt;
  &lt;br /&gt;
  // n'oubliez pas que le premier pixel porte le Numéro 0&lt;br /&gt;
  for(int i=0; i&amp;lt;NUMPIXELS; i++) { // Pour chaque pixel...&lt;br /&gt;
&lt;br /&gt;
    // pixels.Color() prends les valeurs RGB de 0,0,0 jusqu'à 255,255,255&lt;br /&gt;
    pixels.setPixelColor(i, pixels.Color(b, 50, 255));&lt;br /&gt;
  }&lt;br /&gt;
  pixels.show();   // on affiche les pixels&lt;br /&gt;
  delay(T);&lt;br /&gt;
  }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  pixels.begin(); //on initialise le ruban &amp;quot;pixels&amp;quot;&lt;br /&gt;
  pinMode(brocheBouton,INPUT_PULLUP);&lt;br /&gt;
  &lt;br /&gt;
  pinMode(LED_BUILTIN, OUTPUT);&lt;br /&gt;
  digitalWrite(LED_BUILTIN, HIGH);&lt;br /&gt;
  WiFi.begin(ssid, pass);&lt;br /&gt;
&lt;br /&gt;
  // on se connecte au client&lt;br /&gt;
  client.begin(BROKER_IP, 1883, net); // (IP, port,je ne sais pas à quoi correspond &amp;quot;net&amp;quot;)&lt;br /&gt;
  client.onMessage(messageReceived);&lt;br /&gt;
&lt;br /&gt;
  connect();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  pixels.clear(); // Set all pixel colors to 'off'&lt;br /&gt;
  pixels.show();&lt;br /&gt;
  &lt;br /&gt;
  client.loop();&lt;br /&gt;
  delay(10);  // &amp;lt;- fixes some issues with WiFi stability&lt;br /&gt;
&lt;br /&gt;
  if (!client.connected()) {&lt;br /&gt;
    connect();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // publish a message roughly every second.&lt;br /&gt;
&lt;br /&gt;
  if ( digitalRead(brocheBouton) == LOW ){&lt;br /&gt;
  Serial.println(&amp;quot;Appuis Bouton&amp;quot;); &lt;br /&gt;
  client.publish(&amp;quot;/Poke&amp;quot;, &amp;quot;pokou&amp;quot;);&lt;br /&gt;
  delay(250);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et la Version pour ESP32 !&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot; line&amp;gt;&lt;br /&gt;
/////////////////////////&lt;br /&gt;
//      POCL Poke      //&lt;br /&gt;
/////////////////////////&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Un POCL imaginé et réalisé au Hackathon POCL à l'édulab Rennes 2 les 9 et 10 décembre 2021.&lt;br /&gt;
 * &lt;br /&gt;
 * Difficultés :&lt;br /&gt;
 * Configurez le logiciel Arduino pour gérer la ESP32.&lt;br /&gt;
 * Intégrer les biobliothèues requises par le projet :&lt;br /&gt;
 ** #include &amp;lt;MQTT.h&amp;gt; -&amp;gt; pour gérer le protocole de communication c'est la bibliothèque MQTT de Joël Gähwiler : https://github.com/256dpi/arduino-mqtt&lt;br /&gt;
 ** #include &amp;lt;Adafruit_NeoPixel.h&amp;gt; -&amp;gt; pour gérer les rubans de led&lt;br /&gt;
 * &lt;br /&gt;
 *                                      BROCHAGE                            &lt;br /&gt;
                                _________________                        &lt;br /&gt;
                               /     ESP32 WROOM \                       &lt;br /&gt;
                           -  |[ ]RST        TX[ ]| -                    &lt;br /&gt;
                           -  |[ ]A0  -GPIO  RX[ ]| -                    &lt;br /&gt;
                              |[ ]   16    5   [ ]| -                    &lt;br /&gt;
                              |[ ]   14    4   [ ]| -                    &lt;br /&gt;
                    Bouton -  |[X]12       0   [X]| - ruban de leds             &lt;br /&gt;
                           -  |[ ]   13    2   [ ]| LED_BUILTIN          &lt;br /&gt;
                           -  |[ ]   15     GND[X]| - GND (Boutons, ruban de leds)             &lt;br /&gt;
                           -  |[ ]3V3 .      5V[X]| - ruban de Led        &lt;br /&gt;
                              |       +---+       |                     &lt;br /&gt;
                              |_______|USB|_______|                      &lt;br /&gt;
&lt;br /&gt;
Matériel :&lt;br /&gt;
- des fils dupont.&lt;br /&gt;
- un ruban de led RGB WS28B12&lt;br /&gt;
- D1 mini (Wemos, LOLIN,...)&lt;br /&gt;
- bouton poussoir&lt;br /&gt;
- une alimentation 5V&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 * Un travail d'équipe de :&lt;br /&gt;
 * Alma Oskouei&lt;br /&gt;
 * Gaëlle Bescond&lt;br /&gt;
 * Tony Vanpoucke&lt;br /&gt;
 * Wing-Anh Luy&lt;br /&gt;
 * Antony Le Goïc-Auffret&lt;br /&gt;
&lt;br /&gt;
   ___&lt;br /&gt;
 / ___ \&lt;br /&gt;
|_|   | |&lt;br /&gt;
     /_/ &lt;br /&gt;
     _   ___   _ &lt;br /&gt;
    |_| |___|_| |_&lt;br /&gt;
         ___|_   _|&lt;br /&gt;
        |___| |_|&lt;br /&gt;
&lt;br /&gt;
Les petits Débrouillards - décembre 2021 CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/&lt;br /&gt;
&lt;br /&gt;
// Programme inspiré de celui par Joël Gähwiler&lt;br /&gt;
&lt;br /&gt;
// Pour tester sur un PC avec mosquito d'installé (sudo apt install -y mosquitto mosquitto-clients)&lt;br /&gt;
// mosquitto_pub -h 86.223.98.89 -p 1883 -u &amp;quot;poclpokou&amp;quot; -P &amp;quot;pokou&amp;quot; -m &amp;quot;pokou&amp;quot; -t /Poke&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// https://github.com/256dpi/arduino-mqtt&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;MQTT.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
const char ssid[] = &amp;quot;Les Usines&amp;quot;;&lt;br /&gt;
const char pass[] = &amp;quot;usinesnouvelles&amp;quot;;&lt;br /&gt;
WiFiClient net;&lt;br /&gt;
MQTTClient client;&lt;br /&gt;
#define BROKER_IP &amp;quot;debrouillards.ddns.net&amp;quot;  //IP du serveur sur lequel est installé le Broker MQTT&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
&lt;br /&gt;
//=============élément pour le ruban de led et le bouton===============&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Broche de connexion du ruban de LED&lt;br /&gt;
&lt;br /&gt;
#define PIN 0  //&lt;br /&gt;
int brocheBouton = 12;  //GPIO de la broche 12&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Nombre de Led RDGB dans votre ruban&lt;br /&gt;
#define NUMPIXELS 13&lt;br /&gt;
&lt;br /&gt;
// on configurer un riban nommé &amp;quot;pixels&amp;quot;&lt;br /&gt;
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);&lt;br /&gt;
&lt;br /&gt;
#define T 1  // temps pour gérer le fade du ruban&lt;br /&gt;
//==============================================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void connect() {&lt;br /&gt;
  Serial.print(&amp;quot;checking wifi...&amp;quot;);&lt;br /&gt;
  while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
    Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;\nconnecting...&amp;quot;);&lt;br /&gt;
  //connection au serveur MQTT : identifiant, User, mot de passe&lt;br /&gt;
  while (!client.connect(&amp;quot;LeNomDeVotrePOCL&amp;quot;, &amp;quot;poclpokou&amp;quot;, &amp;quot;pokou&amp;quot;)) {&lt;br /&gt;
    Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;\nconnected!&amp;quot;);&lt;br /&gt;
  // on s'abonne au sujet (topic) &amp;quot;/Poke&amp;quot;&lt;br /&gt;
  client.subscribe(&amp;quot;/Poke&amp;quot;);  // Attention à la casse !! La casse c'est maj ou minuscule&lt;br /&gt;
  // client.unsubscribe(&amp;quot;/Poke&amp;quot;);// Pour se désiscrire&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void messageReceived(String &amp;amp;topic, String &amp;amp;payload) {&lt;br /&gt;
  digitalWrite(2, HIGH);&lt;br /&gt;
  fade();&lt;br /&gt;
  Serial.println(&amp;quot;incoming: &amp;quot; + topic + &amp;quot; - &amp;quot; + payload);&lt;br /&gt;
  if (payload == &amp;quot;pokou&amp;quot;) {&lt;br /&gt;
    Serial.println(&amp;quot;clic !&amp;quot;);&lt;br /&gt;
    digitalWrite(2, LOW);&lt;br /&gt;
    delay(100);&lt;br /&gt;
    digitalWrite(2, HIGH);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Note: Do not use the client in the callback to publish, subscribe or&lt;br /&gt;
  // unsubscribe as it may cause deadlocks when other things arrive while&lt;br /&gt;
  // sending and receiving acknowledgments. Instead, change a global variable,&lt;br /&gt;
  // or push to a queue and handle it in the loop after calling `client.loop()`.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void fade() {&lt;br /&gt;
  for (int sig = 0; sig &amp;lt; 3; sig++) {&lt;br /&gt;
    for (int b = 0; b &amp;lt; 255; b++) {&lt;br /&gt;
      pixels.setBrightness(b);&lt;br /&gt;
&lt;br /&gt;
      for (int i = 0; i &amp;lt; NUMPIXELS; i++) {&lt;br /&gt;
        pixels.setPixelColor(i, pixels.Color(250, 150, b));&lt;br /&gt;
      }&lt;br /&gt;
      pixels.show();  // On allume les rubans&lt;br /&gt;
      delay(T);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    for (int b = 255; b &amp;gt; 1; b--) {  //boucle de gestion de la brillance&lt;br /&gt;
      pixels.setBrightness(b);&lt;br /&gt;
&lt;br /&gt;
      // n'oubliez pas que le premier pixel porte le Numéro 0&lt;br /&gt;
      for (int i = 0; i &amp;lt; NUMPIXELS; i++) {  // Pour chaque pixel...&lt;br /&gt;
&lt;br /&gt;
        // pixels.Color() prends les valeurs RGB de 0,0,0 jusqu'à 255,255,255&lt;br /&gt;
        pixels.setPixelColor(i, pixels.Color(b, 50, 255));&lt;br /&gt;
      }&lt;br /&gt;
      pixels.show();  // on affiche les pixels&lt;br /&gt;
      delay(T);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  pixels.begin();  //on initialise le ruban &amp;quot;pixels&amp;quot;&lt;br /&gt;
  pinMode(brocheBouton, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  pinMode(2, OUTPUT);&lt;br /&gt;
  digitalWrite(2, HIGH);&lt;br /&gt;
&lt;br /&gt;
  WiFi.begin(ssid, pass);&lt;br /&gt;
&lt;br /&gt;
  // on se connecte au client&lt;br /&gt;
  client.begin(BROKER_IP, 1883, net);  // (IP, port,je ne sais pas à quoi correspond &amp;quot;net&amp;quot;)&lt;br /&gt;
  client.onMessage(messageReceived);&lt;br /&gt;
&lt;br /&gt;
  connect();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  pixels.clear();  // Set all pixel colors to 'off'&lt;br /&gt;
  pixels.show();&lt;br /&gt;
&lt;br /&gt;
  client.loop();&lt;br /&gt;
  delay(10);  // &amp;lt;- fixes some issues with WiFi stability&lt;br /&gt;
&lt;br /&gt;
  if (!client.connected()) {&lt;br /&gt;
    connect();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // publish a message roughly every second.&lt;br /&gt;
  if (digitalRead(brocheBouton) == LOW) {&lt;br /&gt;
    Serial.println(&amp;quot;Appuis Bouton&amp;quot;);&lt;br /&gt;
    client.publish(&amp;quot;/Poke&amp;quot;, &amp;quot;pokou&amp;quot;);&lt;br /&gt;
    delay(250);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Retours d'expérience==&lt;br /&gt;
ça marche !&lt;br /&gt;
&lt;br /&gt;
shiftr.io, le service MQTT utilisé pour le prototype a une limitation : au bout de 6 heures d'utilisations, le service s'arrête pendant 15 minute !!&lt;br /&gt;
&lt;br /&gt;
==Déjà fait==&lt;br /&gt;
* 18/12/2021 créer notre propre serveur MQTT&lt;br /&gt;
* 20/12/2021 mettre wifimanager pour gérer la configuration de connexion&lt;br /&gt;
* 21/12/2021 site web de sélection de la couleur&lt;br /&gt;
* 22/12/2021 mémorisation de la couleur sélectionnée, publication du code sur Github : https://github.com/antonydbzh/POCLpokou/blob/main/README.md&lt;br /&gt;
&lt;br /&gt;
==Piste de développement à faire pour une V2==&lt;br /&gt;
* évaluer les questions de sécurité&lt;br /&gt;
* imaginer des fonctionnalités supplémentaires (du son façon R2D2, du mouvement )&lt;br /&gt;
* un système de configuration de la couleur (via MQTT et une interface web ?)&lt;br /&gt;
&lt;br /&gt;
===Configuration via MQTT===&lt;br /&gt;
* chaque D1 mini dispose d'un identifiant unique.&lt;br /&gt;
* il est possible de créer un topic MQTT avec cet identifiant qui serait le canal de configuration.&lt;br /&gt;
* le POCL est abonné à ce topic et reçoit donc les infos de configuration qu'il peut stocker dans la mémoire.&lt;br /&gt;
* on peut créer une page web dans laquelle on renseigne l'identifiant et la couleur (ou tout autre paramètre à configurer).&lt;br /&gt;
* la page web envoie la config au topic.&lt;br /&gt;
&lt;br /&gt;
===Mieux, Configuration via la fonctionnalité &amp;quot;Point d'Accès&amp;quot;===&lt;br /&gt;
* rajouter un sélecteur (interrupteur) qui activé, met le D1 mini en mode config.&lt;br /&gt;
* une interface web qui demande la config : wifi, couleur, fonctionnalité,....&lt;br /&gt;
&lt;br /&gt;
===Question de sécurité===&lt;br /&gt;
* le système est très facilement &amp;quot;spamable&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Sources d'infos===&lt;br /&gt;
* www.martyncurrey.com/esp8266-and-C-arduino-ide-part-5-adding-wifimanager/&lt;br /&gt;
* Voir exemple de la bib WiFiManager AutoconnectwithFSparamaters&lt;br /&gt;
&lt;br /&gt;
==Usages==&lt;br /&gt;
* Mobiliser les concepts de Many-to-many au lieu de one-to-one&lt;br /&gt;
* concept de POCL communautaire&lt;br /&gt;
* Un POCL qui a des heures d'ouverture ? (8h à 20h par exemple) ?&lt;br /&gt;
* Conserver le fait d'avoir reçu un pokou ?&lt;br /&gt;
&lt;br /&gt;
==pour tester à partir d'une application==&lt;br /&gt;
l'appli multiplateforme MQTTX : https://mqttx.app/ permet de recevoir et d'envoyer des pokous&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:POCL]]&lt;br /&gt;
[[Catégorie:led]][[Catégorie:ruban de led]][[Catégorie:WS1812B]]&lt;/div&gt;</summary>
		<author><name>Julienrat</name></author>	</entry>

	<entry>
		<id>http://wiki.lesfabriquesduponant.net/index.php?title=POCL_:_Poke&amp;diff=28135</id>
		<title>POCL : Poke</title>
		<link rel="alternate" type="text/html" href="http://wiki.lesfabriquesduponant.net/index.php?title=POCL_:_Poke&amp;diff=28135"/>
				<updated>2024-11-14T14:25:05Z</updated>
		
		<summary type="html">&lt;p&gt;Julienrat : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Résumé du Projet==&lt;br /&gt;
Le POCL: Poke est un POCL communautaire interactif. Sa fonction est d'envoyer et recevoir un message, nommé &amp;quot;pokou&amp;quot; vers ou provenant des autres POCL: Poke.&lt;br /&gt;
&lt;br /&gt;
Le projet a été réalisé par Alma, Wing-Anh, Tony, Antony, Gaelle&lt;br /&gt;
&lt;br /&gt;
Il envoie un message à la communauté de ses homomorphes, qui réagissent par une ou des actions perceptibles par leurs possesseurs (signal lumineux, vibration etc...)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:POCL-equipe-poke.JPG|400px]] [[Fichier:POCL-equipe-poke2.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
==Prototype réalisés ==&lt;br /&gt;
4 prototypes différents ont été réalisés, chacun apportant une évolution/modification supplémentaire.&lt;br /&gt;
* Le premier prototype est fait, en plus de l'électronique, de carton et de papier.&lt;br /&gt;
* Le deuxième prototype consiste en du bois découpé au laser pour remplacer le carton et mieux emprisonner le papier. Cette deuxième génération donnera la forme générale quasiment finale.&lt;br /&gt;
* Le troisième prototype a intégré un bouton dans la structure d'un couvercle pour pouvoir interagir réellement avec les autres POCL.&lt;br /&gt;
* Le quatrième et dernier prototype s'est vu octroyer trois boutons supplémentaires pour pouvoir envoyer plus de &amp;quot;pokous&amp;quot;, ainsi que d'un &amp;quot;maintien d'élégance&amp;quot; pour permettre aux fils d'en sortir sans détériorer le papier sur la durée.&lt;br /&gt;
==Fabrication d'un POCL: Poke==&lt;br /&gt;
La construction d'un POCL: Poke se fera sur la base du prototype le plus à jour, c'est-à-dire le quatrième.&amp;lt;br&amp;gt;&lt;br /&gt;
Attention, les photos du montage proviennent des deuxième et troisième prototypes&lt;br /&gt;
===Proto===&lt;br /&gt;
[[Fichier:POCL-Prototype-poke.JPG|400px]] [[Fichier:POCL-PrototypePoke2.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
Y'a un truc à voir ici : https://www.youtube.com/watch?v=0ZCrEbmvCAQ&lt;br /&gt;
===Matériel===&lt;br /&gt;
* 1 D1 Mini&lt;br /&gt;
* 1 Ruban de LED ou autre objet au choix permettant un stimulus sensoriel pour l'utilisateur&lt;br /&gt;
* 1 Bouton poussoir (4 s'il est prévu d'augmenter la capacité de pokous)&lt;br /&gt;
* Fils conducteurs&lt;br /&gt;
* Découpeuse laser&lt;br /&gt;
* Planches de bois de 5mm d'épaisseur (ou carton facile à découper)&lt;br /&gt;
* Papier fin (des feuilles A4 font parfaitement l'affaire)&lt;br /&gt;
* Colle à bois (optionnel)&lt;br /&gt;
* Connexion internet&lt;br /&gt;
* Ciseaux&lt;br /&gt;
===Découpe du bois===&lt;br /&gt;
Découper le bois à la découpeuse laser&lt;br /&gt;
==Schémas==&lt;br /&gt;
[[Media:Pock PDFMontage.pdf|Télécharger la notice de montage]]&lt;br /&gt;
&lt;br /&gt;
[[Media:Pock-Elv5-decoupelaser.pdf|Télécharger le fichier pour la découpe laser]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pock-Elv5Imagedecoupelaser.png|800px|link=https://www.wiki.lesfabriquesduponant.net/images/5/56/Pock-Elv5-decoupelaser.pdf]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pock model 0.png|400px]] [[Fichier:Pock model 1.png|400px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pock model 2.png|400px]] [[Fichier:Pock model 3.png|400px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pock model 4.png|400px]] [[Fichier:Pock model 5.png|400px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pock model 6.png|400px]] [[Fichier:Pock model 7.png|400px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Pock model 8.png|400px]]&lt;br /&gt;
&lt;br /&gt;
===Découpe papier===&lt;br /&gt;
Découper le papier en une bande large de 6 cm et longue de 28 cm (27.4 cm pour une feuille A4) &lt;br /&gt;
====Prélude====&lt;br /&gt;
La boîte est un cylindre dont le matériau laisse passer la lumière de façon diffuse comme le papier.&lt;br /&gt;
&lt;br /&gt;
Les extrémités du cylindre sont faites de bois découpé au laser afin de renforcer la structure. Le carton peut le remplacer si besoin.&lt;br /&gt;
&lt;br /&gt;
Pour une meilleure apparence finale, les gravures des pièces doivent être orientées vers l'extérieur de l'objet.&lt;br /&gt;
&lt;br /&gt;
====Étape 1====&lt;br /&gt;
Prendre l'anneau troué, et enfoncer dedans les piliers dédiés, le côté épais orienté vers l'intérieur de la pièce&lt;br /&gt;
&lt;br /&gt;
(Photo)&lt;br /&gt;
&lt;br /&gt;
====Étape 2====&lt;br /&gt;
Enrouler la bande de papier autour de l'ossature précédemment créée.&lt;br /&gt;
&lt;br /&gt;
Un chevauchement des deux bouts est attendu, et utile pour la suite&lt;br /&gt;
&lt;br /&gt;
(Photo)&lt;br /&gt;
====Étape 3====&lt;br /&gt;
Insérer les deux anneaux de renforts (les plus grands et fins) autour du papier afin de le pincer avec l'ossature. Les garder à un tiers de la distance de chaque bord pour l'instant.&lt;br /&gt;
&lt;br /&gt;
(Photo)&lt;br /&gt;
====Étape 4====&lt;br /&gt;
Insérer le disque troué sur les piliers pour entièrement bloquer le papier et fermer le cylindre d'un côté.&lt;br /&gt;
&lt;br /&gt;
Il s'agit de l'étape la plus délicate du montage, prendre son temps et y aller par petits pas est vivement recommandé.&lt;br /&gt;
&lt;br /&gt;
Note: la photo montre un anneau troué, mais la pièce est bien pleine dans le plan.&lt;br /&gt;
&lt;br /&gt;
Note: Il est conseillé pour des raisons de simplification de la tâche d'insérer préalablement les boutons poussoir dans les 4 trous centraux et de les raccorder à des fils pour faciliter les connexions futures.&lt;br /&gt;
&lt;br /&gt;
(Photo)&lt;br /&gt;
&lt;br /&gt;
====test du montage du POCL====&lt;br /&gt;
début 16h50&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Électronique====&lt;br /&gt;
[[Fichier:POCL-Poke-etape2.JPG|400px]] [[Fichier:POCL-Poke-etape3.JPG|400px]] [[Fichier:POCL-Poke-etape.JPG|400px]]&lt;br /&gt;
&lt;br /&gt;
====MQTT====&lt;br /&gt;
L'interaction entre les POCL passe par un serveur MQTT (Message Queuing Telemetry Transport)&lt;br /&gt;
* voir [[MQTT]]&lt;br /&gt;
&lt;br /&gt;
Ce serveur est basé sur le broker libre [https://mosquitto.org/ Mosquitto].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Le Broker MQTT Shiftr.io (obsolète)=====&lt;br /&gt;
 Devant les limitation de la démo de ce broker, nous avons monté notre propre server MQTT&lt;br /&gt;
* Service proposé par https://cloud.shiftr.io/welcome&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aller sur cette page pour trouver le bouton permettant d'envoyer des pokous (en phase de test, ne laissez pas trop vos POCL branchés, à cause de la liitation du sevreur Shifter.io) :&lt;br /&gt;
&lt;br /&gt;
===Arduino===&lt;br /&gt;
Le code Arduino présenté correspond à celui du quatrième modèle&lt;br /&gt;
* Il faut installer le [https://www.wikidebrouillard.org/wiki/Utiliser_le_D1_mini_avec_Arduino gestionnaire de carte ESP8266 pour piloter le D1 mini]&lt;br /&gt;
* Il faut installer la bibliothèque MQTT de Joël Gähwiler (voir image plus bas)&lt;br /&gt;
* bibliothèque Adafruit Néopixel&lt;br /&gt;
&lt;br /&gt;
[[Fichier:BibliothequeMQTTPOCL.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot; line&amp;gt;&lt;br /&gt;
/////////////////////////&lt;br /&gt;
//      POCL Poke      //&lt;br /&gt;
/////////////////////////&lt;br /&gt;
/*&lt;br /&gt;
 * Un POCL imaginé et réalisé au Hackathon POCL à l'édulab Rennes 2 les 9 et 10 décembre 2021.&lt;br /&gt;
 * &lt;br /&gt;
 * Difficultés :&lt;br /&gt;
 * Configurez le logiciel Arduino pour gérer la carte D1 mini (ESP8266).&lt;br /&gt;
 * Intégrer les biobliothèues requises par le projet :&lt;br /&gt;
 ** #include &amp;lt;MQTT.h&amp;gt; -&amp;gt; pour gérer le protocole de communication c'est la bibliothèque MQTT de Joël Gähwiler : https://github.com/256dpi/arduino-mqtt&lt;br /&gt;
 ** #include &amp;lt;Adafruit_NeoPixel.h&amp;gt; -&amp;gt; pour gérer les rubans de led&lt;br /&gt;
 * &lt;br /&gt;
 *                                      BROCHAGE                            &lt;br /&gt;
                                _________________                        &lt;br /&gt;
                               /     D1 mini     \                       &lt;br /&gt;
                           -  |[ ]RST        TX[ ]| -                    &lt;br /&gt;
                           -  |[ ]A0  -GPIO  RX[ ]| -                    &lt;br /&gt;
                              |[ ]D0-16    5-D1[ ]| -                    &lt;br /&gt;
                              |[ ]D5-14    4-D2[ ]| -                    &lt;br /&gt;
                    Bouton -  |[X]D6-12    0-D3[X]| - ruban de leds             &lt;br /&gt;
                           -  |[ ]D7-13    2-D4[ ]| LED_BUILTIN          &lt;br /&gt;
                           -  |[ ]D8-15     GND[X]| - GND (Boutons, ruban de leds)             &lt;br /&gt;
                           -  |[ ]3V3 .      5V[X]| - ruban de Led        &lt;br /&gt;
                              |       +---+       |                     &lt;br /&gt;
                              |_______|USB|_______|                      &lt;br /&gt;
&lt;br /&gt;
Matériel :&lt;br /&gt;
- des fils dupont.&lt;br /&gt;
- un ruban de led RGB WS28B12&lt;br /&gt;
- D1 mini (Wemos, LOLIN,...)&lt;br /&gt;
- bouton poussoir&lt;br /&gt;
- une alimentation 5V&lt;br /&gt;
*/&lt;br /&gt;
/*&lt;br /&gt;
 * Un travail d'équipe de :&lt;br /&gt;
 * Alma Oskouei&lt;br /&gt;
 * Gaëlle Bescond&lt;br /&gt;
 * Tony Vanpoucke&lt;br /&gt;
 * Wing-Anh Luy&lt;br /&gt;
 * Antony Le Goïc-Auffret&lt;br /&gt;
   ___&lt;br /&gt;
 / ___ \&lt;br /&gt;
|_|   | |&lt;br /&gt;
     /_/ &lt;br /&gt;
     _   ___   _ &lt;br /&gt;
    |_| |___|_| |_&lt;br /&gt;
         ___|_   _|&lt;br /&gt;
        |___| |_|&lt;br /&gt;
Les petits Débrouillards - décembre 2021 CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/&lt;br /&gt;
// Programme inspiré de celui par Joël Gähwiler&lt;br /&gt;
// https://github.com/256dpi/arduino-mqtt&lt;br /&gt;
*/&lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
#include &amp;lt;MQTT.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
const char ssid[] = &amp;quot;LeNomDeVotreReseauWifi&amp;quot;;&lt;br /&gt;
const char pass[] = &amp;quot;LeCodeDeVotreWifi&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
WiFiClient net;&lt;br /&gt;
MQTTClient client;&lt;br /&gt;
#define BROKER_IP &amp;quot;debrouillards.ddns.net&amp;quot; //IP du serveur sur lequel est installé le Broker MQTT&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
&lt;br /&gt;
//=============élément pour le ruban de led et le bouton===============&lt;br /&gt;
&lt;br /&gt;
// Broche de connexion du ruban de LED&lt;br /&gt;
#define PIN D3 // &lt;br /&gt;
&lt;br /&gt;
int brocheBouton = 12; //GPIO de la broche D6&lt;br /&gt;
&lt;br /&gt;
// Nombre de Led RDGB dans votre ruban&lt;br /&gt;
#define NUMPIXELS 13 &lt;br /&gt;
&lt;br /&gt;
// on configurer un riban nommé &amp;quot;pixels&amp;quot;&lt;br /&gt;
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);&lt;br /&gt;
&lt;br /&gt;
#define T 1 // temps pour gérer le fade du ruban&lt;br /&gt;
//==============================================================&lt;br /&gt;
&lt;br /&gt;
void connect() {&lt;br /&gt;
  Serial.print(&amp;quot;checking wifi...&amp;quot;);&lt;br /&gt;
  while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
    Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;\nconnecting...&amp;quot;);&lt;br /&gt;
  //connection au serveur MQTT : identifiant, User, mot de passe&lt;br /&gt;
  while (!client.connect(&amp;quot;LeNomDeVotrePOCL&amp;quot;, &amp;quot;poclpokou&amp;quot;, &amp;quot;pokou&amp;quot;)) {&lt;br /&gt;
    Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;\nconnected!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// on s'abonne au sujet (topic) &amp;quot;/Poke&amp;quot; &lt;br /&gt;
  client.subscribe(&amp;quot;/Poke&amp;quot;); // Attention à la casse !! La casse c'est maj ou minuscule&lt;br /&gt;
  // client.unsubscribe(&amp;quot;/Poke&amp;quot;);// Pour se désiscrire&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void messageReceived(String &amp;amp;topic, String &amp;amp;payload) {&lt;br /&gt;
  digitalWrite(LED_BUILTIN, HIGH);&lt;br /&gt;
  fade();&lt;br /&gt;
  Serial.println(&amp;quot;incoming: &amp;quot; + topic + &amp;quot; - &amp;quot; + payload);&lt;br /&gt;
  if (payload == &amp;quot;pokou&amp;quot;){&lt;br /&gt;
    Serial.println(&amp;quot;clic !&amp;quot;);&lt;br /&gt;
    digitalWrite(LED_BUILTIN, LOW);&lt;br /&gt;
    delay(100);&lt;br /&gt;
    digitalWrite(LED_BUILTIN, HIGH);&lt;br /&gt;
  }&lt;br /&gt;
  // Note: Do not use the client in the callback to publish, subscribe or&lt;br /&gt;
  // unsubscribe as it may cause deadlocks when other things arrive while&lt;br /&gt;
  // sending and receiving acknowledgments. Instead, change a global variable,&lt;br /&gt;
  // or push to a queue and handle it in the loop after calling `client.loop()`.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void fade() {&lt;br /&gt;
  for (int sig=0; sig&amp;lt;3; sig++){&lt;br /&gt;
  for (int b=0; b&amp;lt;255; b++){&lt;br /&gt;
  pixels.setBrightness(b);&lt;br /&gt;
  &lt;br /&gt;
  for(int i=0; i&amp;lt;NUMPIXELS; i++) {&lt;br /&gt;
    pixels.setPixelColor(i, pixels.Color(250, 150, b));&lt;br /&gt;
  }&lt;br /&gt;
  pixels.show();   // On allume les rubans&lt;br /&gt;
  delay(T);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (int b=255; b&amp;gt;1; b--){ //boucle de gestion de la brillance&lt;br /&gt;
  pixels.setBrightness(b);&lt;br /&gt;
  &lt;br /&gt;
  // n'oubliez pas que le premier pixel porte le Numéro 0&lt;br /&gt;
  for(int i=0; i&amp;lt;NUMPIXELS; i++) { // Pour chaque pixel...&lt;br /&gt;
&lt;br /&gt;
    // pixels.Color() prends les valeurs RGB de 0,0,0 jusqu'à 255,255,255&lt;br /&gt;
    pixels.setPixelColor(i, pixels.Color(b, 50, 255));&lt;br /&gt;
  }&lt;br /&gt;
  pixels.show();   // on affiche les pixels&lt;br /&gt;
  delay(T);&lt;br /&gt;
  }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  pixels.begin(); //on initialise le ruban &amp;quot;pixels&amp;quot;&lt;br /&gt;
  pinMode(brocheBouton,INPUT_PULLUP);&lt;br /&gt;
  &lt;br /&gt;
  pinMode(LED_BUILTIN, OUTPUT);&lt;br /&gt;
  digitalWrite(LED_BUILTIN, HIGH);&lt;br /&gt;
  WiFi.begin(ssid, pass);&lt;br /&gt;
&lt;br /&gt;
  // on se connecte au client&lt;br /&gt;
  client.begin(BROKER_IP, 1883, net); // (IP, port,je ne sais pas à quoi correspond &amp;quot;net&amp;quot;)&lt;br /&gt;
  client.onMessage(messageReceived);&lt;br /&gt;
&lt;br /&gt;
  connect();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  pixels.clear(); // Set all pixel colors to 'off'&lt;br /&gt;
  pixels.show();&lt;br /&gt;
  &lt;br /&gt;
  client.loop();&lt;br /&gt;
  delay(10);  // &amp;lt;- fixes some issues with WiFi stability&lt;br /&gt;
&lt;br /&gt;
  if (!client.connected()) {&lt;br /&gt;
    connect();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // publish a message roughly every second.&lt;br /&gt;
&lt;br /&gt;
  if ( digitalRead(brocheBouton) == LOW ){&lt;br /&gt;
  Serial.println(&amp;quot;Appuis Bouton&amp;quot;); &lt;br /&gt;
  client.publish(&amp;quot;/Poke&amp;quot;, &amp;quot;pokou&amp;quot;);&lt;br /&gt;
  delay(250);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et la Version pour ESP32 !&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot; line&amp;gt;&lt;br /&gt;
/////////////////////////&lt;br /&gt;
//      POCL Poke      //&lt;br /&gt;
/////////////////////////&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Un POCL imaginé et réalisé au Hackathon POCL à l'édulab Rennes 2 les 9 et 10 décembre 2021.&lt;br /&gt;
 * &lt;br /&gt;
 * Difficultés :&lt;br /&gt;
 * Configurez le logiciel Arduino pour gérer la carte D1 mini (ESP8266).&lt;br /&gt;
 * Intégrer les biobliothèues requises par le projet :&lt;br /&gt;
 ** #include &amp;lt;MQTT.h&amp;gt; -&amp;gt; pour gérer le protocole de communication c'est la bibliothèque MQTT de Joël Gähwiler : https://github.com/256dpi/arduino-mqtt&lt;br /&gt;
 ** #include &amp;lt;Adafruit_NeoPixel.h&amp;gt; -&amp;gt; pour gérer les rubans de led&lt;br /&gt;
 * &lt;br /&gt;
 *                                      BROCHAGE                            &lt;br /&gt;
                                _________________                        &lt;br /&gt;
                               /     ESP32 WROOM \                       &lt;br /&gt;
                           -  |[ ]RST        TX[ ]| -                    &lt;br /&gt;
                           -  |[ ]A0  -GPIO  RX[ ]| -                    &lt;br /&gt;
                              |[ ]   16    5   [ ]| -                    &lt;br /&gt;
                              |[ ]   14    4   [ ]| -                    &lt;br /&gt;
                    Bouton -  |[X]12       0   [X]| - ruban de leds             &lt;br /&gt;
                           -  |[ ]   13    2   [ ]| LED_BUILTIN          &lt;br /&gt;
                           -  |[ ]   15     GND[X]| - GND (Boutons, ruban de leds)             &lt;br /&gt;
                           -  |[ ]3V3 .      5V[X]| - ruban de Led        &lt;br /&gt;
                              |       +---+       |                     &lt;br /&gt;
                              |_______|USB|_______|                      &lt;br /&gt;
&lt;br /&gt;
Matériel :&lt;br /&gt;
- des fils dupont.&lt;br /&gt;
- un ruban de led RGB WS28B12&lt;br /&gt;
- D1 mini (Wemos, LOLIN,...)&lt;br /&gt;
- bouton poussoir&lt;br /&gt;
- une alimentation 5V&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
 * Un travail d'équipe de :&lt;br /&gt;
 * Alma Oskouei&lt;br /&gt;
 * Gaëlle Bescond&lt;br /&gt;
 * Tony Vanpoucke&lt;br /&gt;
 * Wing-Anh Luy&lt;br /&gt;
 * Antony Le Goïc-Auffret&lt;br /&gt;
&lt;br /&gt;
   ___&lt;br /&gt;
 / ___ \&lt;br /&gt;
|_|   | |&lt;br /&gt;
     /_/ &lt;br /&gt;
     _   ___   _ &lt;br /&gt;
    |_| |___|_| |_&lt;br /&gt;
         ___|_   _|&lt;br /&gt;
        |___| |_|&lt;br /&gt;
&lt;br /&gt;
Les petits Débrouillards - décembre 2021 CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/&lt;br /&gt;
&lt;br /&gt;
// Programme inspiré de celui par Joël Gähwiler&lt;br /&gt;
&lt;br /&gt;
// Pour tester sur un PC avec mosquito d'installé (sudo apt install -y mosquitto mosquitto-clients)&lt;br /&gt;
// mosquitto_pub -h 86.223.98.89 -p 1883 -u &amp;quot;poclpokou&amp;quot; -P &amp;quot;pokou&amp;quot; -m &amp;quot;pokou&amp;quot; -t /Poke&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// https://github.com/256dpi/arduino-mqtt&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;MQTT.h&amp;gt;&lt;br /&gt;
#include &amp;lt;Adafruit_NeoPixel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;WiFi.h&amp;gt;&lt;br /&gt;
const char ssid[] = &amp;quot;Les Usines&amp;quot;;&lt;br /&gt;
const char pass[] = &amp;quot;usinesnouvelles&amp;quot;;&lt;br /&gt;
WiFiClient net;&lt;br /&gt;
MQTTClient client;&lt;br /&gt;
#define BROKER_IP &amp;quot;debrouillards.ddns.net&amp;quot;  //IP du serveur sur lequel est installé le Broker MQTT&lt;br /&gt;
&lt;br /&gt;
unsigned long lastMillis = 0;&lt;br /&gt;
&lt;br /&gt;
//=============élément pour le ruban de led et le bouton===============&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Broche de connexion du ruban de LED&lt;br /&gt;
&lt;br /&gt;
#define PIN 0  //&lt;br /&gt;
int brocheBouton = 12;  //GPIO de la broche 12&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Nombre de Led RDGB dans votre ruban&lt;br /&gt;
#define NUMPIXELS 13&lt;br /&gt;
&lt;br /&gt;
// on configurer un riban nommé &amp;quot;pixels&amp;quot;&lt;br /&gt;
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);&lt;br /&gt;
&lt;br /&gt;
#define T 1  // temps pour gérer le fade du ruban&lt;br /&gt;
//==============================================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void connect() {&lt;br /&gt;
  Serial.print(&amp;quot;checking wifi...&amp;quot;);&lt;br /&gt;
  while (WiFi.status() != WL_CONNECTED) {&lt;br /&gt;
    Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.print(&amp;quot;\nconnecting...&amp;quot;);&lt;br /&gt;
  //connection au serveur MQTT : identifiant, User, mot de passe&lt;br /&gt;
  while (!client.connect(&amp;quot;LeNomDeVotrePOCL&amp;quot;, &amp;quot;poclpokou&amp;quot;, &amp;quot;pokou&amp;quot;)) {&lt;br /&gt;
    Serial.print(&amp;quot;.&amp;quot;);&lt;br /&gt;
    delay(1000);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.println(&amp;quot;\nconnected!&amp;quot;);&lt;br /&gt;
  // on s'abonne au sujet (topic) &amp;quot;/Poke&amp;quot;&lt;br /&gt;
  client.subscribe(&amp;quot;/Poke&amp;quot;);  // Attention à la casse !! La casse c'est maj ou minuscule&lt;br /&gt;
  // client.unsubscribe(&amp;quot;/Poke&amp;quot;);// Pour se désiscrire&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void messageReceived(String &amp;amp;topic, String &amp;amp;payload) {&lt;br /&gt;
  digitalWrite(2, HIGH);&lt;br /&gt;
  fade();&lt;br /&gt;
  Serial.println(&amp;quot;incoming: &amp;quot; + topic + &amp;quot; - &amp;quot; + payload);&lt;br /&gt;
  if (payload == &amp;quot;pokou&amp;quot;) {&lt;br /&gt;
    Serial.println(&amp;quot;clic !&amp;quot;);&lt;br /&gt;
    digitalWrite(2, LOW);&lt;br /&gt;
    delay(100);&lt;br /&gt;
    digitalWrite(2, HIGH);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Note: Do not use the client in the callback to publish, subscribe or&lt;br /&gt;
  // unsubscribe as it may cause deadlocks when other things arrive while&lt;br /&gt;
  // sending and receiving acknowledgments. Instead, change a global variable,&lt;br /&gt;
  // or push to a queue and handle it in the loop after calling `client.loop()`.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void fade() {&lt;br /&gt;
  for (int sig = 0; sig &amp;lt; 3; sig++) {&lt;br /&gt;
    for (int b = 0; b &amp;lt; 255; b++) {&lt;br /&gt;
      pixels.setBrightness(b);&lt;br /&gt;
&lt;br /&gt;
      for (int i = 0; i &amp;lt; NUMPIXELS; i++) {&lt;br /&gt;
        pixels.setPixelColor(i, pixels.Color(250, 150, b));&lt;br /&gt;
      }&lt;br /&gt;
      pixels.show();  // On allume les rubans&lt;br /&gt;
      delay(T);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    for (int b = 255; b &amp;gt; 1; b--) {  //boucle de gestion de la brillance&lt;br /&gt;
      pixels.setBrightness(b);&lt;br /&gt;
&lt;br /&gt;
      // n'oubliez pas que le premier pixel porte le Numéro 0&lt;br /&gt;
      for (int i = 0; i &amp;lt; NUMPIXELS; i++) {  // Pour chaque pixel...&lt;br /&gt;
&lt;br /&gt;
        // pixels.Color() prends les valeurs RGB de 0,0,0 jusqu'à 255,255,255&lt;br /&gt;
        pixels.setPixelColor(i, pixels.Color(b, 50, 255));&lt;br /&gt;
      }&lt;br /&gt;
      pixels.show();  // on affiche les pixels&lt;br /&gt;
      delay(T);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  pixels.begin();  //on initialise le ruban &amp;quot;pixels&amp;quot;&lt;br /&gt;
  pinMode(brocheBouton, INPUT_PULLUP);&lt;br /&gt;
&lt;br /&gt;
  pinMode(2, OUTPUT);&lt;br /&gt;
  digitalWrite(2, HIGH);&lt;br /&gt;
&lt;br /&gt;
  WiFi.begin(ssid, pass);&lt;br /&gt;
&lt;br /&gt;
  // on se connecte au client&lt;br /&gt;
  client.begin(BROKER_IP, 1883, net);  // (IP, port,je ne sais pas à quoi correspond &amp;quot;net&amp;quot;)&lt;br /&gt;
  client.onMessage(messageReceived);&lt;br /&gt;
&lt;br /&gt;
  connect();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  pixels.clear();  // Set all pixel colors to 'off'&lt;br /&gt;
  pixels.show();&lt;br /&gt;
&lt;br /&gt;
  client.loop();&lt;br /&gt;
  delay(10);  // &amp;lt;- fixes some issues with WiFi stability&lt;br /&gt;
&lt;br /&gt;
  if (!client.connected()) {&lt;br /&gt;
    connect();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  // publish a message roughly every second.&lt;br /&gt;
  if (digitalRead(brocheBouton) == LOW) {&lt;br /&gt;
    Serial.println(&amp;quot;Appuis Bouton&amp;quot;);&lt;br /&gt;
    client.publish(&amp;quot;/Poke&amp;quot;, &amp;quot;pokou&amp;quot;);&lt;br /&gt;
    delay(250);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Retours d'expérience==&lt;br /&gt;
ça marche !&lt;br /&gt;
&lt;br /&gt;
shiftr.io, le service MQTT utilisé pour le prototype a une limitation : au bout de 6 heures d'utilisations, le service s'arrête pendant 15 minute !!&lt;br /&gt;
&lt;br /&gt;
==Déjà fait==&lt;br /&gt;
* 18/12/2021 créer notre propre serveur MQTT&lt;br /&gt;
* 20/12/2021 mettre wifimanager pour gérer la configuration de connexion&lt;br /&gt;
* 21/12/2021 site web de sélection de la couleur&lt;br /&gt;
* 22/12/2021 mémorisation de la couleur sélectionnée, publication du code sur Github : https://github.com/antonydbzh/POCLpokou/blob/main/README.md&lt;br /&gt;
&lt;br /&gt;
==Piste de développement à faire pour une V2==&lt;br /&gt;
* évaluer les questions de sécurité&lt;br /&gt;
* imaginer des fonctionnalités supplémentaires (du son façon R2D2, du mouvement )&lt;br /&gt;
* un système de configuration de la couleur (via MQTT et une interface web ?)&lt;br /&gt;
&lt;br /&gt;
===Configuration via MQTT===&lt;br /&gt;
* chaque D1 mini dispose d'un identifiant unique.&lt;br /&gt;
* il est possible de créer un topic MQTT avec cet identifiant qui serait le canal de configuration.&lt;br /&gt;
* le POCL est abonné à ce topic et reçoit donc les infos de configuration qu'il peut stocker dans la mémoire.&lt;br /&gt;
* on peut créer une page web dans laquelle on renseigne l'identifiant et la couleur (ou tout autre paramètre à configurer).&lt;br /&gt;
* la page web envoie la config au topic.&lt;br /&gt;
&lt;br /&gt;
===Mieux, Configuration via la fonctionnalité &amp;quot;Point d'Accès&amp;quot;===&lt;br /&gt;
* rajouter un sélecteur (interrupteur) qui activé, met le D1 mini en mode config.&lt;br /&gt;
* une interface web qui demande la config : wifi, couleur, fonctionnalité,....&lt;br /&gt;
&lt;br /&gt;
===Question de sécurité===&lt;br /&gt;
* le système est très facilement &amp;quot;spamable&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Sources d'infos===&lt;br /&gt;
* www.martyncurrey.com/esp8266-and-C-arduino-ide-part-5-adding-wifimanager/&lt;br /&gt;
* Voir exemple de la bib WiFiManager AutoconnectwithFSparamaters&lt;br /&gt;
&lt;br /&gt;
==Usages==&lt;br /&gt;
* Mobiliser les concepts de Many-to-many au lieu de one-to-one&lt;br /&gt;
* concept de POCL communautaire&lt;br /&gt;
* Un POCL qui a des heures d'ouverture ? (8h à 20h par exemple) ?&lt;br /&gt;
* Conserver le fait d'avoir reçu un pokou ?&lt;br /&gt;
&lt;br /&gt;
==pour tester à partir d'une application==&lt;br /&gt;
l'appli multiplateforme MQTTX : https://mqttx.app/ permet de recevoir et d'envoyer des pokous&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:POCL]]&lt;br /&gt;
[[Catégorie:led]][[Catégorie:ruban de led]][[Catégorie:WS1812B]]&lt;/div&gt;</summary>
		<author><name>Julienrat</name></author>	</entry>

	</feed>