DIY的带一定温补的简易液化天然气报警器
刚刚开始玩Arduino。使用MQ-5, LM35, 自制M8最小系统做了一个液化天然气报警器,外壳用了一个废弃的电源壳子。
/*---------------------------------------------------
/ 适用于国产MQ-2,MQ-3,MQ4,MQ-5系列传感器使用
/ 模拟输入口对地电压和传感器输出电压值均有差异
/ 需要先测量,做精准测量环境需要有校准仪器做校准
/ -- By Shine
/---------------------------------------------------*/
int buzzer = 8; //定义各端口
int d_sensor = 2;
int a_sensor = A0;
int temp = A1;
int RledPin = 3;
int YledPin = 4;
float sensorValue = 0.0;
float flag = (((50.0 * (0.1 / 20.0))/(5.0 / 1024.0)) + 22.0) - 3.0; //报警阀值按照空气中50ppm浓度有害气体做危险报警触发;
//计算方式按模拟输入端电压每增加0.1V,浓度相应增加20ppm来换算;
//实际使用的ATMEGA8板子的A0接地也有3.0数值,也就是3*0.00488的偏差电压;
//在接上传感器后正常大气下A0有22.0数值稳定输出,此时假设为0ppm浓度。
void Sensor_init(int dl){ //上电延迟25秒给Sensor加热丝加热,双灯闪烁做提示
int i;
for(i=0;i<dl;i++){
digitalWrite(RledPin, HIGH);
digitalWrite(YledPin, HIGH);
delay(500);
digitalWrite(RledPin, LOW);
digitalWrite(YledPin, LOW);
delay(500);
}
}
void an_alert(){
digitalWrite(RledPin, HIGH);
digitalWrite(buzzer, HIGH);
}
void setup(){ //初始化MCU IO
pinMode(RledPin, OUTPUT);
pinMode(YledPin, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(d_sensor, INPUT_PULLUP);
Serial.begin(9600);
Sensor_init(25);
}
void loop() { //循环业务代码
if(digitalRead(d_sensor) == 0){ //MQ传感模块数字开关量提示,触发黄灯表示检测到有害存在
delay(100);
if(digitalRead(d_sensor) == 0){
digitalWrite(YledPin, HIGH);
}
}else{
digitalWrite(YledPin, LOW);
}
sensorValue = analogRead(a_sensor); //读取A0实时模拟量
float vol = analogRead(temp) * (5.0 / 1024.0 * 100); //读取LM35实时温度
if(vol <= 5.0){ //以下为不同温度时模拟信号补偿处理
sensorValue = sensorValue / 2.0;
}else if((vol <= 10.0)&&(vol > 5.0)){
sensorValue = sensorValue / 1.8;
}else if((vol <= 15.0)&&(vol > 10.0)){
sensorValue = sensorValue / 1.6;
}else if((vol <= 20.0)&&(vol > 15.0)){
sensorValue = sensorValue / 1.3;
}else if((vol <= 25.0)&&(vol > 20.0)){
sensorValue = sensorValue / 1.0;
}else if((vol <= 30.0)&&(vol > 25.0)){
sensorValue = sensorValue / 0.8;
}else if((vol <= 35.0)&&(vol > 30.0)){
sensorValue = sensorValue / 0.6;
}else if((vol <= 40.0)&&(vol > 35.0)){
sensorValue = sensorValue / 0.5;
}
Serial.print(vol); //debug串口输出
Serial.print("----");
Serial.println(sensorValue);
if(sensorValue >= flag){ //传感器模拟输出量报警阀值判断
an_alert();
}else{
digitalWrite(RledPin, LOW);
digitalWrite(buzzer, LOW);
}
}
不错,学习了。 谢谢共享,来学习了 外壳选的不错 zxca112 发表于 2015-3-28 20:02 static/image/common/back.gif
外壳选的不错
;P我自己也这么觉得 if语句可否用switch实现呢? li23108 发表于 2015-3-29 07:20 static/image/common/back.gif
if语句可否用switch实现呢?
可以用,不过switch只能处理整型和布尔型数据哦。我这里处理的是float型数据,所以不好用switch 本帖最后由 li23108 于 2015-3-31 22:37 编辑
HuaShine2015 发表于 2015-3-29 09:48 static/image/common/back.gif
可以用,不过switch只能处理整型和布尔型数据哦。我这里处理的是float型数据,所以不好用switch
:lol受教了,还有个问题要请教你,我想用硬盘录像机485输出的代码控制灯 ,代码我抓取了,大概有8个字节地址和执行码,和8个地址和停止码,arduino这里如何处理呢?,,,只要获取到地址码就开灯,不理会停止码,多字节就不会了。请赐教 li23108 发表于 2015-3-31 22:31 static/image/common/back.gif
受教了,还有个问题要请教你,我想用硬盘录像机485输出的代码控制灯 ,代码我抓取了,大概有8个字节 ...
可以参考Auduino IDE的示例程序,Communication-->SerialEvent li23108 发表于 2015-3-31 22:31 static/image/common/back.gif
受教了,还有个问题要请教你,我想用硬盘录像机485输出的代码控制灯 ,代码我抓取了,大概有8个字节 ...
可以参考Auduino IDE的示例程序,Communication-->SerialEvent 本帖最后由 li23108 于 2015-4-3 19:44 编辑
HuaShine2015 发表于 2015-4-3 09:32 static/image/common/back.gif
可以参考Auduino IDE的示例程序,Communication-->SerialEvent
谢谢指导,和接受字符串原理差不多,但是我始终没弄明白,遇到换行符,为一句的结束,那么如何输入换行符给arduino呢?
arduino串口监视器如何操作呢?
刚才试验了下 串口助手可以,,16进制发送0x380x0a对应ACSII为8和换行
串口收到的38 0A 0D 0A 其中0A 0D 0A是对应ACSII中的回车和换行对吧
就是没弄明白arduino调试器中的串口监视器如何操作。 li23108 发表于 2015-4-3 19:19 static/image/common/back.gif
谢谢指导,和接受字符串原理差不多,但是我始终没弄明白,遇到换行符,为一句的结束,那么如何输入换行 ...
实例中的'\n'可以用任意符合ASCII规范的符号代替,这个只是上位机告诉下位机传输完毕的一个协议。
串口调试助手支持字符串直接输入 谢谢共享,来学习。。。。。。。。
页:
[1]