將您的 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。當訊息等待顯示時,左上角的指示燈將會閃爍。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