У меня на кухне есть дисплеи на плите, на микроволновке и на холодильнике, но все они требуют отдельной ручной настройки и не умеют показывать ничего, кроме времени. Да и то через пару месяцев оказывается что все показывают разное. С помощью этого проекта мы добавим к ним еще один дисплей и покажем как отображать на нем время с точностью до секунды, текущую погоду и прогноз на сегодня.
- WEMOS D1 mini
- WEMOS OLED Shield
- Мелкие запчасти
Из магазина нам приходят компонетны в таком виде: Воспользовавшись паяльником, собираем наш убердевайс Проследите, чтобы платы не соприкасались
Идем на сайт NodeMCU custom builds выбираем там ветку dev (мы же хотим использовать последние фичи). Выбираем там необходимые модули. Нам понадобятся: file,i2c,mqtt,net,node,sjson,tmr,u8g,uart,wifi,tls
. Выбираем драйвер дисплея, в нашем случае это ssd1306_64x48_i2c
и шрифты по вкусу, кириллические символы находятся в font_unifont_0_8
. Через некоторое время на почту приходит письмо с ссылкой на скомпилированную прошивку. Если вам лень этим заниматься можете взять уже собранную. Заливаем ее с помощью esptool: esptool.py --port /dev/ttyUSB0 write_flash -fm dio -fs 32m 0x00000 nodemcu-dev-13-modules-2017-04-24-09-58-48-integer.bin
. Наш девайс готов к программированию на lua.
С помощью приложенного Makefile или любым другим способом загружаем код из репозитория в устройство. В файле config.json определяем настройки для нашей беспроводной сети и MQTT брокера. Так же загружаем его.
Наше устройство подключается к брокеру и подписывается на топик oled/events/+
. Модуль ожидает получить в качестве тела сообщения JSON представляющий собой массив объектов примерно такого вида:
[
{
"text":"13:12:34",
"x":0,
"y":11,
"type":"text",
"font":"font_6x10"
},
{
"text":15 C,
"x":2,
"y":29,
"font":"font_unifont_0_8",
"type":"text"
},
{
"text":"15 16 C",
"x":2,
"y":47,
"type":"text",
"font":"font_unifont_0_8"
},
{
"type":"image",
"image":{
"type":"Buffer",
"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,6,0,8,2,1,56,192,1,48,206,0,128,31,0,192,49,0,96,96,0,102,96,10,103,96,15,96,96,0,192,48,0,192,63,0,128,15,0,56,192,1,24,128,1,0,6,0,0,6,0,0,6,0,0,0,0]
},
"x":40,
"y":12,
"w":24,
"h":24
}
]
Поле type может принимать значения text, image, gird
. В последнем случае будет нарисована сетка, облегчающая размещение элементов на экране.
Информацию можно отправить любым удобным для нас способом. Я использовал Node-RED Код для него доступен в этом репозитории. Не забудьте подкорректировать пути, по которым у вас лежат иконки.
- Собрать в корпусе