亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

通过 Arduino IoT Cloud 用 Alexa 控制电视:分步指南

组件与物料

组件数量备注
Arduino Nano 33 IoT1
330Ω 电阻1
IR 接收器 (如 VS1838B)1
IR 发射器1
杜邦线1
面包板1

应用与在线服务

项目详解

注意:本教程可能已过时,请访问 此处 获取最新版本。

简介:Arduino IoT Cloud

Arduino IoT Cloud 让任何人轻松构建物联网设备。控制电视用 Alexa,还需官方 Arduino Alexa Skill。

初学者建议先看入门项目,了解支持板卡配置、IoT Cloud Things 与 Properties 创建流程。

第一部分:如何控制电视

最简单的方法是模拟电视原装红外遥控器。需监听遥控器信号、捕获数据、用 Arduino 复现。电路组装好后上传采集草图,它将遥控器按键产生的 IR 信号脉冲转为无符号整数数组。对准 Arduino IR 接收器 按下列按键:

串口监视器会输出 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 IoT Cloud 用 Alexa 控制电视:分步指南

第三部分: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 并配置控制电视:

通过 Arduino IoT Cloud 用 Alexa 控制电视:分步指南
通过 Arduino IoT Cloud 用 Alexa 控制电视:分步指南
通过 Arduino IoT Cloud 用 Alexa 控制电视:分步指南
通过 Arduino IoT Cloud 用 Alexa 控制电视:分步指南
通过 Arduino IoT Cloud 用 Alexa 控制电视:分步指南
通过 Arduino IoT Cloud 用 Alexa 控制电视:分步指南
通过 Arduino IoT Cloud 用 Alexa 控制电视:分步指南
通过 Arduino IoT Cloud 用 Alexa 控制电视:分步指南
通过 Arduino IoT Cloud 用 Alexa 控制电视:分步指南
通过 Arduino IoT Cloud 用 Alexa 控制电视:分步指南
通过 Arduino IoT Cloud 用 Alexa 控制电视:分步指南

完成!现在可用语音控制电视:

尽情享受 Alexa 与 IoT Cloud 的联动乐趣。有问题或构建了项目欢迎评论区留言。

谢谢,
Arduino 团队

制造工艺

  1. 用 Alexa 控制吊扇:分步指南
  2. 用 Arduino 制作超声波悬浮装置:分步指南
  3. 基于 Arduino、1Sheeld 与红外控制的万能安卓遥控器
  4. Arduino 与智能手机打造智能电压表——简单易做的 DIY 项目
  5. 基于 Arduino 与 MAX30100 的实时物联网心率监测系统
  6. 基于 Arduino MKR1000 与 ThingSpeak 的远程 IoT 机械臂控制系统
  7. 智能物联网罐:ESP8266 + Arduino + 超声波传感器实时监测罐内物位
  8. Arduino Cloud 集成:随时随地监控家中温度
  9. Firmata + Xbox 手柄无线遥控 Arduino 小车:UWP 应用桥接方案
  10. DIY Arduino 加湿器控制器:继电器安全控制高压电路
  11. Arduino 声纳实时测距与 Processing 可视化
  12. 使用 Arduino Nano 和 RDA8057M 制作紧凑型 FM 收音机