Начало работы с IoT-разработкой: учебник по ESP8266 Arduino

Опубликовано: 2022-03-11

Цель этого руководства по ESP8266 Arduino — познакомиться со встроенным программированием с помощью Arduino на чипе, который стал очень популярным среди сообщества производителей (и разработчиков в целом) благодаря своей доступности и простоте использования в пространстве IoT. Учебник также загрязняет наши руки с помощью Alexa, используя неофициальный «хак», чтобы заставить Alexa выполнять наши распоряжения дома (этот метод не предназначен для использования в производстве, только для домашней демонстрации). Попробуйте это дома, но не на работе.

Абстрактное графическое представление учебника ESP8266 Arduino

Прелесть этой техники в том, что мы можем использовать ее в наших собственных домах, чтобы заставить Alexa автоматизировать буквально все, что работает от электричества. В качестве дополнительного бонуса мы получаем представление о программировании встраиваемых систем с помощью Arduino, навык, который, возможно, не так распространен среди обычных программистов в наши дни. Наконец, мы приступаем к работе с популярным чипом ESP8266, любимым среди самодельщиков; это удивительный маленький чип, способный запускать самые разные вещи, со встроенным чипом Wi-Fi, который нам понадобится для этого проекта. Это то, что позволит устройству Alexa и чипу напрямую взаимодействовать друг с другом.

Немного предыстории программирования Alexa: модель программирования «навыков» Alexa работает следующим образом:

Абстрактное графическое представление Alexa

  • Вы говорите со своей Алексой.
  • Alexa направляет вашу речь обратно в облако Amazon.
  • Речевая команда направляется на «навык» Alexa (программа, работающая в облаке Amazon).

«Навык» Alexa берет на себя обработку команды; обычно это приводит к тому, что ответ отправляется обратно на устройство Alexa, заставляя его что-то сказать пользователю в ответ. В случае Alexa IoT команда направляется на «теневое устройство» в облаке Amazon, что в конечном итоге приводит к отправке ответа на какое-то другое устройство в вашем доме. Мы обходим все это с помощью нашего хака. Мы хотим, чтобы устройство Alexa общалось напрямую с нашим чипом ESP8266 внутри нашего дома, не отправляя ничего в облако и обратно. Мы хотим, чтобы Alexa напрямую отправляла запрос на наш ESP8266 только внутри и внутри нашей домашней сети Wi-Fi.

Наш хак на самом деле не является секретом. Мы собираемся заставить наш ESP8266 «эмулировать» Wemo Belkin, устройство, имеющее специальную лицензию Amazon, позволяющую ему напрямую взаимодействовать с устройством Alexa, минуя все описанные выше облачные коммуникации Amazon.

Притворяясь Wemo, наш ESP8266 имеет возможность получать команды непосредственно от Alexa.

Базовый план нашего руководства по ESP8266 Arduino

  • Слушайте на ESP8266 устройство Alexa, отправляющее запросы в локальную сеть Wi-Fi для совместимых устройств, и отвечайте на эти запросы, говоря: «Я Wemo».
  • После того, как устройство Alexa доверяет вам, слушайте дальнейшие команды от указанного устройства. Управляйте ими, отправляя ИК-коды через ИК-передатчик, включая и выключая наш телевизор.

Требования к оборудованию

Абстрактное графическое представление аппаратных средств, включая башню Alexa и плату Arduino.

