语音控制智能家居系统-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 10566|回复: 2

[项目] 语音控制智能家居系统

[复制链接]
发表于 2017-10-29 20:41 | 显示全部楼层 |阅读模式
本帖最后由 Kevin的小小罗 于 2017-10-30 19:18 编辑

在做智能家居的远程控制的过程中,接触了语音控制的一些创意,就自己做了一个这方面的应用,想法就是在家中用语音来控制继电器,从而控制各种电器。按照比例设计了一套家具模型,然后在内部铺设了电路,一套智能家居就改造成啦。初步的想法是是用于做远程控制的,在语音控制方面做了一些拓展,实现远程、近程都能控制,这里只介绍语音控制方面的功能。语音控制模块用的是ASR—M08A,先上模型图~ QQ图片20171029194114.png 用到的传感器有:超声波传感器、红外传感器、光敏传感器、震动传感器
还有风扇、LED灯、3个舵机、喇叭
语音模块与Mega2560通过串口1连接,连接图如下:
QQ图片20171030190816.png

然后介绍一下想实现的功能,当然水平所限,并没有全部实现。不过该系统的好处就是可扩展性很强,Mega2560有54路数字输入/输出口(其中16路可作为PWM输出),16路模拟输入,还有4路串口,实现比较复杂的扩展不在话下~
QQ图片20171029194139.png
在设计语音开关门的时候,想到也可以用超声波来检测是否有人走近,需要开门,就做了一个简易的开关门装置。设计的过程中发现超声波传感器加红外传感器同时检测,效果更好。
QQ图片20171029194151.png
同样在晾衣架上做了扩展,想法上想实现阴雨天自动收衣服,晴天又可以自动晾衣;当然阴雨天需要考虑风雨雷电许多因素,做成产品并不容易,因为手头有光亮度传感器和震动传感器,就做了一个简单的光感应晾衣架,原理如下图。
QQ图片20171029194202.png
制作智能家居的优势就是可扩展性很强,适于用来了解各种传感器的工作原理,上面的介绍已经显示了这一点。
[mw_shl_code=bash,true]//语音控制、光感应晾衣架、超声波感应门程序段
#include <MsTimer2.h>
const int intA = 1000;
const int intB = 500;  
const int INTERVAL = 1;   // 0.001 秒 = 1ms
void ggyy( ) {
   static unsigned int gy = 0;
   ++gy;
   if( gy % intA == 0)timerIsr() ;
   if( gy % intB == 0)timerIsr1();
}


#include  <Servo.h>   //声明伺服舵机函数库
Servo myservo1;  // 定义伺服舵机对象
Servo myservo2;
Servo myservo3;
int sensorPin =A0;//声明光敏电阻传感器连在模拟量端口0
int flag=0;      //声明变量,存储衣架伸出或者收起的标志
int light_val;   //声明变量,存储光敏电阻模拟量数据
//初始化


//volatile int state = LOW;

#include "SR04.h"
#define TRIG_PIN 2
#define ECHO_PIN 3
SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN);
long a;
int flag1=0;
int sensor=10;
int b;


int led=50;
int val;
int val1;
int sw1=22;
void setup()
{
  pinMode(10,INPUT);
  pinMode(led,OUTPUT);
  Serial1.begin(9600);
  Serial.begin(9600);
  digitalWrite(led,LOW);
   pinMode(22, OUTPUT);        //如果没有这句,风扇不会转动
  digitalWrite(22,LOW);
     myservo1.attach(9);       //初始化9号数字端口来控制舵机
     myservo2.attach(8);
     myservo3.attach(7);
     myservo1.write(90);   
     myservo2.write(90);
     myservo3.write(0);  

   //attachInterrupt(0, timerIsr, CHANGE);
   MsTimer2::set(INTERVAL,ggyy);
   MsTimer2::start( );
}

/*void change()
{
   light_val=analogRead(sensorPin); //读取光敏电阻的数据  
//  delay(200);
   if(light_val>300 )
   {state=0;}
   if(light_val<300 )
   {state=1;}
  }
*/
void timerIsr()
{
  int zhendong=digitalRead(52);
  light_val=analogRead(sensorPin); //读取光敏电阻值  
  //Serial.println(light_val);
  //如果是晴天,并且衣架处于收起状态
  if(light_val>300 && flag==0)
  //变量light_val的参数值应根据当天的光线,通过测试来确定。
  {
    myservo1.write(0);     // 启动舵机正转
    myservo2.write(0);     // 启动舵机正转
    delay(100);             // 等待2s,让衣架伸出到位
    flag=1; //标志衣架处于伸出状态
    // myservo.write(93);  //舵机停止
  }
  //如果阴天,没有阳光,并且杆处于伸出状态
  if(light_val<=300 && flag==1)
  {
    myservo1.write(90);     // 启动舵机反转
    myservo2.write(90);      
    delay(100);             // 等待2s,让衣架收回到位
    flag=0; //标志衣架处于收起状态
    //myservo.write(93);  // 舵机停止
  }   
if(zhendong==0&&flag==1)
  {
     myservo1.write(90);     // 启动舵机反转
    myservo2.write(90);      
    delay(100);             // 等待2s,让衣架收回到位
    flag=0;              //标志衣架处于收起状态
    //myservo.write(93);  // 舵机停止
    }
  }

void timerIsr1()                  //超声波红外感应门
{
   b=digitalRead(10);
  a=sr04.Distance();

  delay(1000);
  if(a<5&&flag1==0&&b==0)
{
  myservo3.write(90);  //舵机停止
  flag1=1;
  }
if(a>=5&&flag1==1&&b==1)
//else
{
  myservo3.write(180);
  // delay(1000);
  flag1=0;
// myservo3.write(0);  // 舵机停止
  }
  }

void loop()
{

//timerIsr();
  
   val = Serial1.read();
    if (-1 != val){
        Serial.println(val);
        if (1==val){
        digitalWrite(led,HIGH);
        Serial.println("Hello!");
      //  delay(500);
    //    digitalWrite(led,LOW);
        }
        else if(10==val)
        {
           digitalWrite(led,LOW);
          }
          else if(7==val){
          digitalWrite(sw1,HIGH);
          }
          else if(8==val){
          digitalWrite(sw1,LOW);
          }
         
    }
    val1 = Serial.read();
    if (-1 != val1){
      if ('1'== val1){
      Serial1.print("play,001,$");               //播放录音1
      }
      if ('2'== val1){
      Serial1.print("play,002,$");               //播放录音2
      }
      if('7'==val1){
      Serial1.print("play,007,$");          //注意区分Serial1和Serial
      }
        if('8'==val1){
      Serial1.print("play,008,$");          //注意区分Serial1和Serial
      }
    }
   delay(250);
   
}


[/mw_shl_code]

演示一下:

视频网址:http://v.youku.com/v_show/id_XMz ... j.8428770.3416059.1







发表于 2017-10-29 21:50 | 显示全部楼层
1.感谢对社区比赛的支持,开发者积分和贡献值已发放,请点击以下链接领取纪念衫并参与抽奖~
http://www.arduino.cn/thread-48132-1-1.html
2.比赛结果会在11.15号前公布,请耐心等待。
发表于 2018-10-14 01:28 | 显示全部楼层
这个ASR—M08A模块买不到呀?楼主能够给个链接吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-9-20 22:42 , Processed in 0.095067 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表