查看: 10451
回复: 24
家用燃气&火灾检测报警器(完结) 本帖主对外承接开发, 联系作者
MiaoKo
4
主题
94
回复
该帖子为嘉立创认证过的开发案例,案例是对作者实际开发产品的介绍,您可以通过这些案例去找到和自己产品相关的一些方案或解决途径。 查看更多案例 >>
发表于2016-10-10 15:48:47 | 显示全部楼层
1# 电梯直达

一、作品简介:

国庆期间空闲时间比较多,正好趁机赶出来了。已经发出制板,现在来简单介绍下这次的制作内容。

先上个PCB绘制完成后的3D:


为什么我这次选择制作这个东西呢?确实是有一番原因的,前端时间家里发生了燃气泄露事件,所幸发现还算及时,也有正确地进行处理,所以并未造成任何人身和财产损失,不过着实还很后怕。当时整个屋子里都充斥着浓浓的天然气刺鼻的味道,泄露是因为燃气管道和燃气灶的接口松脱了而导致的。事情处理了之后,我就想一定要安装一个可以检测到燃气泄露并进行报警的装置,现在亡羊补牢,为时不晚。在网上翻看了一下,发现现有的燃气报警器并不符合我预期的期望,还存在很大的改进空间,正好本人又是电子攻城狮一枚,也正好借这次制作节的机会来迅速搞定,并和大家一起分享下。

实现用途:作为家用的燃气泄露和火灾的探测和报警器使用

实现功能:

1)、能够实现较为准确的空气中天然气(CH4)的浓度检测,并在超过设定的浓度阀值后进行声、光报警提示,以便人们能够及时发现和处理燃气泄露事件;

2)、能够检测到周围环境是否有火灾事件产生,在检测到有火灾事件后,能够通过声、光方式进行报警,以便人们及时发现和处理火灾事件。

3)、具备较为准确的环境温度检测功能,一是用于传感器温度补偿算法,二是也可作为温度数据通过四位数码管显示出来供用户参考;

4)、其它的辅助功能还包括:84位数码管,用于燃气浓度数据显示,示警,火灾事件示警,温度数据显示;物体接近探测,以便系统可以实现自动开启和关闭数码管,更加智能化,并降低功耗;一个按键,位于报警器正中央位置,用于实现人机交互,可通过按键实现:报警解除,工作模式设置,火灾检测灵敏度设置,燃气传感器校准等操作;蜂鸣器,用于实现声音示警和操作提示声音提示;315MHZ无线数据发送模块,用以实现设备数据向主机推送或提供接口给其它智能家居设备系统,以实现兼容。

5)、方便的燃气浓度传感器校准,在出厂时,仅需在洁净空气中先调节可调电阻,使电路板的NG测试点电压输出为0,然后通过按键和数码管交互,选择进入校准界面,并放入1000ppm浓度的空气中,等待2分钟即可完成校准,以后就可以正常使用了。

设计的作用与意义:旨在为家庭用户提供一个多功能,全方面的家用异常情况(燃气泄露和火灾事件)检测报警装置。而且我也觉得每个家庭确实有必要有一个这样的东西,因为燃气泄露或各种原因导致的火灾事件是家庭事故中发生率最高的两类事件。

二、作品亮点:

         天然气浓度检测电路,采用催化燃烧式传感器MC105,配合差动放大电路和调零电路,能够使电路有效地避免由于环境温度、湿度变化而导致的传感器变化,使燃气浓度检测在正常工作范围内都能够保证很高的精度和稳定性。

         烟雾检测(火灾探测)电路,通过查询相关资料,选择使用光学烟雾传感器。 该类传感器能够比离子火灾传感器通过检测空气中的烟雾浓度变化,从而能够更早检测出火灾事件,并且无任何辐射。
        
人机交互:数码管进行声音显示,蜂鸣器进行声音提示,按键进行具体操作。通过按键的按下与否,按下的时长可实现功能选择、设置。

         本设计比起市面上现有的同类报警器来说,首先是能够准确稳定地检测空气中天然气的浓度,能够最大程度地避免误报警,并提供报警时的燃气浓度显示功能;二是增加了火灾检测报警功能,现在市面上我所看到的报警器基本不带有这项功能,但从家庭安全考虑出发,这项功能应该是很有必要的,并且这种基于光学传感器的火灾检测方式比起市面上一些基于离子传感器方式的火灾报警器来说,还没有潜在的辐射危害,并且能够在起火的烟雾阶段就检测到,以便及时处理火灾事件。

