Перейти к содержанию

Алиса и обучаемый ИК-пульт DIY: различия между версиями

Материал из Wiki yaboard
м Ark rusinov-9121383 переименовал страницу "Алиса и обучаемый ИК-пульт" в "Алиса и обучаемый ИК-пульт DIY" без оставления…
Нет описания правки
 
(не показаны 3 промежуточные версии этого же участника)
Строка 14: Строка 14:




Преимущества такого решения очевидны:
Преимущества DIY-решения очевидны:
* Гибкая настройка (программирование) всего, что можно;
* Гибкая настройка (программирование) всего, что только можно;
* "Индивидуальные" пульты (излучатель "в упор" в глазок нужного устройства, чтобы не возникало коллизий с другими);
* Произвольные последовательности команд на один и более передатчиков;
* Возможность разместить в любой корпус (включая корпус самого принимающего устройства);
* "Индивидуальные" пульты (излучатель светит "в упор" в глазок нужного устройства, чтобы не возникало коллизий с другими);
* Возможность разместить пульт в любой корпус (включая корпус самого принимающего устройства);
* Отличный способ провести время и подтянуть скиллы.
* Отличный способ провести время и подтянуть скиллы.


Строка 23: Строка 24:
Конечно, придётся немного потрудиться. Для сборки нам понадобятся:
Конечно, придётся немного потрудиться. Для сборки нам понадобятся:
* 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 модуль из примера] уже содержит драйвер, и их можно подключить сразу несколько штук на один пин без дополнительного обвеса и повернуть во все нужные стороны)
* Источник стабилизированного (желательно, чтобы избежать проблем) питания
* Источник стабилизированного (желательно, чтобы избежать проблем) питания
== Подготовительные работы ==
Установить:
* '''ArduinoIDE''', и в самой среде:
** библиотеки '''Blynk''' и '''IRremoteESP8266''',
** библиотеки для платы '''NodeMCU'''.
Проверить правильность настройки ArduinoIDE:
* Подключить NodeMCU к USB-порту компьютера.
* Выбрать правильный '''тип платы'''.
* Выбрать правильный '''порт''' (меню «Инструменты» - «Порт»), его можно посмотреть в диспетчере устройств вашей ОС (например, COM4).
* Создать пустой скетч (меню «Файл» - «Новый», или '''Ctrl-N''').
* Загрузить этот пустой скетч в плату (кнопка «Загрузка», или '''Ctrl-U''').
Подробнее по настройке разделе «Полезные ссылки».




Строка 31: Строка 51:




[[Файл:NoY_IR-1recvr.jpg | thumb | Схема 1: Приёмник]]
[[Файл:NoY_IR-recvr1a.jpg | thumb | Схема 1a: питание приёмника через VIN]]
Наши первые действия - сбор информации с пультов. Для этого:
[[Файл:NoY_IR-recvr1b.jpg | thumb | Схема 1b: питание приёмника по micro-USB]]
# Собираем ИК-приёмник по схеме 1 (Приёмник).
Наши первые действия - сбор информации с пультов. Для этого собираем ИК-приёмник согласно схемам.
# Прошиваем NodeMCU кодом PULT_resv.ino (см. ниже)
 
# В ArduinoIDE открываем монитор порта, наводим диод-излучатель пульта-оригинала (от телека, люстры, кондёра), жмем нужную кнопку.
<pre class=red>
Важно! Выбирайте правильное подключение в зависимости от Вашего питания.
Схема 1a - когда плата запитана через пины VIN и GND.
Схема 1b - более универсальная, будет работать и при питании платы через встроенный порт micro-USB.
</pre>
 
Дальше:
# Прошиваем NodeMCU кодом PULT_resv.ino (см. ниже).
# В ArduinoIDE открываем "Монитор порта", направляем пульт-оригинал (от телевизора, люстры, кондиционера итд) на наш приёмник, жмём нужную кнопку.
 
В мониторе побегут одинаковые строки с числами типа 807F00FF. Это и есть код, переданный при нажатии кнопки.


  В мониторе порта начнут появляться одинаковые строки типа 807F00FF. Это и есть код, переданный при нажатии кнопки.
  Помимо вывода в монитор порта в данном коде есть возможность вывода кодов ИК-пульта в виртуальный пин V30 в приложении Blynk. Для этого в созданном Вами проекте Blynk нужно создать элемент Text Input и задать ему виртуальный пин V30. После сборки, прошивки и подключения к сети в данный элемент будут поступать коды при нажатии на кнопки пульта.


