HuaShine2015 发表于 2015-3-10 23:16:04

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);
    }
   
}








Cupid 发表于 2015-3-11 07:12:23

不错,学习了。

henrypcw 发表于 2015-3-11 11:42:15

谢谢共享,来学习了

zxca112 发表于 2015-3-28 20:02:28

外壳选的不错

HuaShine2015 发表于 2015-3-28 20:10:09

zxca112 发表于 2015-3-28 20:02 static/image/common/back.gif
外壳选的不错

;P我自己也这么觉得

li23108 发表于 2015-3-29 07:20:22

if语句可否用switch实现呢?

HuaShine2015 发表于 2015-3-29 09:48:35

li23108 发表于 2015-3-29 07:20 static/image/common/back.gif
if语句可否用switch实现呢?

可以用,不过switch只能处理整型和布尔型数据哦。我这里处理的是float型数据,所以不好用switch

li23108 发表于 2015-3-31 22:31:11

本帖最后由 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这里如何处理呢?,,,只要获取到地址码就开灯,不理会停止码,多字节就不会了。请赐教

HuaShine2015 发表于 2015-4-3 09:31:43

li23108 发表于 2015-3-31 22:31 static/image/common/back.gif
受教了,还有个问题要请教你,我想用硬盘录像机485输出的代码控制灯 ,代码我抓取了,大概有8个字节 ...

可以参考Auduino IDE的示例程序,Communication-->SerialEvent

HuaShine2015 发表于 2015-4-3 09:32:31

li23108 发表于 2015-3-31 22:31 static/image/common/back.gif
受教了,还有个问题要请教你,我想用硬盘录像机485输出的代码控制灯 ,代码我抓取了,大概有8个字节 ...

可以参考Auduino IDE的示例程序,Communication-->SerialEvent

li23108 发表于 2015-4-3 19:19:33

本帖最后由 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调试器中的串口监视器如何操作。

HuaShine2015 发表于 2015-4-5 19:00:20

li23108 发表于 2015-4-3 19:19 static/image/common/back.gif
谢谢指导,和接受字符串原理差不多,但是我始终没弄明白,遇到换行符,为一句的结束,那么如何输入换行 ...

实例中的'\n'可以用任意符合ASCII规范的符号代替,这个只是上位机告诉下位机传输完毕的一个协议。
串口调试助手支持字符串直接输入

nbzgg 发表于 2015-4-12 23:02:09

谢谢共享,来学习。。。。。。。。
页: [1]
查看完整版本: DIY的带一定温补的简易液化天然气报警器