查看: 427|回复: 5

[GD32F190方案分享] 基于GD32F190的厨房用气管理

[复制链接]

2

主题

0

好友

88

积分

童生

Rank: 2

  • TA的每日心情
    郁闷
    2016-5-31 09:31
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2016-6-8 20:24:27 |显示全部楼层
    一、方案名称
    基于GD32F190的厨房用气管理(从机模块)
    二、设计思路
         1、利用热电偶传感器采集天然气燃烧时的火焰温度,一般天然气燃烧时的温度为600度——850度之间。考虑到天然气质量可能造成燃烧温度稍低,认为采集到的温度大于500度,则有火焰燃烧。
         2、利用气流传感器检测天然气管道中是否有天然气流动。
         3、利用2.4G无线模块将 状态上传到主机,和接收主机下发的指令。
    三、完成功能
           当我们正常使用燃气时,燃气管道内有天然气流动,炉灶上有火焰燃烧,这时我们可以用来煮饭或烧水。但是发生故障时:比如长时间烧水或煮饭,无人看管,导致沸水溢出,将火焰浇灭,致使天然气泄漏;   天然气管道老化,致使天然气泄漏。这时通过检测是否有天然气流动和炉灶上是否有火焰燃烧来判断是否有故障发生,当有故障发生时驱动电动阀门切断天然气,并将故障上发给主机,报警。
        可以定时用气,在主机上设置时间,主机将命令下发,时间到达后,切断天然气。
    四、框架如下
       

    框架图

    框架图

    实物图(从机)

    实物图(从机)

    实物图(从机)

    安装于煤气灶上

    安装于煤气灶

    安装于煤气灶
    1. /********************************************************************************
    2. *函 数 名: Relay_Switch()
    3. *功能说明: 电磁阀开关
    4. *形    参:0---关阀,1---开阀,
    5. *返 回 值: 无
    6. *说明   :若阀门新的状态与旧的状态不一样,则执行动作,并检测阀门反馈的位置信号
    7. ****  若15s内阀门仍没有到达极限位置,则关闭阀门,认为阀门故障
    8. ********************************************************************************/
    9. #define Value_Con_on(x)  (x? GPIO_SetBits(GPIOC,GPIO_PIN_8):GPIO_ResetBits(GPIOC,GPIO_PIN_8))//开阀
    10. #define Value_Con_off(x)  (x? GPIO_SetBits(GPIOC,GPIO_PIN_9):GPIO_ResetBits(GPIOC,GPIO_PIN_9))//开阀
    11. void Relay_Switch(void)
    12. {
    13. /////////////////////////////////////////////////水阀控制////////////////////////////  
    14.      if( Relay_Old_Sta != Relay_State)
    15.      {
    16.           if((Relay_State & 0x01) == 0x01)
    17.           {
    18.               Value_Con_off(OFF);
    19.               Delay_100us(1);
    20.               Value_Con_on(ON);
    21.               Relay_kongzhi=1;//水阀控制标志,0不动作  1开阀  2关阀
    22.               Relay_kongzhi_time=0;
    23.           }else
    24.           {
    25.               Value_Con_on(OFF);
    26.               Delay_100us(1);
    27.               Value_Con_off(ON);
    28.               Relay_kongzhi=2;//水阀控制标志,0不动作  1开阀  2关阀
    29.               Relay_kongzhi_time=0;
    30.           }
    31.           Relay_Old_Sta = Relay_State;
    32.           WriteByte(Relay_Sta_Addr,Relay_State);
    33.      }
    34. ////////////////////////////////////// 水阀 动作 状态 检测 ///////////////////////////
    35.      if(Relay_kongzhi != 0)
    36.     {
    37.         Relay_kongzhi_time++;  //气阀控制时间
    38.         if(Relay_kongzhi_time == 400 ) //气阀控制时间 50ms一次 20s
    39.         {
    40.             Relay_kongzhi_time=0; //气阀控制时间清零
    41.             Relay_kongzhi=0;   //气阀控制标志,0不动作  1开阀  2关阀
    42.           //  Relay_kongzhi_ERR=1;//气阀控制状态 0阀无故障  1阀有故障
    43.         }
    44.      }else if(Relay_kongzhi == 0)  //气阀控制标志,0不动作  1开阀  2关阀
    45.      {
    46.          Value_Con_on(OFF);
    47.          Delay_100us(1);
    48.          Value_Con_off(OFF);
    49.      }
    50. }
    复制代码
    1. /********************************************************************************
    2. *函 数 名: Air_Detec
    3. *功能说明: 气流检测
    4. *形    参:
    5. *返 回 值: 无
    6. *说明   :
    7. ********************************************************************************/

    8. u8 Air_Flow_State=0;
    9. u8 AirTim = 0;
    10. u8 Air_0_time=0;
    11. u8 Fir_State=0;

    12. void Air_Detec(void)
    13. {   
    14.    //主机下发火焰状态
    15.    if( Air_Flow_Read() ) //读取气体状态  1为有气体
    16.   //if( 1 )
    17.    {
    18.        Air_Flow_State=1;  //有气体 气体流动标志为 1
    19.       
    20.        if(Fir_State==0)  //若无火焰(则开始漏气计时);若10S内仍没火焰,则认为漏气
    21.            AirTim++;     //火焰状态 ,主机下发
    22.        else
    23.            AirTim = 0;   //有火焰 ,漏气计时清零
    24.       
    25.        Air_0_time=0; //无气体流动时间
    26.    }else
    27.    {
    28.         if(++Air_0_time>=2) //连续两次无气体流动,认为无气体
    29.         {
    30.            Air_0_time = 0;  //无气体流动时间清零
    31.            AirTim = 0;   //漏气时间清零
    32.            Air_Flow_State=0;//气体流动标志为 0 无气体
    33.         }
    34.    }
    35.    
    36.    if( (Air_Flow_State==1) && (Fir_State==0) && (AirTim>=100) )//有气体流动 并且连续10S内无火焰
    37.    {                                                           //则开始报警
    38.        Relay_State = 0x02;//阀状态,主动关阀
    39.        Air_Flow_State=0x01;//微流量传感器状态
    40.        LED_Con(ON);
    41.        AirTim = 0;
    42.    }
    43.    
    44. }
    复制代码
    1. /*2.4G初始化*/
    2. void L01_Init( void )
    3. {
    4.     INT8U addr[5] = {INIT_ADDR};
    5.     addr[0]=0x01;
    6.     addr[1]=0x01;
    7.     addr[2]=191;
    8.     addr[3]=92;
    9.     addr[4]=68;
    10.     L01_CE_HIGH( );  //CE = 1
    11.     L01_ClearIRQ( IRQ_ALL );
    12. #if DYNAMIC_PACKET == 1
    13.     //dynamic payload length
    14.     L01_WriteSingleReg( L01REG_DYNPD, ( 1<<0 ) );//Enable pipe 0 dynamic payload length
    15.     L01_WriteSingleReg( L01REG_FEATRUE, 0x07 );
    16.     L01_ReadSingleReg( L01REG_DYNPD );   
    17.     L01_ReadSingleReg( L01REG_FEATRUE );
    18. #elif DYNAMIC_PACKET == 0
    19.     //Fixed packet length
    20.     L01_WriteSingleReg( L01REG_RX_PW_P0, FIXED_PACKET_LEN );
    21. #endif//DYNAMIC_PACKET

    22.     L01_WriteSingleReg( L01REG_CONFIG, /*( 1<<MASK_RX_DR ) |*///receive interrupt
    23.                                       ( 1<<EN_CRC ) |     //Enable CRC, 1 byte
    24.                                       ( 1<<PWR_UP ) );    //Power up the device
    25.    
    26.    // L01_WriteSingleReg( L01REG_EN_AA, ( 1<<ENAA_P0 ) );   //Auto ack in pipe 0
    27.     L01_WriteSingleReg( L01REG_EN_AA, 0x00 );   //Auto ack in pipe 0
    28.      
    29.     L01_WriteSingleReg( L01REG_EN_RXADDR, ( 1<<ERX_P0 ) );//Enable pipe 0 receive
    30.     L01_WriteSingleReg( L01REG_SETUP_AW, AW_5BYTES );     //Address width : 5Byte
    31.    
    32.    // L01_WriteSingleReg( L01REG_RETR, ARD_4000US |
    33.     //                    ( REPEAT_CNT & 0x0F ) );         //repeat wait : 250us
    34.      L01_WriteSingleReg( L01REG_RETR, ARD_4000US |
    35.                         ( REPEAT_CNT & 0x03 ) );         //repeat wait : 250us
    36.    
    37.     L01_WriteSingleReg( L01REG_RF_CH, 60 );             //Initial channel
    38.     L01_WriteSingleReg( L01REG_RF_SETUP, 0x26 );
    39.     L01_SetTXAddr( &addr[0], 5 );                          //Set TX address
    40.     L01_SetRXAddr( 0, &addr[0], 5 );                       //Set RX address
    41. }


    42. /*无线通讯数据处理*/
    43. void Modbus_dispose(void)
    44. {
    45.   u8 i;
    46.   TX_Buff[0] = Module_NUM;
    47.   TX_Buff[1] = Modbus_Function;
    48.   switch(Modbus_Function)
    49.   {
    50.     case 0x03: //主机下发配置信息,
    51.      {
    52.        // Water_Num = RX_Buff[4];
    53.        // WriteByte(Water_Lou_Addr,Water_Num);  //记录水流瞬时流量值
    54.      }break;
    55.     case 0x04: //主机下发动作,本模块用
    56.      {
    57.        i = RX_Buff[3];      //气阀的控制
    58.        if(i==0x00)
    59.         {
    60.           Relay_State = 0x00;         
    61.         }
    62.        else
    63.         {
    64.            Relay_State = 0x01;
    65.            Air_Flow_State=0x01;//微流量传感器状态
    66.         }
    67.        TX_Buff[2] = 0x02;
    68.       
    69.        TX_Buff[3] = Relay_State;
    70.       // TX_Buff[3] = 0x0;
    71.        TX_Buff[4] = 0x00;      
    72.        crcdat = getCRC16(TX_Buff,Modbus_Buff_Len - 2);//前5个字节校验
    73.        TX_Buff[5] = crcdat & 0xff;
    74.        TX_Buff[6] = (crcdat >> 8) & 0xff;
    75.      }break;  
    76.     case 0x05: //主机索要本模块状态
    77.      {
    78. if( (i&0x02) != 0 )
    79.     Relay_State=0x00;
    80.       
    81.        TX_Buff[2] = 0; //子功能码
    82.        TX_Buff[3] = Air_Flow_State;//微流量传感器状态
    83.        TX_Buff[4] = Relay_State; //电磁阀状态
    84.       //  TX_Buff[3] = 0;//微流量传感器状态
    85.       //  TX_Buff[4] = 1; //电磁阀状态
    86.        crcdat = getCRC16(TX_Buff,Modbus_Buff_Len - 2);//前5个字节校验
    87.        TX_Buff[5] = crcdat & 0xff;
    88.        TX_Buff[6] = (crcdat >> 8) & 0xff;
    89.      }break;
    90.     case 0x06: //主机下发动作,本模块未用
    91.      {
    92.         ;
    93.      }break;      
    94.   }
    95. }
    复制代码

    回帖推荐

    回复

    使用道具 举报

    2

    主题

    0

    好友

    88

    积分

    童生

    Rank: 2

  • TA的每日心情
    郁闷
    2016-5-31 09:31
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2016-6-8 20:29:54 |显示全部楼层
    1. /****************************************************************************
    2. * 名    称:Fir_Detec       
    3. * 功    能:判断火焰温度
    4. * 入口参数:无
    5. * 出口参数:无
    6. * 说    明:  
    7. * 调用方法:
    8. ****************************************************************************/
    9. u8 Fir_Read_num=0;
    10. u16 Fir_Buff[7];
    11. u8 FirTim = 0;
    12. u8 FirTim_err = 0;

    13. void Fir_Detec(void)
    14. {   
    15.      u8 i=0,j=0;
    16.      u16 tamp=0;
    17.      u32 num;
    18.    //FirADNum = ADS_Read_Finsh();   
    19.     Fir_Buff[Fir_Read_num] = ADS_Read_Finsh();
    20.     Fir_Read_num++;

    21.     if(Fir_Read_num>=5)
    22.     {
    23.       Fir_Read_num=0;
    24. ////////////////////////////////////////排序
    25.         for(i=0;i<4;i++)
    26.         {
    27.            for(j=i+1;j<5;j++)
    28.            {
    29.               if(Fir_Buff[i]>Fir_Buff[j])
    30.               {
    31.                  tamp=Fir_Buff[i];
    32.                  Fir_Buff[i]=Fir_Buff[j];
    33.                  Fir_Buff[j]= tamp;
    34.               }
    35.            }
    36.         }     
    37. /////////////////////////////////////////////////
    38.         num=0;
    39.         for(i=1;i<4;i++)
    40.            num += Fir_Buff[i];
    41.        FirADNum = num/3;
    42.        if( (FirADNum > 20) && (FirADNum < 300 ))    //检测到火焰
    43.       {
    44.          FirADNum=0;
    45.          if(++FirTim >= 2)    //连续2秒检测到
    46.          {
    47.              FirTim = 0;
    48.              FirSta = 1;
    49.              LED_Con(ON); //测试用
    50.          }
    51.        }else
    52.        {
    53.          //LED_Con(OFF); //测试用
    54.          FirTim = 0;
    55.          FirSta = 0;
    56.          if(FirADNum > FirNUM_ERR)
    57.              FirSta_ERR=1;
    58.          else
    59.              FirSta_ERR=0;
    60.          FirADNum=0;
    61.       }
    62.     }
    63. }
    复制代码
    回复

    使用道具 举报

    1

    主题

    1

    好友

    2679

    积分

    进士

    Rank: 5Rank: 5

  • TA的每日心情
    奋斗
    昨天 23:00
  • 签到天数: 644 天

    [LV.9]以坛为家II

    发表于 2016-6-8 22:58:52 |显示全部楼层
    写的好,参考和学习
    回复

    使用道具 举报

    42

    主题

    8

    好友

    3514

    积分

    超级版主

    Rank: 8Rank: 8

  • TA的每日心情
    奋斗
    2016-11-22 15:46
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    发表于 2016-6-9 09:24:42 |显示全部楼层
    不错的idea,没视频总觉得少了点啥
    回复

    使用道具 举报

    195

    主题

    3

    好友

    9648

    积分

    超级版主

    Rank: 8Rank: 8

    该用户从未签到

    发表于 2016-6-29 09:10:58 |显示全部楼层
    文章不错,将内容去经验频道一并发一下,可以有双重奖励哟http://jingyan.eeboard.com/
    回复

    使用道具 举报

    47

    主题

    0

    好友

    500

    积分

    举人

    Rank: 4

    该用户从未签到

    发表于 2016-6-29 09:12:34 |显示全部楼层
    多谢分享,学习
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /6 下一条


    手机版|爱板网 |网站地图  

    GMT+8, 2016-12-8 10:08 , Processed in 0.181393 second(s), 17 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部