Чтобы завершить этот урок, вам нужно будет получить некоторые предметы самостоятельно, и все это легко получить.

  • Любое устройство Alexa. Я разработал этот учебник с помощью Alexa Dot. Будет ли учебник работать с симулятором Echo? Это может быть! (Но я не проверял). Попробуйте, если вы чувствуете себя предприимчивым (или экономным). Устройство Alexa стоит карманных денег, но использование Echosim бесплатно.
  • Чип ESP8266. На момент написания этой статьи они стоили всего несколько долларов. Вы можете приобрести их на Ebay или в любом интернет-магазине с хорошим ассортиментом.
  • ИК (инфракрасный) диод. Вам нужно будет подключить его к чипу ESP8266, и это вам придется сделать самостоятельно. Для этого проекта нам нужны только возможности отправки; мы не заботимся о приеме ИК. Обязательно подключите диод к GND и выведите 0, чтобы этот урок работал. (Если вы сделаете это любым другим способом, это нормально, но вы также должны будете нести ответственность за соответствующее изменение кода руководства. Эта ссылка может вам помочь. Имейте в виду, что из-за схемы нумерации, используемой на ESP8266, контакт 0 может быть помечен как «D3».
  • Последовательный адаптер, который с одной стороны является USB (для подключения к компьютеру разработчика), а другая сторона подходит к чипу ESP8266.
  • Локальная сеть Wi-Fi, к которой вы знаете имя пользователя и пароль.

Фотография ESP8266, прикрепленная к адаптеру, рядом с Echo Dot
ESP8266 подключен к адаптеру, рядом с Echo Dot

Фотография ESP8266 с подключенным ИК-диодом
ESP8266 с подключенным ИК-диодом

Программные инструменты Arduino

  • Ардуино IDE. Есть версии для всех основных ОС, включая Windows. Это руководство было разработано для версии Ubuntu, но я также установил и использовал Arduino в Windows, никаких проблем.
  • Библиотека разработки ESP8266 для Arduino.
  • Драйверы. К счастью, драйверы для вашего адаптера, скорее всего, должны быть plug & play, поэтому никаких дополнительных драйверов не требуется.

Настройка всего

  • Установите среду разработки Arduino.
  • Установите библиотеку ESP8266 с помощью диспетчера плат.

Чтобы установить библиотеку ESP8266 с помощью Boards Manager:

  • В Arduino IDE откройте File -> Preferences .
  • Введите этот URL-адрес в «URL-адрес диспетчера дополнительных плат»: http://arduino.esp8266.com/stable/package_esp8266com_index.json.
  • Нажмите ОК

Снимок экрана учебного пособия по ESP8266 Arduino с выделением поля URL-адресов диспетчера плат

  • Перейдите в Менеджер досок ( Инструменты -> Доска: [текущая доска] -> Менеджер досок ).

    Скриншот с выделением пункта меню Boards Manager

  • В текстовом поле «Фильтр» введите «ESP8266».
  • Вы должны получить запись для «esp8266» теперь, когда у вас добавлен менеджер дополнительных плат. Выберите его и нажмите «Установить».

Скриншот учебного пособия ESP8266 Arduino с диспетчером плат, на котором показан процесс установки

  • Подождите — для загрузки всего требуется некоторое время.
  • Перезапустите IDE Arduino.
  • Откройте Инструменты -> Плата: и на этот раз прокрутите вниз до «Универсальный модуль ESP8266» и выберите его.

Скриншот из руководства по ESP8266 Arduino, на котором выделен пункт меню для универсального модуля ESP8266

Добавление сторонних библиотек

Arduino предлагает множество различных способов добавления внешних библиотек в ваш проект, или «Sketch», как они его называют. Чтобы все было как можно проще, в этом уроке мы просто возьмем самое быстрое объяснение, а именно простое копирование папок. Нам нужно будет добавить ровно две внешние библиотеки для работы учебника: IRemoteESP8266 и https://github.com/me-no-dev/ESPAsyncTCP.

  • В коде учебника на GitHub найдите каталог «libraries».
  • В корневом каталоге установки Arduino (например, C:\Program Files\Arduino) найдите подкаталог «libraries».
  • Скопируйте каталог IRemoteESP8266 из каталога «libraries» учебника в каталог «libraries» Arduino.
  • Скопируйте каталог ESPAsyncTCP из каталога «libraries» учебника в каталог «libraries» Arduino.
  • Перезапустите среду разработки Arduino.

Теперь в проект включены библиотеки для IR-передачи и асинхронного TCP.

Настройки

На изображении ниже показаны типичные настройки, которые подходят мне и моему оборудованию, но могут отличаться для каждого пользователя. Вы можете попробовать приведенные ниже настройки, но есть вероятность, что вам придется настроить их в зависимости от вашего конкретного чипа и адаптера. У меня, например, nodemcu, поэтому мне пришлось изменить метод сброса с «ck» (по умолчанию) на «nodemcu». Кроме того, установите «порт отладки» на «последовательный», чтобы вы могли использовать последовательный отладчик. У меня очень типичная установка, так что вы можете использовать мои настройки в качестве основы; Я просто говорю, что не удивляйтесь, если вам придется возиться с ними, чтобы заставить процесс компиляции и прошивки работать.

Снимок экрана: пункт меню "Последовательный порт отладки"

Подтвердите свою настройку с помощью ESP8266 Hello World

Проекты Arduino начинаются с файла .ino. Файл .ino определяет две точки входа: настройку и цикл. Для нашего «привет, мир» мы собираемся включить немного света на ESP8266, просто чтобы убедиться, что наш код работает.

 //SET TO MATCH YOUR HARDWARE #define SERIAL_BAUD_RATE 9600 #define LED_PIN 2 /*---------------------------------------*/ //Runs once, when device is powered on or code has just been flashed void setup() { //if set wrong, your serial debugger will not be readable Serial.begin(SERIAL_BAUD_RATE); pinMode(LED_PIN, OUTPUT); } /*---------------------------------------*/ //Runs constantly void loop() { digitalWrite(LED_PIN, LOW); delay(1000); digitalWrite(LED_PIN, HIGH); delay(1000); }

Скомпилируйте и прошейте код

Компиляция и прошивка - это простые шаги, если ваши настройки до сих пор верны. Чтобы скомпилировать без перепрошивки, просто перейдите в Sketch -> Verify/Compile из меню Arduino.

Скриншот пункта меню «Загрузить» в меню «Эскиз»

Чтобы записать код на чип, а также скомпилировать его, выберите Sketch -> Upload в меню Arduino.

Скриншот процесса загрузки

Если прошивка прошла успешно, вы увидите, как индикатор выполнения переходит от 0% к 100%, в течение которого светодиод на вашем чипе, скорее всего, будет мигать или мигать.

Чтобы проверить, что последовательная отладка работает:

  • Сначала убедитесь, что для порта отладки установлено значение Serial ( Tools -> Debug port ).
  • После того, как ваш код закончит прошивать чип, выберите Tools -> Serial Monitor .

Снимок экрана: пункт меню "Последовательный порт отладки"

Вывод последовательного отладчика после успешного запуска:

Скриншот вывода последовательного отладчика после успешного запуска

Отлично, так что работает; затем мы хотим проверить наш ИК-выход. Давайте отправим сигнал через наш ИК-передатчик и убедимся, что сигнал проходит.

Мы собираемся использовать существующую библиотеку Arduino IR, чтобы помочь нам. Одна из замечательных особенностей Arduino заключается в том, насколько легко подключать и отключать библиотеки и модули. Очень освежает для C++ framework!

Просто следуйте инструкциям в файле README этого репозитория Git для установки в Arduino.

Этот код просто несколько раз мигает ИК-передатчиком. ИК невидим для человеческого глаза, но есть совет по его тестированию; запустите этот код, убедитесь (с помощью отладчика), что он работает на вашем чипе, затем откройте камеру вашего мобильного устройства. Посмотрите прямо на лампочку ИК-диода через камеру . Если он работает, вы должны увидеть, как лампочка включается и выключается. Вы также можете попробовать это с любым работающим пультом дистанционного управления (например, стандартным пультом от телевизора). Следующий код должен заставить ИК-лампу мигать каждые 0,5 секунды. На самом деле он отправляет команду включения / выключения LG, поэтому он может фактически включать и выключать ваш телевизор LG, если он находится поблизости.

 #include <IRremoteESP8266.h> // IR Library IRsend* irSend; // infrared sender //SET TO MATCH YOUR HARDWARE #define SERIAL_BAUD_RATE 9600 //PIN 0 is D3 ON THE CHIP #define IR_PIN 0 /*---------------------------------------*/ //Runs once, when device is powered on or code has just been flashed void setup() { //if set wrong, your serial debugger will not be readable Serial.begin(SERIAL_BAUD_RATE); //initialize the IR irSend = new IRsend(IR_PIN, true); irSend->begin(); } /*---------------------------------------*/ //Runs constantly void loop() { irSend->sendNEC(0x20DF10EF, 32, 3); delay(1000); }

Начните обучение ESP8266

Если до сих пор все работало, я думаю, мы можем быть удовлетворены тем, что наше основное оборудование и настройки работают, и мы готовы приступить к основной части урока.

Подключиться к Wi-Fi

Во-первых, нам нужно подключиться к локальному Wi-Fi. Приведенный ниже код попытается подключиться к Wi-Fi и сообщит об успешном подключении (через последовательный отладчик). В примере кода не забудьте заменить значение myWifiSsid на имя пользователя вашей сети Wi-Fi, а значение myWifiPassword — на правильный пароль.

 #include "debug.h" // Serial debugger printing #include "WifiConnection.h" // Wifi connection // this file is part of my tutorial code #include <IRremoteESP8266.h> // IR library WifiConnection* wifi; // wifi connection IRsend* irSend; // infrared sender //SET YOUR WIFI CREDS const char* myWifiSs; const char* myWifiPassword = "*******"; //SET TO MATCH YOUR HARDWARE #define SERIAL_BAUD_RATE 9600 //PIN 0 is D3 ON THE CHIP #define IR_PIN 0 /*---------------------------------------*/ //Runs once, when device is powered on or code has just been flashed void setup() { //if set wrong, your serial debugger will not be readable Serial.begin(SERIAL_BAUD_RATE); //initialize wifi connection wifi = new WifiConnection(myWifiSsid, myWifiPassword); wifi->begin(); //connect to wifi if (wifi->connect()) { debugPrint("Wifi Connected"); } } /*---------------------------------------*/ //Runs constantly void loop() { }

Запустите сервер Wemo

Связаны? Хорошо. Теперь мы подходим к сути проекта: серверу Wemo.

Мой собственный эмулятор Wemo включен в исходные файлы этого руководства. Теперь вы можете поискать в Google и найти более простой эмулятор Wemo. Вы можете найти тот, который написан с использованием меньшего количества кода и который легко понять. Во что бы то ни стало, не стесняйтесь исследовать, экспериментировать, писать свои собственные и т. д. Это все часть того, чтобы сделать это руководство своим собственным.

Моя причина в том, что он использует ESPAsyncTCP. Почему это хорошо? Что ж, существует не так много серверов (или устройств), которые вы можете запустить на ESP8266, используя этот метод, прежде чем он начнет становиться ненадежным, в том смысле, что Alexa начнет пропускать устройства (не находя их), команды будут сброшены, а производительность становится медленным. Я обнаружил, что это число максимально увеличивается при использовании библиотеки ESPAsyncTCP.

Без него я обнаружил, что ненадежность составляет около 10-12 устройств; с ним я считаю, что это число увеличивается примерно до 16. Если вы хотите расширить этот учебник и изучить пределы возможностей чипа, я бы порекомендовал использовать мою версию. Если вы хотите увидеть более простую версию только для собственного понимания, не стесняйтесь искать «wemo emulator Arduino» в Google; вы должны найти множество примеров.

Теперь нам нужно установить библиотеку ESPAsyncTCP. Установите его так же, как мы сделали библиотеку IR; перейдите на страницу Git и следуйте инструкциям.

Эта библиотека также включена в мой пример кода esp8266 arduino. Вот только код, чтобы открыть соединение Wi-Fi, прослушать запрос на обнаружение Alexa и обработать его, вернув ответ «Я Wemo».

 #include "debug.h" // Serial debugger printing #include "WifiConnection.h" // Wifi connection #include "Wemulator.h" // Our Wemo emulator #include <IRremoteESP8266.h> // IR library WifiConnection* wifi; // wifi connection Wemulator* wemulator; // wemo emulator IRsend* irSend; // infrared sender //SET YOUR WIFI CREDS const char* myWifiSs; const char* myWifiPassword = "*******"; //SET TO MATCH YOUR HARDWARE #define SERIAL_BAUD_RATE 9600 //PIN 0 is D3 ON THE CHIP #define IR_PIN 0 /*---------------------------------------*/ //Runs once, when device is powered on or code has just been flashed void setup() { //if set wrong, your serial debugger will not be readable Serial.begin(SERIAL_BAUD_RATE); //initialize wifi connection wifi = new WifiConnection(myWifiSsid, myWifiPassword); wifi->begin(); //initialize the IR irSend = new IRsend(IR_PIN, false); irSend->begin(); //initialize wemo emulator wemulator = new Wemulator(); //connect to wifi if (wifi->connect()) { wemulator->begin(); //start the wemo emulator (it runs as a series of webservers) wemulator->addDevice("tv", new WemoCallbackHandler(&commandReceived)); wemulator->addDevice("television", new WemoCallbackHandler(&commandReceived)); wemulator->addDevice("my tv", new WemoCallbackHandler(&commandReceived)); wemulator->addDevice("my television", new WemoCallbackHandler(&commandReceived)); } } /*---------------------------------------*/ //Runs constantly void loop() { //let the wemulator listen for voice commands if (wifi->isConnected) { wemulator->listen(); } }

предварительное тестирование

Протестируйте то, что у нас есть (wifi и эмулятор), запустив Alexa. В этом руководстве предполагается, что ваше устройство Alexa настроено и установлено у вас дома.

Тестовое открытие:

Скажите Алексе: «Алекса, найди устройства».

Это заставит Alexa транслировать запрос UDP в вашу локальную сеть Wi-Fi, сканируя Wemos и другие совместимые устройства. Этот запрос должен быть получен при вызове wemulator->listen(); в функции цикла(). Это, в свою очередь, направляет его в метод handleUDPPacket(*) . Ответ отправляется в nextUDPResponse() . Обратите внимание на содержание этого ответа:

 const char UDP_TEMPLATE[] PROGMEM = "HTTP/1.1 200 OK\r\n" "CACHE-CONTROL: max-age=86400\r\n" "DATE: Sun, 20 Nov 2016 00:00:00 GMT\r\n" "EXT:\r\n" "LOCATION: http://%s:%d/setup.xml\r\n" "OPT: \"http://schemas.upnp.org/upnp/1/0/\"; ns=01\r\n" "01-NLS: %s\r\n" "SERVER: Unspecified, UPnP/1.0, Unspecified\r\n" "ST: urn:Belkin:device:**\r\n" "USN: uuid:Socket-1_0-%s::urn:Belkin:device:**\r\n\r\n";

Это код, который говорит Alexa: «Я Wemo (Belkin), чем я могу вам помочь?» Как только Alexa получает этот ответ, она знает и запоминает, что будущие команды умного дома могут быть перенаправлены на это устройство.

Вывод последовательного отладчика в этот момент должен выглядеть так, как показано на рисунке ниже. По завершении обнаружения Alexa устно сообщит вам, что она «обнаружила [N] устройств» в вашей сети.

Скриншот вывода Alexa

В функции setup() обратите внимание на следующий фрагмент:

 new WemoCallbackHandler(&commandReceived)

Это обратный вызов, в котором мы будем захватывать команды от Alexa. Его тело определено в WemoCallbackHandler.h (WemoCallbackHandler::handleCallback). Как только мы получили команду от Alexa, мы можем делать с ней все, что захотим. В предыдущих строках мы настроили возможные команды, которые можно использовать, с помощью следующих строк кода:

 wemulator->addDevice("tv"); wemulator->addDevice("television"); wemulator->addDevice("my tv"); wemulator->addDevice("my television");

Итак, это 4 отдельных «сервера» или прослушивателя, которые мы запускаем на чипе. Это настраивает возможность сказать Alexa любую из следующих команд:

Алекса, включи телевизор Алекса, выключи телевизор Алекса, включи телевизор Алекса, выключи телевизор Алекса, включи мой телевизор Алекса, выключи мой телевизор Алекса, включи мой телевизор Алекса, выключи мой телевизор

И вот как мы это протестируем. Мы ожидаем, что произнесение любой из этих команд должно разбудить наш код и ввести этот обратный вызов, где мы можем делать с ним все, что захотим.

Скриншот того, что происходит, когда вы произносите команду

Добавьте ИК-команду

Теперь, когда мы получили команду, пришло время обработать ее,… включив/выключив наш телевизор. Так что это будет все — Wi-Fi, эмулятор wemo и IR — все вместе. Мой телевизор — LG, поэтому я нашел соответствующую последовательность включения/выключения и отправил ее через функцию sendNEC нашей ИК-библиотеки (LG использует протокол NEC). ИК-кодирование/декодирование является отдельной темой, в которой сообщение кодируется в модуляции сигнала; это спецификация очень точных таймингов, меток и пробелов. Каждый производитель склонен использовать свой собственный протокол для команд и с разными временными интервалами; это довольно интересно, и вы можете копнуть глубже, заглянув в исходный код этой IR-библиотеки, погуглив и т. д. Но для нашего удобства обо всех подробностях позаботится наша IR-библиотека.

Ваш телевизор не LG? Просто погуглите правильный код. Вот команда для телевизоров Sony (осторожно: не тестировалось):

 irSend.sendSony(0xa90, 12);

Если вы действительно хотите сделать все своими руками, вы можете настроить ИК-приемник, направить на него пульт дистанционного управления (или любой ИК-передатчик) и декодировать коды, которые он отправляет; это другой учебник, хотя.

Сквозной тест

  • Разместите Alexa в любом месте, где она вас услышит.
  • Поместите ESP8266 с подключенным ИК-диодом в пределах диапазона дистанционного управления телевизором.
  • Скажите «Алекса, найди устройства». Подождите, пока он сообщит об успехе (он должен был обнаружить хотя бы одно устройство).
  • Скажите «Алекса, включи мой телевизор» или «Алекса, выключи мой телевизор».

Alexa должна понимать вашу команду (как команду умного дома, не направленную на конкретный навык), искать локальное устройство для ее обработки и отправлять команду на устройство (ваш ESP8266). Ваше устройство должно получить его и отправить команду дистанционного управления на телевизор. Вы можете наблюдать за своим диодом через камеру мобильного телефона, чтобы убедиться, что он излучает.

Поскольку ИК-код для выключения телевизора такой же, как и код для его включения, не имеет значения, даете ли вы команду «включить» или «выключить». Это тот же код, и он переключает состояние. Если телевизор выключен, он должен включиться, а если включен, то должен выключить.

Поиск проблемы

Вы подключены к Wi-Fi?

Вы ввели правильное имя пользователя/пароль в правильные значения переменных?

 //SET YOUR WIFI CREDS const char* myWifiSs; const char* myWifiPassword = "*******";

Вы получаете сообщение об ошибке или какую-либо ошибку через последовательный порт отладки при подключении к Wi-Fi?

Включен ли ваш Wi-Fi и можете ли вы подключиться к нему любым другим обычным способом?

Ваше устройство обнаруживает Alexa?

Alexa будет отправлять запросы на обнаружение устройств, когда вы говорите «Alexa, найдите устройства».

Ваша Alexa должна быть правильно настроена и подключена к той же сети Wi-Fi, что и ваш ESP8266.

Посмотрите в Fauxmo.h. См. функцию Fauxmo::handle(). Это первый код, который запустится после того, как ESP8266 услышит вызов. Поместите сообщения отладки, чтобы увидеть, есть ли какой-либо код после

 if (len > 0) {

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

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

Ваше устройство получает команду?

Когда вы вводите команду «Алекса, включи мой телевизор», выполнение должно войти в ваш WemoCallbackHandler::handleCallback handler (в файле WemoCallbackHandler.h). Если вы этого не сделали, попробуйте вывести туда какое-нибудь отладочное сообщение, чтобы убедиться, что оно срабатывает, когда вы вводите свою команду. Кроме того, попробуйте убедиться, что Alexa знает о вашем устройстве, сказав «Alexa, найдите устройства» перед подачей команды. Этот шаг предполагает успешное обнаружение устройства.

ИК-диод излучает?

Как описано выше, когда вы думаете, что ваше устройство должно излучать, наведите на него камеру мобильного телефона и посмотрите на диод через камеру. Хотя в реальной жизни вы ничего не видите, через камеру это должно выглядеть как обычный свет, загорающийся и мигающий. Если вы видите это, значит, оно излучает… что-то.

Инфракрасный сигнал перевернут?

Ваш ИК-диод может быть подключен таким образом, что сигнал будет по существу обратным. Пожалуйста, выдержите меня в моем объяснении, так как я не специалист по электронике или электромонтажу, но результатом неправильного подключения диода будет то, что ИК-подсветка будет включена по умолчанию, но выключена, когда библиотека IRSend намеревается включить это на. Если это так, ваш ИК-свет должен быть включен (виден через камеру) по умолчанию после запуска кода setup() , но до того, как произойдет что-либо еще. Если бы вы закомментировали весь код внутри loop() , вы бы увидели, что он постоянно остается включенным.

Чтобы яснее увидеть, как это исправить, перейдите в папку library/IRemoteESP8266/src кода учебника. Смотрите конструктор:

 IRsend::IRsend(uint16_t IRsendPin, bool inverted) : IRpin(IRsendPin), periodOffset(PERIOD_OFFSET) { if (inverted) { outputOn = LOW; outputOff = HIGH; } else { outputOn = HIGH; outputOff = LOW; } }

Мы говорим об «перевернутом» аргументе и логике, которая его обрабатывает. Если ваша проводка перевернута, самое простое решение — внести небольшое изменение в код, чтобы учесть это (вместо того, чтобы перемонтировать… но, конечно, вы можете сделать это, если хотите). Просто измените эту строку в AlexaTvRemote.ino:

 //initialize the IR irSend = new IRsend(IR_PIN, false);

к

 //initialize the IR irSend = new IRsend(IR_PIN, true);

У вас есть правильный код дистанционного управления и команда?

Если все остальное вроде бы идет нормально, а телевизор просто не слушается, вполне вероятно, что что-то не так с ИК-кодом. Попробуйте разные вызовы функций на этом интерфейсе библиотеки IR (например, sendLG , sendPanasonic , sendSharp и т. д.) или убедитесь, что тот, который вы используете, соответствует вашему оборудованию. Очень маловероятно, что аппаратное обеспечение вашего телевизора не поддерживается этой библиотекой, но я думаю, что это технически возможно.

Убедитесь, что код, который вы отправляете, подходит для вашего оборудования. Возможно, вам придется немного покопаться в Google, чтобы найти правильный. Если ничего не помогает, всегда есть возможность обнаружить код, который исходит от вашего работающего пульта дистанционного управления, когда вы нажимаете кнопку питания, но это другое руководство и требует другого оборудования.

Подведение итогов

Надеюсь, у вас все получилось. Если да (а может, даже если и нет), то это был хороший способ наточить зубы сразу по нескольким предметам:

  • Алекса
  • Встроенное программирование
  • Чип ESP8266
  • Среда разработки Arduino

Кроме того, у вас, возможно, есть небольшое удобство: вы можете включать и выключать телевизор с помощью голосовой команды.

Почему Хак?

Почему это хак, а не часть базового API для Alexa? Узнав, как развивать свой первый навык Alexa, все, что я действительно хотел знать, это «как я могу просто отправить команду прямо с Alexa на другое устройство в сети?» Обидно, что Amazon не представила полноценный API для связи между устройством Alexa и другими объектами в локальной сети, не проходя через парадигму «навыков» или «умного дома» (где все должно отправляться в AWS прежде чем что-либо делать), но их просто нет.

Попробуйте пойти дальше

Попробуйте набор команд дистанционного управления, чтобы более полно управлять своим телевизором, например переключать каналы и регулировать громкость. Проверьте пределы чипа, увидев, сколько различных команд вы можете прослушивать на одном ESP8266 (подсказка: число едва разбивается на двузначное, без какого-либо очень умного программирования). Если вы хорошо разбираетесь в оборудовании, попробуйте управлять другими устройствами не через ИК-порт, подключив их напрямую к чипам ESP8266; как освещение и тому подобное. Изобретите Wemo заново!

Связанный:
  • Как я сделал полнофункциональную метеостанцию ​​на Arduino
  • Работа с аудиосэмплированием ESP32