三、系统框架图:

        

四、原理图

基于催化燃烧的燃气浓度检测

基于光学烟雾检测的火灾探测

数码管驱动

蜂鸣器驱动

315MHZ无线数据发送

温度测量

基于光电的物体接近检测

MCUICSP和按键

供电

五、主要元器件清单

      1)、天然气传感器:炜盛MC105

      2)、烟雾检测传感器:光学迷宫(这个器件真不好找,名字也不一定正确,网上目前也只找到一家有卖的)

      3)、温度测量传感器:DS18B20 http://www.szlcsc.com/product/details_10283.html

      4)、光电传感器:ST188

      5)LED数码管驱动:TM1628 http://www.szlcsc.com/product/details_38154.html

      6)、低功耗精密运算放大器:TLC27L2 http://www.szlcsc.com/product/details_7456.html

      7)、MCU:PIC16F1829 http://www.szlcsc.com/product/details_37289.html

      8)、5V有源蜂鸣器:TMB09055 http://www.szlcsc.com/product/details_3242.html

      9)、315MHZ数据发送模块:H34A

      10)、0.4英寸8段四位绿色数码管:FJ4401AG http://www.szlcsc.com/product/details_19891.html


六、PCB

        

PCB图

PCB实物图

焊接后的调试

装上外壳后的实物图(正常温度显示)

装上外壳后的实物图(菜单显示)

装上外壳后的实物图(烟雾检测报警)


7、软件描述

因为采用的MCUMicroChip的,所以开发环境就用MPLAB X IDE,这个软件还是蛮强大的。就是有些臃肿,吃电脑性能。MCU底层操作直接由MPLAB插件MCC图形化配置自动生成

MCC配置



需要写的软件代码主要就是:应用初始化及应用进程控制,按键事件处理,蜂鸣器事件处理,基于DS18B20的温控进程,基于TM1628的数码管显示进程。

实现的功能包括:

    1)、  燃气泄露检测报警以及校准:上电后,延迟3分钟左右使能燃气检测,因为催化燃烧式的传感器需要一定来加热到工作状态,之前的传感器是处于不正确工作状态的,所以需要跳过。在平时运行时,如果检测到空气中的燃气值超过一定浓度,会控制蜂鸣器以一定间隔鸣叫进行声音提示,并在数码管上实时检测到的空气中的燃气浓度值(PPM),并闪烁数码管。在此状态下,按一下按键即解除报警,并暂时关闭燃气检测,2分钟后,继续进行正常的燃气检测,不然会造成刚解除又报警的BUG

    2)、  烟雾检测报警:通过检测空气中的烟雾浓度,来判断是否有火灾发生。和燃气泄露报警类似,在检测到空气中烟雾浓度超标后,会驱动蜂鸣器和数码管进行声光报警。数码管会显示FIRE字样,并闪烁。在报警状态下,按一下按键即解除报警,并暂时关闭烟雾检测,2分钟后,继续进行正常的烟雾浓度检测,不然会造成刚解除又报警的BUG

    3)、  功能选择以及设置:由数码管和按键共同构成一个菜单系统,在非报警状态下,按一下按键即进入菜单选择界面,并在数码管上实时显示菜单编号。轻触一下按键,可以进行菜单功能选择,并同时伴随一声短暂的蜂鸣器鸣叫来反馈选择操作;保持按键长按2s以上,即可设定该菜单对应的功能,设备同时发出一声长达1S的蜂鸣器鸣叫来反馈设定操作。菜单数目共有6个,包括以下功能设定:温度显示常开,温度显示仅在有物体靠近时,烟雾检测灵敏度设置为低,烟雾检测灵敏度设置为中,烟雾检测灵敏度设置为高,燃气浓度传感器校准(1000PPM).在设定功能后,即退出菜单选择。如果在菜单选择界面停留超过30S,而没有进行任何按键操作,则自动返回空闲状态。

    4)、  温度显示功能:可以进行0.25°精度的温度测量以及显示,并可根据菜单设置进行温度实时显示或仅在需要时显示。

    5)、  燃气浓度校准:基于MC105的催化燃烧式传感器,在组装完毕后,需要进行燃气浓度和传感器输出电压值的映射。我自己设定的方法是,在菜单中有一个功能来进行该操作。选择该功能后,在10S内将设备放在燃气浓度为1000PPM的透明密封箱体内,设备会自动采集当前燃气传感器的输出电压值,并认为这是1000PPM时的输出电压值,再通过燃气输出电压和浓度的转换公式来确定电压输出每个单位值对应的浓度变化。所幸这个传感器的浓度-电压变化还算线性。

    6)、(还未实现)报警信息通过自定义的315MHZ编码格式向外界发送,以便能够被其它对应;

