2.5.7 智能灯光系统#

2.5.7.1 简介#

如果你不想起床关灯开灯时你是不是再想喊一声通过语音模块或者通过手机控制卧室灯,客厅灯,厨房灯,过道灯呢?本次课程就是教你如何使用ESP-01S模块加语音模块控制LED灯模拟家庭中你所需要开关的灯。

2.5.7.2 接线图#

注意:UNO代码上传完毕后再将ESP-01S模块连接到UNO扩展板上,连接时注意ESP-01S模块接口的线序,GND对应黑色线,VCC对应红色线,不要接错!!!

a100

2.5.7.3 ESP-01S 代码#

请注意,你需要将SSID 名称与PASSWD 密码修改成你需要连接的WiFi的,并且这个WiFi需要是2.4GHz频段的。

#include <ESP01_Wed.h>

char* WiFi_SSID = "LiuTest";       //你的wifi名称
char* WiFi_Password = "88888888";  //你的wifi密码

// 创建库对象
ESP01_Wed webInterface(WiFi_SSID, WiFi_Password, 750);  // SSID, 密码, 串口波特率

void setup() {
  // 初始化库
  webInterface.begin();

  // 添加传感器显示,将不需要显示的直接注释掉对应的代码即可
  //   webInterface.addSensor("Water Detect", "water", "waterValue");              //水滴传感器数据显示
  //   webInterface.addSensor("Temperature(&deg;C)", "temperature", "tempValue");  //温度数据显示
  //   webInterface.addSensor("Humidity(%RH)", "humidity", "humidityValue");       //湿度数据显示
  //   webInterface.addSensor("LIGHT", "light", "lightValue");                     //光敏传感器数据显示
  //   webInterface.addSensor("Ultrasonic(cm)", "ultrasonic", "ultraValue");       //超声波距离数据显示
  //   webInterface.addSensor("Smoke", "smoke", "smokeValue");                     //烟雾传感器数据显示
  //   webInterface.addSensor("Alcohol", "alcohol", "alcoholValue");               //酒精传感器数据显示
  //   webInterface.addSensor("Soil Moisture", "soil", "soilValue");               //土壤湿度传感器数据显示
  //   webInterface.addSensor("Pot", "pot", "potValue");                           //电位器数据显示器

  // 添加控制按钮,将不需要的按键直接注释掉对应的代码即可
  webInterface.addToggleButton("Red LED", "RED_LED:1", "RED_LED:0");        //添加红光灯控制按键
   webInterface.addToggleButton("Green LED", "GREEN_LED:1", "GREEN_LED:0");  //添加绿光灯控制按键
   webInterface.addToggleButton("Blue LED", "BLUE_LED:1", "BLUE_LED:0");     //添加蓝光灯控制按键
//   webInterface.addToggleButton("White LED", "WHITE_LED:1", "WHITE_LED:0");  //添加白光灯控制按键
//   webInterface.addToggleButton("Relay", "RELAY:1", "RELAY:0");              //添加继电器模块控制按键
//   webInterface.addToggleButton("Laser", "LASER:1", "LASER:0");              //添加激光模块控制按键
//   webInterface.addToggleButton("Water Pump", "PUMP:1", "PUMP:0");           //添加水泵控制按键
//   webInterface.addToggleButton("Motor", "MOTOR:1", "MOTOR:0");              //添加电机控制按键
//   webInterface.addToggleButton("Servo", "SERVO:1", "SERVO:0");              //添加舵机控制按键

  // 打印IP地址
  Serial.print("Web server IP: ");
  Serial.println(webInterface.getIP());
}

void loop() {
  // 主循环
  webInterface.loop();
}

2.5.7.4 UNO 代码#

// 引入SoftwareSerial库,用于创建软串口通信
#include <SoftwareSerial.h>

// 创建软串口对象,使用A5作为RX引脚接收数据,A4作为TX引脚发送数据
// 通常用于连接语音识别模块
SoftwareSerial mySerial(A5, A4);

// 定义变量用于存储从语音模块接收到的控制码
volatile int Voice_Control = 0;  // 初始化为0,确保首次判断时不触发任何指令

// 字符串变量,用于存储从WiFi模块(通过硬件串口)接收到的指令
String WiFi_Control = "";

// 定义LED连接的引脚号
int redLedPin = 9;
int greenLedPin = 10;
int blueLedPin = 11;

void setup() {
  // 初始化硬件串口,波特率设置为750(非标准值,需确保与WiFi模块一致)
  Serial.begin(750);
  
  // 初始化软串口,波特率9600,用于与语音模块通信
  mySerial.begin(9600);
  
  // 设置三色LED控制引脚为输出模式
  pinMode(redLedPin, OUTPUT);     // 红色LED
  pinMode(greenLedPin, OUTPUT);    // 绿色LED
  pinMode(blueLedPin, OUTPUT);    // 蓝色LED
}

