_SKU_KIT0005__Smart_Home_kit_for_Arduino - jimaobian/DFRobotWikiCn GitHub Wiki

Smart Home kit for Arduino(SKU:KIT0005)

概述

晚上回到家,家里黑漆漆一片,得找到开灯的按钮才算完事,有时候在想,如果灯泡会听话该多好啊,有了这个想法,智能家居就应运而生了,我们用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,因此下载程序时需要将扩展板的拨动开关打到PROG处,下载完后打到XBEE处);

  • 温湿度传感器DHT11接到数字口6;

  • LED模块接到数字口7;

  • 继电器模块接到数字口8;

  • 气体传感器接到模拟口1;

  • 环境光线传感器接到模拟口2。

步骤2 将扩展板的拨动开关打到PROG处,通过USB数据线将代码(需要先导入对应库文件)下到主控板中,下载成功后将扩展板的拨动开关打到XBEE处。

功能介绍

  1. 识别开关灯命令,执行开关灯操作,并语音播报当前状态。
  2. 识别温湿度读取命令,并语音播报当前温湿度情况。
  3. 实时监测危险气体,一旦检测到立即报警并语音播报危险情况。
  4. 未有识别时不做操作,识别命令有误时播报“请问您在说什么?”。
  5. 你也可以考考小米渣:“需要开灯吗?”,系统就会对环境光线进行检测,光线暗的情况下,小米渣会提醒你:“光线不足,正在开灯”然后开灯,如果光线明亮时,小米渣会说:“光线明亮,不需要开灯”保持灯在关的状态(判断光线强弱的阈值在程序中进行设置,用户可以自行修改)。

|

**'套件中所配的LED模块,起指示作用,灯亮起时表示可以说出口令进行识别,灯灭时表示不识别口令;继电器模块模拟家里的灯泡。 为了最大程度的减少小米渣的误操作,在程序中我们设定了一条口令触发“小米渣”,即该套件只有在正确的识别到“小米渣”三个字之后, 才能执行其后关键字命令的操作,例如,如果要执行开灯命令,您需先说:“小米渣”,之后小米渣会说:“您好”,然后你再说:“开灯”, **之后小米渣才会执行开灯命令。如果你不先叫小米渣的名字,它可不会理会你的吩咐喔。'

|

语音控制命令

注意:LED灯亮了才可进行语音识别

  1. “小米渣”——口令触发命令。
  2. “现在温度怎么样”——温湿度检测命令,播报相应环境温湿度。
  3. “开灯”——开灯命令,需先执行口令触发命令才执行改命令。
  4. “关灯”——关灯命令,需先执行口令触发命令才执行改命令。
  5. “需要开灯吗”——环境光线检测命令,根据光线强弱,执行开关灯命令。
  6. “小米”、“小”、“米渣“——垃圾关键词,目的是减小误操作。
  7. 其他功能就要发挥您的聪明才智了哦。
warning_yellow.png
eg:

指示灯亮,说“小米渣”,等她说“你好”

等待指示灯亮,说“开灯”

指示灯亮,说“小米渣”,等她说“你好”

等待指示灯亮,说“关灯” |

Arduino程序代码

适用于Arduino IDE 1.0以上版本,使用样例代码前,请先下载以下“库文件”,并安装其中的库文件: 库文件 安装库文件的方法

/*
识别关键词的个数为SUM;
n为数组中对应关键词的序列号,例如数组sRecog中的第一个关键词为“kai deng”则对应的序列号为0;
Voice.Initialise();初始化设置输入方式MIC/MONO。
*/
#include <TimerOne.h>
#include <avr/wdt.h>
#include <Voice.h>
#include <Syn6288.h>
#include <DHT.h>

#define DHTTYPE DHT11   // DHT 11

Syn6288 syn;
uint8  nAsrStatus=0;
#define SUM 11

#define DHT11_PIN 6          //DHT11传感器插数字口6
#define light_sensor_pin A2  //光线传感器插模拟口2
#define light_threshold 200  //光线传感器阈值
#define gas_sensor_pin A1    //气体传感器插模拟口1
#define gas_threshold 700    //气体传感器报警阈值
#define relay 8              //继电器插数字口8
#define state_led 7          //状态指示灯插数字口7

DHT dht(DHT11_PIN, DHTTYPE);

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;
                    uint8_t h = dht.readHumidity();
                                    uint8_t t = dht.readTemperature();  //读取温度
                    /*Serial.print("Temperature:");
                    Serial.print(DHT.temperature);
                    Serial.print("   humidity:");
                    Serial.println(DHT.humidity);*/
                    uint8_t pig1 = t/10;    //温度数值十位
                    uint8_t pig2 = t%10;    //温度数值个位
                    uint8_t pig3 = h/10;        //湿度数值十位
                    uint8_t pig4 = h%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
}

相关库文件

File:nextredirectltr.png购买 Smart Home kit智能家居语音识别初级套件Arduino兼容

⚠️ **GitHub.com Fallback** ⚠️