代码采用状态机方式编程运行,限于篇幅,帖子中只贴出两处关键代码:

应用进程(由系统10ms定时调用):


应用进程流程图


void AppTask_PollHandler(void)
{
    switch(sys_run_data.sys_ccs)
    {
        case SYS_HSTATE_IDLE:
            if(sys_run_data.task == SysTask_Ng_Alarm)//燃气泄露报警激活
            {
                LedDisplay_Control(LedDisplay_ControlAction_Number,2,sys_run_data.NG_PPM);//开启显示

                AuxEvt_Add(AUX_EVT_BEEP_NG_ALARM);//启动蜂鸣器烟雾报警

                sys_run_data.BitFlag.LedDisplay_Toggle = 0;//清0数码管显示翻转标志位

                SYS_Timing_EVT_Add(&alarm_led_display_toggle_space_10ms_cnt, SYS_TIMING_EVT_ALARM_LED_DISPLAY_TOGGLE_SPACE);//启动LED定时翻转计时任务

                sys_run_data.sys_ccs = SYS_HSTATE_DISPLAY_NG_ALARM;//跳转到 燃气报警 应用流程
            }
            else if(sys_run_data.task == SysTask_Smoke_Alarm)//烟雾报警激活
            {
                LedDisplay_Control(LedDisplay_ControlAction_PredefinedChar,sizeof(LedDisplay_SmokeAlarmCharData),LedDisplay_SmokeAlarmCharData);//开启显示

                AuxEvt_Add(AUX_EVT_BEEP_SMOKE_ALARM);//启动蜂鸣器烟雾报警

                sys_run_data.BitFlag.LedDisplay_Toggle = 0;//清0数码管显示翻转标志位

                SYS_Timing_EVT_Add(&alarm_led_display_toggle_space_10ms_cnt, SYS_TIMING_EVT_ALARM_LED_DISPLAY_TOGGLE_SPACE);//启动LED定时翻转计时任务

                sys_run_data.sys_ccs = SYS_HSTATE_DISPLAY_SMOKE_ALARM;//跳转到 烟雾报警 应用流程
            }
            else if(sys_run_data.task == SysTask_Menu_Display)//菜单显示
            {
                sys_run_data.MenuFunctionIndex = MenuFunctionIndex_DisplayTemperature_AlwaysOn;//初始化菜单指示索引变量
                
                LedDisplay_Control(LedDisplay_ControlAction_PredefinedChar, 4, &LedDisplay_MenuCharData[sys_run_data.MenuFunctionIndex][0]);//开启菜单显示
                
                sys_run_data.BitFlag.LedDisplay_MenuQuit = 0;
                
                SYS_Timing_EVT_Add(&led_display_menu_quit_delay_10ms_cnt,SYS_TIMING_EVT_LED_DISPLAY_QUIT_DELAY);//启动LED显示菜单的退出延时 计时任务

                sys_run_data.sys_ccs = SYS_HSTATE_DISPLAY_MENU;//跳转到 菜单显示 应用流程
            }
            else if(sys_run_data.task == SysTask_Temperature_Display)//探测到有物体接近
            {
                sys_run_data.sys_ccs = SYS_HSTATE_DISPLAY_TEMPERATURE;
            }

            break;

        case SYS_HSTATE_DISPLAY_TEMPERATURE://温度数据显示

            if(sys_run_data.task == SysTask_Temperature_Display)//当前任务仍然是温度显示
            {
                if(DS18B20_GetRunState() == DS18B20_RunState_RunSus)//温度转换成功:进行显示
                {
                    //获取转换后的温度数据:整数部分
                    sys_run_data.TemperatureDataArray[0] = 0;
                    DS18B20_GetTemperature_Integer(1, &sys_run_data.TemperatureDataArray[1]);
                    
                    //获取转换后的温度数据:小数部分
                    DS18B20_GetTemperature_Decimal(1, &temp_u16);
                    sys_run_data.TemperatureDataArray[2] = temp_u16>>8;
                    sys_run_data.TemperatureDataArray[3] = temp_u16;
                        
                    LedDisplay_Control(LedDisplay_ControlAction_Number,4,sys_run_data.TemperatureDataArray);
                    
                    DS18B20_Run();//再次进行温度转换 
                }
                else if(DS18B20_GetRunState() == DS18B20_RunState_Running)//温度转换 正在运行中:等待,不做处理
                {

                }
                else//其余未运行或运行错误:启动温度转换
                {
                    DS18B20_Run();
                }
            }
            else//当前任务已经改变(或变化,或取消):返回IDLE态,以便重新进入对应任务
            {
                LedDisplay_Control(LedDisplay_ControlAction_Off,0,(void *)(0));//关闭数码管显示
                
                sys_run_data.sys_ccs = SYS_HSTATE_IDLE;
            }

            break;

         case SYS_HSTATE_DISPLAY_NG_ALARM:
            if(sys_run_data.task == SysTask_Ng_Alarm)//当前的显示任务仍然是Ng Alarm
            {
                //数码管显示处理:翻转
                if(sys_run_data.BitFlag.LedDisplay_Toggle)//LED显示翻转间隔到
                {
                    if(LedDisplay_OnOffStateRead())//当前数码管显示 开:关闭显示
                    {
                        LedDisplay_Control(LedDisplay_ControlAction_Off,0,(void *)(0));
                    }
                    else//当前数码管显示关闭:开启显示
                    {
                        LedDisplay_Control(LedDisplay_ControlAction_Number,2,sys_run_data.NG_PPM);//开启显示
                    }
                    
                    sys_run_data.BitFlag.LedDisplay_Toggle = 0;//清除数码管显示的翻转标志位
                }

                //蜂鸣器报警处理:停止报警驱动,则开启继续报警
                if(Aux_RunStateControl(AuxDevRunState_Beep_Read));//蜂鸣器仍在工作中:不动作
                else//蜂鸣器停止工作:再次启动蜂鸣器
                {
                    AuxEvt_Add(AUX_EVT_BEEP_NG_ALARM);//启动蜂鸣器烟雾报警
                }                
            }
            else//当前任务已经改变(或变化,或取消):返回IDLE态,以便重新进入对应任务
            {
                LedDisplay_Control(LedDisplay_ControlAction_Off,0,(void *)(0));//关闭数码管显示

                SYS_Timing_EVT_Del(SYS_TIMING_EVT_ALARM_LED_DISPLAY_TOGGLE_SPACE);//关闭数码管显示定时翻转 定时任务

                Aux_RunStateControl(AuxDevRunState_Beep_Off);//关闭蜂鸣器鸣叫

                sys_run_data.sys_ccs = SYS_HSTATE_IDLE;
            }
            
            break;

         case SYS_HSTATE_DISPLAY_SMOKE_ALARM:
            if(sys_run_data.task == SysTask_Smoke_Alarm)//当前的显示任务仍然是Smoke Alarm
            {
                //数码管显示处理:翻转
                if(sys_run_data.BitFlag.LedDisplay_Toggle)//LED显示翻转间隔到
                {
                    if(LedDisplay_OnOffStateRead())//当前数码管显示 开:关闭显示
                    {
                        LedDisplay_Control(LedDisplay_ControlAction_Off,0,(void *)(0));
                    }
                    else//当前数码管显示关闭:开启显示
                    {
                        LedDisplay_Control(LedDisplay_ControlAction_PredefinedChar,sizeof(LedDisplay_SmokeAlarmCharData),LedDisplay_SmokeAlarmCharData);
                    }
                    
                    sys_run_data.BitFlag.LedDisplay_Toggle = 0;//清除数码管显示的翻转标志位
                }

                //蜂鸣器报警处理:停止报警驱动,则开启继续报警
                if(Aux_RunStateControl(AuxDevRunState_Beep_Read));//蜂鸣器仍在工作中:不动作
                else//蜂鸣器停止工作:再次启动蜂鸣器
                {
                    AuxEvt_Add(AUX_EVT_BEEP_SMOKE_ALARM);//启动蜂鸣器烟雾报警
                }                
            }
            else//当前任务已经改变(或变化,或取消):返回IDLE态,以便重新进入对应任务
            {
                LedDisplay_Control(LedDisplay_ControlAction_Off,0,(void *)(0));//关闭数码管显示

                SYS_Timing_EVT_Del(SYS_TIMING_EVT_ALARM_LED_DISPLAY_TOGGLE_SPACE);//关闭数码管显示定时翻转 定时任务

                Aux_RunStateControl(AuxDevRunState_Beep_Off);//关闭蜂鸣器鸣叫

                sys_run_data.sys_ccs = SYS_HSTATE_IDLE;
            }
            break;

        case SYS_HSTATE_DISPLAY_MENU:
            if(sys_run_data.task == SysTask_Menu_Display)//当前的显示任务仍然是显示菜单
            {
                //有按键动作
                if(sys_run_data.PbAction>PushButton_Action_No)
                {
                    if(sys_run_data.PbAction == PushButton_Action_Select)//选择
                    {
                        sys_run_data.MenuFunctionIndex++;

                        if(sys_run_data.MenuFunctionIndex > MenuFunctionIndex_NgSensorCal_In_1000ppm)//显示回滚
                        {
                            sys_run_data.MenuFunctionIndex = 0;
                        }

                        LedDisplay_Control(LedDisplay_ControlAction_PredefinedChar, 4, &LedDisplay_MenuCharData[sys_run_data.MenuFunctionIndex][0]);//显示对应菜单
                    }
                    else if(sys_run_data.PbAction == PushButton_Action_Sure)//确定
                    {
                        switch(sys_run_data.MenuFunctionIndex)
                        {
                            case MenuFunctionIndex_DisplayTemperature_AlwaysOn:
                                sys_run_data.BitFlag.InfraredSensorEnable = 0;
                                break;
                                
                            case MenuFunctionIndex_DisplayTemperature_WhenApproached:
                                sys_run_data.BitFlag.InfraredSensorEnable = 1;
                                break;
                                
                            case MenuFunctionIndex_SmokerSensorSensitivity_Low:
                                
                                sys_run_data.SmokeSensor_DetectThd_AdcVal = SMOKE_SENSOR_DETECT_SENSITIVITY_LOW_ADC_VAL;

                                //【增加写入到EEPROM】
                                
                                break;
                                
                            case MenuFunctionIndex_SmokerSensorSensitivity_Medium:
                                
                                sys_run_data.SmokeSensor_DetectThd_AdcVal = SMOKE_SENSOR_DETECT_SENSITIVITY_MEDIUM_ADC_VAL;

                                //【增加写入到EEPROM】
                                
                                break;
                                
                            case MenuFunctionIndex_SmokerSensorSensitivity_High:
                                
                                sys_run_data.SmokeSensor_DetectThd_AdcVal = SMOKE_SENSOR_DETECT_SENSITIVITY_HIGH_ADC_VAL;

                                //【增加写入到EEPROM】
                                
                                break;
                                
                            case MenuFunctionIndex_NgSensorCal_In_1000ppm:
                                
                                break;

                            default:

                                break;
                        }

                        //退出菜单显示任务
                        sys_run_data.task = SysTask_No;
                        
                        LedDisplay_Control(LedDisplay_ControlAction_Off,0,(void *)(0));//关闭数码管显示
                        
                        sys_run_data.sys_ccs = SYS_HSTATE_IDLE;
                    }
                    
                    sys_run_data.PbAction = PushButton_Action_No;//清0 记录的按键动作

                    SYS_Timing_EVT_Add(&led_display_menu_quit_delay_10ms_cnt,SYS_TIMING_EVT_LED_DISPLAY_QUIT_DELAY);//【重置】LED显示菜单的退出延时 计时任务
                }
                else if(sys_run_data.BitFlag.LedDisplay_MenuQuit)//进入菜单界面,长时间无操作:退出菜单显示
                {
                    sys_run_data.task = SysTask_No;
                    
                    LedDisplay_Control(LedDisplay_ControlAction_Off,0,(void *)(0));//关闭数码管显示
                    
                    sys_run_data.sys_ccs = SYS_HSTATE_IDLE;
                }
            }
            else//当前任务已经改变(或变化,或取消):返回IDLE态,以便重新进入对应任务
            {
                LedDisplay_Control(LedDisplay_ControlAction_Off,0,(void *)(0));//关闭数码管显示
                
                sys_run_data.sys_ccs = SYS_HSTATE_IDLE;
            }

            break;

        default:

            break;
    }
}

