智能家居因其便利性和节能性而变得流行。一个实施的项目使用语音命令无线控制家用电器和灯光。Android 应用程序执行语音到文本的转换,蓝牙与微控制器通信以执行命令。这消除了与设备进行物理交互的需要。智能家居可以通过自动执行任务和跟踪能源使用情况来节省能源并减少碳足迹。家庭中的智能技术是一种让日常任务更轻松的有效方法。智能家居设备还可以跟踪能源使用情况并提供提高效率的见解。
在此之前,我们已经构建了一些 IoT 家庭自动化项目,以下是一些示例:
基于 IoT 的井盖监控系统
使用 Android Studio 创建 Android 应用,使用 NodeMCU 通过 WiFi 控制 LED
使用 Node-RED 和 Raspberry Pi 实现家庭自动化:控制灯光和读取 DHT11 数据
所需组件
Arduino UNO
HC-05 蓝牙模块
2 通道继电器模块 (5v)
2 个支架
2 个灯泡
220v 电线,带 2 针公插座
太阳能板
跳线
螺母和螺栓
和智能手机
蓝牙模块 HC-05
它是电子项目中广泛使用的无线通信模块。它使用串行 UART 通信进行数据传输。
该模块可以以两种模式工作:
主模式:它可以与所有从属设备共享数据。
从属模式:它从主蓝牙接收数据。
在这里,我们的蓝牙模块作为从属设备工作,而智能手机是主设备。
HC 05 引脚分布
它由 6 个引脚组成,分别是 STATE、RXD、TXD、GND、VCC 和 EN,如模块背面所述。
STATE 引脚:此引脚定义模块的状态,无论它是否与其他设备配对。
RxD 引脚:此引脚使用串行 UART 通信。当模块处于命令模式时,此引脚用于发送 AT 命令。
TxD 引脚:此引脚使用串行 UART 通信。当模块处于命令模式时,此引脚用于推送对 AT 命令的响应。
Vcc 引脚:此引脚用于为模块供电以使其工作。它通常连接到 Arduino 板上的 5V 引脚。其电压范围在 3.6v 到 5v 之间。
GND 引脚:此引脚用于将模块连接到 Arduino 板的地。
EN 引脚:此引脚用于在命令和数据模式之间切换。如果此引脚设置为 HIGH,模块将处于命令模式。同样,如果此引脚设置为低电平,模块将处于数据模式。
继电器
它是一种开关机电设备,可以切换高安培交流-直流电源。
继电器引脚分布
继电器模块引脚分布
该模块通常有四个引脚:
Vcc 引脚:用于为继电器模块供电。它通常连接到 5v。
GND 引脚:用于为继电器模块提供接地。
IN1:用于控制模块内第一个继电器的输出。
IN2:用于控制模块内第二个继电器的输出。
此外,每个继电器的高压端子侧还有三个引脚。这些是 NC(常闭)、COM(公共)和 NO(常开)。
连接非常简单,让我们开始吧。
蓝牙 HC-05:为了在 Arduino 和蓝牙 HC-05 模块之间建立通信,Arduino 的引脚 3(代码中定义的 Tx)连接到蓝牙模块的接收引脚 (RxD),而引脚 2 (Rx) 连接到发送引脚 (TxD)。蓝牙模块通过将其 Vcc 和 GND 引脚连接到 Arduino 各自的电源和接地引脚来供电。
继电器模块:Arduino 引脚 5 连接到继电器模块的 IN1,而引脚 6 连接到 IN2。这些输入引脚是低电平有效,这意味着逻辑低电平激活继电器,逻辑高电平停用继电器。
继电器模块有两个 LED 指示继电器的状态。当继电器被激活时,相应的 LED 会亮起。继电器模块通过将其 Vcc 和 GND 引脚连接到 Arduino 各自的电源和接地引脚来供电。
在继电器模块的高压侧,两个继电器的 COM 端口都连接到交流电。每个继电器的 NO 端子连接到每个单独的灯泡,而中性线直接连接到两个灯泡,如电路图所示。
设置语音命令 Android 应用程序
要使用该项目,首先您需要从 Playstore 安装一个名为 Arduino Bluetooth 的应用程序。
下载并安装该应用程序。
授予麦克风权限并启用蓝牙。
启动您的项目并将您的设备与 HC-05 配对。
在应用程序中切换到语音模式。
点击麦克风图标开始发出语音命令。
根据您的代码说出正确的命令。
享受通过语音提示控制您的设备的乐趣。
Arduino 代码说明
程序通过串行通信读取蓝牙模块数据并将其与定义的条件进行比较。如果任何条件为真,则将执行该任务。如果任何条件不满足,它将不执行任何操作。
首先,我们必须包含所有必要的库才能成功执行代码。库仅包括 SoftwareSerial。此外,我们还定义了进一步编程所需的变量和对象。
#include
// Define 2 channel relay pins
const int Light1 = 6; // Relay pin 1 (IN1)
const int Light2 = 5; // Relay pin 2 (IN2)
/* Create object named bt of the class SoftwareSerial */
SoftwareSerial bt(2, 3); /* (Rx,Tx) */
我们使用软件串行库来定义 Arduino 的 Rx 和 Tx 串行通信引脚。除此之外,我们可以直接使用 Arduino 引脚 (0,1) 作为 Rx 和 Tx,但每当我们上传新代码时,都会产生断开连接的麻烦。
在这里,我们将 pin2 定义为 Rx,将 pin3 定义为 Tx。始终记住,蓝牙的 RxD 连接到 Arduino 的 Tx,而 TxD 连接到 Arduino 的 Rx。
void setup() {
bt.begin(9600); /* 定义软件串行通信的波特率 */
Serial.begin(9600); /* 定义串行通信的波特率 */
// 将继电器引脚设置为 OUTPUT
pinMode(Light1, OUTPUT);
pinMode(Light2, OUTPUT);
digitalWrite(Light1, HIGH);
digitalWrite(Light2, HIGH);
}
在 setup() 函数中,启动串行通信。
蓝牙模块只能以波特率 9600 进行通信。因此,我们初始化 BT 模块。
此外,我们定义所有 Pinmode。
void loop() {
String data="";
char ch;
while (bt.available()) /* 如果串行端口上有数据 */
{ ch = bt.read(); /* 将收到的字符打印到串行监视器上 */
data=data+ch;
}
Serial.print(data);
// 使用语音命令控制设备
if ((data == "打开灯 1")||(data == "打开灯 1")) // 打开 Device1
{
digitalWrite(Light1, LOW);
delay(200);
}
else if ((data == "关闭灯 1")||(data == "关闭灯 1")) // 关闭 Device1
{
digitalWrite(Light1, HIGH);
delay(200);
}
// 使用语音命令控制设备
else if ((data == "打开灯二")||(data == "打开灯至")||(data == "打开灯 2")) // 打开设备 2
{
digitalWrite(Light2, LOW);
delay(200);
}
else if ((data== "关闭灯二")||(data == "关闭灯至")||(data == "关闭灯 2")) // 关闭设备 2
{
digitalWrite(Light2, HIGH);
delay(200);
}
}
在上面的循环部分,我们完成了所有处理任务,如读取串行端口、比较文本和执行任务。
读取串行端口上的可用数据并将其存储在字符串变量“data”中。此外,将存储的数据与我们使用 IF-Else 条件实现的不同条件进行比较。
您可以根据自己的方便更改比较文本。此外,您还可以在串行监视器上检查通过智能手机的语音命令发送的接收数据。
这就是代码的全部内容,只需上传代码即可。请注意 Rx 和 Tx 引脚,不要忘记在串行监视器上将波特率设置为 9600。
您将在下面的代码部分找到完整的代码。
项目运作
使用上传的代码启动您的项目。
打开应用程序并配对您的 BT 模块。
开始发送代码中使用的语音命令来控制设备。
#include
// DeUfine 2 channel relay pins
const int Light1 = 6; // Relay pin 1 (IN1)
const int Light2 = 5; // Relay pin 2 (IN2)
/* Create object named bt of the class SoftwareSerial */
SoftwareSerial bt(2, 3); /* (Rx,Tx) */
void setup() {
bt.begin(9600); /* Define baud rate for software serial communication */
Serial.begin(9600); /* Define baud rate for serial communication */
// Set Relay pins as OUTPUT
pinMode(Light1, OUTPUT);
pinMode(Light2, OUTPUT);
digitalWrite(Light1, HIGH);
digitalWrite(Light2, HIGH);
}
void loop() {
String data="";
char ch;
while (bt.available()) /* If data is available on serial port */
{ ch = bt.read(); /* Print character received on to the serial monitor */
data=data+ch;
}
Serial.print(data);
// Control the devices using voice command
if ((data == "turn on light one")||(data == "turn on light 1")) // turn on Device1
{
digitalWrite(Light1, LOW);
delay(200);
}
else if ((data == "turn off light one")||(data == "turn off light 1")) // turn off Device1
{
digitalWrite(Light1, HIGH);
delay(200);
}
// Control the devices using voice command
else if ((data == "turn on light two")||(data == "turn on light to")||(data == "turn on light 2")) // turn on Device2
{
digitalWrite(Light2, LOW);
delay(200);
}
else if ((data== "turn off light two")||(data == "turn off light to")||(data == "turn off light 2")) // turn off Device2
{
digitalWrite(Light2, HIGH);
delay(200);
}
}
希望你喜欢这篇文章并从中学到一些有用的东西。如果你有任何问题请联系逐高电子开发部应广单片机选型表
台湾应广科技语音IC作为一款高性能、低成本、易用的单片机芯片,在智能家居、智能安防、智能工业等领域具有广泛的应用前景。其高效的语音识别功能、语音提示与回放功能以及高性能的ADC和OTP烧录特性,使得该芯片在各类应用中都能发挥出色的性能。逐高电子专注于智能语音技术的研发和应用,致力于为客户提供高性能、低功耗的语音芯片解决方案。