void loop() {
  // 持续检查软串口是否有来自语音模块的数据
  while (mySerial.available()) {
    // 读取一个字节的数据(语音模块发送的通常是整数值)
    Voice_Control = mySerial.read();
    
    // 将接收到的语音指令通过硬件串口打印,便于调试
    Serial.print("Voice_Control:");
    Serial.println(Voice_Control);
  }

  // 检查硬件串口是否有来自WiFi模块的数据
  if (Serial.available()) {
    // 读取直到换行符的字符串(WiFi指令通常以换行结束)
    WiFi_Control = Serial.readStringUntil('\n');
    
    // 去除字符串首尾的空白字符(如回车、空格等)
    WiFi_Control.trim();
    
    // 将接收到的WiFi指令回传,便于调试
    Serial.print("WiFi_Control:");
    Serial.println(WiFi_Control);
  }

  // 根据语音指令或WiFi指令控制LED状态
  // 使用逻辑或(||)实现两种控制源均可触发相同动作
  
  // 控制红色LED:指令1 或 "RED_LED:1" 点亮
  if (Voice_Control == 1 || WiFi_Control == "RED_LED:1") {
    digitalWrite(redLedPin, HIGH);               // 点亮红色LED
    Serial.println("ACK:RED_LED:1");      // 发送确认信息
  
  // 控制红色LED:指令2 或 "RED_LED:0" 熄灭
  } else if (Voice_Control == 2 || WiFi_Control == "RED_LED:0") {
    digitalWrite(redLedPin, LOW);
    Serial.println("ACK:RED_LED:0");
  
  // 控制绿色LED:指令5 或 "GREEN_LED:1" 点亮
  } else if (Voice_Control == 5 || WiFi_Control == "GREEN_LED:1") {
    digitalWrite(greenLedPin, HIGH);
    Serial.println("ACK:GREEN_LED:1");
  
  // 控制绿色LED:指令6 或 "GREEN_LED:0" 熄灭
  } else if (Voice_Control == 6 || WiFi_Control == "GREEN_LED:0") {
    digitalWrite(greenLedPin, LOW);
    Serial.println("ACK:GREEN_LED:0");
  
  // 控制蓝色LED:指令7 或 "BLUE_LED:1" 点亮
  } else if (Voice_Control == 7 || WiFi_Control == "BLUE_LED:1") {
    digitalWrite(blueLedPin, HIGH);
    Serial.println("ACK:BLUE_LED:1");
  
  // 控制蓝色LED:指令8 或 "BLUE_LED:0" 熄灭
  } else if (Voice_Control == 8 || WiFi_Control == "BLUE_LED:0") {
    digitalWrite(blueLedPin, LOW);
    Serial.println("ACK:BLUE_LED:0");
  }

  // 清除当前指令,避免重复执行
  WiFi_Control = " ";   // 注意:赋值为空格字符串,建议改为空字符串""
  Voice_Control = 0;    // 语音指令清零
}

2.5.7.5 代码说明#

① 添加库文件,设置模拟串口引脚为RX:A5,TX:A4,添加全局变量整数类型名为Voice_Control,添加全局变量字符串类型名为WiFi_Control,设置LED控制引脚

② 设置好模拟串口波特率为9600以及串口波特率750,设置控制引脚为输出。

③ 读取模拟串口中语言模块发送的控制指令,并赋值给变量Voice_Control; 读取串口中ESP-01S模块发送的控制指令,并赋值给变量WiFi_Control

④ 使用判断模块判断变量Voice_Control等于1或者变量WiFi_Control等于RED_LED:1,如果条件满足亮起红色灯光,串口打印"ACK:RED_LED:1"应答。

④ 添加否则如果判断变量Voice_Control等于2或者变量WiFi_Control等于RED_LED:0,如果条件满足熄灭红色灯光,串口打印"ACK:RED_LED:0"应答。

④ 使用判断模块判断变量Voice_Control等于5或者变量WiFi_Control等于GREEN_LED:1,如果条件满足亮起红色灯光,串口打印"ACK:GREEN_LED:1"应答。

④ 添加否则如果判断变量Voice_Control等于6或者变量WiFi_Control等于GREEN_LED:0,如果条件满足熄灭红色灯光,串口打印"ACK:GREEN_LED:0"应答。

④ 使用判断模块判断变量Voice_Control等于7或者变量WiFi_Control等于BLUE_LED:1,如果条件满足亮起红色灯光,串口打印"ACK:BLUE_LED:1"应答。

④ 添加否则如果判断变量Voice_Control等于8或者变量WiFi_Control等于BLUE_LED:0,如果条件满足熄灭红色灯光,串口打印"ACK:BLUE_LED:0"应答。

2.5.7.6 代码结果#

上传测试代码成功,你可以通过WiFi输入IP地址进入控制页面控制LED灯点亮并且你也可以使用语言模块控制LED打开以及关闭。

语言模块控制方法:

开红灯示例: 你:“小智小智” ,小智:“我在”,你:“开红灯” 或 “打开红色灯” 或 “打开楼道灯”,小智:“已打开”

关红灯示例: 你:“小智小智” ,小智:“我在”,你:“关红灯” 或 “关闭红色灯” 或 “关闭楼道灯”,小智:“已关闭”

开绿灯示例: 你:“小智小智” ,小智:“我在”,你:“开绿灯” 或 “打开绿色灯” 或 “打开厨房灯”,小智:“已打开”

关绿灯示例: 你:“小智小智” ,小智:“我在”,你:“关绿灯” 或 “关闭绿色灯” 或 “关闭厨房灯”,小智:“已关闭”

开蓝灯示例: 你:“小智小智” ,小智:“我在”,你:“开蓝灯” 或 “打开蓝色灯” 或 “打开卧室灯”,小智:“已打开”

关红蓝示例: 你:“小智小智” ,小智:“我在”,你:“关蓝灯” 或 “关闭蓝色灯” 或 “关闭卧室灯”,小智:“已关闭”