Управление телевизором через Alexa и Arduino IoT Cloud — пошаговое руководство
Компоненты и материалы
| Arduino Nano 33 IoT | 1 |
| Резистор 330 Ом | 1 |
| IR-приемник (generic, например VS1838B) | 1 |
| IR-передатчик (generic) | 1 |
| Перемычки (generic) | 1 |
| Макетная плата (generic) | 1 |
Приложения и онлайн-сервисы
- Arduino Web Editor
- Arduino IoT Cloud
- Arduino Amazon Alexa Official Arduino Skill
О проекте
Примечание: Это руководство может быть устаревшим, перейдите сюда для более актуальной версии.
Введение: Arduino IoT Cloud
Arduino IoT Cloud — платформа, позволяющая любому легко создавать IoT-подключенные объекты. Для управления телевизором через Alexa мы также используем официальный Arduino Alexa Skill.
Если вы новичок в Arduino IoT Cloud, рекомендуем сначала ознакомиться с вводным проектом, который даст обзор и проведет через настройку одной из поддерживаемых плат, IoT Cloud Things и Properties и поможет начать работу.
Часть 1: Как управлять телевизором
Самый простой способ управлять любым телевизором — сделать вид, что мы его собственный ИК-пульт. Для этого нужно прослушать сигналы пульта, захватить данные и имитировать их с Arduino. После сборки схемы загрузим этот скетч. Он преобразует ИК-импульсы от нажатий кнопок пульта в массив беззнаковых целых. Направьте пульт на IR-приемник Arduino и нажмите:
- POWER/STANDBY
- КАНАЛЫ ОТ 1 ДО 9
- ГРОМКОСТЬ ВВЕРХ
- ГРОМКОСТЬ ВНИЗ
- MUTE
- КАНАЛ ВВЕРХ
- КАНАЛ ВНИЗ
Значения появятся в Serial Monitor как rawData. Запишите их в текстовый файл, присвоив каждому списку имя массива (chan1, chan2 и т.д.). Приведенные ниже значения — только для справки, сгенерированные пультом Samsung TV.
CHANNEL 1 unsigned 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};
CHANNEL 2 unsigned 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-9, volUp, volDown, chanUp, chanDown, onoff, mute)
Часть 2: Arduino IoT Cloud
На главной странице Arduino IoT Cloud создадим новый Thing с понятным именем. Назовем его TVRemoteController. Выберем используемую плату. В этом руководстве — Arduino Nano 33 IoT, но подойдет любая совместимая, только учтите, что распиновка и поведение IR-библиотеки могут отличаться. Если плату не видно — возможно, вы пропустили процедуру Getting Started, вернитесь к ней.
Добавим одно Property к нашему Thing — оно будет представлять телевизор. В категории Smart Home выберем «TV» как Property Type, установим «Read & Write», а в «Update» — «When the value changes».
Вид Properties нашего Thing должен выглядеть так:

