acdc0616 发表于 2012-10-6 10:05:15

Arduino出门提醒器2.0版

      首先感谢前几天我发的求助贴,给我解答的Tim老师还有其他老师。

    制作原因:1:有时在家给太阳能打水,水没打满期间忙别的把打水的事忘了,并且又出门去了,回来时肯定水已经打
               满流很长时间了。
            2:如果天然气上烧着水或其他,出门忘了,那后果更严重。

    历经千辛万苦终于完成出门提醒器2.0版,程序部分通过实验测试。
    也可以看我的空间http://user.qzone.qq.com/46402123/infocenter
       2.0版使用方法:此版本共有四个按键(真实投入使用时,把天然气按键和太阳能按键换成无线接收的开关,出门按键
                   成门磁开关)
                   作为日常提醒,没有其他事件启动时,只要打开门就会语音提醒“出门请带上手机、钥匙、钱包”。
                   当天然气按键启动,打开门时就会语音提醒“请关闭天然气”。
                   当太阳能按键启动,打开门时就会语音提醒“请关闭太阳能”。
                   按下复位键,人为启动的条件都会复位,重新回到出门日常语音提醒。

出门提醒器2.0版硬件配置:Arduino、扩展板、Syn6288语音模块(含喇叭)、自制按键、连线等。

照片与视频用同事新买的小米1S手机拍的









http://player.youku.com/player.php/sid/XNDU4MDI0MDQ0/v.swf

程序代码还请各位老师在帮我看看,有什么地方用的不对的吗?我对程序不是太懂。#include "Syn6288.h"
int key_trq=4;//按键1输入端;
int key_tyn=5;//按键2输入端;
int key_door=6;//按键3输入端;
int key_reset=7;//按键4输入端;
boolean trq_n=false;//上电复位;
boolean tyn_n=false;//上电复位;
Syn6288 syn;
uint8_t text1[]={0xC7,0xEB,0xB9,0xD8,0xB1,0xD5,0xCC,0xEC,0xC8,0xBB,0xC6,0xF8}; //请关闭天然气
uint8_t text2[]={0xC7,0xEB,0xB9,0xD8,0xB1,0xD5,0xCC,0xAB,0xD1,0xF4,0xC4,0xDC}; //请关闭太阳能
uint8_t text3[]={0xB3,0xF6,0xC3,0xC5,0xC7,0xEB,0xB4,0xF8,0xC9,0xCF,0xCA,0xD6,0xBB,0xFA,0xD4,0xBF,0xB3,0xD7,0x3B,0xC7,0xAE,0xB0,0xFC}; //出门请带上手机钥匙钱包

void setup()
{
Serial.begin(9600);
pinMode(key_trq,INPUT);//初始化,定义各端口属性;
pinMode(key_tyn,INPUT);
pinMode(key_door,INPUT);
pinMode(key_reset,INPUT);
}

boolean key_trq_n()//天然气子程序;
{
if(digitalRead(key_trq) == LOW)    //按键1按下;
{
    delay(20);
    if(digitalRead(key_trq) == LOW)
    {
      trq_n = true;//重新启动;
    }
    while(digitalRead(key_trq) == LOW);
}
return trq_n;
}

boolean key_tyn_n()//太阳能子程序;
{
if(digitalRead(key_tyn) == LOW)    //按键2按下;
{
    delay(20);
    if(digitalRead(key_tyn) == LOW)
    {
      tyn_n = true;//重新启动;
    }
    while(digitalRead(key_tyn) == LOW);
}
return tyn_n;
}

void loop()
{
if(digitalRead(key_reset)==LOW)//复位;
{
trq_n=false; //复位;
tyn_n=false;
}
    if(key_trq_n() && digitalRead(key_door)==LOW)//天然气+门开关=语音1;
    {
    syn.play(text1,sizeof(text1),0); //语音1,请关闭天然气;
    }
    if(key_tyn_n() && digitalRead(key_door)==LOW)//太阳能+门开关=语音2;
    {
    syn.play(text2,sizeof(text2),0); //语音2,请关闭太阳能;
    }
if(digitalRead(key_door)==LOW && !key_trq_n() && !key_tyn_n())//门开关=语音2;
    {
    syn.play(text3,sizeof(text3),0); //语音3,出门请带上手机钥匙钱包;
    }
}1. 下面的工作就是硬件部分了,先找个合适的盒子,把电路装进去。
2. 更换相应的触发按键。
3. 在继续改进升级,如在之后的2.X版加入已启动事件的指示灯、无线门铃等等一些改进。在3.0之后的版本加入屏幕显示。

benzking 发表于 2012-10-6 11:12:51

31行的while(digitalRead(key_trq) == LOW);和45行不需要吧

acdc0616 发表于 2012-10-6 11:25:36

benzking 发表于 2012-10-6 11:12 static/image/common/back.gif
31行的while(digitalRead(key_trq) == LOW);和45行不需要吧

while(digitalRead(key_tyn) == LOW);
主要给 return tyn_n;   用的,主要判别状态的。
回头我去掉试试。

我主要担心的是这句if(digitalRead(key_door)==LOW && !key_trq_n() && !key_tyn_n())中“&&”逻辑和后能不能直接给“!”
还有我用的都是if,还是用if else好呢。

不过现在的程序都可以用的。

MicroCao 发表于 2012-10-6 11:52:52

不错,这个语音模块挺流畅的

benzking 发表于 2012-10-6 17:37:36

lz准备用什么天然气按键和太阳能按键换成无线接收的开关
这个比较难找吧

太行摄狼 发表于 2012-10-6 23:05:31

zhi只是一个创意而已,别要求搞

acdc0616 发表于 2012-10-8 12:26:42

benzking 发表于 2012-10-6 17:37 static/image/common/back.gif
lz准备用什么天然气按键和太阳能按键换成无线接收的开关
这个比较难找吧

我打算用比较低廉的 2272-M4 非锁四路无线遥控 做输入

acdc0616 发表于 2012-10-8 12:32:35

太行摄狼 发表于 2012-10-6 23:05 static/image/common/back.gif
zhi只是一个创意而已,别要求搞

是的,因为我不是做电子这行的,只是非常喜欢,就当边玩边学习了。O(∩_∩)O~

acdc0616 发表于 2012-10-8 12:34:03

MicroCao 发表于 2012-10-6 11:52 static/image/common/back.gif
不错,这个语音模块挺流畅的

好像有很多公交车都用它报站吧。有点语言读的也不顺耳。
页: [1]
查看完整版本: Arduino出门提醒器2.0版