本帖最后由 睿奇爸爸 于 2016-11-28 22:03 编辑
接触arduino没多久,家里正好也需要一个天然气报警器,尝试着做了一个,本人菜鸟一个,请轻拍。
用到的模块:
Arduino nano 一块
MQ4 甲烷(天然气)浓度传感器 一块
有源蜂鸣器模块 一块
TM1637 LED模块 一块
废旧棉签盒子一个、5V旧手机充电器一个
想实现的功能是:利用MQ4 传感器 测得空气中甲烷的含量,超过设定值后,蜂鸣器报警。同时,TM1637模块始终显示MQ4测得的浓度模拟量
- /*
- 使用MQ4传感器,测试空气中甲烷(天然气)含量,如超过设定值,则蜂鸣报警!
- MQ4甲烷传感器模引脚接A3,数字引脚接D4,蜂鸣器引脚接D5。
- TM1637 LED模块 CLK引脚接 D2 DIO引脚接 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();
- }
- }
- }
复制代码
|