Модуль Lilygo T-relay S3: https://alii.pub/6ut7mq?erid=2SDnjdn5Vmi
Дисплей ili9341: https://alii.pub/6ut83g?erid=2SDnjdAW8VN
Прежде чем приступить к материалу, я Вас попрошу, если нравится то, что я делаю и хотите следить за моей деятельностью, то рекомендую подписаться на мой телеграмм канал: https://t.me/ypavla
Там я публикую новости о вышедших видео, статьях и разные устройства для умного дома и не только показываю.
Спасибо за внимание, теперь продолжим.
Lilygo пришли наверное к логическому заключению в своей линейке модулей T-relay. Они выпускали несколько версий. сначала была плата с 4рьмя реле и gpio выходами (но без корпуса)https://alii.pub/6ut884?erid=2SDnjdrXo6g. Потом была версия с 8 реле и тоже без корпуса https://alii.pub/6ut88p?erid=2SDnjduVmfN. А вот сейчас вышла уже версия в корпусе на 6 реле, с креплением на DIN рейку. С подключением дополнительных модулей реле по цепочке. Так-же с часами реального времени, с подключением датчика температуры ds18b20. Да еще с возможностью подключения дисплея ili9341.
И такой модуль уже похож на взрослый. И его вполне себе можно уже внедрять в систему умного дома, куда-нибудь в шкаф для управления нагрузкой.
Распиновка довольно скудная у производителя.
Здесь не указана распиновка посадочного гнезда ds18b20. Дисплей тоже не расписан, но благо хоть шелкография есть.
По данному модулю информацию от разработчика Lilygo можно подчеркнуть на github.
К модулю T-relay S3 подключаются дополнительные модули на 6 реле, такого же формфактора (на фото видно). Подключаются они по цепочке и всего можно подключить дополнительно 3 модуля. Всего получится 24 реле.
Как это работает:
По сути очень просто. Релюшками управляет контроллер esp32s3 с помощью сдвигового регистра SN74HC595.
Такие регистры служат как расширитель gpio пинов. То-есть, используя 4 пина для управления регистром, получаем 8 выводов, для управления например реле.
Но и это еще не все плюсы такого регистра, они подключаться могут последовательно. Тоесть используя все теже 4 пина для управлением регистра, они же и управляют следующим регистром подключенным последовательно. И насколько я понимаю, таких можно подключить 256 штук.
Тогда почему всего 3 дополнительных модуля? Я думаю потому что питание больше не выдержит.
На страничке Гитхаба по этому модулю, есть пример для работы в ESPHome одним (головным модулем) реле: https://github.com/Xinyuan-LilyGO/LilyGo-T-Relay/blob/main/ESPHome/T-Relay-ESP32S3.yaml
И зная, что следующий модуль подключен последовательно. Распиновки доп модуля вообще нету… Я решил, что он управляется последовательно тоже как и подключен, по этому изменил немного код под esphome для головного модуля и дополнительного.
И выглядеть код стал следующим образом:
sn74hc595:
- id: "sn74hc595_hub"
data_pin: 7
clock_pin: 5
latch_pin: 6
sr_count: 2
# Individual outputs
switch:
- platform: gpio
# SN74HC595 Pin #0
name: "Switch 1"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 0
number: 0
inverted: false
id: relay1
- platform: gpio
# SN74HC595 Pin #1
name: "Switch 2"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 1
number: 1
inverted: false
id: relay2
- platform: gpio
# SN74HC595 Pin #2
name: "Switch 3"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 2
number: 2
inverted: false
id: relay3
- platform: gpio
# SN74HC595 Pin #3
name: "Switch 4"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 3
number: 3
inverted: false
id: relay4
- platform: gpio
# SN74HC595 Pin #4
name: "Switch 5"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 4
number: 4
inverted: false
id: relay5
- platform: gpio
# SN74HC595 Pin #5
name: "Switch 6"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 5
number: 5
inverted: false
id: relay6
#pin светодиода
- platform: gpio
# SN74HC595 Pin #5
#LED
name: "Switch 7"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 6
number: 6
inverted: false
id: relay7
#pin светодиода
- platform: gpio
# SN74HC595 Pin #5
name: "Switch 8"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 6
number: 7
inverted: false
id: relay8
#реле второй платы расширения
- platform: gpio
# SN74HC595 Pin #5
name: "Switch 9"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 6
number: 8
inverted: false
id: relay9
- platform: gpio
# SN74HC595 Pin #5
name: "Switch 10"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 6
number: 9
inverted: false
id: relay10
- platform: gpio
# SN74HC595 Pin #5
name: "Switch 11"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 6
number: 10
inverted: false
id: relay11
- platform: gpio
# SN74HC595 Pin #5
name: "Switch 12"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 6
number: 11
inverted: false
id: relay12
- platform: gpio
# SN74HC595 Pin #5
name: "Switch 13"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 6
number: 12
inverted: false
id: relay13
- platform: gpio
# SN74HC595 Pin #5
name: "Switch 14"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 6
number: 13
inverted: false
id: relay14
- platform: gpio
# SN74HC595 Pin #5
name: "Switch 15"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 6
number: 14
inverted: false
id: relay15
Ну а дальше я изменил код, добавив работу с часами встроенными, так-же добавил работу датчика температуры ds18b20 и дисплея ili9341.
На дисплей вывел информацию о времени с часов реального времени, так-же взял показания мощности потребляемой моего сетевого фильтра из Home Assistant. Ну и вторыми показаниями я вывел значения с датчика ds18b20.
Такой код выглядит следующим образом:
i2c:
scl: 17
sda: 16
spi:
clk_pin: 13
mosi_pin: 11
miso_pin: 12
output:
- platform: ledc
pin: 9
id: gpio_9_backlight_pwm
dallas:
pin: 21
update_interval: 10s
# Define a monochromatic, dimmable light for the backlight
light:
- platform: monochromatic
output: gpio_9_backlight_pwm
name: "Display Backlight"
id: back_light
restore_mode: ALWAYS_ON
sn74hc595:
- id: "sn74hc595_hub"
data_pin: 7
clock_pin: 5
latch_pin: 6
sr_count: 2
# Individual outputs
switch:
- platform: gpio
# SN74HC595 Pin #0
name: "Switch 1"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 0
number: 0
inverted: false
id: relay1
- platform: gpio
# SN74HC595 Pin #1
name: "Switch 2"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 1
number: 1
inverted: false
id: relay2
- platform: gpio
# SN74HC595 Pin #2
name: "Switch 3"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 2
number: 2
inverted: false
id: relay3
- platform: gpio
# SN74HC595 Pin #3
name: "Switch 4"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 3
number: 3
inverted: false
id: relay4
- platform: gpio
# SN74HC595 Pin #4
name: "Switch 5"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 4
number: 4
inverted: false
id: relay5
- platform: gpio
# SN74HC595 Pin #5
name: "Switch 6"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 5
number: 5
inverted: false
id: relay6
- platform: gpio
# SN74HC595 Pin #5
#LED
name: "Switch 7"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 6
number: 6
inverted: false
id: relay7
- platform: gpio
# SN74HC595 Pin #5
name: "Switch 8"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 6
number: 7
inverted: false
id: relay8
###############################################
- platform: gpio
# SN74HC595 Pin #5
name: "Switch 9"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 6
number: 8
inverted: false
id: relay9
- platform: gpio
# SN74HC595 Pin #5
name: "Switch 10"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 6
number: 9
inverted: false
id: relay10
- platform: gpio
# SN74HC595 Pin #5
name: "Switch 11"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 6
number: 10
inverted: false
id: relay11
- platform: gpio
# SN74HC595 Pin #5
name: "Switch 12"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 6
number: 11
inverted: false
id: relay12
- platform: gpio
# SN74HC595 Pin #5
name: "Switch 13"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 6
number: 12
inverted: false
id: relay13
- platform: gpio
# SN74HC595 Pin #5
name: "Switch 14"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 6
number: 13
inverted: false
id: relay14
- platform: gpio
# SN74HC595 Pin #5
name: "Switch 15"
pin:
sn74hc595: sn74hc595_hub
# Use pin number 6
number: 14
inverted: false
id: relay15
sensor:
- platform: homeassistant
id: power_plug
entity_id: sensor.setevoi_filtr_power
- platform: dallas
name: "temperature_test"
id: temperature_ds18b20
address: "0xA104166427CCFF28"
time:
- platform: pcf8563
id: pcf8563_time
address: 0x51
- platform: homeassistant
# instead try to synchronize via network repeatedly ...
on_time_sync:
then:
# ... and update the RTC when the synchronization was successful
pcf8563.write_time:
font:
- file: "fonts/Roboto-Medium.ttf"
id: font_roboto_medium22
size: 15
glyphs: |-
!"%()+=,-_.:°0123456789АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧЩЬЫЪЭЮЯABCDEFGHIJKLMNOPQRSTUVWXYZ абвгдеёжзийклмнопрстуфхцчщьыъэюяabcdefghijklmnopqrstuvwxyz'éèàòùç/&ôœìïöñ
- file: "fonts/Roboto-Medium.ttf"
id: font_roboto_medium44
size: 44
- file: "fonts/Roboto-Medium.ttf"
id: font_roboto_medium27
size: 27
- file: "fonts/GoogleSans-Bold.ttf"
id: font_name
size: 18
glyphs: |-
!"%()+=,-_.:°0123456789АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧЩЬЫЪЭЮЯABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz'éèàòùç/&ôœìïöñ
- file: "fonts/GoogleSans-Medium.ttf"
id: font_value
size: 36
glyphs: |-
!"%()+=,-_.:°0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz'éèàòùç/&ôœìïöñ
- file: "fonts/GoogleSans-Medium.ttf"
id: font_footer
size: 8
glyphs: |-
!"%()+=,-_.:°0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz'éèàòùç/&ôœìïöñ
# https://pictogrammers.github.io/@mdi/font/5.3.45/
- file: 'fonts/materialdesignicons-webfont.ttf'
id: font_icons
size: 100
glyphs:
- "\U000F0594" # clear-night
- "\U000F0590" # cloudy
- "\U000F0595" # partlycloudy
- "\U000F0591" # fog
- "\U000F0592" # hail
- "\U000F0593" # lightning
- "\U000F067E" # lightning-rainy
- "\U000F0596" # pouring
- "\U000F0597" # rainy
- "\U000F0F36" # snowy
- "\U000F067F" # snowy-rainy
- "\U000F0599" # sunny
- "\U000F059D" # windy
- "\U000F059E" # windy-variant
- "\U000F0F38" # exceptional
- file: 'fonts/materialdesignicons-webfont.ttf'
id: font_icons_small
size: 15
glyphs:
- "\U000F10C2" # Temperature High
- "\U000F10C3" # Temperature Low
- "\U000F058E" #mdi-water-percent
- "\U000F05A1" #mdi-weight
- "\U000F0708" #mdi-react
- "\U000F0438" #mdi-radiator
- "\U000F0425" # POWER
- "\U000F054B" # umbrella
- "\U000F0592" # hail
- "\U000F0593" # lightning
- "\U000F067E" # lightning-rainy
- "\U000F0597" # rainy
- "\U000F0F36" # snowy
- "\U000F0594" # clear-night
- "\U000F0599" # sunny
- "\U000F07CA" # fuel
- "\U000F024A" # flower
- "\U000F051F" # time-remaining
- "\U000F140B" # Energy
- "\U000F109F" # Coffee
- "\U000F02E3" # Bed
- "\U000F0531" # Tree
- "\U000F0E5B" # 3D Printer
- file: 'fonts/materialdesignicons-webfont.ttf'
id: font_icons_small_b
size: 56
glyphs:
- "\U000F10C2" # Temperature High
- "\U000F10C3" # Temperature Low
- "\U000F0425" # POWER
- "\U000F054B" # umbrella
- "\U000F0592" # hail
- "\U000F0593" # lightning
- "\U000F067E" # lightning-rainy
- "\U000F0597" # rainy
- "\U000F0F36" # snowy
- "\U000F0594" # clear-night
- "\U000F0599" # sunny
- "\U000F07CA" # fuel
- "\U000F024A" # flower
- "\U000F051F" # time-remaining
- "\U000F140B" # Energy
- "\U000F109F" # Coffee
- "\U000F02E3" # Bed
- "\U000F0531" # Tree
- "\U000F0E5B" # 3D Printer
- file: 'fonts/materialdesignicons-webfont.ttf'
id: font_icons_small_s
size: 44
glyphs:
- "\U000F10C2" # Temperature High
- "\U000F10C3" # Temperature Low
- "\U000F0425" # POWER
- "\U000F054B" # umbrella
- "\U000F0592" # hail
- "\U000F0593" # lightning
- "\U000F067E" # lightning-rainy
- "\U000F0597" # rainy
- "\U000F0F36" # snowy
- "\U000F0594" # clear-night
- "\U000F0599" # sunny
- "\U000F07CA" # fuel
- "\U000F024A" # flower
- "\U000F051F" # time-remaining
- "\U000F140B" # Energy
- "\U000F109F" # Coffee
- "\U000F02E3" # Bed
- "\U000F0A61" # LTC
- "\U000F0813" # BTC
color:
- id: RED
red: 100%
green: 0%
blue: 0%
- id: BLUE
red: 0%
green: 0%
blue: 100%
- id: WHITE
red: 100%
green: 100%
blue: 100%
- id: YELLOW
red: 100%
green: 100%
blue: 0%
display:
- platform: ili9xxx
model: TFT_2.4
rotation: 270
#model: ili9341
cs_pin: 8
dc_pin: 46
# led_pin: 32
reset_pin: 3
id: my_display
pages:
- id: page1
lambda: |-
it.strftime(it.get_width() / 2, 7, id(font_roboto_medium22), TextAlign::CENTER,"%d-%m-%Y", id(pcf8563_time).now());
it.strftime(it.get_width() / 2, 25, id(font_roboto_medium27), TextAlign::CENTER, "%X", id(pcf8563_time).now());
//info
it.print(it.get_width() / 2, 53, id(font_roboto_medium22), WHITE, TextAlign::CENTER, "ПОТРЕБЛЯЕМАЯ МОЩНОСТЬ");
it.print(11, 64, id(font_roboto_medium22), WHITE, TextAlign::LEFT, "POWER");
it.printf(210, 64, id(font_roboto_medium22), RED, "%.1fВТ", id(power_plug).state);
it.printf(195, 64, id(font_icons_small), YELLOW, TextAlign::LEFT, "\U000F0425");
it.print(11, 86, id(font_roboto_medium22), WHITE, TextAlign::LEFT, "DS18B20");
it.printf(210, 86, id(font_roboto_medium22), RED, "%.1f°C", id(temperature_ds18b20).state);
it.printf(195, 86, id(font_icons_small), YELLOW, TextAlign::LEFT, "\U000F10C3");