新人报到,第一个项目:DIY燃气报警器
本帖最后由 睿奇爸爸 于 2016-11-28 22:03 编辑接触arduino没多久,家里正好也需要一个天然气报警器,尝试着做了一个,本人菜鸟一个,请轻拍。
用到的模块:
Arduino nano 一块
MQ4 甲烷(天然气)浓度传感器 一块
有源蜂鸣器模块一块
TM1637 LED模块 一块
废旧棉签盒子一个、5V旧手机充电器一个
想实现的功能是:利用MQ4 传感器 测得空气中甲烷的含量,超过设定值后,蜂鸣器报警。同时,TM1637模块始终显示MQ4测得的浓度模拟量
/*
使用MQ4传感器,测试空气中甲烷(天然气)含量,如超过设定值,则蜂鸣报警!
MQ4甲烷传感器模引脚接A3,数字引脚接D4,蜂鸣器引脚接D5。
TM1637 LED模块CLK引脚接 D2DIO引脚接 D3
*/
#include <TM1637Display.h>
#define CLK 2 // 接TM1637 CLK引脚
#define DIO 3 // 接TM1637 DIO引脚
TM1637Display display(CLK, DIO); // 导入TM1637库
const int PinAMQ4 = A3;// MQ4传感器模拟引脚
const int PinMQ4 = 4; // MQ4传感器数字引脚
const int PinBuz = 5; // 蜂鸣器引脚
const int sensitivity = 180; //灵敏度设定
const int threshold = 80; //阈值 (因为5V的手机充电器有波纹,加上也没有设计滤波函数,所以常态下有一个50~70之间的底噪,为了敏捷开发所以观察估算了一个阈值直接减去,请大家亲拍。实际使用后发现,MQ4的灵敏度非常高,这种简单的写法也没有出现误报和漏报。)
const int delayBeeeBeee = 500; //长Beee的延时 (低浓度下的报警声延时)
const int delayBeBeBe = 100;//急促Be的延时 (高浓度下的报警声延时)
void setup() {
pinMode (PinAMQ4, INPUT);
pinMode (PinMQ4, INPUT);
pinMode (PinBuz, OUTPUT);
digitalWrite(PinBuz, HIGH); // 蜂鸣器静音 (我用的是低电平触发的蜂鸣器模块)
Serial.begin(9600);
display.setBrightness(5, true); // 打开显示,并设置亮度为5
}
void SerialPrint(int AMQ4, bool DMQ4) { // 串口输出(用于调试)
Serial.print(AMQ4);
Serial.print(" ");
Serial.println(DMQ4);
}
void BeeeeBeee() {
digitalWrite(PinBuz, HIGH); // 蜂鸣器静音 (我用的是低电平触发的蜂鸣器模块)
digitalWrite(PinBuz, LOW); //
delay(delayBeeeBeee);
digitalWrite(PinBuz, HIGH); // 蜂鸣器静音
delay(delayBeeeBeee);
}
void BeBeBeBe() {
digitalWrite(PinBuz, HIGH); // 蜂鸣器静音
digitalWrite(PinBuz, LOW); //
delay(delayBeBeBe);
digitalWrite(PinBuz, HIGH); // 蜂鸣器静音
delay(delayBeBeBe);
}
void loop() {
digitalWrite(PinBuz, HIGH); // 蜂鸣器静音
delay(100);
int AMQ4 = analogRead(PinAMQ4);// 读取传感器模拟量
bool DMQ4 = digitalRead(PinMQ4);// 读取传感器数字量
SerialPrint(AMQ4, DMQ4);// 串口输出(用于调试)
if (DMQ4) { // 如果 传感器数字量 没有报警
if (AMQ4 <= threshold) { // 同时 模拟量 小于 阈值
display.showNumberDec(0);// 数码管显示0
delay(200);
} else if (AMQ4 <= sensitivity) { // 模拟量 大于 阈值 小于 灵敏度
display.showNumberDec(AMQ4 - threshold); // 数码管显示(模拟量-阈值)
delay(200);
} else {// 模拟量 大于 灵敏度
display.showNumberDec(AMQ4 - threshold); // 数码管显示(模拟量-阈值)
BeeeeBeee();
}
} else { // 如果 传感器数字量 报警
if (AMQ4 <= threshold) { // 报警同时 模拟量 小于 阈值
display.showNumberDec(AMQ4); // 数码管显示(模拟量)
BeeeeBeee();
} else if (AMQ4 <= sensitivity) { // 模拟量 大于 阈值 小于 灵敏度
display.showNumberDec(AMQ4); // 数码管显示(模拟量)
BeeeeBeee();
} else {// 模拟量 大于 灵敏度
display.showNumberDec(AMQ4); // 数码管显示(模拟量)
BeBeBeBe();
}
}
}
支持新人发帖 支持一个!很详细!
页:
[1]