一氧化碳气体无色、无臭、无味,无法感觉它的存在,但它却有着致命的威胁,一氧化碳中毒的事件时常发生,我们又该如何避免悲剧的发生。
于是有了基于开源平台,使用DFRobot推出的Gravity气体传感器,搭建的气体检测报警系统。
一氧化碳阈值报警
材料清单:
- DFRduino UNO R3
- 一氧化碳传感器
- 传感器扩展板
- LCD 1602显示屏
- 蜂鸣器
PS:所需硬件均可在DF创客商城找到
一氧化碳传感器
PS:这是一款能够检测气体浓度的气体传感器,具有CO、O2、H2S、SO2等十余种型号,可以快速、准确的测量环境中对应气体的浓度,支持模拟量、I2C和UART三种输出方式,探头采用电化学原理,具有抗干扰能力强、稳定性高、灵敏度高等特点。广泛适用于工厂、矿井、废气处理系统等需要进行有害气体浓度检测的场景。
电路连接:
UNO R3 一氧化碳传感器
SDA ———— D/T
SCL ———— C/R
GND ———— GND
5V ———— VCC
4 ———— ALA
UNO R3 LCD 1602显示屏
A4 ———— SDA
A5 ———— SCL
GND ———— GND
5V ———— VCC
UNO R3 蜂鸣器
3 ———— 输入
GND ———— GND
5V ———— VCC
电路连接
关键函数:
模式选择函数changeAcquireMode()
gas.changeAcquireMode(gas.INITIATIVE)
/*gas.INITIATIVE // 主动上传模式gas.PASSIVITY // 被动应答模式
*/
gas.readGasConcentrationPPM();
gas.queryGasType();
gas.setThresholdAlarm(gas.ON, 200, gas.LOW_THRESHOLD_ALA ,gas.queryGasType());
/*gas.ON 开启gas.OFF 关闭200 设置阈值gas.LOW_THRESHOLD_ALA 报警时跳转低电平gas.HIGH_THRESHOLD_ALA 报警时跳转高电平
*/
使用I2C通信,将传感器上的拨码开关SEL拨到0。I2C地址默认为0x74。如果需要修改I2C地址,可通过模块上的拨码开关配置硬件I2C地址。
拨码开关与I2C地址参数对应关系如下:
- ADDRESS_0:0x74, A0=0, A1=0
- ADDRESS_1:0x75, A0=0, A1=1
- ADDRESS_2:0x76, A0=1, A1=0
- ADDRESS_3:0x77, A0=1, A1=1
检测报警效果:
串口监视器显示对应的气体类型/浓度/报警。当一氧化碳浓度超过阈值,屏幕显示“warning!!!”提示,同时蜂鸣器报警。
总结:
搭配传感器扩展板可以避免复杂的接线,更方便、更快速的完成项目搭建。
为保证数据精准,初次通电需要预热5分钟以上,切换通信方式和改变I2C地址后系统需要全部断电重新通电。
确保所需库文件已安装,否则程序无法通过编译。
所需要的库以及程序:
DFRobot_GasSensor库
#include "DFRobot_MultiGasSensor.h"#include <Wire.h>
#include "DFRobot_LCD.h"
#include <LiquidCrystal_I2C.h>
DFRobot_LCD lcd(16,2);
int k=0;
//默认打开,此时使用IIC通信,屏蔽之后使用软串口通信
#define I2C_COMMUNICATION#ifdef I2C_COMMUNICATION
#define I2C_ADDRESS 0x74DFRobot_GAS_I2C gas(&Wire ,I2C_ADDRESS);
#else
#if (!defined ARDUINO_ESP32_DEV) && (!defined __SAMD21G18A__)
/**UNO:pin_2-----RXpin_3-----TX
*/SoftwareSerial mySerial(2, 3);DFRobot_GAS_SoftWareUart gas(&mySerial);
#else
/**ESP32:IO16-----RXIO17-----TX
*/DFRobot_GAS_HardWareUart gas(&Serial2); //ESP32HardwareSerial
#endif
#endif/**设置与报警引脚连接的主控引脚
*/
#define ALA_pin 4
#define IR_DETEC_PIN 3
void setup() {
/**串口初始化,用作查看打印输出
*/Serial.begin(115200);lcd.init();lcd.setCursor(2, 0);lcd.print(":");/**传感器初始化,用作初始化串口或者初始化IIC,由此时使用的通信方式来决定
*/while(!gas.begin()){Serial.println("NO Deivces !");delay(1000);}
/**获取数据模式为:主控需要向传感器请求
*/while (!gas.changeAcquireMode(gas.PASSIVITY)) //被动应答{delay(1000);}Serial.println("change acquire mode success!");/**设置传感器报警的阈值
*/while (!gas.setThresholdAlarm(gas.ON, 20, gas.HIGH_THRESHOLD_ALA ,gas.queryGasType())){ //阈值报警开启 跳转高电平 设置气体类型Serial.println("Failed to open alarm!");delay(1000);}pinMode(ALA_pin,INPUT);pinMode(IR_DETEC_PIN,OUTPUT);digitalWrite(IR_DETEC_PIN,LOW);
}void loop() {
/**循环获取环境气体浓度,到阈值则报警
*/Serial.print(gas.queryGasType());//获取气体类型Serial.print(":");Serial.println(gas.readGasConcentrationPPM());k= gas.readGasConcentrationPPM();if (digitalRead(ALA_pin) == 1){Serial.println("warning!!!");lcd.setCursor(4, 1);lcd.print("warning!!!");digitalWrite(IR_DETEC_PIN,HIGH);}else{Serial.println("nolmal!!!");lcd.setCursor(4, 1);lcd.print("nolmal!!!");digitalWrite(IR_DETEC_PIN,LOW);}delay(200);lcd.setCursor(0, 0);lcd.print(gas.queryGasType());lcd.setCursor(4, 0);lcd.print(gas.readGasConcentrationPPM());if(k>=10)
{lcd.setCursor(9, 0);lcd.print("% vol");
}else{lcd.setCursor(8, 0);lcd.print("% vol");
}delay(1000);lcd.setCursor(0, 1);lcd.print(" ");lcd.setCursor(4, 0);lcd.print(" ");
}