如何设计一个家庭防火报警系统
最近刚入手一块Arduino UNO R3,想设计一个家庭防火报警系统,有一个火焰传感器,MQ2烟雾传感器,一个红外热释传感器,一个蜂鸣器模块,现在可以单模块实现功能,求哪位大神指点一下如何多线程并发控制,多模块运行。 呃 我觉得arduino的多线程不好用,建议你还是轮询检查,避免中断吧 只要传感器管脚或地址不冲突,就将他们叠加起来,程序采用轮训方式,速度应该足够快的. zoologist 发表于 2013-12-10 13:40 static/image/common/back.gif呃 我觉得arduino的多线程不好用,建议你还是轮询检查,避免中断吧
代码如何写 是不得调用一些库 林定祥 发表于 2013-12-10 16:39 static/image/common/back.gif
只要传感器管脚或地址不冲突,就将他们叠加起来,程序采用轮训方式,速度应该足够快的.
有可以参考的实例么 推荐一两个 谢谢了 哈哈 黑天使NAZI 发表于 2013-12-10 16:58 static/image/common/back.gif
代码如何写 是不得调用一些库
应该会调用其他库,然后轮询好了 黑天使NAZI 发表于 2013-12-10 16:59 static/image/common/back.gif
有可以参考的实例么 推荐一两个 谢谢了 哈哈
程序分成两部分,setup loop把每一个已经试过的程序,将不同的部分按位子对号入座就行了. 黑天使NAZI 发表于 2013-12-10 16:59 static/image/common/back.gif
有可以参考的实例么 推荐一两个 谢谢了 哈哈
单独的多跑通了,把他们一个模块硬件上叠加起来,看看硬件上是否有冲突,有冲突就调整,软件也相应变化,加入模块后再加入相应的程序.逐步叠加,调试就可以了. 林定祥 发表于 2013-12-11 08:42 static/image/common/back.gif
程序分成两部分,setup loop把每一个已经试过的程序,将不同的部分按位子对号入座就行了.
我把我该的代码发给您 您给帮忙看一下行不 林定祥 发表于 2013-12-11 08:46 static/image/common/back.gif
单独的多跑通了,把他们一个模块硬件上叠加起来,看看硬件上是否有冲突,有冲突就调整,软件也相应变化,加入模 ...
我把我该的代码发给您 您帮我指导一下可以不 林定祥 发表于 2013-12-11 08:42 static/image/common/back.gif
程序分成两部分,setup loop把每一个已经试过的程序,将不同的部分按位子对号入座就行了.
我把我该的代码发给您 您给帮忙看一些行不 谢谢 黑天使NAZI 发表于 2013-12-14 20:22 static/image/common/back.gif
我把我该的代码发给您 您帮我指导一下可以不
打包上次,我来试一下。 林定祥 发表于 2013-12-14 21:46 static/image/common/back.gif
打包上次,我来试一下。
您给个联系方式我把现该的代码发给您 您给帮忙看下 黑天使NAZI 发表于 2013-12-14 22:26 static/image/common/back.gif
您给个联系方式我把现该的代码发给您 您给帮忙看下
我的QQ:806002393 黑天使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