智能家居因其便利性和節能性而變得流行。一個實施的項目使用語音命令無線控制家用電器和燈光。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燒錄特性,使得該芯片在各類應用中都能發揮出色的性能。逐高電子專注于智能語音技術的研發和應用,致力于為客戶提供高性能、低功耗的語音芯片解決方案。