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

用 Alexa 控制电视:Arduino 与 ESP8266 实现语音遥控

组件与物料清单

组件 数量 说明
Arduino UNO 1 配合 IR 发射二极管发送电视红外指令
NodeMCU ESP8266 开发板 1 WiFi 模块,向 Alexa 模拟 "WEMO" 设备,接收语音指令转发给 Arduino
IR 发射/接收模块 1 串联 100Ω 电阻驱动 IR LED 发射红外信号

所需工具

所需软件

项目原理

利用 Alexa 语音控制电视:录制电视遥控器的红外信号,配置 ESP8266 模拟 WEMO 设备接入 Alexa,语音指令触发 ESP8266 向 Arduino 发送脉冲,Arduino 驱动 IR LED 重放对应红外码实现控制。

步骤 1:安装前置库

在 Arduino IDE 库管理器中安装或手动导入:

步骤 2:编程 NodeMCU (ESP8266)

打开 ESP8266-Alexa.ino,修改 WiFi 凭据和设备名称(如 "TV"、"GregsNetflix"、"Sleep"、"Office"),上传至 NodeMCU(需在板管理器安装 ESP8266 支持)。

用 Alexa 控制电视:Arduino 与 ESP8266 实现语音遥控

步骤 3:读取电视遥控器红外码

将 IR_REMOTE_read.ino 上传至 Arduino,打开串口监视器,对着 IR 接收头按遥控器按键,记录显示的十六进制编码备用。

步骤 4:编程 Arduino 发射红外信号

打开 IR-Alexa-Send.ino,将步骤 3 记录的红外码填入对应指令处,上传至 Arduino UNO。接线参考原理图:IR 发射管接 Arduino D3,ESP8266 与 Arduino 通过 GPIO 互联(D1-D4 对应四个虚拟设备)。

用 Alexa 控制电视:Arduino 与 ESP8266 实现语音遥控

步骤 5:Alexa App 配置测试

在 Alexa App 中 "添加设备",自动发现 ESP8266 模拟的 4 个虚拟设备。随后即可用语音控制:

用 Alexa 控制电视:Arduino 与 ESP8266 实现语音遥控

完整代码

ESP8266-Alexa.ino (NodeMCU)

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include "fauxmoESP.h"

#define WIFI_SSID "your_ssid"
#define WIFI_PASS "your_password"
#define SERIAL_BAUDRATE 115200

fauxmoESP fauxmo;

void wifiSetup() {
  WiFi.mode(WIFI_STA);
  Serial.printf("[WIFI] Connecting to %s ", WIFI_SSID);
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print("."); delay(100);
  }
  Serial.println();
  Serial.printf("[WIFI] STATION Mode, SSID: %s, IP: %s\n", WiFi.SSID().c_str(), WiFi.localIP().toString().c_str());
}

#define RELAY_PIN1 13  // 对应 "TV"
#define RELAY_PIN2 2   // 对应 "GregsNetflix"
#define RELAY_PIN3 14  // 对应 "Sleep"
#define RELAY_PIN4 15  // 对应 "Office"

void setup() {
  pinMode(RELAY_PIN1, OUTPUT); digitalWrite(RELAY_PIN1, LOW);
  pinMode(RELAY_PIN2, OUTPUT); digitalWrite(RELAY_PIN2, LOW);
  pinMode(RELAY_PIN3, OUTPUT); digitalWrite(RELAY_PIN3, LOW);
  pinMode(RELAY_PIN4, OUTPUT); digitalWrite(RELAY_PIN4, LOW);

  Serial.begin(SERIAL_BAUDRATE);
  Serial.println("FauxMo demo sketch");
  wifiSetup();

  fauxmo.addDevice("TV");
  fauxmo.addDevice("GregsNetflix");
  fauxmo.addDevice("Sleep");
  fauxmo.addDevice("Office");
  fauxmo.onMessage(callback);
}

void callback(uint8_t device_id, const char * device_name, bool state) {
  Serial.printf("[MAIN] %s state: %s\n", device_name, state ? "ON" : "OFF");
  if (strcmp(device_name, "TV") == 0) {
    digitalWrite(RELAY_PIN1, state ? HIGH : HIGH);  // 注意:原代码 ON/OFF 均置 HIGH,实际应区分
  }
  if (strcmp(device_name, "GregsNetflix") == 0) {
    digitalWrite(RELAY_PIN2, state ? HIGH : LOW);
  }
  if (strcmp(device_name, "Sleep") == 0) {
    digitalWrite(RELAY_PIN3, state ? HIGH : LOW);
  }
  if (strcmp(device_name, "Office") == 0) {
    digitalWrite(RELAY_PIN4, state ? HIGH : LOW);
  }
}

