我們用Arduino打造這么一款智能家居套件并為它取了一個(gè)很搞的名字“某某某”,需要開燈的時(shí)候,你只需叫某某某開燈,某某某就會(huì)立馬為你打開電燈并回答:“正在開燈”,某某某的功能可不止這一個(gè)功能哦。下面我們一一道來(lái)。
套件清單:
1.UNO控制板一塊
2.DFRduino I/OExpansion V5.0 擴(kuò)展板一塊
3.中文語(yǔ)音識(shí)別模塊Voice Recognition V1.0 一塊
4.語(yǔ)音合成模塊 Speech Synthesizer bee 一塊
5.繼電器模塊一個(gè)
6.溫濕度傳感器DHT11一個(gè)
7.氣體傳感器一個(gè)(可檢測(cè)煙霧,煤氣,天然氣,甲烷等)
8.LED燈模塊一個(gè)(用于表示語(yǔ)音識(shí)別狀態(tài),燈亮?xí)r方可進(jìn)行識(shí)別)
9.環(huán)境光線傳感器一個(gè)
10.小喇叭一個(gè)
制作步驟:
步驟1
將語(yǔ)音識(shí)別模塊插到控制板上(語(yǔ)音識(shí)別模塊已占用數(shù)字口2,4,9,10,11,12,13);然后將擴(kuò)展板V5插到語(yǔ)音識(shí)別模塊之上;語(yǔ)音合成模塊插到傳感器擴(kuò)展板的xbee插座上(語(yǔ)音合成模塊占用數(shù)字口0和1,下載程序時(shí)需要拔掉語(yǔ)音合成模塊哦);LED模塊接到數(shù)字口7;繼電器模塊接到數(shù)字口8,溫濕度傳感器DHT11接到模擬口0;氣體傳感器接到模擬口1;環(huán)境光線傳感器接到模擬口2。
步驟2
通過USB數(shù)據(jù)線,將代碼下到控制器,代碼下載成功后再將語(yǔ)音合成模塊插到擴(kuò)展板的XBEE接口上(注意,因?yàn)檎Z(yǔ)音合成模塊會(huì)占用串口,所以必須下載程序時(shí)必須拔掉,否則程序無(wú)法下載成功)。
功能介紹:
1.識(shí)別開關(guān)燈命令,執(zhí)行開關(guān)燈操作,并語(yǔ)音播報(bào)當(dāng)前狀態(tài)。
2.識(shí)別溫濕度讀取命令,并語(yǔ)音播報(bào)當(dāng)前溫濕度情況。
3.實(shí)時(shí)監(jiān)測(cè)危險(xiǎn)氣體,一旦檢測(cè)到立即報(bào)警并語(yǔ)音播報(bào)危險(xiǎn)情況。
4.未有識(shí)別時(shí)不做操作,識(shí)別命令有誤時(shí)播報(bào)“請(qǐng)問您在說什么?”。
5.你也可以考考某某某:“需要開燈嗎?”,系統(tǒng)就會(huì)對(duì)環(huán)境光線進(jìn)行檢測(cè),光線暗的情況下,某某某會(huì)提醒你:“光線不足,正在開燈”然后開燈,如果光線明亮?xí)r,某某某會(huì)說:“光線明亮,不需要開燈”保持燈在關(guān)的狀態(tài)(判斷光線強(qiáng)弱的閾值在程序中進(jìn)行設(shè)置,用戶可以自行修改)。
注:
為了最大程度的減少某某某的誤操作,在程序中我們?cè)O(shè)定了一條口令觸發(fā)“某某某”,即該套件只有在正確的識(shí)別到“某某某”三個(gè)字之后,才能執(zhí)行其后關(guān)鍵字命令的操作,例如,如果要執(zhí)行開燈命令,您需先說:“某某某”,之后某某某會(huì)說:“您好”,然后你再說:“開燈”,之后某某某才會(huì)執(zhí)行開燈命令。如果你不先叫某某某的名字,它可不會(huì)理會(huì)你的吩咐喔。
語(yǔ)音控制命令:
1.“某某某”——口令觸發(fā)命令。
2.“現(xiàn)在溫度怎么樣”——溫濕度檢測(cè)命令,播報(bào)相應(yīng)環(huán)境溫濕度。
3.“開燈”——開燈命令,需先執(zhí)行口令觸發(fā)命令才執(zhí)行改命令。
4.“關(guān)燈”——關(guān)燈命令,需先執(zhí)行口令觸發(fā)命令才執(zhí)行改命令。
5.“需要開燈嗎”——環(huán)境光線檢測(cè)命令,根據(jù)光線強(qiáng)弱,執(zhí)行開關(guān)燈命令。
6.“小米”、“小”、“米渣“——垃圾關(guān)鍵詞,目的是減小誤操作。
7.其他功能就要發(fā)揮您的聰明才智了哦。
程序代碼:
/*
識(shí)別關(guān)鍵詞的個(gè)數(shù)為SUM;
n為數(shù)組中對(duì)應(yīng)關(guān)鍵詞的序列號(hào),例如數(shù)組sRecog中的第一個(gè)關(guān)鍵詞為“kai deng”則對(duì)應(yīng)的序列號(hào)為0;
Voice.Initialise();初始化設(shè)置輸入方式MIC/MONO。
*/
#include <Wire.h>
#include <Voice.h>
#include "Syn6288.h"
Syn6288 syn;
#define SUM 15
#define DHT11_PIN 0 //模擬0
byte dht11_dat[5];
uint8 nAsrStatus=0;
char sRecog[SUM][80] = {"xiao mou","xian zai wen du zen me yang","kaideng","guan deng","xu yao kai deng ma","mi","ao","mi zha","wendu","kai","guan"};//某某某,現(xiàn)在溫度怎么樣,開燈,關(guān)燈,需要開燈嗎, ?
uint8_t text1[]={0xD2,0xBB,0xB6,0xFE,0xC8,0xFD,0xCB,0xC4,0xCE,0xE5,0xC1,0xF9,0xC6,0xDF,0xB0,0xCB,0xBE,0xC5,0xCA,0xAE,0xC1,0xE3};//一二三四五六七八九十零
uint8_t text2[]={0xC4,0xFA,0xBA,0xC3};// 您好
uint8_t text3[]={0xB5,0xB1,0xC7,0xB0,0xCE,0xC2,0xB6,0xC8,0xCE,0xAA};//當(dāng)前溫度
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";//報(bào)警音
uint8_ttext7[]={0xC7,0xEB,0xD7,0xA2,0xD2,0xE2,0xA3,0xAC,0xD3,0xD0,0xCE,0xA3,0xCF,0xD5,0xC6,0xF8,0xCC,0xE5,0xD0,0xB9,0xC2,0xA9};//請(qǐng)注意,有危險(xiǎn)氣體泄漏
uint8_t text8[]={0xD5,0xFD,0xD4,0xDA,0xBF,0xAA,0xB5,0xC6};//正在開燈
uint8_t text9[]={0xD5,0xFD,0xD4,0xDA,0xB9,0xD8,0xB5,0xC6};//正在關(guān)燈
uint8_ttext10[]={0xC7,0xEB,0xCE,0xCA,0xC4,0xE3,0xD4,0xDA,0xCB,0xB5,0xCA,0xB2,0xC3,0xB4,0xA3,0xBF};//請(qǐng)問你在說什么?
uint8_ttext11[]={0xB9,0xE2,0xCF,0xDF,0xB2,0xBB,0xD7,0xE3,0x20,0xA3,0xAC,0xD5,0xFD,0xD4,0xDA,0xBF,0xAA,0xB5,0xC6};//光線不足,正在開燈
uint8_ttext12[]={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 textt[2];
int gas,shine;
int dat1,dat2;
int flag;
int led=8;
int pig1,pig2,pig3,pig4;
void DHT11()
{
byte i;
byte dht11_in;
PORTC &= ~_BV(DHT11_PIN);
delay(18);
PORTC |= _BV(DHT11_PIN);
delayMicroseconds(40);
DDRC &= ~_BV(DHT11_PIN);
delayMicroseconds(40);
dht11_in = PINC &_BV(DHT11_PIN);
if(dht11_in){
Serial.println("dht11start condition 1 not met");
return;
}
delayMicroseconds(80);
dht11_in = PINC &_BV(DHT11_PIN);
if(!dht11_in){
Serial.println("dht11start condition 2 not met");
return;
}
delayMicroseconds(80);
for (i=0; i<5; i++)
dht11_dat[ i] =read_dht11_dat();
DDRC |= _BV(DHT11_PIN);
PORTC |= _BV(DHT11_PIN);
byte dht11_check_sum =dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];
// check check_sum
if(dht11_dat[4]!=dht11_check_sum)
{
Serial.println("DHT11checksum error");
}
dat1=dht11_dat[2];
dat2=dht11_dat[0];
}
byte read_dht11_dat()
{
byte i = 0;
byte result=0;
for(i=0; i< 8; i++){
while(!(PINC &_BV(DHT11_PIN))); // wait for 50us
delayMicroseconds(30);
if(PINC & _BV(DHT11_PIN))
result |=(1<<(7-i));
while((PINC &_BV(DHT11_PIN))); // wait '1' finish
}
return result;
}
void finally (unsigned char n)
{
//Serial.println(n);
switch(n)
{
case 0:syn.play(text2,sizeof(text2),0);flag=1;break;
case 1:
if(flag==1)
{
pig1=dat1/10;
pig2=dat1%10;
pig3=dat2/10;
pig4=dat2%10;
syn.play(text3,sizeof(text3),0);
if(pig1>0)
{
text[0]=text1[pig1*2-2];
text[1]=text1[pig1*2-1];
syn.play(text,sizeof(text),0);
text[0]=text1[18];
text[1]=text1[19];
syn.play(text,sizeof(text),0);
}
if(pig2>0)
{
text[0]=text1[pig2*2-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)
{
// Serial.println(pig3);
textt[0]=text1[pig3*2-2];
textt[1]=text1[pig3*2-1];
syn.play(textt,sizeof(textt),0);
textt[0]=text1[18];
textt[1]=text1[19];
syn.play(textt,sizeof(textt),0);
}
if(pig4>0)
{
// Serial.println(pig4);
textt[0]=text1[pig4*2-2];
textt[1]=text1[pig4*2-1];
syn.play(textt,sizeof(textt),0);
}
flag=0;
}
break;
case 2:
if(flag==1)
{
syn.play(text8,sizeof(text8),0);
digitalWrite(led,HIGH);
//delay(100);
flag=0;
}
break;
case 3:
if(flag==1)
{
syn.play(text9,sizeof(text9),0);
digitalWrite(led,LOW);
//delay(100);
flag=0;
}
break;
case 4:if(flag==1)
{
shine=analogRead(2);
if(shine<200)
{
syn.play(text11,sizeof(text11),0);
digitalWrite(led,HIGH);
}
else
{
syn.play(text12,sizeof(text12),0);
digitalWrite(led,LOW);
}
flag=0;
}
break;
default:syn.play(text10,sizeof(text10),0);
break;
}
}
void ExtInt0Handler ()
{
Voice.ProcessInt0(); //芯片送出中斷信號(hào)
}
void setup()
{
Wire.begin();
Serial.begin(9600);
Voice.Initialise(MIC,VoiceRecognitionV1);//Initialisemode MIC or MONO,default is MIC
//VoiceRecognitionV1 is VoiceRecognitionV1.0 shield
//VoiceRecognitionV2 is VoiceRecognitionV2.1 module attachInterrupt(0,ExtInt0Handler,LOW);
DDRC |= _BV(DHT11_PIN);
PORTC |= _BV(DHT11_PIN);
pinMode(led,OUTPUT);
pinMode(7,OUTPUT); //用于顯示可識(shí)別狀態(tài),燈亮?xí)r可識(shí)別
}
void loop()
{
uint8 nAsrRes;
nAsrStatus = LD_ASR_NONE;
// DHT11();
while(1)
{
DHT11();
gas=analogRead(1);
if(gas>700)
{
syn.play(text6,sizeof(text6),0);
syn.play(text7,sizeof(text7),0);
}
delay(100);
switch(nAsrStatus)
{
case LD_ASR_RUNING:
case LD_ASR_ERROR:
break;
case LD_ASR_NONE:
{
nAsrStatus=LD_ASR_RUNING;
if(Voice.RunASR(SUM,80,sRecog)==0)
{
nAsrStatus=LD_ASR_ERROR;
Serial.println( "ASR_ERROR");
}
Serial.println( "ASR_RUNING.....");
digitalWrite(7,HIGH);
break;
}
case LD_ASR_FOUNDOK:
{
digitalWrite(7,LOW);
nAsrRes =Voice.LD_GetResult();// 一次ASR識(shí)別流程結(jié)束,去取ASR識(shí)別結(jié)果
finally(nAsrRes);
nAsrStatus =LD_ASR_NONE;
break;
}
case LD_ASR_FOUNDZERO:
default:
{
digitalWrite(7,LOW);
nAsrStatus =LD_ASR_NONE;
break;
}
}// switch
delay(500);
}// while
}
資料下載:
基于Arduino的智能家居語(yǔ)音識(shí)別系統(tǒng)設(shè)計(jì).rar
(1.64 MB, 下載次數(shù): 57)
2021-12-1 21:17 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|