|
本帖最后由 Kevin的小小罗 于 2017-10-30 19:18 编辑
在做智能家居的远程控制的过程中,接触了语音控制的一些创意,就自己做了一个这方面的应用,想法就是在家中用语音来控制继电器,从而控制各种电器。按照比例设计了一套家具模型,然后在内部铺设了电路,一套智能家居就改造成啦。初步的想法是是用于做远程控制的,在语音控制方面做了一些拓展,实现远程、近程都能控制,这里只介绍语音控制方面的功能。语音控制模块用的是ASR—M08A,先上模型图~
用到的传感器有:超声波传感器、红外传感器、光敏传感器、震动传感器
还有风扇、LED灯、3个舵机、喇叭
语音模块与Mega2560通过串口1连接,连接图如下:
然后介绍一下想实现的功能,当然水平所限,并没有全部实现。不过该系统的好处就是可扩展性很强,Mega2560有54路数字输入/输出口(其中16路可作为PWM输出),16路模拟输入,还有4路串口,实现比较复杂的扩展不在话下~
在设计语音开关门的时候,想到也可以用超声波来检测是否有人走近,需要开门,就做了一个简易的开关门装置。设计的过程中发现超声波传感器加红外传感器同时检测,效果更好。
同样在晾衣架上做了扩展,想法上想实现阴雨天自动收衣服,晴天又可以自动晾衣;当然阴雨天需要考虑风雨雷电许多因素,做成产品并不容易,因为手头有光亮度传感器和震动传感器,就做了一个简单的光感应晾衣架,原理如下图。
制作智能家居的优势就是可扩展性很强,适于用来了解各种传感器的工作原理,上面的介绍已经显示了这一点。
[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
|
|