使用 Alexa 和 Arduino IoT Cloud 完全控制您的电视
组件和用品
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
![]() |
| × | 1 | |||
![]() |
| × | 1 |
应用和在线服务
![]() |
| |||
![]() |
| |||
![]() |
|
关于这个项目
注意:本教程可能已过时,请转到 这里 获取最新版本。
简介:Arduino 物联网云
Arduino IoT Cloud 是一个平台,可让任何人轻松构建 IoT 连接对象。为了使用 Alexa 控制我们的电视,我们还将使用官方 Arduino Alexa 技能。
如果您不熟悉 Arduino IoT Cloud,我们建议您首先查看此介绍性项目,该项目将为您提供概述并指导您完成设置其中一个受支持的开发板 IoT Cloud Things em> 和属性 并让您加入。
第 1 部分:如何控制电视机
控制任何类型电视的最简单方法就是将我们当作它自己的遥控红外控制器。为了做到这一点,我们必须倾听 对于遥控器将发送的信号,捕获数据并使用我们的 Arduino 板模拟它。电路组装好后,我们将把这个草图上传到我们的电路板上。它将通过远程按钮按下生成的 IR 信号脉冲串转换为无符号整数数组。让我们将遥控器指向 Arduino IR 接收器 我们构建并按下以下按钮:
- 电源/待机
- 从 1 到 9 的频道
- 音量增大
- 降低音量
- 静音
- 频道向上
- 频道下降
我们将看到通过串行监视器的值 , 报告为 rawData
.现在让我们将它们记入一个文本文件,并为每个列表分配自己的数组名称(chan1
, chan2
等等)。以下数值仅供参考,由三星电视遥控器生成。
CHANNEL 1unsigned int chan1[67] ={4450,4500, 550,1700, 500,1700, 550,1700, 550,550, 550,600, 500,600, 550,5050505005005 ,1700,500600,500600,550550,550600,500600,550550,550600,500,1700,550600,500600,550550,550600,500600,550,1700,500,1700,550600,500,1700,550,1700,550 ,1700, 500,1700, 550,1700, 500};CHANNEL 2unsigned int chan2[67] ={4500,4500, 550,1700, 500,1700, 550,1700, 550,500500505050505 ,1700,550,1700,500,1700,550600,500600,550550,550600,500600,550,1700,500,600,550,1700,500600,550550,550600,500600,550550,550650,450,1700,550600,500 ,1700, 550,1700, 500,1700, 550,1700, 550,1700, 500};CHANNEL 3unsigned int chan3[67] ={4500,4500, 500,1700, 550,50505005001 ,550600,500600,550550,550,1700,500,1700,550,1700,550550,550600,500600,550550,550600,500600,550,1700,500,1700,550600,550550,550550,550600,550550,550 ,1700, 500 ,600, 550,550, 550,1700, 550,1650, 550,1700, 550,1700, 500,1700, 600};CHANNEL 4unsigned int chan4[67] ={4450,540505005050 ,1700,550600,500600,550550,600550,500600,550,1700,500,1700,550,1700,550550,550600,500600,550550,550600,500600,550550,550600,500,1700,550600,500600,550550 , 550,600, 500,1700, 550,1700, 550,1700, 500,600, 550,1700, 500,1700, 550,1700, 550,1700, 500};通道 5unsigned int chan5[67] ={4500,4500, 500,1700, 550,1700, 550,1700, 550,550, 550,550, 550,550, 600,550, 5,505,505,505,5005,550,505005 ,500600,550550,550600,500,1700,550600,500600,550,1700,500600,550550,550600,550550,550550,550,1700,550,1700,500,600,550,1700,500,1700,550,1700 , 550,1700, 500};通道 6unsigned int chan6[67] ={4500,4500, 550,1650, 550,1700, 550,1700, 500,600, 550,550, 550,600, 500,600, 5005,5005,5005006,5005,5005006 ,500600,550550,600550,550550,550,1700,500,600,550,1700,500600,550550,550600,500600,550,1700,500,600,550,1700,500,600,550,1650,600,1650,550,1700 , 550,1650, 600};通道 7unsigned int chan7[67] ={4500,4500, 550,1700, 500,1700, 550,1750, 500,550, 550,600, 500,650, 500,550, 5505,5005,505,5005,505,0505005 ,500550,550600,500650,500550,550600,500,1700,550,1750,500600,500550,550600,500650,500,1750,450,1700,550600,500650,500,1700,500,1700,550,1750 , 500,1700, 500};通道 8unsigned int chan8[67] ={4450,4550, 500,1700, 550,1700, 550,1650, 550,600, 500,600, 550,550, 550,600, 5005,5005,5005005,5005,05006 ,500600,550550,550600,500,1700,550600,500,1700,550,1700,500600,550550,550650,450600,550550,550,1700,550550,550600,500,1700,550,1700,550,1700 , 500,1700, 550};通道 9unsigned int chan9[67] ={4450,4500, 550,1700, 550,1700, 500,1700, 550,600, 500,600, 550,550, 550,600, 5005,5005,5005006,5005,05006 ,550600,500600,550550,550600,500,1700,550,1700,550,1700,500600,550550,550550,550600,500,1700,550600,500600,550550,550,1700,550,1700,500,1700 , 550,1700, 550}; VOLUME UPunsigned INT VOLUP [67] ={4500,4500,550,1700,500,1750,500,1700,550600,500600,500600,550550,550600,500,1700,550,1700,550,1700,500650,450600 ,550600,500650,450650,500,1700,500,1750,500,1750,500550,550600,500650,500550,550600,500650,500600,500600,500,1700,550,1750,450,1750,500,1700 , 550,1700, 500}; VOLUME DOWNunsigned INT VOLDOWN [67] ={4450,4550,500,1700,550,1700,550,1650,550600,550550,550600,500600,500600,550,1700,500,1700,550,1700,550550,550600 ,500600,550550,550600,500,1700,550,1700,550600,500,1700,550600,500600,500600,550550,550600,500650,500,1700,500650,500,1700,500,1750,500,1700 , 550,1700, 500}; CHANNEL UPunsigned int chanUp[67] ={4500,4450, 550,1700, 550,1650, 550,1700, 550,550, 550,600, 550,550, 550,550, 5065,505,505,5005,506,50505050 ,550600,500600,550550,550550,550,1700,550550,600550,550,1650,550600,550550,550550,550,1700,550550,550,1700,550,1700,550550,550,1650,600,1650 , 550,1700, 550}; CHANNEL DOWNunsigned int chanDown[67] ={4500,4450, 600,1650, 550,1700, 550,1650, 550,600, 550,550, 550,550, 550,600, 5005,5005,505,05005,5005,05006 ,550550,550550,550550,600550,550550,550600,500600,550,1650,600550,550550,550550,600,1650,550,1700,500,1700,600,1650,550550,600,1650,550,1700 , 500,1700, 550};
第 2 部分:Arduino 物联网云
来自主要的 Arduino IoT Cloud 页面,我们将创建一个新的事物 并为其指定一个有意义的名称。我们称之为TVRemoteController .然后我们将选择我们要使用的板。在本教程中,我们使用了 Arduino Nano 33 IoT,但如果您有另一个兼容的板子也可以,但请记住,IR 库的引脚排列和行为可能会发生变化。如果此时您看不到您的电路板,您可能跳过了入门 我们上面提到的程序,如果是这种情况,请返回该程序。
完成后,我们将添加一个属性 到我们的事物 ,它将代表我们的电视机。在智能家居下 类别,属性类型选择“TV”,设置为“读写”,在“更新”下选择“值改变时”。
这是属性 此时我们 Thing 的视图应该是这样的:

