|
Arduino智能家居初級套件
晚上回到家,家里黑漆漆一片,得找到開燈的按鈕才算完事,有時候在想,如果燈泡會聽話該多好啊,有了這個想法,智能家居就應運而生了,我們用Arduino打造這么一款智能家居套件并為它取了一個很搞的名字“小米渣”,需要開燈的時候,你只需叫小米渣開燈,小米渣就會立馬為你打開電燈并回答:“正在開燈”,小米渣的功能可不止這一個功能哦。下面我們一一道來。
套件清單:
1.UNO控制板一塊
2.DFRduino I/O Expansion V5.0 擴展板一塊
3.中文語音識別模塊Voice Recognition V1.0 一塊
4.語音合成模塊 Speech Synthesizer bee 一塊
5.繼電器模塊一個
6.溫濕度傳感器DHT11一個
7.氣體傳感器一個(可檢測煙霧,煤氣,天然氣,甲烷等)
8.LED燈模塊一個(用于表示語音識別狀態,燈亮時方可進行識別)
9.環境光線傳感器一個
10.小喇叭一個
制作步驟:
步驟1
將語音識別模塊插到控制板上(語音識別模塊已占用數字口2,4,9,10,11,12,13);然后將擴展板V5插到語音識別模塊之上;語音合成模塊插到傳感器擴展板的xbee插座上(語音合成模塊占用數字口0和1,下載程序時需要拔掉語音合成模塊哦);LED模塊接到數字口7;繼電器模塊接到數字口8,溫濕度傳感器DHT11接到模擬口0;氣體傳感器接到模擬口1;環境光線傳感器接到模擬口2。
步驟2
通過USB數據線,將代碼下到控制器,代碼下載成功后再將語音合成模塊插到擴展板的XBEE接口上(注意,因為語音合成模塊會占用串口,所以必須下載程序時必須拔掉,否則程序無法下載成功)。
功能介紹:
1.識別開關燈命令,執行開關燈操作,并語音播報當前狀態。
2.識別溫濕度讀取命令,并語音播報當前溫濕度情況。
3.實時監測危險氣體,一旦檢測到立即報警并語音播報危險情況。
4.未有識別時不做操作,識別命令有誤時播報“請問您在說什么?”。
5.你也可以考考小米渣:“需要開燈嗎?”,系統就會對環境光線進行檢測,光線暗的情況下,小米渣會提醒你:“光線不足,正在開燈”然后開燈,如果光線明亮時,小米渣會說:“光線明亮,不需要開燈”保持燈在關的狀態(判斷光線強弱的閾值在程序中進行設置,用戶可以自行修改)。
注:
為了最大程度的減少小米渣的誤操作,在程序中我們設定了一條口令觸發“小米渣”,即該套件只有在正確的識別到“小米渣”三個字之后,才能執行其后關鍵字命令的操作,例如,如果要執行開燈命令,您需先說:“小米渣”,之后小米渣會說:“您好”,然后你再說:“開燈”,之后小米渣才會執行開燈命令。如果你不先叫小米渣的名字,它可不會理會你的吩咐喔。
語音控制命令:
1.“小米渣”——口令觸發命令。
2.“現在溫度怎么樣”——溫濕度檢測命令,播報相應環境溫濕度。
3.“開燈”——開燈命令,需先執行口令觸發命令才執行改命令。
4.“關燈”——關燈命令,需先執行口令觸發命令才執行改命令。
5.“需要開燈嗎”——環境光線檢測命令,根據光線強弱,執行開關燈命令。
6.“小米”、“小”、“米渣“——垃圾關鍵詞,目的是減小誤操作。
7.其他功能就要發揮您的聰明才智了哦。
程序代碼:
- /*
- 識別關鍵詞的個數為SUM;
- n為數組中對應關鍵詞的序列號,例如數組sRecog中的第一個關鍵詞為“kai deng”則對應的序列號為0;
- Voice.Initialise();初始化設置輸入方式MIC/MONO。
- */
- #include <TimerOne.h>
- #include <avr/wdt.h>
- #include <Voice.h>
- #include <Syn6288.h>
- #include <dht11.h>
- dht11 DHT;
- Syn6288 syn;
- uint8 nAsrStatus=0;
- #define SUM 11
- #define DHT11_PIN A0
- #define light_sensor_pin A2
- #define light_threshold 200
- #define gas_sensor_pin A1
- #define gas_threshold 700
- #define relay 8
- #define state_led 7
- char sRecog[SUM][30] = {"xiao mi zha","xian zai wen du zen me yang","kai deng","guan deng","xu yao kai deng ma","xiao mi","xiao","mi zha","wen du","kai","guan"};
- //小米渣,現在溫度怎么樣,開燈,關燈,需要開燈嗎
- uint8_t text1[]={0xC1,0xE3,0xD2,0xBB,0xB6,0xFE,0xC8,0xFD,0xCB,0xC4,0xCE,0xE5,0xC1,0xF9,0xC6,0xDF,0xB0,0xCB,0xBE,0xC5,0xCA,0xAE};//零一二三四五六七八九十
- uint8_t text2[]={0xC4,0xFA,0xBA,0xC3};// 您好
- uint8_t text3[]={0xB5,0xB1,0xC7,0xB0,0xCE,0xC2,0xB6,0xC8,0xCE,0xAA};//當前溫度為
- uint8_t text4[]={0xCA,0xAA,0xB6,0xC8,0xCE,0xAA,0xB0,0xD9,0xB7,0xD6,0xD6,0xAE};//濕度為百分之
- uint8_t text5[]={0xC9,0xE3,0xCA,0xCF,0xB6,0xC8};//攝氏度
- uint8_t text6[]="soundn";//報警音
- uint8_t text7[]={0xC7,0xEB,0xD7,0xA2,0xD2,0xE2,0xA3,0xAC,0xD3,0xD0,0xCE,0xA3,0xCF,0xD5,0xC6,0xF8,0xCC,0xE5,0xD0,0xB9,0xC2,0xA9};//請注意,有危險氣體泄漏
- uint8_t text8[]={0xD5,0xFD,0xD4,0xDA,0xBF,0xAA,0xB5,0xC6};//正在開燈
- uint8_t text9[]={0xD5,0xFD,0xD4,0xDA,0xB9,0xD8,0xB5,0xC6};//正在關燈
- uint8_t text10[]={0xC7,0xEB,0xCE,0xCA,0xC4,0xE3,0xD4,0xDA,0xCB,0xB5,0xCA,0xB2,0xC3,0xB4,0xA3,0xBF};//請問你在說什么?
- uint8_t text11[]={0xB9,0xE2,0xCF,0xDF,0xB2,0xBB,0xD7,0xE3,0x20,0xA3,0xAC,0xD5,0xFD,0xD4,0xDA,0xBF,0xAA,0xB5,0xC6};//光線不足,正在開燈
- uint8_t text12[]={0xCF,0xD6,0xD4,0xDA,0xB9,0xE2,0xCF,0xDF,0xC3,0xF7,0xC1,0xC1,0xA3,0xAC,0xB2,0xBB,0xD0,0xE8,0xD2,0xAA,0xBF,0xAA,0xB5,0xC6};//光線明亮,不需要開燈
- uint8_t text[2];
- uint8_t flag; //標志位,收到小米渣口令后將置為1,動作執行完后清零
- void finally(uint8_t n) //n為sRecog數組中對應關鍵詞的序列號
- {
- switch(n)
- {
- case 0: syn.play(text2,sizeof(text2),0);flag=1;break; // 您好
- case 1: //現在溫度怎么樣
- if(flag==1) //收到小米渣的出發命令后
- {
- flag=0;
- DHT.read(DHT11_PIN); //讀取溫度
- /*Serial.print("Temperature:");
- Serial.print(DHT.temperature);
- Serial.print(" humidity:");
- Serial.println(DHT.humidity);*/
- uint8_t pig1 = DHT.temperature/10; //溫度數值十位
- uint8_t pig2 = DHT.temperature%10; //溫度數值個位
- uint8_t pig3 = DHT.humidity/10; //濕度數值十位
- uint8_t pig4 = DHT.humidity%10; //濕度數值個位
- syn.play(text3,sizeof(text3),0); //當前溫度為
- if(pig1>0){
- text[0]=text1[pig1*2];
- text[1]=text1[pig1*2+1];
- syn.play(text,sizeof(text),0); //播放溫度數值十位
- text[0]=text1[20];
- text[1]=text1[21];
- syn.play(text,sizeof(text),0); //播放語音十
- }
- if(pig2>0){
- text[0]=text1[pig2*2];
- text[1]=text1[pig2*2+1];
- syn.play(text,sizeof(text),0); //播放溫度數值個位
- }
- syn.play(text5,sizeof(text5),0); //播放攝氏度
- syn.play(text4,sizeof(text4),0); //播放濕度為百分之
-
- if(pig3>0){
- text[0]=text1[pig3*2];
- text[1]=text1[pig3*2+1];
- syn.play(text,sizeof(text),0); //播放濕度數值十位
- text[0]=text1[20];
- text[1]=text1[21];
- syn.play(text,sizeof(text),0); //播放語音十
- }
- if(pig4>0){
- text[0]=text1[pig4*2];
- text[1]=text1[pig4*2+1];
- syn.play(text,sizeof(text),0); //播放濕度數值個位
- }
- }
- break;
- case 2: //開燈
- if(flag==1)
- {
- syn.play(text8,sizeof(text8),0); //播放正在開燈
- digitalWrite(relay,HIGH); //高電平驅動
- flag=0;
- }
- break;
- case 3: //關燈
- if(flag==1)
- {
- syn.play(text9,sizeof(text9),0); //播放正在關燈
- digitalWrite(relay,LOW);
- flag=0;
- }
- break;
- case 4: //需要開燈嗎?
- if(flag==1)
- {
- int shine=analogRead(light_sensor_pin); //讀取光照度模擬量
- //Serial.print("Light:");
- //Serial.println(shine);
- if(shine < light_threshold) //小于光照度閥值時
- {
- syn.play(text11,sizeof(text11),0); //光線不足,正在開燈
- digitalWrite(relay,HIGH);
- }
- else
- {
- syn.play(text12,sizeof(text12),0); //光線明亮,不需要開燈
- digitalWrite(relay,LOW);
- }
- flag=0;
- }
- break;
- default:syn.play(text10,sizeof(text10),0);break; //非正常命令,請問你在說什么
- }
- }
- void ExtInt0Handler ()
- {
- Voice.ProcessInt0(); //芯片送出中斷信號
-
- }
- void timerIsr()
- {
- wdt_reset();
- }
- void setup()
- {
- Serial.begin(9600);
- Voice.Initialise(MIC,VoiceRecognitionV1);//Initialise mode MIC or MONO,default is MIC
- //VoiceRecognitionV1 is VoiceRecognitionV1.0 shield
- //VoiceRecognitionV2 is VoiceRecognitionV2.1 module
- attachInterrupt(0,ExtInt0Handler,LOW);
-
- pinMode(relay,OUTPUT);
- digitalWrite(relay,LOW);
- pinMode(state_led,OUTPUT);
- digitalWrite(state_led,LOW);
- Timer1.initialize(90000);
- Timer1.attachInterrupt(timerIsr); // attach the service routine here
- wdt_enable(WDTO_120MS);
- }
- void loop()
- {
- static uint8_t nAsrRes=0;
- static unsigned long time = millis();
- if(millis()-time>100)
- {
- int gas=analogRead(gas_sensor_pin);
- if(gas > gas_threshold)
- {
- syn.play(text6,sizeof(text6),0);
- syn.play(text7,sizeof(text7),0);
- }
- switch(nAsrStatus)
- {
- case LD_ASR_RUNING:
- case LD_ASR_ERROR:break;
- case LD_ASR_NONE:
- {
- nAsrStatus=LD_ASR_RUNING;
- if (Voice.RunASR(SUM,30,sRecog)==0) //識別不正確
- {
- nAsrStatus= LD_ASR_ERROR;
- Serial.println( "ASR_ERROR");
- }
- Serial.println( "ASR_RUNING.....");
- digitalWrite(state_led,HIGH);
- break;
- }
- case LD_ASR_FOUNDOK:
- {
- digitalWrite(state_led,LOW);
- nAsrRes =Voice. LD_GetResult();// 一次ASR識別流程結束,去取ASR識別結果
- finally(nAsrRes);
- nAsrStatus = LD_ASR_NONE;
- break;
- }
- case LD_ASR_FOUNDZERO:
- default:
- {
- digitalWrite(state_led,LOW);
- nAsrStatus = LD_ASR_NONE;
- break;
- }
- }// switch
- }//if
- }
復制代碼
|
-
-
基于Arduino的智能家居語音識別系統設計.docx
2022-5-16 00:12 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
687.28 KB, 下載次數: 33, 下載積分: 黑幣 -5
-
-
Voice RecognitionV1.0使用手冊.zip
2022-5-16 00:12 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
353.76 KB, 下載次數: 18, 下載積分: 黑幣 -5
-
-
SYN6288模塊資料.zip
2022-5-16 00:12 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
521.3 KB, 下載次數: 18, 下載積分: 黑幣 -5
-
-
Smart_home(源代碼).zip
2022-5-16 00:12 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
10.23 KB, 下載次數: 18, 下載積分: 黑幣 -5
-
-
Arduino智能家居初級套件使用說明.doc
2022-5-16 00:12 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
175 KB, 下載次數: 20, 下載積分: 黑幣 -5
|