Полный контроль над вашим телевизором с помощью Alexa и Arduino IoT Cloud
Компоненты и расходные материалы
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Приложения и онлайн-сервисы
| ||||
| ||||
|
Об этом проекте
Примечание. Это руководство может быть устаревшим, перейдите здесь для более актуальной версии .
Введение:Arduino IoT Cloud
Arduino IoT Cloud - это платформа, которая позволяет любому легко создавать объекты, подключенные к IoT. Чтобы управлять нашим телевизором с помощью Alexa, мы также будем использовать официальный навык Arduino Alexa.
Если вы новичок в Arduino IoT Cloud, мы советуем сначала взглянуть на этот вводный проект, который даст вам обзор и проведет вас через процесс настройки одной из поддерживаемых плат, IoT Cloud Things и Свойства и доставим вас на борт.
Часть 1. Как управлять телевизором
Самый простой способ управлять телевизором любого типа - действовать так, как если бы мы были его собственным удаленным инфракрасным контроллером. Для этого нам нужно послушать для сигналов, которые будет отправлять пульт, захватите данные и имитируйте их с помощью нашей платы Arduino. Как только схема будет собрана, мы загрузим этот эскиз на нашу плату. Он преобразует пакеты ИК-сигнала, генерируемые удаленными нажатиями кнопок, в массив целых чисел без знака. Направим пульт на ИК-приемник Arduino. мы построили и нажимаем следующие кнопки:
- ПИТАНИЕ / РЕЖИМ ОЖИДАНИЯ
- КАНАЛЫ С 1 ПО 9
- УВЕЛИЧИТЬ ГРОМКОСТЬ
- УМЕНЬШИТЬ ГРОМКОСТЬ
- MUTE
- ПОДКЛЮЧИТЬ КАНАЛ
- КАНАЛ ВНИЗ
Мы увидим значения, поступающие через Serial Monitor , отображается как rawData
. Давайте пока запомним их в текстовом файле и присвоим каждому списку собственное имя массива ( chan1
, chan2
и так далее). Следующие значения приведены только для справки и генерируются пультом дистанционного управления телевизора Samsung.
КАНАЛ 1 без знака int chan1 [67] ={4450,4500, 550,1700, 500,1700, 550,1700, 550,550, 550,600, 500,600, 550,550, 550,600, 500,1700, 550,1700, 550 , 1700, 500,600, 500,600, 550,550, 550,600, 500,600, 550,550, 550,600, 500,1700, 550,600, 500,600, 550,550, 550,600, 500,600, 550,1700, 500,1700, 550,600, 500,1700, 550,1700, 550 , 1700, 500,1700, 550,1700, 500}; КАНАЛ 2 без знака int chan2 [67] ={4500,4500, 550,1700, 500,1700, 550,1700, 550,550, 550,550, 550,600, 500,600, 550,600, 500 , 1700, 550,1700, 500,1700, 550,600, 500,600, 550,550, 550,600, 500,600, 550,1700, 500,600, 550,1700, 500,600, 550,550, 550,600, 500,600, 550,550, 550,650, 450,1700, 550,600, 500 , 1700, 550,1700, 500,1700, 550,1700, 550,1700, 500}; КАНАЛ 3 без знака int chan3 [67] ={4500,4500, 500,1700, 550,1700, 550,1700, 500,600, 550,550 , 550,600, 500,600, 550,550, 550,1700, 500,1700, 550,1700, 550,550, 550,600, 500,600, 550,550, 550,600, 500,600, 550,1700, 500,1700, 550,600, 550,550, 550,550, 550,600, 550,550, 550 , 1700, 500 , 600, 550,550, 550,1700, 550,1650, 550,1700, 550,1700, 500,1700, 600}; КАНАЛ 4 без знака int chan4 [67] ={4450,4450, 550,1700, 550,1700, 500 , 1700, 550,600, 500,600, 550,550, 600,550, 500,600, 550,1700, 500,1700, 550,1700, 550,550, 550,600, 500,600, 550,550, 550,600, 500,600, 550,550, 550,600, 500,1700, 550,600, 500,600, 550,550 , 550,600, 500,1700, 550,1700, 550,1700, 500,600, 550,1700, 500,1700, 550,1700, 550,1700, 500}; КАНАЛ 5 без знака int chan5 [67] ={4500,4500, 500,1700, 550,1700, 550,1700, 550,550, 550,550, 550,550, 600,550, 550,550, 550,1700, 550,1650, 550,1700, 550,550, 550,600 , 500,600, 550,550, 550,600, 500,1700, 550,600, 500,600, 550,1700, 500,600, 550,550, 550,600, 550,550, 550,550, 550,1700, 550,1700, 500,600, 550,1700, 500,1700, 550,1700 , 550,1700, 500}; КАНАЛ 6 беззнаковый int chan6 [67] ={4500,4500, 550,1650, 550,1700, 550,1700, 500,600, 550,550, 550,600, 500,600, 500,600, 550,1700, 500,1700, 550,1700, 550,550, 600,550 , 500,600, 550,550, 600,550, 550,550, 550,1700, 500,600, 550,1700, 500,600, 550,550, 550,600, 500,600, 550,1700, 500,600, 550,1700, 500,600, 550,1650, 600,1650, 550,1700 , 550,1650, 600}; КАНАЛ 7 без знака int chan7 [67] ={4500,4500, 550,1700, 500,1700, 550,1750, 500,550, 550,600, 500,650, 500,550, 550,550, 550,1750, 500,1700, 500,1700, 550,650, 450,650 , 500,550, 550,600, 500,650, 500,550, 550,600, 500,1700, 550,1750, 500,600, 500,550, 550,600, 500,650, 500,1750, 450,1700, 550,600, 500,650, 500,1700, 500,1700, 550,1750 , 500,1700, 500}; КАНАЛ 8 без знака int chan8 [67] ={4450,4550, 500,1700, 550,1700, 550,1650, 550,600, 500,600, 550,550, 550,600, 500,600, 550,1700, 500,1700, 550,1700, 550,550, 550,600 , 500,600, 550,550, 550,600, 500,1700, 550,600, 500,1700, 550,1700, 500,600, 550,550, 550,650, 450,600, 550,550, 550,1700, 550,550, 550,600, 500,1700, 550,1700, 550,1700 , 500,1700, 550}; КАНАЛ 9 без знака int chan9 [67] ={4450,4500, 550,1700, 550,1700, 500,1700, 550,600, 500,600, 550,550, 550,600, 500,600, 550,1700, 500,1700, 550,1700, 500,600, 550,550 , 550,600, 500,600, 550,550, 550,600, 500,1700, 550,1700, 550,1700, 500,600, 550,550, 550,550, 550,600, 500,1700, 550,600, 500,600, 550,550, 550,1700, 550,1700, 500,1700 , 550,1700, 550}; VOLUME UPunsigned int volUp [67] ={4500,4500, 550,1700, 500,1750, 500,1700, 550,600, 500,600, 500,600, 550,550, 550,600, 500,1700, 550,1700, 550,1700, 500,650, 450,600 , 550,600, 500,650, 450,650, 500,1700, 500,1750, 500,1750, 500,550, 550,600, 500,650, 500,550, 550,600, 500,650, 500,600, 500,600, 500,1700, 550,1750, 450,1750, 500,1700 , 550,1700, 500}; VOLUME DOWNunsigned int volDown [67] ={4450,4550, 500,1700, 550,1700, 550,1650, 550,600, 550,550, 550,600, 500,600, 500,600, 550,1700, 500,1700, 550,1700, 550,550, 550,600 , 500,600, 550,550, 550,600, 500,1700, 550,1700, 550,600, 500,1700, 550,600, 500,600, 500,600, 550,550, 550,600, 500,650, 500,1700, 500,650, 500,1700, 500,1750, 500,1700 , 550,1700, 500}; КАНАЛ UPunsigned int chanUp [67] ={4500,4450, 550,1700, 550,1650, 550,1700, 550,550, 550,600, 550,550, 550,550, 600,550, 550,1650, 550,1700, 550,1650, 600,550, 550,550 , 550,600, 500,600, 550,550, 550,550, 550,1700, 550,550, 600,550, 550,1650, 550,600, 550,550, 550,550, 550,1700, 550,550, 550,1700, 550,1700, 550,550, 550,1650, 600,1650 , 550,1700, 550}; КАНАЛ ВНИЗ [67] ={4500,4450, 600,1650, 550,1700, 550,1650, 550,600, 550,550, 550,550, 550,600, 500,600, 550,1700, 500,1700, 550,1700, 550,550, 550,600 , 550,550, 550,550, 550,550, 600,550, 550,550, 550,600, 500,600, 550,1650, 600,550, 550,550, 550,550, 600,1650, 550,1700, 500,1700, 600,1650, 550,550, 600,1650, 550,1700 , 500,1700, 550};
Часть 2:Arduino IoT Cloud
Из основного Arduino IoT Cloud страницу, мы создадим новую вещь и присвойте ему осмысленное имя. Назовем его TVRemoteController . . Затем мы выберем доску, которую собираемся использовать. Для этого урока мы использовали Arduino Nano 33 IoT, но если у вас есть другая совместимая плата, это тоже будет хорошо, просто имейте в виду, что распиновка и поведение библиотеки IR могут измениться. Если на этом этапе вы не видите свою доску, возможно, вы пропустили Начало работы Процедура, которую мы упомянули выше, если это так, вернитесь к этому процессу.
После этого мы добавим одно свойство на нашу вещь , он будет представлять собой наш телевизор. В разделе Умный дом выберите "TV" в качестве типа свойства, установите для него значение "Read &Write" и в разделе "Update" выберите "When the value changes"
Вот что Свойства взгляд на нашу Вещь в этот момент должен выглядеть так:
Часть 3:Веб-редактор Arduino
Пришло время нажать кнопку «ИЗМЕНИТЬ ЭСКИЗ», после чего мы перейдем в веб-редактор, где мы сможем добавить некоторый собственный код в эскиз, автоматически созданный IoT Cloud.
Первое, что нам нужно добавить, - это библиотека IR Remote от Кена Ширриффа.
#include
Затем нам нужно настроить один двумерный массив для наших каналов и 6 массивов для нужных нам команд. Если вы помните, в Части 1 мы захватили некоторые данные IR, которые теперь будем использовать для заполнения наших массивов
const unsigned int chan [9] [67] ={{chan1}, {chan2}, {chan3}, {chan4}, {chan5}, {chan6}, {chan7}, {chan8}, {chan9}}; const беззнаковый int volUp [67] ={...}; const unsigned int volDown [67] ={...}; const беззнаковый int chanUp [67] ={...}; const unsigned int chanDown [67] ={...}; const unsigned int onoff [67] ={...}; const unsigned int mute [67] ={...};
Затем давайте настроим ИК-библиотеку и необходимую частоту (для этого типа приложений она всегда будет 38 кГц)
IRsend irsend; const int freq =38;
Нам также понадобится функция для отправки ИК-команд и мигания встроенного светодиода (на этом этапе в основном для целей отладки). Используемое значение задержки будет зависеть от марки и модели вашего телевизора, поэтому не стесняйтесь настраивать его, если что-то не работает должным образом (неправильные команды или команды не получены).
void sendIR (const unsigned int buf []) {digitalWrite (LED_BUILTIN, HIGH); irsend.sendRaw (buf, 67, freq); задержка (300); digitalWrite (LED_BUILTIN, LOW);}
Последний шаг - завершить сгенерированный обратный вызов onTvChange ()
с некоторым настраиваемым кодом для отправки ИК-команд, когда свойство TV изменяется командами Alexa. Например, если громкость увеличивается, мы должны виртуально нажать кнопку Volume Up, если канал установлен на 7, мы должны отправить последовательность для кнопки канала 7 и так далее.
void onTvChange () {Serial.println ("=================="); Serial.println ("Switch:" + String (tv.getSwitch ())); Serial.println ("Объем:" + String (tv.getVolume ())); Serial.println ("Канал:" + String (tv.getChannel ())); Serial.println ("Без звука:" + String (tv.getMute ())); Serial.println ("=================="); если (первый) {prevSwitch =tv.getSwitch (); prevVolume =tv.getVolume (); prevChannel =tv.getChannel (); prevMute =tv.getMute (); первый =ложь; возвращение; } // Громкость изменилась if (tv.getVolume ()> prevVolume) {tv.setMute (false); prevMute =false; для (int k =prevVolume + 1; k <=tv.getVolume (); k ++) {sendIR (volUp); Serial.println ("Запрошенный объем:" + String (tv.getVolume ()) + "Set:" + String (k)); } prevVolume =tv.getVolume (); } иначе, если (tv.getVolume () =tv.getVolume (); k--) {sendIR (volDown); Serial.println ("Объем изменен:" + String (tv.getVolume ()) + "Set:" + String (k)); } prevVolume =tv.getVolume (); } // Отключение звука изменено if (tv.getMute ()! =PrevMute &&tv.getMute ()) {prevMute =tv.getMute (); sendIR (без звука); Serial.println ("Отключение звука изменено:" + String (tv.getMute ())); } иначе, если (tv.getMute ()! =prevMute &&! tv.getMute ()) {prevMute =tv.getMute (); sendIR (без звука); Serial.println ("Отключение звука изменено:" + String (tv.getMute ())); } // Канал изменен if (tv.getChannel ()! =PrevChannel) {int newChannel =tv.getChannel (); если (newChannel> 0 &&newChannel <10) {sendIR (chan [newChannel-1]); } else if (newChannel> 9) {if (newChannel> prevChannel) {for (int ch =prevChannel; ch newChannel; ch--) {sendIR (chanDown); Serial.println ("Chan запрошен:" + String (newChannel) + "Set:" + String (ch)); }}} prevChannel =newChannel; Serial.println ("Канал изменен:" + String (tv.getChannel ())); } // Вкл. / Выкл. Изменено if (tv.getSwitch ()! =PrevSwitch) {prevSwitch =tv.getSwitch (); если (tv.getSwitch ()) {sendIR (chan [6]); } else {sendIR (вкл.); } Serial.println ("Переключатель изменен:" + String (tv.getSwitch ())); }
Часть 4. Amazon Alexa
Теперь нам понадобится приложение Amazon Alexa . который можно загрузить из Apple App Store или Google Play Store. После установки войдите в систему с существующей учетной записью или создайте новую.
Давайте рассмотрим шаги, необходимые для установки Arduino Alexa Skill и настройки его для доступа и управления нашим телевизором. Мы проследим последовательность изображений ниже, чтобы увидеть все необходимые шаги.
Мы закончили, пришло время управлять телевизором с помощью голоса, задавая такие вопросы, как
- «Алекса, прибавь громкости на телевизоре».
- «Алекса, выключить ТВ» или «Алекса, включить ТВ».
- «Алекса, следующий канал на ТВ».
Получайте удовольствие от игры с Alexa и IoT Cloud. Если у вас есть вопросы и / или вы строите этот проект, дайте нам знать в комментариях ниже.
Спасибо,
Команда Arduino
Код
Ардуино
Схема
Производственный процесс
- Включение Alexa Control для потолочного вентилятора
- Ультразвуковой левитационный аппарат с использованием ARDUINO
- Универсальный пульт дистанционного управления с использованием Arduino, 1Sheeld и Android
- Вольтметр своими руками с использованием Arduino и смартфона
- Монитор сердечного ритма с использованием Интернета вещей
- Использование Интернета вещей для удаленного управления манипулятором
- IOT - Smart Jar с использованием ESP8266, Arduino и ультразвукового датчика
- Узнавайте температуру своего дома откуда угодно с помощью Arduino Cloud!
- Управление Arduino Rover с помощью Firmata и контроллера Xbox One
- Управление увлажнителем Arduino