将您的 OBEGRäNSAD LED 壁灯变成动态画布
该软件还处于早期阶段,是我的第一个此类软件。如果您有任何需要改进的地方,我会非常高兴收到 PR 或问题:)
使用此代码和说明的风险由您自行承担!设备可能会损坏!
您可以使用提供的 Web GUI 控制灯。您可以通过串行输出获取 IP,也可以在路由器设置中搜索它。
首先。该软件是为 ESP32 开发板编写的,但它也应该适用于任何其他 Arduino 板。您只需删除 WiFi、OTA 和 Web 服务器相关代码即可。
我使用的ESP32:
已验证可与 TTGO LoRa32 V2.1 (T3_V1.6.1) 配合使用。注意:在 esp8266 上,每像素亮度仅在存储和全局亮度(analogWrite)禁用时才起作用。
我很抱歉这么说,但你必须撬开灯的背面,因为宜家没有在这里安装常规螺丝。我用螺丝刀在螺钉之间抬起背面,然后用第二个物体将其撬开,但您也可以钻出铆钉以避免损坏背板。
打开后盖,你会看到4块一模一样的盘子。它们分别在 4 个区域中配备了 64 个 LED。我们只对最低的一个感兴趣。在这里,您会在底部边缘找到 6 个连接器,我们将其连接到我们的板。上面是一个微控制器。您必须删除它,因为它包含标准程序。
变量可以在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 " "
如果您想使用 OTA 更新,还可以在upload.py
中设置用户名和密码。
注意: WiFi 管理器仅适用于 ESP32。对于 ESP8266,需要在secrets.h
中提供WIFI_SSID
和WIFI_PASSWORD
。
该项目使用 tzapu 的 WiFiManager。启动后,设备将尝试连接到已知的接入点。如果没有可用的已知接入点,设备将创建一个名为Ikea Display Setup WiFi
网络。在任何设备上连接到该网络。将弹出一个强制门户,并引导您完成配置过程。连接成功后,设备将重新启动并准备就绪。
可以通过修改include/constants.h
中的WIFI_MANAGER_SSID
来更改创建的网络的名称。
像这样连接它们,并记住根据您的板将它们设置在include/constants.h
中。
液晶显示屏 | ESP32 | TTGO LoRa32 | NodeMCUv2 | 洛林D32(专业版) |
---|---|---|---|---|
接地 | 接地 | 接地 | 接地 | 接地 |
电压控制电路 | 5V | 5V | 车架号 | USB |
EN (PIN_ENABLE) | GPIO26 | IO22 | GPIO16 D0 | GPIO26 |
输入(PIN_数据) | GPIO27 | IO23 | GPIO13 D7 | GPIO27 |
时钟(PIN_CLOCK) | GPIO14 | IO02 | GPIO14 D5 | GPIO14 |
CLA(PIN_LATCH) | GPIO12 | IO15 | GPIO0 D3 | GPIO12 |
纽扣一端 | GPIO16 | IO21 | GPIO2 D4 | GPIO25 |
按钮另一端 | 接地 | 接地 | 接地 | 接地 |
感谢 RBEGamer 在本期中展示了如何使用原始按钮接线。使用此解决方案,您将不需要上表中的“按钮一端”和“按钮另一端”焊接。
src
包含 arduino 代码。
platformio.ini
中 OTA 行的注释。将 IP 替换为您的设备 IP。 frontend
包含网络代码。
npm i
.env
文件中设置您的设备 IPnpm run dev
启动服务器npm run build
构建它。此命令为您创建webgui.cpp
。使用Docker
构建前端
docker compose run node
插件/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
};
插件/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());
您可以使用 按钮或通过 Web 界面将面板设置为 DDP。该协议使用UDP并侦听端口4048 。
LED 显示服务提供了一个简单但功能强大的外部接口,允许用户在 16x16 LED 显示屏上显示消息和图表。可以通过对服务端点的 HTTP 调用来访问此功能。
要在 LED 显示屏上显示消息,用户可以向以下端点发出 HTTP GET 请求:
http://your-server/api/message
text
(可选):要在 LED 显示屏上显示的文本消息。graph
(可选):表示图的以逗号分隔的整数列表。这些值应在 0 到 15 的范围内,并将在 LED 显示屏上以图表形式显示。miny
(可选):图表下端的缩放,默认为 0maxy
(可选):图表上端的缩放,默认为 15repeat
(可选):消息应重复的次数。如果未提供,则默认值为 1。将此值设置为 -1 以无限重复。当消息等待显示时,左上角的指示灯将会闪烁。id
(可选):消息的唯一标识符。这可用于稍后删除或修改消息。delay
(可选):每次滚动移动之间的延迟毫秒数。默认值为 50 毫秒。 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
此示例将在 LED 显示屏上显示消息“Hello”以及相应的图形,重复 3 次,并为其分配标识符 1,滚动时等待 60ms。
要从显示中删除消息,用户可以向以下端点发出 HTTP GET 请求:
http://your-server/api/removemessage
id
(必填):要删除的消息的唯一标识符。 GET http://your-server/api/removemessage?id=1
此示例将从 LED 显示屏上删除标识符为 1 的消息。
检索服务器的当前状态。
GET http://your-server/api/status
获取(固定)元数据,例如行数和列数以及可用插件的列表。
GET http://your-server/api/metadata
要按 ID 设置活动插件,请向以下端点发出 HTTP PATCH 请求:
PATCH http://your-server/api/plugin
id
(必需):要设置为活动的插件的 ID。200 OK
,显示消息“插件集”。404 Not Found
,消息“未找到插件”。 要设置 LED 显示屏的亮度,请向以下端点发出 HTTP GET 请求:
PATCH http://your-server/api/brightness
value
(必填):亮度值 (0..255)。200 OK
并显示消息“Ok”。404 Not Found
并显示消息“无效亮度值”。 以字节数组的形式获取当前显示的数据,每个字节代表亮度值。请注意,全局亮度值在这些值之后应用,因此如果将全局亮度设置为 16,您仍会以这种方式获得 255 的值。
GET http://your-server/api/data