Превратите светодиодный настенный светильник ОБЕГРЭНСАД в живой холст для рисования.
Это программное обеспечение находится на ранней стадии и является моим первым в своем роде. Если вам есть что улучшить, я буду очень рад пиару или проблеме :)
Используйте этот код и инструкции на свой страх и риск! Устройство может быть повреждено!
Вы можете управлять лампой с помощью прилагаемого веб-интерфейса. Вы можете получить IP-адрес через последовательный выход или выполнить поиск в настройках маршрутизатора.
Прежде всего. Это программное обеспечение было написано для платы разработчика ESP32, но оно должно работать и с любой другой платой Arduino. Вам просто нужно удалить код, связанный с Wi-Fi, OTA и веб-сервером.
ESP32, который я использовал:
Проверено для работы с TTGO LoRa32 V2.1 (T3_V1.6.1). Примечание. В esp8266 попиксельная яркость работает только тогда, когда отключены хранилище и глобальная яркость (analogWrite).
Мне жаль это говорить, но вам придется открыть заднюю часть лампы, поскольку IKEA не установила сюда обычные винты. Я поднял заднюю часть с помощью отвертки между винтами и открыл ее вторым предметом, но вы также можете высверлить заклепки, чтобы не сломать заднюю панель.
Открыв заднюю часть, вы увидите 4 одинаковые пластины. Каждый из них оснащен 64 светодиодами в 4 полях. Нас интересует только самый низкий. Здесь вы найдете 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 " "
также установите имя пользователя и пароль внутри upload.py
, если вы хотите использовать обновления OTA.
Примечание. Менеджер Wi-Fi работает только на ESP32. Для ESP8266 WIFI_SSID
и WIFI_PASSWORD
должны быть указаны в secrets.h
.
В этом проекте используется WiFiManager от tzapu. После загрузки устройство попытается подключиться к известным точкам доступа. Если известная точка доступа недоступна, устройство создаст сеть под названием Ikea Display Setup WiFi
. Подключитесь к этой сети на любом устройстве. Откроется авторизованный портал, который проведет вас через процесс настройки. После успешного подключения устройство перезагрузится и будет готово к работе.
Имя созданной сети можно изменить, изменив WIFI_MANAGER_SSID
в include/constants.h
.
Подключите их следующим образом и не забудьте установить их в include/constants.h
в соответствии с вашей платой.
ЖК-дисплей | ЭСП32 | ТТГО ЛоРа32 | NodeMCUv2 | Лолин D32 (Про) |
---|---|---|---|---|
Земля | Земля | Земля | Земля | Земля |
ВКК | 5В | 5В | ВИН | USB |
РУ (PIN_ENABLE) | GPIO26 | ИО22 | ГПИО16 Д0 | GPIO26 |
ВХОД (ПИН_ДАННЫЕ) | GPIO27 | ИО23 | GPIO13 D7 | GPIO27 |
CLK (PIN_CLOCK) | GPIO14 | IO02 | GPIO14 D5 | GPIO14 |
CLA (PIN_LATCH) | GPIO12 | IO15 | GPIO0 D3 | GPIO12 |
КНОПКА на одном конце | GPIO16 | ИО21 | GPIO2 D4 | GPIO25 |
КНОПКА другой конец | Земля | Земля | Земля | Земля |
Спасибо RBEGamer, который в этом выпуске показывает, как использовать оригинальную проводку кнопок. Благодаря этому решению вам не понадобится пайка «КНОПКА на одном конце» и «КНОПКА на другом конце», как указано в таблице выше.
src
содержит код Arduino.
platformio.ini
. Замените IP на IP вашего устройства. frontend
содержит веб-код.
npm i
.env
npm 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());
Установить панель на DDP можно с помощью кнопки или через веб-интерфейс. Этот протокол использует UDP и прослушивает порт 4048 .
Служба светодиодного дисплея предоставляет простой, но мощный внешний интерфейс, который позволяет пользователям отображать сообщения и графики на светодиодном дисплее размером 16x16. Доступ к этой функции можно получить через HTTP-вызовы к конечной точке службы.
Чтобы отобразить сообщение на светодиодном дисплее, пользователи могут отправить HTTP-запрос GET к следующей конечной точке:
http://your-server/api/message
text
(необязательно): текстовое сообщение, отображаемое на светодиодном дисплее.graph
(необязательно): список целых чисел, разделенных запятыми, представляющих график. Значения должны находиться в диапазоне от 0 до 15 и будут отображаться в виде графика на светодиодном дисплее.miny
(необязательно): масштабирование для нижнего конца графика, по умолчанию равно 0.maxy
(необязательно): масштабирование верхнего края графика, по умолчанию 15.repeat
(необязательно): количество раз, которое сообщение должно быть повторено. Если оно не указано, значение по умолчанию — 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
В этом примере сообщение «Привет» будет отображаться на светодиодном дисплее с соответствующим графиком, повторяться три раза и присваиваться ему идентификатор 1, при прокрутке ждать 60 мс.
Чтобы удалить сообщение с дисплея, пользователи могут отправить HTTP-запрос GET к следующей конечной точке:
http://your-server/api/removemessage
id
(обязательно): уникальный идентификатор сообщения, которое необходимо удалить. GET http://your-server/api/removemessage?id=1
В этом примере сообщение с идентификатором 1 будет удалено со светодиодного дисплея.
Чтобы получить текущий статус сервера.
GET http://your-server/api/status
Чтобы получить (фиксированные) метаданные, такие как количество строк и столбцов, а также список доступных плагинов.
GET http://your-server/api/metadata
Чтобы установить активный плагин по идентификатору, отправьте запрос HTTP PATCH к следующей конечной точке:
PATCH http://your-server/api/plugin
id
(обязательно): идентификатор плагина, который нужно сделать активным.200 OK
с сообщением «Набор плагинов».404 Not Found
с сообщением «Плагин не найден». Чтобы установить яркость светодиодного дисплея, выполните HTTP-запрос GET к следующей конечной точке:
PATCH http://your-server/api/brightness
value
(обязательно): значение яркости (0..255).200 OK
с сообщением «ОК».404 Not Found
с сообщением «Недопустимое значение яркости». Чтобы получить текущие отображаемые данные в виде массива байтов, каждый байт представляет значение яркости. Имейте в виду, что значение глобальной яркости применяется ПОСЛЕ этих значений, поэтому, если вы установите глобальную яркость на 16, вы все равно получите значение 255 таким образом.
GET http://your-server/api/data