按键事件处理:

void PushedButton_Process(void)
{
    U8 PushedButton;
    U16 PushTime;
    
    PushedButton = HMI_PbGetLastButton(&PushTime);//【如果同时按下了两个按键,则返回值应是如何呢?待调试验证】
    
    switch(PushedButton)
    {
        case Hmi_PbState_Pb1:
            if((sys_run_data.task == SysTask_Ng_Alarm) || (sys_run_data.task == SysTask_Smoke_Alarm))//如果系统当前正处于燃气报警或烟雾报警:解除报警
            {
                //AuxEvt_Add(AUX_EVT_BEEP_ALALRM_RELEASED);

                //先根据当前执行任务各自关闭对应的传感器检测功能,并添加使能延时计时
                if(sys_run_data.task == SysTask_Ng_Alarm)
                {
                    sys_run_data.BitFlag.NgSensorEnable = 0;
                    
                    NgSensor_detect_delay_10ms_sum = NG_SENSOR_DETECT_DELAY_WHEN_RELEASED_10MS;//设置燃气传感器延迟使能时间为:2分钟
                    
                    SYS_Timing_EVT_Add(&NgSensor_detect_delay_10ms_cnt,SYS_TIMING_EVT_NG_SENSOR_DETECT_DELAY);
                }
                else if(sys_run_data.task == SysTask_Smoke_Alarm)
                {
                    sys_run_data.BitFlag.SmokeSensorEnable = 0;
                    
                    SmokeSensor_detect_delay_10ms_sum = SMOKE_SENSOR_DETECT_DELAY_WHEN_RELEASED_10MS;//设置烟雾传感器延迟使能时间为:2分钟
                    
                    SYS_Timing_EVT_Add(&SmokeSensor_detect_delay_10ms_cnt,SYS_TIMING_EVT_SMOKE_SENSOR_DETECT_DELAY);
                }

                sys_run_data.task = SysTask_No;//重置当前正在执行的任务为NO
            }
            else if((sys_run_data.task == SysTask_Temperature_Display) || (sys_run_data.task == SysTask_No))//如果系统当前任务是温度显示(或当前无任务):则切换到菜单显示
            {
                sys_run_data.task = SysTask_Menu_Display;

                AuxEvt_Add(AUX_EVT_BEEP_BUTTON_SELECT);
            }
            else if(sys_run_data.task == SysTask_Menu_Display)//如果系统当前任务是菜单显示:则进一步区分按键时长,对按键功能进行区分
            {
                if(PushTime >= PUSH_BUTTON_ACTION_SURE_PUSHED_TIME_10MS)//按键按下的持续时长大于一定值
                {
                    sys_run_data.PbAction = PushButton_Action_Sure;

                    AuxEvt_Add(AUX_EVT_BEEP_BUTTON_SURE);
                }
                else
                {
                    sys_run_data.PbAction = PushButton_Action_Select;

                    AuxEvt_Add(AUX_EVT_BEEP_BUTTON_SELECT);
                }
            }

            break;

        default:

            break;
    }
}