Часть 3: Arduino Web Editor
Нажмите кнопку «EDIT SKETCH», которая перенесет в Web Editor, где можно добавить пользовательский код к автоматически сгенерированному скетчу IoT Cloud.
Первое — подключить библиотеку IR Remote от Ken Shirriff.
#include <IRremote.h>
Настроим двумерный массив для каналов и 6 массивов для команд. В Части 1 мы захватили IR-данные — теперь используем их для заполнения массивов.
const unsigned int chan[9][67] = { {chan1}, {chan2}, {chan3}, {chan4}, {chan5}, {chan6}, {chan7}, {chan8}, {chan9} };
const unsigned int volUp[67] = {...};
const unsigned int volDown[67] = {...};
const unsigned int chanUp[67] = {...};
const unsigned int chanDown[67] = {...};
const unsigned int onoff[67] = {...};
const unsigned int mute[67] = {...};
Настроим IR-библиотеку и требуемую частоту (для таких применений всегда 38 кГц).
IRsend irsend;
const int freq = 38;
Понадобится функция для отправки IR-команд и мигания встроенным LED (на этом этапе в основном для отладки). Значение задержки зависит от марки и модели телевизора — меняйте, если команды не работают как надо.
void sendIR(const unsigned int buf[]) {
digitalWrite(LED_BUILTIN, HIGH);
irsend.sendRaw(buf, 67, freq);
delay(300);
digitalWrite(LED_BUILTIN, LOW);
}
Финальный шаг — завершить сгенерированный callback onTvChange() пользовательским кодом для отправки IR-команд при изменении TV property командами Alexa. Например, если громкость увеличена — виртуально нажать Volume Up, если канал установлен на 7 — отправить последовательность для кнопки 7, и т.д.
void onTvChange() {
Serial.println("==================");
Serial.println("Switch:"+String(tv.getSwitch()));
Serial.println("Volume:"+String(tv.getVolume()));
Serial.println("Channel:"+String(tv.getChannel()));
Serial.println("Mute:"+String(tv.getMute()));
Serial.println("==================");
if (first){
prevSwitch = tv.getSwitch();
prevVolume = tv.getVolume();
prevChannel = tv.getChannel();
prevMute = tv.getMute();
first = false;
return;
}
// Громкость изменилась
if (tv.getVolume() > prevVolume) {
tv.setMute(false);
prevMute = false;
for (int k = prevVolume + 1; k <= tv.getVolume(); k++) {
sendIR(volUp);
Serial.println("Volume requested:"+String(tv.getVolume())+" Set:"+String(k));
}
prevVolume = tv.getVolume();
} else if (tv.getVolume() < prevVolume) {
tv.setMute(false);
prevMute = false;
for (int k = prevVolume - 1; k >= tv.getVolume(); k--) {
sendIR(volDown);
Serial.println("Volume changed:"+String(tv.getVolume())+" Set:"+String(k));
}
prevVolume = tv.getVolume();
}
// Mute изменился
if (tv.getMute() != prevMute && tv.getMute()) {
prevMute = tv.getMute();
sendIR(mute);
Serial.println("Mute changed:"+String(tv.getMute()));
} else if (tv.getMute() != prevMute && !tv.getMute()) {
prevMute = tv.getMute();
sendIR(mute);
Serial.println("Mute changed:"+String(tv.getMute()));
}
// Канал изменился
if (tv.getChannel() != prevChannel) {
int newChannel = tv.getChannel();
if (newChannel > 0 && newChannel < 10) {
sendIR(chan[newChannel-1]);
} else if (newChannel > 9) {
if (newChannel > prevChannel) {
for (int ch = prevChannel; ch < newChannel; ch++) {
sendIR(chanUp);
Serial.println("Chan requested:"+String(newChannel)+" Set:"+String(ch));
}
} else if (newChannel < prevChannel) {
for (int ch = prevChannel; ch > newChannel; ch--) {
sendIR(chanDown);
Serial.println("Chan requested:"+String(newChannel)+" Set:"+String(ch));
}
}
}
prevChannel = newChannel;
Serial.println("Channel changed:"+String(tv.getChannel()));
}
// Вкл/Выкл изменился
if (tv.getSwitch() != prevSwitch) {
prevSwitch = tv.getSwitch();
if (tv.getSwitch()) {
sendIR(chan[6]); // пример: канал 7 для включения
} else {
sendIR(onoff);
}
Serial.println("Switch changed:"+String(tv.getSwitch()));
}
}
Часть 4: Amazon Alexa
Нужен Amazon Alexa app из Apple App Store или Google Play Store. Установите, войдите в аккаунт или создайте новый.
Пройдем шаги установки Arduino Alexa Skill и настройки для доступа и управления телевизором. Следуйте последовательности изображений ниже.











Готово! Теперь можно голосом управлять телевизором:
- «Alexa, turn the volume up on TV.»
- «Alexa, mute TV» или «Alexa, unmute TV.»
- «Alexa, next channel on TV.»
Веселитесь с Alexa и IoT Cloud. Вопросы и результаты — в комментариях ниже.
Спасибо,
Команда Arduino
Схемы

Производственный процесс
- Управление потолочным вентилятором через Alexa: пошаговое руководство
- Создание ультразвукового левитатора на Arduino: пошаговое руководство
- Универсальный Android-пульт на Arduino, 1Sheeld и ИК-управлении
- Умный вольтметр на Arduino и смартфоне — простое DIY-проект
- IoT-монитор пульса в реальном времени на Arduino и MAX30100
- Удаленное IoT-управление самодельной манипулятором
- Умная банка на ESP8266 + Arduino: мониторинг наполненности в реальном времени
- Мониторинг температуры дома из любой точки через Arduino IoT Cloud
- Управление Arduino-роботом через Firmata и геймпад Xbox One
- DIY-контроллер увлажнителя на Arduino с реле: безопасная работа с высоким напряжением