单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:1579|回复:0
打印上一主题下一主题

基于Arduino的智能家居语音识别系统设计

[复制链接]
跳转到指定楼层
楼主
ID:1026694发表于 2022-5-16 00:12|只看该作者回帖奖励
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.其他功能就要发挥您的聪明才智了哦。
程序代码:
  1. /*
  2. 识别关键词的个数为SUM;
  3. n为数组中对应关键词的序列号,例如数组sRecog中的第一个关键词为“kai deng”则对应的序列号为0;
  4. Voice.Initialise();初始化设置输入方式MIC/MONO。
  5. */
  6. #include< TimerOne.h>
  7. #include< avr/wdt.h>
  8. #include< Voice.h>
  9. #include< Syn6288.h>
  10. #include< dht11.h>
  11. dht11 DHT;
  12. Syn6288 syn;
  13. uint8  nAsrStatus=0;
  14. #define SUM 11

  15. #define DHT11_PIN A0
  16. #define light_sensor_pin A2
  17. #define light_threshold 200
  18. #define gas_sensor_pin A1
  19. #define gas_threshold 700
  20. #define relay 8
  21. #define state_led 7

  22. 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"};
  23. //小米渣,现在温度怎么样,开灯,关灯,需要开灯吗

  24. 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};//零一二三四五六七八九十
  25. uint8_t text2[]={0xC4,0xFA,0xBA,0xC3};// 您好
  26. uint8_t text3[]={0xB5,0xB1,0xC7,0xB0,0xCE,0xC2,0xB6,0xC8,0xCE,0xAA};//当前温度为
  27. uint8_t text4[]={0xCA,0xAA,0xB6,0xC8,0xCE,0xAA,0xB0,0xD9,0xB7,0xD6,0xD6,0xAE};//湿度为百分之
  28. uint8_t text5[]={0xC9,0xE3,0xCA,0xCF,0xB6,0xC8};//摄氏度
  29. uint8_t text6[]="soundn";//报警音
  30. 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};//请注意,有危险气体泄漏
  31. uint8_t text8[]={0xD5,0xFD,0xD4,0xDA,0xBF,0xAA,0xB5,0xC6};//正在开灯
  32. uint8_t text9[]={0xD5,0xFD,0xD4,0xDA,0xB9,0xD8,0xB5,0xC6};//正在关灯
  33. uint8_t text10[]={0xC7,0xEB,0xCE,0xCA,0xC4,0xE3,0xD4,0xDA,0xCB,0xB5,0xCA,0xB2,0xC3,0xB4,0xA3,0xBF};//请问你在说什么?
  34. uint8_t text11[]={0xB9,0xE2,0xCF,0xDF,0xB2,0xBB,0xD7,0xE3,0x20,0xA3,0xAC,0xD5,0xFD,0xD4,0xDA,0xBF,0xAA,0xB5,0xC6};//光线不足,正在开灯
  35. 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};//光线明亮,不需要开灯

  36. uint8_t text[2];
  37. uint8_t flag;   //标志位,收到小米渣口令后将置为1,动作执行完后清零

  38. void finally(uint8_t n) //n为sRecog数组中对应关键词的序列号
  39. {
  40.    switch(n)
  41.    {
  42.        case 0: syn.play(text2,sizeof(text2),0);flag=1;break;   // 您好
  43.        case 1:         //现在温度怎么样
  44.          if(flag==1)   //收到小米渣的出发命令后
  45.          {
  46.                flag=0;
  47.                DHT.read(DHT11_PIN);   //读取温度
  48.                /*Serial.print("Temperature:");
  49.                Serial.print(DHT.temperature);
  50.                Serial.print("   humidity:");
  51.                Serial.println(DHT.humidity);*/
  52.                uint8_t pig1 = DHT.temperature/10;  //温度数值十位
  53.                uint8_t pig2 = DHT.temperature%10;  //温度数值个位
  54.                uint8_t pig3 = DHT.humidity/10;     //湿度数值十位
  55.                uint8_t pig4 = DHT.humidity%10;     //湿度数值个位
  56.                syn.play(text3,sizeof(text3),0);   //当前温度为    
  57.                if(pig1>0){
  58.                text[0]=text1[pig1*2];
  59.                text[1]=text1[pig1*2+1];
  60.                syn.play(text,sizeof(text),0);     //播放温度数值十位
  61.                text[0]=text1[20];
  62.                text[1]=text1[21];
  63.                syn.play(text,sizeof(text),0);     //播放语音十
  64.                }
  65.                if(pig2>0){
  66.                text[0]=text1[pig2*2];
  67.                text[1]=text1[pig2*2+1];
  68.                syn.play(text,sizeof(text),0);     //播放温度数值个位  
  69.                }            
  70.                syn.play(text5,sizeof(text5),0);   //播放摄氏度
  71.                syn.play(text4,sizeof(text4),0);   //播放湿度为百分之
  72.               
  73.                if(pig3>0){
  74.                text[0]=text1[pig3*2];
  75.                text[1]=text1[pig3*2+1];
  76.                syn.play(text,sizeof(text),0);  //播放湿度数值十位
  77.                text[0]=text1[20];
  78.                text[1]=text1[21];
  79.                syn.play(text,sizeof(text),0); //播放语音十
  80.                }
  81.                if(pig4>0){
  82.                text[0]=text1[pig4*2];
  83.                text[1]=text1[pig4*2+1];
  84.                syn.play(text,sizeof(text),0);  //播放湿度数值个位  
  85.                }            
  86.          }
  87.          break;
  88.        case 2: //开灯
  89.          if(flag==1)
  90.          {
  91.            syn.play(text8,sizeof(text8),0); //播放正在开灯
  92.            digitalWrite(relay,HIGH);   //高电平驱动
  93.            flag=0;  
  94.          }
  95.          break;  
  96.        case 3: //关灯
  97.          if(flag==1)
  98.          {
  99.            syn.play(text9,sizeof(text9),0); //播放正在关灯
  100.            digitalWrite(relay,LOW);
  101.            flag=0;
  102.          }
  103.          break;
  104.        case 4: //需要开灯吗?
  105.          if(flag==1)
  106.          {
  107.            int shine=analogRead(light_sensor_pin); //读取光照度模拟量
  108.            //Serial.print("Light:");
  109.            //Serial.println(shine);
  110.            if(shine< light_threshold)  //小于光照度阀值时
  111.            {
  112.                syn.play(text11,sizeof(text11),0); //光线不足,正在开灯
  113.                digitalWrite(relay,HIGH);
  114.            }
  115.            else
  116.            {
  117.                syn.play(text12,sizeof(text12),0); //光线明亮,不需要开灯
  118.                digitalWrite(relay,LOW);
  119.            }
  120.            flag=0;
  121.          }
  122.          break;
  123.        default:syn.play(text10,sizeof(text10),0);break;  //非正常命令,请问你在说什么    
  124.    }
  125. }

  126. void ExtInt0Handler ()
  127. {
  128.   Voice.ProcessInt0();  //芯片送出中断信号
  129.           
  130. }
  131. void timerIsr()
  132. {
  133.   wdt_reset();
  134. }
  135. void setup()
  136. {
  137.   Serial.begin(9600);
  138.   Voice.Initialise(MIC,VoiceRecognitionV1);//Initialise mode MIC or MONO,default is MIC
  139.                              //VoiceRecognitionV1 is VoiceRecognitionV1.0 shield
  140.                              //VoiceRecognitionV2 is VoiceRecognitionV2.1 module  
  141.   attachInterrupt(0,ExtInt0Handler,LOW);

  142.   pinMode(relay,OUTPUT);
  143.   digitalWrite(relay,LOW);
  144.   pinMode(state_led,OUTPUT);
  145.   digitalWrite(state_led,LOW);
  146.   Timer1.initialize(90000);
  147.   Timer1.attachInterrupt(timerIsr); // attach the service routine here
  148.   wdt_enable(WDTO_120MS);
  149. }
  150. void loop()
  151. {  
  152.    static uint8_t nAsrRes=0;
  153.    static unsigned long time = millis();
  154.    if(millis()-time>100)
  155.    {  
  156.      int gas=analogRead(gas_sensor_pin);
  157.      if(gas > gas_threshold)
  158.      {
  159.          syn.play(text6,sizeof(text6),0);
  160.          syn.play(text7,sizeof(text7),0);
  161.      }
  162.        switch(nAsrStatus)
  163.        {
  164.          case LD_ASR_RUNING:
  165.          case LD_ASR_ERROR:break;
  166.          case LD_ASR_NONE:
  167.          {
  168.            nAsrStatus=LD_ASR_RUNING;
  169.            if (Voice.RunASR(SUM,30,sRecog)==0) //识别不正确
  170.            {
  171.                nAsrStatus= LD_ASR_ERROR;
  172.                Serial.println( "ASR_ERROR");
  173.            }

  174.            Serial.println( "ASR_RUNING.....");
  175.            digitalWrite(state_led,HIGH);
  176.            break;
  177.          }
  178.          case LD_ASR_FOUNDOK:
  179.          {
  180.            digitalWrite(state_led,LOW);
  181.            nAsrRes =Voice. LD_GetResult();//   一次ASR识别流程结束,去取ASR识别结果          
  182.            finally(nAsrRes);
  183.            nAsrStatus = LD_ASR_NONE;
  184.            break;
  185.          }
  186.          case LD_ASR_FOUNDZERO:
  187.          default:
  188.          {  
  189.            digitalWrite(state_led,LOW);
  190.            nAsrStatus = LD_ASR_NONE;
  191.            break;
  192.          }
  193.        }// switch

  194.    }//if
  195. }
复制代码


基于Arduino的智能家居语音识别系统设计.docx

687.28 KB, 下载次数: 33, 下载积分: 黑币 -5

Voice RecognitionV1.0使用手册.zip

353.76 KB, 下载次数: 18, 下载积分: 黑币 -5

SYN6288模块资料.zip

521.3 KB, 下载次数: 18, 下载积分: 黑币 -5

Smart_home(源代码).zip

10.23 KB, 下载次数: 18, 下载积分: 黑币 -5

Arduino智能家居初级套件使用说明.doc

175 KB, 下载次数: 20, 下载积分: 黑币 -5

手机版|小黑屋|51黑电子论坛|51黑电子论坛6群QQ管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网