8、作品演示:

待制作

9、总结:

对于作品的:1)、构思这个作品,是事出有因的,就是文章开头所说的事情。所以就想着自己要做一个。我自己对作品的需求呢,不光要有燃气泄露检测,再加上烟雾检测,温度检测,还预留了射频数据发送端口。

2)、在帖子刚贴出来后,和网友讨论发现,果然自己的需求和大家的期望还是很不一样的,对于温度传感器和数码管的使用,有朋友觉得不太实用。我也反复思考了下,在单设备方式下,数码管进行温度,报警信息,菜单选择上还是很有优势的,虽然单独的声音反馈也可以做到。说这话,意思是,一个成熟的产品,是不能闭门造车,完全按自己的预构来弄,这是要不得的,要充分了解大家对于一个产品有没有需求,有啥需要才能做出大家满意的东西来。

3)、还有网友提到,作品有些地方不太符合这个行业的要求规范。至少要短路,防爆之类的,别发生燃气泄露,设备自己产生火花搞出事故,虽然一般不可能。但设计之初,确实也没参考行业规范。这一点,如果待到改进的时候,肯定会多考虑的。

4)、设备调试方面:花费功夫比较多的是在两个传感器的调试上。首先说烟雾传感器吧,虽然好不容易找到了光学迷宫这种玩意,但具体怎么测量还真是一头雾水。烟雾传感器原理其实和夏普的PM2.5红外光学传感器很类似,空气中的烟雾颗粒会折射红外发射管发出的红外光,并被红外光敏二极管接收到。红外发射管的驱动,刚开始设为常亮,发现功耗很大,后面改为在每次检测前,先提前10ms点亮,然后在对传感器的输出进行电压采集后就关闭红外发射管,大大降低了功耗。红外接收检测端,由一个红外光敏二极管和一个电阻串联到GND组成,电阻上的电压通过运算放大器进行同相比例进行放大后传送给MCUADC采集。

