Transforme sua luminária de parede LED OBEGRÄNSAD em uma tela de desenho viva
Este software está em um estágio inicial e é o primeiro desse tipo. Se você tiver algo a melhorar, ficaria muito feliz com um PR ou um problema :)
Use este código e instruções por sua própria conta e risco! O dispositivo pode ser danificado!
Você pode controlar a lâmpada com uma GUI da web fornecida. Você pode obter o IP via saída serial ou pesquisá-lo nas configurações do roteador.
Em primeiro lugar. Este software foi escrito para a placa ESP32 Dev, mas também deve funcionar com qualquer outra placa Arduino. Você só precisa remover o código relacionado ao WiFi, OTA e ao servidor web.
O ESP32 que usei:
Verificado para funcionar com TTGO LoRa32 V2.1 (T3_V1.6.1). Nota: No esp8266 o brilho por pixel só funciona quando o armazenamento e o brilho global (analogWrite) estão desabilitados.
Lamento dizer isso, mas você terá que abrir a parte de trás da sua lâmpada, pois a IKEA não instalou parafusos normais aqui. Levantei a parte traseira com uma chave de fenda entre os parafusos e abri-a com um segundo objeto, mas você também pode perfurar os rebites para evitar quebrar o painel traseiro.
Depois de abrir a parte traseira, você verá 4 placas idênticas. Cada um deles está equipado com 64 Leds em 4 campos. Estamos interessados apenas no mais baixo. Aqui você encontrará 6 conectores na borda inferior, aos quais conectamos nossa placa. Acima está um microcontrolador. Você tem que removê-lo, porque contém os programas padrão.
As variáveis podem ser encontradas 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 " "
também defina nome de usuário e senha dentro de upload.py
, se quiser usar atualizações OTA.
Nota: O gerenciador WiFi só funciona no ESP32. Para ESP8266, WIFI_SSID
e WIFI_PASSWORD
precisam ser fornecidos em secrets.h
.
Este projeto usa WiFiManager do tzapu. Após a inicialização, o dispositivo tentará se conectar a pontos de acesso conhecidos. Se nenhum ponto de acesso conhecido estiver disponível, o dispositivo criará uma rede chamada Ikea Display Setup WiFi
. Conecte-se a esta rede em qualquer dispositivo. Um portal cativo aparecerá e o guiará pelo processo de configuração. Após uma conexão bem-sucedida, o dispositivo será reiniciado e estará pronto para funcionar.
O nome da rede criada pode ser alterado modificando WIFI_MANAGER_SSID
em include/constants.h
.
Conecte-os assim e lembre-se de configurá-los em include/constants.h
de acordo com sua placa.
LCD | ESP32 | TTGO LoRa32 | NóMCUv2 | Lolin D32 (Pró) |
---|---|---|---|---|
GND | GND | GND | GND | GND |
CCV | 5V | 5V | VIN | USB |
PT (PIN_ENABLE) | GPIO26 | IO22 | GPIO16 D0 | GPIO26 |
IN (PIN_DATA) | GPIO27 | IO23 | GPIO13 D7 | GPIO27 |
CLK (PIN_CLOCK) | GPIO14 | IO02 | GPIO14 D5 | GPIO14 |
CLA (PIN_LATCH) | GPIO12 | IO15 | GPIO0 D3 | GPIO12 |
BOTÃO uma extremidade | GPIO16 | IO21 | GPIO2 D4 | GPIO25 |
BOTÃO outra extremidade | GND | GND | GND | GND |
Obrigado ao RBEGamer que está mostrando nesta edição como usar a fiação original dos botões. Com esta solução você não precisará da soldagem "BOTÃO em uma extremidade" e "BOTÃO na outra extremidade" da tabela acima.
src
contém o código do Arduino.
platformio.ini
se desejar. Substitua o IP pelo IP do seu dispositivo. frontend
contém o código da web.
npm i
.env
npm run dev
npm run build
. Este comando cria o webgui.cpp
para você. Construir front-end usando Docker
docker compose run node
plug-ins/MyPlugin.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/MeuPlugin.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());
Você pode configurar o painel para DDP usando o botão ou através da interface web. Este protocolo usa UDP e escuta na porta 4048 .
O serviço LED Display fornece uma interface externa simples, mas poderosa, que permite aos usuários exibir mensagens e gráficos em um display LED 16x16. Essa funcionalidade pode ser acessada por meio de chamadas HTTP para o terminal em serviço.
Para exibir uma mensagem no display LED, os usuários podem fazer uma solicitação HTTP GET para o seguinte endpoint:
http://your-server/api/message
text
(opcional): A mensagem de texto a ser exibida no display LED.graph
(opcional): uma lista de inteiros separados por vírgula que representa um gráfico. Os valores deverão estar na faixa de 0 a 15 e serão visualizados em forma de gráfico no display LED.miny
(opcional): escala para a extremidade inferior do gráfico, o padrão é 0maxy
(opcional): escala para a extremidade superior do gráfico, o padrão é 15repeat
(opcional): O número de vezes que a mensagem deve ser repetida. Se não for fornecido, o padrão será 1. Defina esse valor como -1 para repetir infinitamente. Enquanto as mensagens estiverem pendentes para exibição, um led indicador no canto superior esquerdo piscará.id
(opcional): um identificador exclusivo para a mensagem. Isso pode ser usado para remoção ou modificação posterior da mensagem.delay
(opcional): O número de ms de atraso entre cada movimento de rolagem. O padrão é 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 exemplo exibirá a mensagem “Hello” no display LED com um gráfico correspondente, repetirá três vezes e atribuirá o identificador 1, aguardará 60 ms enquanto rola.
Para remover uma mensagem da exibição, os usuários podem fazer uma solicitação HTTP GET para o seguinte endpoint:
http://your-server/api/removemessage
id
(obrigatório): O identificador exclusivo da mensagem a ser removida. GET http://your-server/api/removemessage?id=1
Este exemplo removerá a mensagem com o identificador 1 do display LED.
Para recuperar o status atual do servidor.
GET http://your-server/api/status
Para obter os metadados (fixos), como número de linhas e colunas e uma lista de plugins disponíveis.
GET http://your-server/api/metadata
Para definir um plugin ativo por ID, faça uma solicitação HTTP PATCH para o seguinte endpoint:
PATCH http://your-server/api/plugin
id
(obrigatório): O ID do plugin a ser definido como ativo.200 OK
com a mensagem "Plugin Set".404 Not Found
com a mensagem "Plugin não encontrado". Para definir o brilho do display LED, faça uma solicitação HTTP GET para o seguinte endpoint:
PATCH http://your-server/api/brightness
value
(obrigatório): O valor do brilho (0..255).200 OK
com a mensagem "Ok".404 Not Found
com a mensagem "Valor de brilho inválido". Para obter os dados atuais exibidos como uma matriz de bytes, cada byte representando o valor do brilho. Esteja ciente de que o valor do brilho global é aplicado APÓS esses valores, portanto, se você definir o brilho global como 16, ainda obterá valores de 255 dessa forma.
GET http://your-server/api/data