久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3679|回復: 2
打印 上一主題 下一主題
收起左側

基于Arduino的智能家居語音識別系統設計

[復制鏈接]
跳轉到指定樓層
樓主
ID:984022 發表于 2021-12-1 21:17 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我們用Arduino打造這么一款智能家居套件并為它取了一個很搞的名字“某某某”,需要開燈的時候,你只需叫某某某開燈,某某某就會立馬為你打開電燈并回答:“正在開燈”,某某某的功能可不止這一個功能哦。下面我們一一道來。
套件清單:
1.UNO控制板一塊
2.DFRduino I/OExpansion 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 <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"};//某某某,現在溫度怎么樣,開燈,關燈,需要開燈嗎, ?
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};//當前溫度
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_ttext7[]={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_ttext10[]={0xC7,0xEB,0xCE,0xCA,0xC4,0xE3,0xD4,0xDA,0xCB,0xB5,0xCA,0xB2,0xC3,0xB4,0xA3,0xBF};//請問你在說什么?
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();  //芯片送出中斷信號
               
}
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); //用于顯示可識別狀態,燈亮時可識別
}
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識別流程結束,去取ASR識別結果  
                          
                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的智能家居語音識別系統設計.rar (1.64 MB, 下載次數: 57)

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:471572 發表于 2021-12-4 12:54 | 只看該作者
好不好用?有人試過嗎?
回復

使用道具 舉報

板凳
ID:906792 發表于 2021-12-21 10:31 | 只看該作者
先站個樓觀望觀望
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美在线视频 | 久久新| 成年人黄色免费视频 | 欧美一级在线免费观看 | 中文字幕免费视频 | 综合久久一区 | 国产精品揄拍一区二区 | 日韩欧美网| 一级毛片视频 | 国产不卡在线观看 | 国产一区二区久久 | 久久久国产精品视频 | av网站免费看 | 成人二区 | 久久精品成人一区 | 精品精品视频 | 黄色一级电影免费观看 | 久草电影网 | 天天干天天爱天天 | 亚州国产 | 久久性av | 亚洲福利在线观看 | 欧美综合一区二区三区 | 一级a性色生活片久久毛片 一级特黄a大片 | 国产一区二区三区四区区 | 嫩草懂你的影院入口 | 亚洲啪啪| 日日夜夜精品视频 | 国产不卡一 | 91视频国产一区 | 免费看国产一级特黄aaaa大片 | 日本精品一区二区三区四区 | 久久不卡| 成人在线播放网站 | 日韩免费视频一区二区 | 久久91 | 精品久久国产视频 | 中文字幕一区二区三区四区不卡 | 成人国产精品入口免费视频 | 天天操天天干天天爽 | 99这里只有精品视频 |