刚开始的时候,放大倍数设置过小,基本检测不到电压变化,后面逐步尝试,将放大倍数设置为430K/1K=430倍,才能够在空气中烟雾浓度变化时,检测到明显的传感器输出电压变化。另外红外发射管的限流电阻如果用贴片的话,要选用0805以上的;ADC在进行传感器电压采集时,一定要多次采集后再进行处理,建议一般剔除头2次的电压采集值,因为有一定可能出现采集到的数值偏低,可能是采样电容充电未完成吧。

5)、燃气传感器,采用差动放大电路是正确的选择,并且同样也需要极高的放大倍数,因为由于燃气浓度变化而在传感器输出端产生的电压值实在太微弱了,必须进行放大处理。燃气浓度和采样值的对应关系目前只有通过1000PPM浓度和采样ADC数值进行处理,算出每个ADC对应的浓度值来进行映射的。看手册,其变化曲线还算线性,所以这么处理应该还能凑和。

7)、像这类空气成分检测,最好还是设计一个风道,单靠空气的自然流通,检测效果是不理想的,因为空气流动是随机的,成分的浓度分布也是有差异的,所以最好有风扇能够将空气吸入,增加空气流通量,以达到更加准确和及时的检测。

8)、关于作品的升级,如果以后还重做的话,我会首先压缩设备体积,长宽大大减小,以增加高度的方式来补偿,正确做到能够简洁地插在插座上,而不会占到其它插孔。再把220V5V直接放在设备内,去掉温度传感器,替换315MHZ通讯为Wifi/Zigbee通讯。最后,如果再做一个安卓手机客户端就更可以了。;)

 

