Transformez votre applique murale LED OBEGRÄNSAD en une toile de dessin en direct
Ce logiciel en est à ses débuts et est le premier du genre. Si vous avez quelque chose à améliorer, je serais très heureux d'un PR ou d'un problème :)
Utilisez ce code et ces instructions à vos propres risques ! L'appareil pourrait être endommagé !
Vous pouvez contrôler la lampe avec une interface graphique Web fournie. Vous pouvez obtenir l'adresse IP via la sortie série ou la rechercher dans les paramètres de votre routeur.
Tout d'abord. Ce logiciel a été écrit pour la carte de développement ESP32, mais il devrait également fonctionner avec n'importe quelle autre carte Arduino. Il vous suffit de supprimer le code lié au WiFi, OTA et au serveur Web.
L'ESP32 que j'ai utilisé :
Vérifié pour fonctionner avec TTGO LoRa32 V2.1 (T3_V1.6.1). Remarque : sur l'esp8266, la luminosité par pixel ne fonctionne que lorsque le stockage et la luminosité globale (analogWrite) sont désactivés.
Je suis désolé de le dire, mais vous devrez ouvrir l'arrière de votre lampe, car IKEA n'a pas installé de vis ordinaires ici. J'ai soulevé le dos avec un tournevis entre les vis et l'ai ouvert avec un deuxième objet, mais vous pouvez également percer les rivets pour éviter de casser le panneau arrière.
Après avoir ouvert le dos, vous verrez 4 plaques identiques. Ceux-ci sont équipés chacun de 64 Leds réparties en 4 champs. Nous ne nous intéressons qu'au plus bas. Vous trouverez ici 6 connecteurs sur le bord inférieur, auxquels nous connectons notre carte. Ci-dessus se trouve un microcontrôleur. Vous devez le supprimer car il contient les programmes standards.
Les variables peuvent être trouvées dans include/constants.h
.
include/secrets.h
# pragma once
# define WIFI_HOSTNAME " "
# ifdef ESP8266
# define WIFI_SSID " "
# define WIFI_PASSWORD " "
# endif
# define OTA_USERNAME " "
# define OTA_PASSWORD " "
définissez également le nom d'utilisateur et le mot de passe dans upload.py
, si vous souhaitez utiliser les mises à jour OTA.
Remarque : le gestionnaire WiFi ne fonctionne que sur ESP32. Pour ESP8266, WIFI_SSID
et WIFI_PASSWORD
doivent être fournis dans secrets.h
.
Ce projet utilise le WiFiManager de tzapu. Après le démarrage, l'appareil tentera de se connecter aux points d'accès connus. Si aucun point d'accès connu n'est disponible, l'appareil créera un réseau appelé Ikea Display Setup WiFi
. Connectez-vous à ce réseau sur n'importe quel appareil. Un portail captif apparaîtra et vous guidera tout au long du processus de configuration. Après une connexion réussie, l'appareil redémarre et est prêt à fonctionner.
Le nom du réseau créé peut être modifié en modifiant WIFI_MANAGER_SSID
dans include/constants.h
.
Connectez-les comme ceci et n'oubliez pas de les définir dans include/constants.h
en fonction de votre tableau.
Écran LCD | ESP32 | TTGO LoRa32 | NoeudMCUv2 | Lolin D32 (Pro) |
---|---|---|---|---|
GND | GND | GND | GND | GND |
VCC | 5V | 5V | NIV | USB |
FR (PIN_ENABLE) | GPIO26 | IO22 | GPIO16D0 | GPIO26 |
DANS (PIN_DATA) | GPIO27 | IO23 | GPIO13 D7 | GPIO27 |
CLK (PIN_CLOCK) | GPIO14 | IO02 | GPIO14D5 | GPIO14 |
CLA (PIN_LATCH) | GPIO12 | IO15 | GPIO0D3 | GPIO12 |
BOUTON à une extrémité | GPIO16 | IO21 | GPIO2D4 | GPIO25 |
BOUTON à l'autre extrémité | GND | GND | GND | GND |
Merci à RBEGamer qui montre dans ce numéro comment utiliser le câblage des boutons d'origine. Avec cette solution, vous n'aurez pas besoin de la soudure « BOUTON à une extrémité » et « BOUTON à l'autre extrémité » du tableau ci-dessus.
src
contient le code Arduino.
platformio.ini
si vous le souhaitez. Remplacez l'adresse IP par l'adresse IP de votre appareil. frontend
contient le code Web.
npm i
.env
npm run dev
npm run build
. Cette commande crée le webgui.cpp
pour vous. Construire une interface à l'aide de Docker
docker compose run node
plugins/MonPlugin.h
# pragma once
# include " PluginManager.h "
class MyPlugin : public Plugin {
public:
MyPlugin ();
~MyPlugin () override ;
void setup () override ;
void loop () override ;
const char * getName () const override ;
void teardown () override ; // optional
void websocketHook (DynamicJsonDocument &request) override ; // optional
};
plugins/MonPlugin.cpp
# include " plugins/MyPlugin.h "
MyPlugin::MyPlugin () {
// Constructor logic, if needed
}
void MyPlugin::setup () {
// Setup logic for your plugin
}
void MyPlugin::loop () {
// Loop logic for your plugin
}
const char * MyPlugin::getName () const {
return " MyPlugin " ; // name in GUI
}
void MyPlugin::teardown () {
// code if plugin gets deactivated
}
void MyPlugin::websocketHook (DynamicJsonDocument &request) {
// handle websocket requests
}
main.cpp
. # include " plugins/MyPlugin.h "
pluginManager.addPlugin( new MyPlugin());
Vous pouvez régler le panneau sur DDP à l'aide du bouton ou via l'interface Web. Ce protocole utilise UDP et écoute sur le port 4048 .
Le service LED Display fournit une interface externe simple mais puissante qui permet aux utilisateurs d'afficher des messages et des graphiques sur un écran LED 16x16. Cette fonctionnalité est accessible via des appels HTTP vers le point de terminaison du service.
Pour afficher un message sur l'écran LED, les utilisateurs peuvent envoyer une requête HTTP GET au point de terminaison suivant :
http://your-server/api/message
text
(facultatif) : le message texte à afficher sur l'écran LED.graph
(facultatif) : une liste d’entiers séparés par des virgules représentant un graphique. Les valeurs doivent être comprises entre 0 et 15 et seront visualisées sous forme de graphique sur l'écran LED.miny
(facultatif) : mise à l'échelle pour l'extrémité inférieure du graphique, par défaut 0maxy
(facultatif) : mise à l'échelle pour l'extrémité supérieure du graphique, la valeur par défaut est 15repeat
(facultatif) : le nombre de fois que le message doit être répété. Si elle n'est pas fournie, la valeur par défaut est 1. Définissez cette valeur sur -1 pour répéter à l'infini. Pendant que les messages sont en attente d'affichage, un indicateur LED dans le coin supérieur gauche clignotera.id
(facultatif) : un identifiant unique pour le message. Cela peut être utilisé pour une suppression ou une modification ultérieure du message.delay
(facultatif) : Le nombre de ms de délai entre chaque mouvement de défilement. La valeur par défaut est 50 ms. GET http://your-server/api/message?text=Hello&graph=8,5,2,1,0,0,1,4,7,10,13,14,15,15,14,11&repeat=3&id=1&delay=60
Cet exemple affichera le message "Bonjour" sur l'écran LED avec un graphique correspondant, le répétera trois fois, et lui attribuera l'identifiant 1, attendra 60 ms pendant le défilement.
Pour supprimer un message de l'affichage, les utilisateurs peuvent envoyer une requête HTTP GET au point de terminaison suivant :
http://your-server/api/removemessage
id
(obligatoire) : l'identifiant unique du message à supprimer. GET http://your-server/api/removemessage?id=1
Cet exemple supprimera le message avec l'identifiant 1 de l'écran LED.
Pour récupérer l'état actuel du serveur.
GET http://your-server/api/status
Pour obtenir les métadonnées (fixes), comme le nombre de lignes et de colonnes et une liste des plugins disponibles.
GET http://your-server/api/metadata
Pour définir un plugin actif par ID, effectuez une requête HTTP PATCH au point de terminaison suivant :
PATCH http://your-server/api/plugin
id
(obligatoire) : L'ID du plugin à définir comme actif.200 OK
avec le message "Plugin Set".404 Not Found
avec le message "Plugin not found". Pour définir la luminosité de l'écran LED, effectuez une requête HTTP GET au point de terminaison suivant :
PATCH http://your-server/api/brightness
value
(obligatoire) : La valeur de luminosité (0..255).200 OK
avec le message "Ok".404 Not Found
avec le message « Valeur de luminosité invalide ». Pour obtenir les données actuellement affichées sous forme de tableau d'octets, chaque octet représentant la valeur de luminosité. Sachez que la valeur de luminosité globale est appliquée APRÈS ces valeurs, donc si vous définissez la luminosité globale sur 16, vous obtiendrez toujours des valeurs de 255 de cette façon.
GET http://your-server/api/data