Записываем полученные коды в блокнот сразу с названиями кнопок. Чтобы не вставать два раза(тм), записываем все кнопки со всех пультов, что планируем использовать.
[[Файл:NoY IR-code-blynk.jpg]]
 
Записываем полученные коды в блокнот, сразу с названиями кнопок. А чтобы не вставать два раза(тм), запишем все кнопки со всех пультов, которые планируем использовать.


{{#spoiler:show=Показать PULT_resv.ino | hide=Спрятать PULT_resv.ino |  
{{#spoiler:show=Показать PULT_resv.ino | hide=Спрятать PULT_resv.ino |  
<pre>
<pre>
#define BLYNK_PRINT Serial //серийный порт для подключения по вайфаю
#ifndef UNIT_TEST
#ifndef UNIT_TEST
#include <Arduino.h>
#include <Arduino.h>
#endif
#endif
#include <IRremoteESP8266.h>
#include <IRremoteESP8266.h> //эту библиотеку нужно установить из маркета библиотек ардуино
#include <IRrecv.h>
#include <IRrecv.h>
#include <IRutils.h>
#include <IRutils.h>


const uint16_t kRecvPin = 0;
#include <ESP8266WiFi.h> //подключение модуля вайфая
#include <BlynkSimpleEsp8266.h> //библиотека для модуля вайфая
 
char auth[] = "Токен_блинк"; //ключ от пульта
 
char ssid[] = "SSID_сети"; //название сети вайфая
char pass[] = "Пароль сети"; //пароль от вайфая
 
const uint16_t kRecvPin = 0; //пин D3 на NodeMCU
String code = "FFFFFFFF";


IRrecv irrecv(kRecvPin);
IRrecv irrecv(kRecvPin);
Строка 63: Строка 105:
   Serial.begin(115200);
   Serial.begin(115200);
   irrecv.enableIRIn();  // Start the receiver
   irrecv.enableIRIn();  // Start the receiver
   while (!Serial)  // Wait for the serial connection to be establised.
   while (!Serial) { // Wait for the serial connection to be establised.
     delay(50);
     delay(50);
  }
   Serial.println();
   Serial.println();
   Serial.print("IRrecvDemo is now running and waiting for IR message on Pin ");
   Serial.print("IRrecvDemo is now running and waiting for IR message on Pin ");
Строка 73: Строка 116:


void loop() {
void loop() {
  Blynk.run();


   if (irrecv.decode(&results)) {
   if (irrecv.decode(&results)) {
Строка 78: Строка 122:
     Serial.println("");
     Serial.println("");
     irrecv.resume();  // Receive the next value
     irrecv.resume();  // Receive the next value
 
    code = uint64ToString(results.value,HEX);
    Blynk.virtualWrite(V30,uint64ToString(results.value,HEX)); //вывод кода в пин 30
  }
   delay(100);
   delay(100);
}
}
Строка 88: Строка 134:




[[Файл:NoY_IR-2send.jpg | thumb | Схема 2: Пульт]]
[[Файл:NoY_IR-pult2a.jpg | thumb | Схема 2a: Питание пульта и модулей через VIN]]
Теперь можно разобрать схему приёмника, или оставить на будущее), а теперь:
[[Файл:NoY_IR-pult2b.jpg | thumb | Схема 2b: Питание пульта по micro-USB]]
# Собрать новую по схеме 2 (Пульт).
 
Первая часть завершена! Схему приёмника можно разобрать, или оставить на будущее), а сейчас:
# Собираем пульт по схеме 2a или 2b (различия те же, что и в вариантах приёмника).
# Прошиваем код 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);''' - здесь мы впишем (а программа отправит) ИК-код, который мы записали в блокнотик в шаге 1 (например, 807F00FF).
* '''irsend.sendNEC (0xЗАПИСАННЫЙКОД, 32);''' - здесь мы укажем (а программа отправит) ИК-код из тех, что мы сохранили в блокнотик при считывании пультов (например, 807F00FF или любой другой).


  Для каждой кнопки нужно прописать свой irsend.sendNEC(0xКОД, 32); имитируя её нажатие. Можно указать и несколько нажатий при изменении одного виртуального пина (например, включить ТВ, а затем включить нужный канал/вход).
  Для каждой виртуальной кнопки нашего пульта нужно указать свой irsend.sendNEC (0xКОД, 32); имитирующий её нажатие.
Можно указать сразу серию нажатий при изменении одного виртуального пина (например, "Включить ТВ" + "Переключить нужный канал/вход"; или убавить громкость сразу на 7 нажатий кнопки "-").


По этой схеме настраиваем все виртуальные пины Blynk, вебхуки, и пробрасываем их в Алису через Кузю, об этом подробно [//wiki.yaboard.com/s/bg написано здесь].
По этой же схеме настраиваем все виртуальные пины Blynk, вебхуки, и пробрасываем их в Алису через Кузю, об этом подробно [//wiki.yaboard.com/s/bg уже написано здесь].




Строка 117: Строка 167:
#endif
#endif
#include <IRremoteESP8266.h>
#include <IRremoteESP8266.h>
#include <IRutils.h>
#include <IRutils.h>
#include <IRsend.h>
#include <IRsend.h>
Строка 137: Строка 186:
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 вставить код полученный от пульта-оригинала
}
}


Строка 151: Строка 200:
   Blynk.begin(auth, ssid, pass);
   Blynk.begin(auth, ssid, pass);
   Serial.begin(115200);
   Serial.begin(115200);
}
}


Строка 166: Строка 214:


Скачать архив прошивок для пульта можно [[:Файл:PULT_code.zip | по этой ссылке]].
Скачать архив прошивок для пульта можно [[:Файл:PULT_code.zip | по этой ссылке]].
== Полезные ссылки ==
* [//help.blynk.cc/en/articles/512105-how-to-install-blynk-library-for-arduino-ide Инструкция по установке библиотеки blynk, а также её актуальная версия]
* [//robotclass.ru/articles/node-mcu-arduino-ide-setup/ Хорошая инструкция по настройке ArduinoIDE для NodeMCU]
* [//wiki.yaboard.com/s/bg Пример настройки устройств в приложении Blynk и интеграции их в Алису через навык «Домовенок Кузя»]




Строка 171: Строка 228:




* Можно брать один виртуальный пин (например, V0) и задавать ему не 0 и 1, а сразу строковое значение типа "FFFFFFFF" ИК-кода, а в код подставлять переменную.  
* Брать один виртуальный пин (например, V0) и задавать ему не 0 и 1, а сразу строковое значение типа "FFFFFFFF" ИК-кода, а в код подставлять переменную.  
* Совместить обе схемы (и прошивки) в одной (D2 передатчик, D3 приёмник), отлавливать коды прямо из блинка и сделать конструкцию универсальной. Изменяться будут только передаваемые вебхуком значения одного пина.
* Совместить обе схемы (и прошивки) в одной (D2 передатчик, D3 приёмник), отлавливать коды прямо из блинка и сделать конструкцию универсальной. Изменяться будут только передаваемые вебхуком значения одного пина.
* Дописать прошивку так, чтобы  пульт стал полностью самообучаемым и умел сохранять команды в энергонезависимой памяти (EEPROM).
* Дописать прошивку так, чтобы  пульт стал полностью самообучаемым и умел сохранять команды в энергонезависимой памяти (EEPROM).




А один из участников нашего чата по аналогичной схеме сделал... ИК-прокси, который пропускал в телевизор только разрешённые коды )
Кстати, один из участников нашего чата по аналогичной схеме сделал... ИК-прокси, который пропускал в телевизор только разрешённые коды )





Текущая версия от 12:45, 11 января 2020

Знания Применение информации с этой страницы требует специальных знаний и навыков
Всё описанное на этой странице вы производите на свой страх и риск, включая нарушение работы программного обеспечения и выход из строя оборудования, а также риск поражения током и травмы.
Материал носит информационный характер, и не является прямым указанием к действию!

Вступление

Сегодня будем собирать собственный, и даже почти обучаемый ИК-пульт :) Автор назвал его "НеЯндекс.Пульт", и дальнейший текст основан на его оригинальной инструкции.


Преимущества DIY-решения очевидны:

  • Гибкая настройка (программирование) всего, что только можно;
  • Произвольные последовательности команд на один и более передатчиков;
  • "Индивидуальные" пульты (излучатель светит "в упор" в глазок нужного устройства, чтобы не возникало коллизий с другими);
  • Возможность разместить пульт в любой корпус (включая корпус самого принимающего устройства);
  • Отличный способ провести время и подтянуть скиллы.


Конечно, придётся немного потрудиться. Для сборки нам понадобятся:

  • NodeMCU (автор брал здесь)
  • Модуль ИК-приёмника (автор использовал этот)
  • Модуль ИК-излучателя (например, модуль из примера уже содержит драйвер, и их можно подключить сразу несколько штук на один пин без дополнительного обвеса и повернуть во все нужные стороны)
  • Источник стабилизированного (желательно, чтобы избежать проблем) питания

Подготовительные работы

Установить:

  • ArduinoIDE, и в самой среде:
    • библиотеки Blynk и IRremoteESP8266,
    • библиотеки для платы NodeMCU.

Проверить правильность настройки ArduinoIDE:

  • Подключить NodeMCU к USB-порту компьютера.
  • Выбрать правильный тип платы.
  • Выбрать правильный порт (меню «Инструменты» - «Порт»), его можно посмотреть в диспетчере устройств вашей ОС (например, COM4).
  • Создать пустой скетч (меню «Файл» - «Новый», или Ctrl-N).
  • Загрузить этот пустой скетч в плату (кнопка «Загрузка», или Ctrl-U).


Подробнее по настройке разделе «Полезные ссылки».

Считываем оригинальные коды

Схема 1a: питание приёмника через VIN
Схема 1b: питание приёмника по micro-USB

Наши первые действия - сбор информации с пультов. Для этого собираем ИК-приёмник согласно схемам.

 Важно! Выбирайте правильное подключение в зависимости от Вашего питания.
Схема 1a - когда плата запитана через пины VIN и GND. 
Схема 1b - более универсальная, будет работать и при питании платы через встроенный порт micro-USB.

Дальше:

  1. Прошиваем NodeMCU кодом PULT_resv.ino (см. ниже).
  2. В ArduinoIDE открываем "Монитор порта", направляем пульт-оригинал (от телевизора, люстры, кондиционера итд) на наш приёмник, жмём нужную кнопку.

В мониторе побегут одинаковые строки с числами типа 807F00FF. Это и есть код, переданный при нажатии кнопки.

Помимо вывода в монитор порта в данном коде есть возможность вывода кодов ИК-пульта в виртуальный пин V30 в приложении Blynk. Для этого в созданном Вами проекте Blynk нужно создать элемент Text Input и задать ему виртуальный пин V30. После сборки, прошивки и подключения к сети в данный элемент будут поступать коды при нажатии на кнопки пульта.

Записываем полученные коды в блокнот, сразу с названиями кнопок. А чтобы не вставать два раза(тм), запишем все кнопки со всех пультов, которые планируем использовать.

<button type="button" class="spoilers-button" aria-expanded="false">Показать PULT_resv.ino</button>

Повелеваем устройствами

Схема 2a: Питание пульта и модулей через VIN
Схема 2b: Питание пульта по micro-USB

Первая часть завершена! Схему приёмника можно разобрать, или оставить на будущее), а сейчас:

  1. Собираем пульт по схеме 2a или 2b (различия те же, что и в вариантах приёмника).
  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, вебхуки, и пробрасываем их в Алису через Кузю, об этом подробно уже написано здесь.

<button type="button" class="spoilers-button" aria-expanded="false">Показать PULT_send.ino</button>

Исходные коды прошивок

Скачать архив прошивок для пульта можно по этой ссылке.

Полезные ссылки

Что можно улучшить

  • Брать один виртуальный пин (например, V0) и задавать ему не 0 и 1, а сразу строковое значение типа "FFFFFFFF" ИК-кода, а в код подставлять переменную.
  • Совместить обе схемы (и прошивки) в одной (D2 передатчик, D3 приёмник), отлавливать коды прямо из блинка и сделать конструкцию универсальной. Изменяться будут только передаваемые вебхуком значения одного пина.
  • Дописать прошивку так, чтобы пульт стал полностью самообучаемым и умел сохранять команды в энергонезависимой памяти (EEPROM).
Кстати, один из участников нашего чата по аналогичной схеме сделал... ИК-прокси, который пропускал в телевизор только разрешённые коды )


Удачной сборки, весёлых экспериментов и надёжной работы!