写到最后的最后:1个月时间实际上确实有点不够,平时上班时间都是有工作的,这些只能晚上回去捣鼓一下,周末捣鼓一下,再除去吃饭和休息的时间,一周最多也就:1*5+3*2 = 11个小时来搞,一个月算下来也就40个小时左右,如果不是趁着国庆期间把电路图搞完了,我还真不一定搞得完。即便到了现在,程序中也还有很多粗糙的地方,之后还要一周左右时间来慢慢修改调试程序。感谢公司做结构的同事,在听说我的制作后,帮我设计并用3D打印机打了一个外壳。看起来确实比裸电路板好多了,也比较个性化。如果以后再升级,相信在配合下,提前设计好结构,提前规划好功能,可以做出更美观实用的设备。



kk118a
0
主题
11
回复
发表于2016-10-25 21:20:57   |  显示全部楼层
22#
板子有点大,看看家爆的行业手册

主题

回复
  • 温馨提示: 标题不合格、重复发帖、发布广告贴,将会被删除帖子或禁止发言。 详情请参考: 社区发帖规则
  • 您当前输入了 0 个文字。还可以输入 8000 个文字。 已添加复制上传图片功能,该功能目前仅支持chrome和火狐

禁言/删除

X
请选择禁言时长:
是否清除头像:
禁言/删除备注:
昵 称:
 
温馨提示:昵称只能设置一次,设置后无法修改。
只支持中文、英文和数字。

举报

X
请选择举报类型:
请输入详细内容:

顶部