第 3 部分:Arduino 网络编辑器
现在是点击“EDIT SKETCH”按钮的时候了,这将带我们进入Web Editor,我们可以在其中向IoT Cloud 自动生成的Sketch 添加一些自定义代码。
我们必须包含的第一件事是 IR Remote 库,作者是 Ken Shirriff。
#include
然后我们必须为我们的通道设置一个二维数组,并为我们需要的命令设置 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 库和所需的频率(对于这种应用,它总是 38KHz)
IRsend irsend;const int freq =38;
我们还需要一个函数来发送 IR 命令并使内置 LED 闪烁(在这个阶段主要用于调试目的)。所使用的延迟值取决于您的电视的品牌和型号,因此如果事情没有按预期工作(错误的命令或未收到命令),请随时调整它。
void sendIR(const unsigned int buf[]) { digitalWrite(LED_BUILTIN, HIGH); irsend.sendRaw(buf, 67, freq);延迟(300);数字写入(LED_BUILTIN,低);}
最后一步是完成生成的回调onTvChange()
使用一些自定义代码,以便在 Alexa 命令更改 TV 属性时发送 IR 命令。例如,如果音量增大,我们必须虚拟按下按钮音量增大, 如果通道设置为7,我们必须发送通道7按钮的序列,依此类推。
void onTvChange() { Serial.println("=================="); Serial.println("开关:"+String(tv.getSwitch())); Serial.println("音量:"+String(tv.getVolume())); Serial.println("频道:"+String(tv.getChannel())); Serial.println("静音:"+String(tv.getMute())); Serial.println("=================="); if (first){ prevSwitch =tv.getSwitch(); prevVolume =tv.getVolume(); prevChannel =tv.getChannel(); prevMute =tv.getMute();第一个 =假;返回; } // 音量改变 if (tv.getVolume()> prevVolume) { tv.setMute(false); prevMute =false; for (int k =prevVolume + 1; k<=tv.getVolume(); k++) { sendIR(volUp); Serial.println("请求的音量:"+String(tv.getVolume())+" Set:"+String(k)); } prevVolume =tv.getVolume(); } else if (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();发送IR(静音); Serial.println("静音改变了:"+String(tv.getMute())); } else if (tv.getMute() !=prevMute &&!tv.getMute()) { prevMute =tv.getMute();发送IR(静音); Serial.println("静音改变了:"+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(chanDown); Serial.println("陈请求:"+String(newChannel)+" Set:"+String(ch)); } } } prevChannel =newChannel; Serial.println("频道改变了:"+String(tv.getChannel())); } // On/Off 改变 if (tv.getSwitch() !=prevSwitch) { prevSwitch =tv.getSwitch(); if (tv.getSwitch()) { sendIR(chan[6]); } else { sendIR(onoff); } Serial.println("开关改变了:"+String(tv.getSwitch())); }
第 4 部分:亚马逊 Alexa
我们现在需要 Amazon Alexa 应用 可以从 Apple App Store 或 Google Play Store 下载。安装后,使用您现有的帐户登录或创建一个新帐户。
让我们完成安装 Arduino Alexa Skill 所需的步骤,并将其配置为访问和控制我们的电视。我们将按照下面的图片顺序查看所有必需的步骤。











我们完成了,现在是时候用语音控制我们的电视询问诸如
- “Alexa,把电视音量调大。”
- “Alexa,将电视静音”或“Alexa,取消电视静音。”
- “Alexa,下一个电视频道。”
玩得开心 Alexa 和 IoT Cloud。如果您有任何疑问和/或构建此项目,请在下面的评论中告诉我们。
谢谢,
Arduino 团队
代码
阿杜诺
示意图

制造工艺
- 对吊扇启用 Alexa Control
- 使用 ARDUINO 的超声波悬浮机器
- 使用 Arduino、1Sheeld 和 Android 的通用远程控制
- 使用 Arduino 和智能手机的 DIY 电压表
- 使用物联网的心率监测器
- 使用物联网远程控制机械臂
- IOT - 使用 ESP8266、Arduino 和超声波传感器的智能罐
- 使用 Arduino Cloud 随时随地了解您家的温度!
- 使用 Firmata 和 Xbox One 控制器控制 Arduino Rover
- Arduino 加湿器控制
- Sonar 使用 arduino 并在处理 IDE 上显示
- 使用 Arduino 和 RDA8057M 的 FM 收音机