Convierte tu lámpara de pared LED OBEGRÄNSAD en un lienzo de dibujo en vivo
Este software se encuentra en una etapa inicial y es el primero de su tipo. Si tienes algo que mejorar, me alegraría mucho un PR o un problema :)
Utilice este código e instrucciones bajo su propia responsabilidad. ¡El aparato podría sufrir daños!
Puede controlar la lámpara con una GUI web suministrada. Puede obtener la IP a través de la salida en serie o puede buscarla en la configuración de su enrutador.
En primer lugar. Este software fue escrito para la placa de desarrollo ESP32, pero también debería funcionar con cualquier otra placa Arduino. Sólo necesita eliminar el código relacionado con WiFi, OTA y servidor web.
El ESP32 que usé:
Verificado para funcionar con TTGO LoRa32 V2.1 (T3_V1.6.1). Nota: En esp8266, el brillo por píxel solo funciona cuando el almacenamiento y el brillo global (escritura analógica) están deshabilitados.
Lamento decir esto, pero tendrás que abrir la parte posterior de tu lámpara, ya que IKEA no instaló tornillos normales aquí. Levanté la parte trasera con un destornillador entre los tornillos y la abrí con un segundo objeto, pero también puedes perforar los remaches para evitar romper el panel trasero.
Después de abrir la parte trasera, verá 4 placas idénticas. Cada uno de ellos está equipado con 64 LED en 4 campos. Sólo nos interesa el más bajo. Aquí encontrarás 6 conectores en el borde inferior, a los que conectamos nuestra placa. Arriba hay un microcontrolador. Tienes que eliminarlo porque contiene los programas estándar.
Las variables se pueden encontrar dentro de 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 " "
También configure el nombre de usuario y la contraseña dentro de upload.py
, si desea utilizar actualizaciones OTA.
Nota: El administrador de WiFi solo funciona en ESP32. Para ESP8266, WIFI_SSID
y WIFI_PASSWORD
deben proporcionarse en secrets.h
.
Este proyecto utiliza WiFiManager de tzapu. Después de iniciarse, el dispositivo intentará conectarse a puntos de acceso conocidos. Si no hay ningún punto de acceso conocido disponible, el dispositivo creará una red llamada Ikea Display Setup WiFi
. Conéctese a esta red en cualquier dispositivo. Aparecerá un portal cautivo que lo guiará a través del proceso de configuración. Después de una conexión exitosa, el dispositivo se reiniciará y estará listo para funcionar.
El nombre de la red creada se puede cambiar modificando WIFI_MANAGER_SSID
en include/constants.h
.
Conéctalos así y recuerda configurarlos en include/constants.h
según tu tablero.
LCD | ESP32 | TTGO LoRa32 | NodoMCUv2 | Lolín D32 (Pro) |
---|---|---|---|---|
Tierra | Tierra | Tierra | Tierra | Tierra |
VCC | 5V | 5V | Número de bastidor | USB |
ES (PIN_ENABLE) | GPIO26 | IO22 | GPIO16D0 | GPIO26 |
EN (PIN_DATOS) | GPIO27 | IO23 | GPIO13 D7 | GPIO27 |
CLK (PIN_RELOJ) | GPIO14 | IO02 | GPIO14D5 | GPIO14 |
CLA (PIN_LATCH) | GPIO12 | IO15 | GPIO0 D3 | GPIO12 |
BOTÓN un extremo | GPIO16 | IO21 | GPIO2D4 | GPIO25 |
BOTÓN otro extremo | Tierra | Tierra | Tierra | Tierra |
Gracias a RBEGamer que muestra en esta edición cómo utilizar el cableado del botón original. Con esta solución no necesitarás soldar el "BOTÓN en un extremo" y el "BOTÓN en el otro extremo" de la tabla anterior.
src
contiene el código arduino.
platformio.ini
si lo deseas. Reemplace la IP con la IP de su dispositivo. frontend
contiene el código web.
npm i
.env
npm run dev
npm run build
. Este comando crea webgui.cpp
por usted. Construir interfaz usando Docker
docker compose run node
complementos/MiPlugin.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
};
complementos/MyPlugin.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());
Puede configurar el panel en DDP usando el botón o mediante la interfaz web. Este protocolo utiliza UDP y escucha en el puerto 4048 .
El servicio LED Display proporciona una interfaz externa simple pero poderosa que permite a los usuarios mostrar mensajes y gráficos en una pantalla LED de 16x16. Se puede acceder a esta funcionalidad a través de llamadas HTTP al punto final del servicio.
Para mostrar un mensaje en la pantalla LED, los usuarios pueden realizar una solicitud HTTP GET al siguiente punto final:
http://your-server/api/message
text
(opcional): El mensaje de texto que se mostrará en la pantalla LED.graph
(opcional): una lista de números enteros separados por comas que representan un gráfico. Los valores deben estar en el rango de 0 a 15 y se visualizarán como un gráfico en la pantalla LED.miny
(opcional): escala para el extremo inferior del gráfico, el valor predeterminado es 0maxy
(opcional): escala para el extremo superior del gráfico, el valor predeterminado es 15repeat
(opcional): la cantidad de veces que se debe repetir el mensaje. Si no se proporciona, el valor predeterminado es 1. Establezca este valor en -1 para que se repita infinitamente. Mientras los mensajes están pendientes de visualización, un indicador LED en la esquina superior izquierda parpadeará.id
(opcional): un identificador único para el mensaje. Esto se puede utilizar para eliminar o modificar posteriormente el mensaje.delay
(opcional): el número de ms de retraso entre cada movimiento de desplazamiento. El valor predeterminado es 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
Este ejemplo mostrará el mensaje "Hola" en la pantalla LED con el gráfico correspondiente, lo repetirá tres veces y le asignará el identificador 1, espera 60 ms mientras se desplaza.
Para eliminar un mensaje de la pantalla, los usuarios pueden realizar una solicitud HTTP GET al siguiente punto final:
http://your-server/api/removemessage
id
(obligatorio): el identificador único del mensaje que se va a eliminar. GET http://your-server/api/removemessage?id=1
Este ejemplo eliminará el mensaje con el identificador 1 de la pantalla LED.
Para recuperar el estado actual del servidor.
GET http://your-server/api/status
Para obtener los metadatos (fijos), como el número de filas y columnas y una lista de complementos disponibles.
GET http://your-server/api/metadata
Para configurar un complemento activo por ID, realice una solicitud HTTP PATCH al siguiente punto final:
PATCH http://your-server/api/plugin
id
(obligatorio): el ID del complemento que se establecerá como activo.200 OK
con el mensaje "Conjunto de complementos".404 Not Found
con el mensaje "Complemento no encontrado". Para configurar el brillo de la pantalla LED, realice una solicitud HTTP GET al siguiente punto final:
PATCH http://your-server/api/brightness
value
(obligatorio): El valor de brillo (0..255).200 OK
con el mensaje "Ok".404 Not Found
con el mensaje "Valor de brillo no válido". Para obtener los datos mostrados actualmente como una matriz de bytes, cada byte representa el valor de brillo. Tenga en cuenta que el valor de brillo global se aplica DESPUÉS de estos valores, por lo que si establece el brillo global en 16, seguirá obteniendo valores de 255 de esta manera.
GET http://your-server/api/data