通过 Arduino IoT Cloud 用 Alexa 控制电视:分步指南
组件与物料
| 组件 | 数量 | 备注 |
|---|---|---|
| Arduino Nano 33 IoT | 1 | |
| 330Ω 电阻 | 1 | |
| IR 接收器 (如 VS1838B) | 1 | |
| IR 发射器 | 1 | |
| 杜邦线 | 1 | |
| 面包板 | 1 |
应用与在线服务
- Arduino Web Editor
- Arduino IoT Cloud
- Arduino Amazon Alexa 官方技能
项目详解
注意:本教程可能已过时,请访问 此处 获取最新版本。
简介:Arduino IoT Cloud
Arduino IoT Cloud 让任何人轻松构建物联网设备。控制电视用 Alexa,还需官方 Arduino Alexa Skill。
初学者建议先看入门项目,了解支持板卡配置、IoT Cloud Things 与 Properties 创建流程。
第一部分:如何控制电视
最简单的方法是模拟电视原装红外遥控器。需监听遥控器信号、捕获数据、用 Arduino 复现。电路组装好后上传采集草图,它将遥控器按键产生的 IR 信号脉冲转为无符号整数数组。对准 Arduino IR 接收器 按下列按键:
- 电源/待机
- 频道 1-9
- 音量+ / 音量-
- 静音
- 频道+ / 频道-
串口监视器会输出 rawData,记录到文本文件,每组起数组名(chan1、chan2…)。下方仅为参考,来自三星电视遥控器:
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};
... (chan3 到 chan9、volUp、volDown、chanUp、chanDown、onoff、mute 同理,此处省略以节省篇幅)
第二部分:Arduino IoT Cloud 配置
在 Arduino IoT Cloud 主页创建新 Thing,命名 TVRemoteController。选择开发板(本教程用 Arduino Nano 33 IoT,其他兼容板也可,注意引脚和 IR 库行为可能不同)。若看不见板卡,可能漏做了入门流程,请返回完成。
添加一个 Property 代表电视。在 Smart Home 类别选 “TV” 作为属性类型,设为 “Read & Write”,更新策略选 “When the value changes”。

第三部分:Arduino Web Editor 编码
点击 “EDIT SKETCH” 进入 Web Editor,在 IoT Cloud 自动生成的草图基础上添加自定义代码。
首先引入 Ken Shirriff 的 IRremote 库:
#include <IRremote.h>
建立二维数组存 9 个频道,6 个命令数组。用第一部分采集的 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 库与载波频率 (固定 38kHz):
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);
}
最后补全 IoT Cloud 生成的回调 onTvChange(),根据 Alexa 改变的 TV 属性发送对应 IR 指令。例如音量增加 → 发送 volUp;频道设为 7 → 发送 chan[6];等等。
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();
}
// 静音变化
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?原代码如此,实际应用请替换为真实开机码 onoff
} else {
sendIR(onoff);
}
Serial.println("Switch changed:" + String(tv.getSwitch()));
}
}
第四部分:Amazon Alexa 配置
需安装 Amazon Alexa App (App Store / Google Play),登录或注册账号。
按下图步骤安装 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 制作超声波悬浮装置:分步指南
- 基于 Arduino、1Sheeld 与红外控制的万能安卓遥控器
- Arduino 与智能手机打造智能电压表——简单易做的 DIY 项目
- 基于 Arduino 与 MAX30100 的实时物联网心率监测系统
- 基于 Arduino MKR1000 与 ThingSpeak 的远程 IoT 机械臂控制系统
- 智能物联网罐:ESP8266 + Arduino + 超声波传感器实时监测罐内物位
- Arduino Cloud 集成:随时随地监控家中温度
- Firmata + Xbox 手柄无线遥控 Arduino 小车:UWP 应用桥接方案
- DIY Arduino 加湿器控制器:继电器安全控制高压电路
- Arduino 声纳实时测距与 Processing 可视化
- 使用 Arduino Nano 和 RDA8057M 制作紧凑型 FM 收音机