Алиса и обучаемый ИК-пульт DIY: различия между версиями
правка текста |
Нет описания правки |
||
| Строка 25: | Строка 25: | ||
* NodeMCU (автор брал [//ru.aliexpress.com/item/32665100123.html здесь]) | * NodeMCU (автор брал [//ru.aliexpress.com/item/32665100123.html здесь]) | ||
* Модуль ИК-приёмника (автор использовал [//ru.aliexpress.com/item/32776953499.html этот]) | * Модуль ИК-приёмника (автор использовал [//ru.aliexpress.com/item/32776953499.html этот]) | ||
* Модуль ИК-излучателя (например, [//ru.aliexpress.com/item/32860595867.html | * Модуль ИК-излучателя (например, [//ru.aliexpress.com/item/32860595867.html модуль из примера] уже содержит драйвер, и их можно подключить сразу несколько штук на один пин без дополнительного обвеса и повернуть во все нужные стороны) | ||
* Источник стабилизированного (желательно, чтобы избежать проблем) питания | * Источник стабилизированного (желательно, чтобы избежать проблем) питания | ||
| Строка 36: | Строка 36: | ||
# Собираем ИК-приёмник по схеме 1. | # Собираем ИК-приёмник по схеме 1. | ||
# Прошиваем NodeMCU кодом PULT_resv.ino (см. ниже) | # Прошиваем NodeMCU кодом PULT_resv.ino (см. ниже) | ||
# В ArduinoIDE открываем "Монитор порта", наводим пульт-оригинал (от | # В ArduinoIDE открываем "Монитор порта", наводим пульт-оригинал (от ТВ/люстры/кондиционера) на наш приёмник, жмём нужную кнопку. | ||
В мониторе побегут одинаковые строки типа 807F00FF. Это и есть код, переданный при нажатии кнопки. | В мониторе побегут одинаковые строки с числами типа 807F00FF. | ||
Это и есть код, переданный при нажатии кнопки. | |||
По очереди записываем нужные коды в блокнот, сразу с названиями кнопок. А чтобы не вставать два раза(тм), считаем все кнопки со всех пультов, которые планируем использовать. | |||
{{#spoiler:show=Показать PULT_resv.ino | hide=Спрятать PULT_resv.ino | | {{#spoiler:show=Показать PULT_resv.ino | hide=Спрятать PULT_resv.ino | | ||
| Строка 79: | Строка 80: | ||
Serial.println(""); | Serial.println(""); | ||
irrecv.resume(); // Receive the next value | irrecv.resume(); // Receive the next value | ||
} | |||
delay(100); | delay(100); | ||
} | } | ||
| Строка 90: | Строка 91: | ||
[[Файл:NoY_IR-2send.jpg | thumb | Схема 2: Пульт]] | [[Файл:NoY_IR-2send.jpg | thumb | Схема 2: Пульт]] | ||
Схему приёмника можно разобрать, или оставить на будущее), а сейчас: | Первая часть завершена! Схему приёмника можно разобрать, или оставить на будущее), а сейчас: | ||
# Собираем пульт по схеме 2. | # Собираем пульт по схеме 2. | ||
# Прошиваем код PULT_send.ino, перед этим немного изменив код: | # Прошиваем код PULT_send.ino, перед этим немного изменив код: | ||
#* заполним <span class="tocopy">char auth[]=</span>, <span class="tocopy">char ssid[]=</span> и <span class="tocopy">char pass[]=</span> своими значениями (ориентируясь на подсказки в комментариях). | #* заполним <span class="tocopy">char auth[]=</span>, <span class="tocopy">char ssid[]=</span> и <span class="tocopy">char pass[]=</span> своими значениями (ориентируясь на подсказки в комментариях). | ||
#* пропишем виртуальные пины. | #* пропишем виртуальные пины. | ||
Действие-реакция на изменение состояния каждого отдельного пина представляет типовой блок: | |||
BLYNK_WRITE(V0) { //виртуальный пин 0 | BLYNK_WRITE(V0) { //виртуальный пин 0 | ||
int pinValue = param.asInt(); | int pinValue = param.asInt(); | ||
if (pinValue = 1)irsend.sendNEC(0xЗАПИСАННЫЙКОД, 32); | if (pinValue==1) irsend.sendNEC (0xЗАПИСАННЫЙКОД, 32); | ||
} | } | ||
Расшифруем | Расшифруем: | ||
* '''BLYNK_WRITE(V0)''' - отслеживаем изменение виртуального пина V0 | * '''BLYNK_WRITE(V0)''' - отслеживаем изменение виртуального пина V0 | ||
* '''if (pinValue = 1)''' - если пин принимает значение 1 то | * '''if (pinValue==1)''' - если пин принимает значение 1, то... | ||
* '''irsend.sendNEC (0xЗАПИСАННЫЙКОД, 32);''' - здесь мы | * '''irsend.sendNEC (0xЗАПИСАННЫЙКОД, 32);''' - здесь мы укажем (а программа отправит) ИК-код из тех, что мы сохранили в блокнотик при считывании пультов (например, 807F00FF или любой другой). | ||
Для каждой виртуальной кнопки нашего пульта нужно | Для каждой виртуальной кнопки нашего пульта нужно указать свой irsend.sendNEC (0xКОД, 32); имитирующий её нажатие. | ||
Можно указать | Можно указать сразу серию нажатий при изменении одного виртуального пина (например, "Включить ТВ" + "Переключить нужный канал/вход"; или убавить громкость сразу на 7 нажатий кнопки "-"). | ||
По этой схеме настраиваем все виртуальные пины Blynk, вебхуки, и пробрасываем их в Алису через Кузю, об этом подробно | По этой же схеме настраиваем все виртуальные пины Blynk, вебхуки, и пробрасываем их в Алису через Кузю, об этом подробно [//wiki.yaboard.com/s/bg уже написано здесь]. | ||
| Строка 139: | Строка 141: | ||
BLYNK_WRITE(V0) { //виртуальный пин 0 | BLYNK_WRITE(V0) { //виртуальный пин 0 | ||
int pinValue = param.asInt(); | int pinValue = param.asInt(); | ||
if (pinValue = 1)irsend.sendNEC(0xFFFFFFF, 32); //вместо FFFFFFF вставить код полученный от пульта-оригинала | if (pinValue==1)irsend.sendNEC(0xFFFFFFF, 32); //вместо FFFFFFF вставить код полученный от пульта-оригинала | ||
} | } | ||
BLYNK_WRITE(V1) { //виртуальный пин 1 | BLYNK_WRITE(V1) { //виртуальный пин 1 | ||
int pinValue = param.asInt(); | int pinValue = param.asInt(); | ||
if (pinValue = 1)irsend.sendNEC(0xFFFFFFF, 32); //вместо FFFFFFF вставить код полученный от пульта-оригинала | if (pinValue==1)irsend.sendNEC(0xFFFFFFF, 32); //вместо FFFFFFF вставить код полученный от пульта-оригинала | ||
} | } | ||
| Строка 153: | Строка 155: | ||
Blynk.begin(auth, ssid, pass); | Blynk.begin(auth, ssid, pass); | ||
Serial.begin(115200); | Serial.begin(115200); | ||
} | } | ||
Версия от 18:39, 10 декабря 2019
Материал носит информационный характер, и не является прямым указанием к действию!
Вступление
Сегодня будем собирать собственный, и даже почти обучаемый ИК-пульт :) Автор назвал его "НеЯндекс.Пульт", и дальнейший текст основан на его оригинальной инструкции.
Преимущества DIY-решения очевидны:
- Гибкая настройка (программирование) всего, что только можно;
- Произвольные последовательности команд на один и более передатчиков;
- "Индивидуальные" пульты (излучатель светит "в упор" в глазок нужного устройства, чтобы не возникало коллизий с другими);
- Возможность разместить пульт в любой корпус (включая корпус самого принимающего устройства);
- Отличный способ провести время и подтянуть скиллы.
Конечно, придётся немного потрудиться. Для сборки нам понадобятся:
- NodeMCU (автор брал здесь)
- Модуль ИК-приёмника (автор использовал этот)
- Модуль ИК-излучателя (например, модуль из примера уже содержит драйвер, и их можно подключить сразу несколько штук на один пин без дополнительного обвеса и повернуть во все нужные стороны)
- Источник стабилизированного (желательно, чтобы избежать проблем) питания
Считываем оригинальные коды
Наши первые действия - сбор информации с пультов. Для этого:
- Собираем ИК-приёмник по схеме 1.
- Прошиваем NodeMCU кодом PULT_resv.ino (см. ниже)
- В ArduinoIDE открываем "Монитор порта", наводим пульт-оригинал (от ТВ/люстры/кондиционера) на наш приёмник, жмём нужную кнопку.
В мониторе побегут одинаковые строки с числами типа 807F00FF. Это и есть код, переданный при нажатии кнопки.
По очереди записываем нужные коды в блокнот, сразу с названиями кнопок. А чтобы не вставать два раза(тм), считаем все кнопки со всех пультов, которые планируем использовать.
Повелеваем устройствами
Первая часть завершена! Схему приёмника можно разобрать, или оставить на будущее), а сейчас:
- Собираем пульт по схеме 2.
- Прошиваем код PULT_send.ino, перед этим немного изменив код:
- заполним char auth[]=, char ssid[]= и char pass[]= своими значениями (ориентируясь на подсказки в комментариях).
- пропишем виртуальные пины.
Действие-реакция на изменение состояния каждого отдельного пина представляет типовой блок:
BLYNK_WRITE(V0) { //виртуальный пин 0
int pinValue = param.asInt();
if (pinValue==1) irsend.sendNEC (0xЗАПИСАННЫЙКОД, 32);
}
Расшифруем:
- BLYNK_WRITE(V0) - отслеживаем изменение виртуального пина V0
- if (pinValue==1) - если пин принимает значение 1, то...
- irsend.sendNEC (0xЗАПИСАННЫЙКОД, 32); - здесь мы укажем (а программа отправит) ИК-код из тех, что мы сохранили в блокнотик при считывании пультов (например, 807F00FF или любой другой).
Для каждой виртуальной кнопки нашего пульта нужно указать свой irsend.sendNEC (0xКОД, 32); имитирующий её нажатие. Можно указать сразу серию нажатий при изменении одного виртуального пина (например, "Включить ТВ" + "Переключить нужный канал/вход"; или убавить громкость сразу на 7 нажатий кнопки "-").
По этой же схеме настраиваем все виртуальные пины Blynk, вебхуки, и пробрасываем их в Алису через Кузю, об этом подробно уже написано здесь.
Исходные коды прошивок
Скачать архив прошивок для пульта можно по этой ссылке.
Что можно улучшить
- Брать один виртуальный пин (например, V0) и задавать ему не 0 и 1, а сразу строковое значение типа "FFFFFFFF" ИК-кода, а в код подставлять переменную.
- Совместить обе схемы (и прошивки) в одной (D2 передатчик, D3 приёмник), отлавливать коды прямо из блинка и сделать конструкцию универсальной. Изменяться будут только передаваемые вебхуком значения одного пина.
- Дописать прошивку так, чтобы пульт стал полностью самообучаемым и умел сохранять команды в энергонезависимой памяти (EEPROM).
Кстати, один из участников нашего чата по аналогичной схеме сделал... ИК-прокси, который пропускал в телевизор только разрешённые коды )
Удачной сборки, весёлых экспериментов и надёжной работы!