Sommaire
Dans ce tutoriel nous allons créer un encodeur rotatif connecté pour piloter tout type de chose comme le volume ou la luminosité de vos ordinateurs Windows par exemple grâce au package WindowsControl.
Pour cela nous allons utiliser un encodeur rotatif aussi nommé potentiomètre angulaire comme le KY-040 (comptez entre 50 cts et 2 euros pièce) avec un ESP8266 connecté en Wifi à votre Constellation.
Prérequis
Pour réaliser ce tutoriel, il nous faut :
- Un ESP8266, ici nous utilisons un D1 Mini Pro
- Un encodeur rotatif KY-040
- Un serveur Constellation
- Le package WindowsControl déployé sur au moins une sentinelle Windows
Etape 1 : créer un encodeur rotatif connecté
Le KY-040 a 5 pins : deux pour l’alimentation (5V et Gnd), deux pour l’encodeur rotatif (CLK et DT) et un dernier pour le bouton (lorsque l’on pousse sur le potentiomètre).
Nous allons donc tout simplement connecter les pin 5V et Gnd sur le port 5V et Gnd de notre D1 Mini Pro. Les pins CLK et DT respectivement sur les ports D1 et D2 et le switch (pin SW) sur le port D3.
Vous pouvez optionnellement habiller le potentiomètre avec un bouchon, ci-dessous récupéré sur une veille chaine Hifi :
Votre encodeur est prêt, il ne reste plus qu’à le programmer.
Etape 2 : programmer l’ESP8266
Pour démarrer vous devez dans Constellation déclarer une sentinelle associée à une clé d’accès et un package virtuel. Ici notre ESP8266 est représenté par la sentinelle nommée “ESP8266” et le package virtuel se nomme “RotaryController”.
Dans l’Arduino IDE, nous créons un nouveau projet à partir du Starter Kit Constellation pour ESP8266 dans lequel nous allons définir le nom de notre réseau Wifi (SSID) ainsi que sa clé d’accès puis nous configurerons le client Constellation en spécifiant l’identité de notre package virtuel, sa clé d’accès et l’adresse/port de notre serveur Constellation :
1 2 3 4 5 6 7 |
// ESP8266 Wifi #include <ESP8266WiFi.h> char ssid[] = "MON SSID"; char password[] = "macléWifi!!!!"; // Constellation client Constellation<WiFiClient> constellation("X.X.X.X", 8088, "ESP8266", "RotaryController", "xxxxxxxxxxxxxxxxx"); |
Encore une fois si tout cela est nouveau pour vous, je vous recommande de suivre ce guide d’introduction à l’API Constellation pour Arduino/ESP8266.
Maintenant que la coquille de notre package virtuel sur ESP8266 est prête, ajoutons une librairie pour interpréter les signaux du KY-040 (inputs CLK et DT) pour connaitre et mesurer le mouvement du potentiomètre.
Dans le gestionnaire de bibliothèque (menu Croquis > Inclure une bibliothèque), installez la librairie “Encoder” de Paul Stoffregen et ajoutez-la dans votre code avant de déclarer une variable de type “Encoder” que nous nommerons “encoder”.
Pour rappel nous avons connecté le KY-040 sur les ports D1 (CLK) et D2 (DT) et le bouton sur D3 (SW) :
1 2 3 4 |
#include <Encoder.h> Encoder encoder(D1, D2); int pinSW = D3; |
Le bouton poussoir du potentiomètre est un simple bouton poussoir connecté en « pull-up » (à la masse). Il n’est donc pas traité par la librairie « Encoder » et sera interprété avec un simple « digitalRead« .
Toujours dans l’entête de votre code, configurons les valeurs par défaut suivantes :
1 2 3 4 5 |
// Default values static String target = "WindowsControl"; static String mcbUp = "VolumeUp"; static String mcbDown = "VolumeDown"; static String mcbPush = "Mute"; |
Ici on configure où on va envoyer le message, par défaut au scope du package « WindowsControl ».
A ce package « WindowsControl » on enverra :
- Un message « VolumeUp » si le potentiomètre « monte »
- Un message « VolumeDown » si le potentiomètre « descend »
- Un message « Mute » si on pousse le potentiomètre « monte »
C’est à dire que par défaut, notre potentiomètre connecté contrôlera le volume des PC Windows où le package WindowsControl est déployé. On pourra par la suite personnaliser ces actions dans les settings comme nous le verrons ci-dessous.
Entrons maintenant dans le code de la méthode « setup()« . Ajoutons la ligne suivante pour initialiser l’entrée D3 où est connecté le bouton poussoir :
1 2 |
// Init I/O pinMode(pinSW, INPUT_PULLUP); |
Enregistrons ensuite un MessageCallback « ReloadSettings » pour permettre de recharger la configuration « à la volée » sans devoir redémarrer notre EPS. Ce MessageCallback se charge d’invoquer la fonction « loadSettings()« .
De plus, à la fin de notre méthode « setup() » invoquons cette méthode « loadSettings() » pour charger la configuration au démarrage.
1 2 3 4 5 6 7 8 9 10 |
// ReloadSettings MessageCallback constellation.registerMessageCallback("ReloadSettings", MessageCallbackDescriptor().setDescription("Reload the settings"), [](JsonObject& json) { loadSettings(); constellation.writeInfo("Settings reloaded"); }); constellation.declarePackageDescriptor(); // Load settings on start loadSettings(); |
Cette méthode « loadSettings() » récupère les settings sur le serveur Constellation et écrase la valeur par défaut si le setting est défini sur le serveur.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
void loadSettings() { JsonObject& settings = constellation.getSettings(); if(settings.containsKey("Target")) { target = String(settings["Target"].asString()); } if(settings.containsKey("OnUp")) { mcbUp = String(settings["OnUp"].asString()); } if(settings.containsKey("OnDown")) { mcbDown = String(settings["OnDown"].asString()); } if(settings.containsKey("OnPush")) { mcbPush = String(settings["OnPush"].asString()); } } |
De ce fait par défaut, notre potentiomètre connecté invoque le MessageCallback « VolumeUp » sur le package « WindowsControl » lorsque l’on tourne à droite, « VolumeDown » à gauche ou « Mute » lorsqu’on appuie dessus. Il suffira d’ajouter/modifier les settings de notre package virtuel depuis la Console Constellation pour modifier ces actions.
Il ne reste plus qu’à définir le code de la boucle principale, la fonction « loop()« .
Celle-ci lit la valeur de l’encodeur rotatif et envoi les messages dans Constellation en cas de montée ou de descente. La boucle lit également la valeur de l’entrée D3 pour envoyer le message en cas d’appui sur le potentiomètre.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
void loop(void) { constellation.loop(); static long lastValue = -1; long value = encoder.read(); if (value != lastValue && abs(value - lastValue) >= 4) { if(lastValue > value) { Serial.println("Up"); constellation.sendMessage(Package, target.c_str(), mcbUp.c_str(), "{}"); } else { Serial.println("Down"); constellation.sendMessage(Package, target.c_str(), mcbDown.c_str(), "{}"); } lastValue = value; } static int lastButtonState = LOW; int buttonState = digitalRead(pinSW); if (buttonState != lastButtonState && buttonState == LOW) { Serial.println("Push"); constellation.sendMessage(Package, target.c_str(), mcbPush.c_str(), "{}"); } lastButtonState = buttonState; } |
Et voilà votre potentiomètre connecté est opérationnel !
Démos
Piloter le volume de vos PC
Une fois le programme téléversé sur votre ESP8266, vous pouvez tourner le potentiomètre à gauche ou à droite pour diminuer ou augmenter le volume. Si vous appuyez sur le bouton, vous alternez entre les modes « mute/un-mute ».
Par contre si vous avez déployé le package WindowsControl sur plusieurs de vos sentinelles, vous contrôlerez simultanément le volume sur TOUTES vos sentinelles comme le montre l’animation ci-dessus.
Souvenez-vous du concept d’instance, ici notre ESP8266 envoie un message au scope « WindowsControl », c’est donc TOUTES les instances du package « WindowsControl » qui recevrons le message.
Piloter le volume d’un PC en particulier
Pour contrôler le volume d’un PC en particulier, il faut envoyer les messages au scope d’une instance du « WindowsControl » en particulier.
Pour cela nous devez spécifier l’instance selon la nomenclature suivante : « SENTINEL/Package ».
Par exemple, le nom de la sentinelle sur laquelle est déployée le package WindowsControl est « PC-SEB_UI ». Il faudra donc que j’envoie les messages au package « PC-SEB_UI/WindowsControl » pour contrôler le volume de mon ordinateur « PC-SEB » et non de tous.
Comme nous avons créé un système personnalisable en se servant des settings Constellation, il me suffit, depuis la Console Constellation, d’ajouter le setting que nous avons nommé « Target » pour définir le nom du scope où envoyer les messages :
Et voilà, désormais je ne pilote que le volume de cette machine en particulier et non de toutes mes machines.
Piloter la luminosité d’un PC
Si on observe les MessageCallbacks du package WindowsControl, on constate qu’il expose d’autre MCs dont « BrightnessUp » et « BrightnessDown » pour augmenter ou diminuer la luminosité.
Avec notre code se base sur les settings, nous pouvons modifier le nom des MC à invoquer en ajoutant/modifiant les settings du package.
Ajoutons donc deux settings nommés « OnUp » et « OnDown » respectivement définis avec les valeurs « BrightnessUp » et « BrightnessDown ». Invoquons ensuite le MC « ReloadSettings » sur notre package virtuel ou bien appuyez sur le bouton « Reset » de votre ESP8266 pour le redémarrer et donc recharger les settings :
Désormais notre potentiomètre connecté pilotera la luminosité :
Pour aller plus loin …
Comme vous l’avez vu, notre potentiomètre est entièrement personnalisable car le nom des MC à invoquer en cas de montée, descente ou d’appui sur le potentiomètre est personnalisable dans les settings.
Ici on pilote le volume ou la luminosité d’un Windows grâce au package WindowsControl, mais on pourrait également piloter tout type de chose : l’intensité d’une lampe, le thermostat, le toit ouvrant d’une voiture ou bien des valeurs de vos programmes ou pages Web, par exemple le slider d’une page HTML !
Libre à votre imagination 😉
Démarrez la discussion sur le forum Constellation