黑天使NAZI 发表于 2013-12-10 13:24:16

如何设计一个家庭防火报警系统

      最近刚入手一块Arduino UNO R3,想设计一个家庭防火报警系统,有一个火焰传感器,MQ2烟雾传感器,一个红外热释传感器,一个蜂鸣器模块,现在可以单模块实现功能,求哪位大神指点一下如何多线程并发控制,多模块运行。

zoologist 发表于 2013-12-10 13:40:35

呃 我觉得arduino的多线程不好用,建议你还是轮询检查,避免中断吧

林定祥 发表于 2013-12-10 16:39:57

只要传感器管脚或地址不冲突,就将他们叠加起来,程序采用轮训方式,速度应该足够快的.

黑天使NAZI 发表于 2013-12-10 16:58:34

zoologist 发表于 2013-12-10 13:40 static/image/common/back.gif
呃 我觉得arduino的多线程不好用,建议你还是轮询检查,避免中断吧

代码如何写 是不得调用一些库

黑天使NAZI 发表于 2013-12-10 16:59:38

林定祥 发表于 2013-12-10 16:39 static/image/common/back.gif
只要传感器管脚或地址不冲突,就将他们叠加起来,程序采用轮训方式,速度应该足够快的.

有可以参考的实例么 推荐一两个 谢谢了 哈哈

zoologist 发表于 2013-12-10 20:59:58

黑天使NAZI 发表于 2013-12-10 16:58 static/image/common/back.gif
代码如何写 是不得调用一些库

应该会调用其他库,然后轮询好了

林定祥 发表于 2013-12-11 08:42:23

黑天使NAZI 发表于 2013-12-10 16:59 static/image/common/back.gif
有可以参考的实例么 推荐一两个 谢谢了 哈哈

程序分成两部分,setup loop把每一个已经试过的程序,将不同的部分按位子对号入座就行了.

林定祥 发表于 2013-12-11 08:46:20

黑天使NAZI 发表于 2013-12-10 16:59 static/image/common/back.gif
有可以参考的实例么 推荐一两个 谢谢了 哈哈

单独的多跑通了,把他们一个模块硬件上叠加起来,看看硬件上是否有冲突,有冲突就调整,软件也相应变化,加入模块后再加入相应的程序.逐步叠加,调试就可以了.

黑天使NAZI 发表于 2013-12-14 20:21:52

林定祥 发表于 2013-12-11 08:42 static/image/common/back.gif
程序分成两部分,setup loop把每一个已经试过的程序,将不同的部分按位子对号入座就行了.

我把我该的代码发给您 您给帮忙看一下行不

黑天使NAZI 发表于 2013-12-14 20:22:33

林定祥 发表于 2013-12-11 08:46 static/image/common/back.gif
单独的多跑通了,把他们一个模块硬件上叠加起来,看看硬件上是否有冲突,有冲突就调整,软件也相应变化,加入模 ...

我把我该的代码发给您 您帮我指导一下可以不

黑天使NAZI 发表于 2013-12-14 20:23:26

林定祥 发表于 2013-12-11 08:42 static/image/common/back.gif
程序分成两部分,setup loop把每一个已经试过的程序,将不同的部分按位子对号入座就行了.

我把我该的代码发给您 您给帮忙看一些行不 谢谢

林定祥 发表于 2013-12-14 21:46:23

黑天使NAZI 发表于 2013-12-14 20:22 static/image/common/back.gif
我把我该的代码发给您 您帮我指导一下可以不

打包上次,我来试一下。

黑天使NAZI 发表于 2013-12-14 22:26:46

林定祥 发表于 2013-12-14 21:46 static/image/common/back.gif
打包上次,我来试一下。

您给个联系方式我把现该的代码发给您 您给帮忙看下

黑天使NAZI 发表于 2013-12-14 22:27:21

黑天使NAZI 发表于 2013-12-14 22:26 static/image/common/back.gif
您给个联系方式我把现该的代码发给您 您给帮忙看下

我的QQ:806002393

黑天使NAZI 发表于 2013-12-14 22:45:02

黑天使NAZI 发表于 2013-12-14 20:22 static/image/common/back.gif
我把我该的代码发给您 您帮我指导一下可以不

#include <pt.h>//ProtoThreads必须包含的头文件
int flame = A0;
int mq = A1;
int Beep = 3;
int val = 0;
int val1 = 0;
int hw = 5;
int val3;
static int counter1, counter2, counter3, state1 = 0, state2 = 0, state3 = 0; //counter为定时计数器,state为每个灯的状态

static int protothread1(struct pt *pt) //线程1,控制灯1
{
PT_BEGIN(pt);//线程开始
while (1) //每个线程都不会死
{
    PT_WAIT_UNTIL(pt, counter1 == 1); //如果时间满了1秒,则继续执行,否则记录运行点,退出线程1
    val = analogRead(flame);
    Serial.print("flame=");
    Serial.println(val);
    delay(1000);
    if (val >= 500)
    {
      digitalWrite(Beep, LOW);
    }
    else
    {
      digitalWrite(Beep, HIGH);
    }
    counter1 = 0; //计数器置零
}
PT_END(pt); //线程结束
}


static int protothread2(struct pt *pt) //线程2,控制灯2
{
PT_BEGIN(pt); //线程开始
while (1) {   //每个线程都不会死
    PT_WAIT_UNTIL(pt, counter2 == 1); //如果时间满了5秒,则继续执行,否则记录运行点,退出线程2
    val1 = analogRead(mq);
    Serial.print("mq2=");
    Serial.println(val1);
    delay(1000);
    if (val1 >= 500)
    {
      digitalWrite(Beep, LOW);
    }
    else
    {
      digitalWrite(Beep, HIGH);
    }
    counter2 = 0; //计数清零
}
PT_END(pt);//线程结束
}
static int protothread3(struct pt *pt) //线程1,控制灯1
{
PT_BEGIN(pt);//线程开始
while (1) //每个线程都不会死
{
    PT_WAIT_UNTIL(pt, counter3 == 1); //如果时间满了1秒,则继续执行,否则记录运行点,退出线程1
    val = digitalRead(hw); //将数字接口 7 的值读取赋给 val
    if (val == LOW) //当红外热释电传感器检测有信号时,LED 亮起
    {
      
      digitalWrite(Beep, HIGH);
      
    }
    else
    {
   digitalWrite(Beep, LOW);
    }
    counter3 = 0; //计数器置零
}
PT_END(pt); //线程结束
}

static struct pt pt1, pt2, pt3;
void setup()
{

pinMode(Beep, OUTPUT);
pinMode(hw, INPUT);
Serial.begin(9600);
PT_INIT(&pt1);//线程1初始化
PT_INIT(&pt2);//线程2初始化
PT_INIT(&pt3);//线程2初始化
}

void loop () //这就是进行线程调度的地方
{
protothread2(&pt2);//执行线程2
protothread1(&pt1);//执行线程1
protothread3(&pt3);//执行线程1
delay(10); //时间片,每片1秒,可根据具体应用设置大小
counter1++;
counter2++;
counter3++;
}
这是我改的代码 红外热释传感器,烟火和MQ2烟雾传感器都可以实现 现在还有一个温湿度传感器和一个红外遥控器没有实现 红外遥控用来关闭蜂鸣器的报警声音谢谢了
页: [1] 2
查看完整版本: 如何设计一个家庭防火报警系统