void loop() {
  fauxmo.handle();
  delay(500);
  // 复位引脚防止常驻高电平
  digitalWrite(RELAY_PIN1, LOW);
  digitalWrite(RELAY_PIN2, LOW);
  digitalWrite(RELAY_PIN3, LOW);
  digitalWrite(RELAY_PIN4, LOW);
}

IR-Alexa-Send.ino (Arduino UNO)

#include <IRremote.h>
IRsend irsend;
#define a 4  // TV
#define b 5  // GregsNetflix
#define c 6  // Sleep
#define d 7  // Office

void setup() {
  Serial.begin(9600);
  pinMode(a, INPUT); pinMode(b, INPUT);
  pinMode(c, INPUT); pinMode(d, INPUT);
}

void loop() {
  if (digitalRead(a) == HIGH) {
    irsend.sendNEC(0x57E3E817, 32);  // Power
    Serial.println("TV"); delay(500);
  }
  if (digitalRead(b) == HIGH) {
    // 进入 Netflix 系列按键序列
    irsend.sendNEC(0x57E354AB, 32); delay(2000); // Enter
    irsend.sendNEC(0x57E39867, 32); delay(1000); // Up x3
    irsend.sendNEC(0x57E39867, 32); delay(1000);
    irsend.sendNEC(0x57E39867, 32); delay(1000);
    irsend.sendNEC(0x57E3B44B, 32); delay(1000); // Right
    irsend.sendNEC(0x57E354AB, 32); delay(2000); // Enter x2
    irsend.sendNEC(0x57E354AB, 32);
    Serial.println("The Office"); delay(500);
  }
  if (digitalRead(c) == HIGH) {
    // 睡眠定时器按键序列
    irsend.sendNEC(0x57E38679, 32); delay(1500); // Options
    irsend.sendNEC(0x57E3CC33, 32); delay(700);  // Down x4
    irsend.sendNEC(0x57E3CC33, 32); delay(700);
    irsend.sendNEC(0x57E3CC33, 32); delay(700);
    irsend.sendNEC(0x57E3CC33, 32); delay(700);
    irsend.sendNEC(0x57E3B44B, 32); delay(700);  // Right x2
    irsend.sendNEC(0x57E3B44B, 32); delay(900);
    irsend.sendNEC(0x57E38679, 32);               // Options
    Serial.println("Sleep Timer"); delay(500);
  }
  if (digitalRead(d) == HIGH) {
    irsend.sendNEC(0x57E34AB5, 32);  // Netflix 热键
    Serial.println("Greg's Netflix"); delay(500);
  }
}

IR_REMOTE_read.ino (读取遥控码)

#include <IRremote.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 9, 2);
int receiverpin = 10;
IRrecv irrecv(receiverpin);
decode_results results;

void setup() {
  lcd.begin(16, 2);
  pinMode(receiverpin, INPUT);
  Serial.begin(9600);
  irrecv.enableIRIn();
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    lcd.clear();
    lcd.print(results.value, HEX);
    delay(150);
    irrecv.resume();
  }
}

原理图

用 Alexa 控制电视:Arduino 与 ESP8266 实现语音遥控

制造工艺

  1. 工业触摸屏修还是换?专家决策指南
  2. 避孕药:历史、获益、风险与生产
  3. 用 Alexa 控制吊扇:分步指南
  4. Windows 10 Cortana 蓝牙控制 Arduino LED:UWP 应用开发全流程
  5. 通过 Arduino IoT Cloud 用 Alexa 控制电视:分步指南
  6. 金属钻削专家指南:机床钻孔技巧与实战要点
  7. 掌握汽车维修DIY技巧:省钱又靠谱的实用指南
  8. 工业控制系统防护:验证有效的策略与最佳实践
  9. 诊断修复过程控制系统的八大实证步骤
  10. 通过 Wake-on-LAN 利用 PLCnext 远程唤醒 PC
  11. 工业控制系统向无线网络转型指南
  12. 为何热固性复合材料是现代制造的理想之选