Arduino 聲控開關-語音辨識
這是聲控開關的第二部,上次用到的技術是利用Mic回饋的電壓,判斷拍手的動作.
進而去控制開關的動作.
這次的比較簡單,是利用語音IC模組,直接辨識語音.做出判斷,進而去控制開關的動作.
準備材料
1. Arduino Mega2560x1
2. LD3320語音識別模組
3. 繼電器模組
4. BEEP
5. LED
聲控開關-線路圖
由於太簡單了就直接分析語法吧...哈
#include "ld3320.h" // 使用LD3320的Lib
// Lib微雪課堂下載,裡面的講解也可看看
// 網址如下
// http://www.waveshare.net/study/article-11-1.html
#define RELAYON 0 // 定義RELAYON為"0", 以下依此類推 #define RELAYOFF 1 #define JIAWEISI 2 #define READFAIL -1 #define BEEP A7
#define BEEPGND A9 #define SLED 14 #define SLEDGND 15 #define RELAYPIN1 A0 #define RELAYPIN2 A1 VoiceRecognition Voice; // 宣告語音辨識含式庫VoiceRecognition
// 關鍵字為Voice void setup() { Serial.begin(115200); // 用來偵錯的, Serial port的速率, 設為115200bps pinMode(SLED,OUTPUT); // 設定SLED為輸出腳 pinMode(SLEDGND,OUTPUT); // 設定SLEDGND為輸出腳, 做低電位腳用 pinMode(BEEP, OUTPUT); // 設定BEEP為輸出腳 pinMode(BEEPGND, OUTPUT); // 設定BEEP為輸出腳, 做低電位腳用 pinMode(RELAYPIN1, OUTPUT); // 設定RELAYIN1為輸出腳 pinMode(RELAYPIN2, OUTPUT); // 設定RELAYIN2為輸出腳 digitalWrite(SLED, LOW); // SLED輸出低電位
digitalWrite(SLEDGND, LOW); // SLEDGND輸出低電位 digitalWrite(BEEP, LOW); // BEEP輸出低電位 digitalWrite(BEEPGND, LOW); // BEEPGND輸出低電位 digitalWrite(RELAYPIN1, HIGH); // RELAYPIN1輸出高電位 digitalWrite(RELAYPIN2, HIGH); // RELAYPIN1輸出高電位 Voice.init(); // 初始化Voice模組
Voice.addCommand("jia wei si", JIAWEISI); // 加入語音辨識關鍵字"賈維斯" // 這邊使用的是羅馬拼音 // 如果你有看鋼鐵人的話 // 應該會猜到我為何叫它賈維斯 Voice.addCommand("kai deng", RELAYON); // 加入語音辨識關鍵字"開燈" Voice.addCommand("guan deng", RELAYOFF); // 加入語音辨識關鍵字"關燈" Voice.start(); // 開始識別 Serial.println("Test Start"); // 用來偵錯的 for (int i = 0; i < 5; i++) // 開機聲 { digitalWrite(SLED, HIGH); tone(BEEP, 1000); delay(50); digitalWrite(SLED, LOW); noTone(BEEP); delay(50); } } void loop()
{ int iJIAWEISITime; switch (Voice.read()) // 語音識別含式
{ case JIAWEISI: Serial.println("Jia Wei Si"); // 用來偵錯的 for (int i = 0; i < 2; i++) // 辨識到賈維斯後, 回應BEEP聲 { // 兼LED閃爍 digitalWrite(SLED, HIGH); tone(BEEP, 1000); delay(50); digitalWrite(SLED, LOW); noTone(BEEP); delay(50); } //--- 開關可識別區 --------------------------------------------------------------------------
iJIAWEISITime = 0; while (iJIAWEISITime < 3000) // 開始計時約 3second { switch (Voice.read()) // 語音識別含式 { case RELAYON: Serial.println("ON"); // 用來偵錯的 digitalWrite(RELAYPIN1, LOW); // 繼電器1開啟 digitalWrite(RELAYPIN2, LOW); // 繼電器2開啟 iJIAWEISITime = 0; // 計時計數歸0 break; case RELAYOFF: Serial.println("OFF"); // 用來偵錯的 digitalWrite(RELAYPIN1, HIGH); // 繼電器1關閉 digitalWrite(RELAYPIN2, HIGH); // 繼電器1關閉 iJIAWEISITime = 0; // 計時計數歸0 break; default: break; } if ((iJIAWEISITime % 200) == 0) // LED閃爍代表目前在開關可識別區 { digitalWrite(SLED, HIGH); } if ((iJIAWEISITime % 200) == 100) { digitalWrite(SLED, LOW); } iJIAWEISITime++; // 計時計數加1 delay(1); // 計時計數單位1msec, 計數3000次, 大約等於3秒 } //--- 開關可識別區 -------------------------------------------------------------------------- // 開關可識別區,算是這次使用的小技巧 // 因為這款語音識別模組,有誤判的機率 // 所以為了防止誤判造成開關異常動作 // 一樣採用了28開關的複雜指命法,來控制開關 // 蝦米!不知道28開關!!!請參考我的另一篇Arduino聲控開關.
// // 首先,先幫聲控開關起個名子. // 這範例,我用的是"賈維斯"這個名子 // 當我說"賈維斯"時,若語音辨識系統有聽到 // 則系統會回應嗶嗶聲兼閃爍LED // 然後進入"開關可識別區" // 在開關可識別區內若無偵測到開關燈指令 // 則離開開關可識別區 // 若在開關可識別區內,說"開燈"則開關打開,並重新計時 // 若在開關可識別區內,說"關燈"則開關關閉,並重新計時 // // 開關可識別區為何指令是開關燈,因為我是將開關用在燈上 // 你可以依據你的需求更改 // break; default: //Serial.println("Not define!"); // 用來偵錯的 break; } } |
Designed by 30sec studio in Taiwan
Arduino聲控開關-語音辨識由Peng Yi Hsing製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款釋出。
此作品衍生自30sec studio。
文章標籤
全站熱搜
留言列表