TA的每日心情 | 郁闷 2016-5-31 09:31 |
---|
签到天数: 1 天 连续签到: 1 天 [LV.1]初来乍到
|
一、方案名称
基于GD32F190的厨房用气管理(从机模块)
二、设计思路
1、利用热电偶传感器采集天然气燃烧时的火焰温度,一般天然气燃烧时的温度为600度——850度之间。考虑到天然气质量可能造成燃烧温度稍低,认为采集到的温度大于500度,则有火焰燃烧。
2、利用气流传感器检测天然气管道中是否有天然气流动。
3、利用2.4G无线模块将 状态上传到主机,和接收主机下发的指令。
三、完成功能
当我们正常使用燃气时,燃气管道内有天然气流动,炉灶上有火焰燃烧,这时我们可以用来煮饭或烧水。但是发生故障时:比如长时间烧水或煮饭,无人看管,导致沸水溢出,将火焰浇灭,致使天然气泄漏; 天然气管道老化,致使天然气泄漏。这时通过检测是否有天然气流动和炉灶上是否有火焰燃烧来判断是否有故障发生,当有故障发生时驱动电动阀门切断天然气,并将故障上发给主机,报警。
可以定时用气,在主机上设置时间,主机将命令下发,时间到达后,切断天然气。
四、框架如下
框架图
实物图(从机)
实物图(从机)
安装于煤气灶上
安装于煤气灶
- /********************************************************************************
- *函 数 名: Relay_Switch()
- *功能说明: 电磁阀开关
- *形 参:0---关阀,1---开阀,
- *返 回 值: 无
- *说明 :若阀门新的状态与旧的状态不一样,则执行动作,并检测阀门反馈的位置信号
- **** 若15s内阀门仍没有到达极限位置,则关闭阀门,认为阀门故障
- ********************************************************************************/
- #define Value_Con_on(x) (x? GPIO_SetBits(GPIOC,GPIO_PIN_8):GPIO_ResetBits(GPIOC,GPIO_PIN_8))//开阀
- #define Value_Con_off(x) (x? GPIO_SetBits(GPIOC,GPIO_PIN_9):GPIO_ResetBits(GPIOC,GPIO_PIN_9))//开阀
- void Relay_Switch(void)
- {
- /////////////////////////////////////////////////水阀控制////////////////////////////
- if( Relay_Old_Sta != Relay_State)
- {
- if((Relay_State & 0x01) == 0x01)
- {
- Value_Con_off(OFF);
- Delay_100us(1);
- Value_Con_on(ON);
- Relay_kongzhi=1;//水阀控制标志,0不动作 1开阀 2关阀
- Relay_kongzhi_time=0;
- }else
- {
- Value_Con_on(OFF);
- Delay_100us(1);
- Value_Con_off(ON);
- Relay_kongzhi=2;//水阀控制标志,0不动作 1开阀 2关阀
- Relay_kongzhi_time=0;
- }
- Relay_Old_Sta = Relay_State;
- WriteByte(Relay_Sta_Addr,Relay_State);
- }
- ////////////////////////////////////// 水阀 动作 状态 检测 ///////////////////////////
- if(Relay_kongzhi != 0)
- {
- Relay_kongzhi_time++; //气阀控制时间
- if(Relay_kongzhi_time == 400 ) //气阀控制时间 50ms一次 20s
- {
- Relay_kongzhi_time=0; //气阀控制时间清零
- Relay_kongzhi=0; //气阀控制标志,0不动作 1开阀 2关阀
- // Relay_kongzhi_ERR=1;//气阀控制状态 0阀无故障 1阀有故障
- }
- }else if(Relay_kongzhi == 0) //气阀控制标志,0不动作 1开阀 2关阀
- {
- Value_Con_on(OFF);
- Delay_100us(1);
- Value_Con_off(OFF);
- }
- }
复制代码- /********************************************************************************
- *函 数 名: Air_Detec
- *功能说明: 气流检测
- *形 参:
- *返 回 值: 无
- *说明 :
- ********************************************************************************/
- u8 Air_Flow_State=0;
- u8 AirTim = 0;
- u8 Air_0_time=0;
- u8 Fir_State=0;
- void Air_Detec(void)
- {
- //主机下发火焰状态
- if( Air_Flow_Read() ) //读取气体状态 1为有气体
- //if( 1 )
- {
- Air_Flow_State=1; //有气体 气体流动标志为 1
-
- if(Fir_State==0) //若无火焰(则开始漏气计时);若10S内仍没火焰,则认为漏气
- AirTim++; //火焰状态 ,主机下发
- else
- AirTim = 0; //有火焰 ,漏气计时清零
-
- Air_0_time=0; //无气体流动时间
- }else
- {
- if(++Air_0_time>=2) //连续两次无气体流动,认为无气体
- {
- Air_0_time = 0; //无气体流动时间清零
- AirTim = 0; //漏气时间清零
- Air_Flow_State=0;//气体流动标志为 0 无气体
- }
- }
-
- if( (Air_Flow_State==1) && (Fir_State==0) && (AirTim>=100) )//有气体流动 并且连续10S内无火焰
- { //则开始报警
- Relay_State = 0x02;//阀状态,主动关阀
- Air_Flow_State=0x01;//微流量传感器状态
- LED_Con(ON);
- AirTim = 0;
- }
-
- }
复制代码- /*2.4G初始化*/
- void L01_Init( void )
- {
- INT8U addr[5] = {INIT_ADDR};
- addr[0]=0x01;
- addr[1]=0x01;
- addr[2]=191;
- addr[3]=92;
- addr[4]=68;
- L01_CE_HIGH( ); //CE = 1
- L01_ClearIRQ( IRQ_ALL );
- #if DYNAMIC_PACKET == 1
- //dynamic payload length
- L01_WriteSingleReg( L01REG_DYNPD, ( 1<<0 ) );//Enable pipe 0 dynamic payload length
- L01_WriteSingleReg( L01REG_FEATRUE, 0x07 );
- L01_ReadSingleReg( L01REG_DYNPD );
- L01_ReadSingleReg( L01REG_FEATRUE );
- #elif DYNAMIC_PACKET == 0
- //Fixed packet length
- L01_WriteSingleReg( L01REG_RX_PW_P0, FIXED_PACKET_LEN );
- #endif//DYNAMIC_PACKET
- L01_WriteSingleReg( L01REG_CONFIG, /*( 1<<MASK_RX_DR ) |*///receive interrupt
- ( 1<<EN_CRC ) | //Enable CRC, 1 byte
- ( 1<<PWR_UP ) ); //Power up the device
-
- // L01_WriteSingleReg( L01REG_EN_AA, ( 1<<ENAA_P0 ) ); //Auto ack in pipe 0
- L01_WriteSingleReg( L01REG_EN_AA, 0x00 ); //Auto ack in pipe 0
-
- L01_WriteSingleReg( L01REG_EN_RXADDR, ( 1<<ERX_P0 ) );//Enable pipe 0 receive
- L01_WriteSingleReg( L01REG_SETUP_AW, AW_5BYTES ); //Address width : 5Byte
-
- // L01_WriteSingleReg( L01REG_RETR, ARD_4000US |
- // ( REPEAT_CNT & 0x0F ) ); //repeat wait : 250us
- L01_WriteSingleReg( L01REG_RETR, ARD_4000US |
- ( REPEAT_CNT & 0x03 ) ); //repeat wait : 250us
-
- L01_WriteSingleReg( L01REG_RF_CH, 60 ); //Initial channel
- L01_WriteSingleReg( L01REG_RF_SETUP, 0x26 );
- L01_SetTXAddr( &addr[0], 5 ); //Set TX address
- L01_SetRXAddr( 0, &addr[0], 5 ); //Set RX address
- }
- /*无线通讯数据处理*/
- void Modbus_dispose(void)
- {
- u8 i;
- TX_Buff[0] = Module_NUM;
- TX_Buff[1] = Modbus_Function;
- switch(Modbus_Function)
- {
- case 0x03: //主机下发配置信息,
- {
- // Water_Num = RX_Buff[4];
- // WriteByte(Water_Lou_Addr,Water_Num); //记录水流瞬时流量值
- }break;
- case 0x04: //主机下发动作,本模块用
- {
- i = RX_Buff[3]; //气阀的控制
- if(i==0x00)
- {
- Relay_State = 0x00;
- }
- else
- {
- Relay_State = 0x01;
- Air_Flow_State=0x01;//微流量传感器状态
- }
- TX_Buff[2] = 0x02;
-
- TX_Buff[3] = Relay_State;
- // TX_Buff[3] = 0x0;
- TX_Buff[4] = 0x00;
- crcdat = getCRC16(TX_Buff,Modbus_Buff_Len - 2);//前5个字节校验
- TX_Buff[5] = crcdat & 0xff;
- TX_Buff[6] = (crcdat >> 8) & 0xff;
- }break;
- case 0x05: //主机索要本模块状态
- {
- if( (i&0x02) != 0 )
- Relay_State=0x00;
-
- TX_Buff[2] = 0; //子功能码
- TX_Buff[3] = Air_Flow_State;//微流量传感器状态
- TX_Buff[4] = Relay_State; //电磁阀状态
- // TX_Buff[3] = 0;//微流量传感器状态
- // TX_Buff[4] = 1; //电磁阀状态
- crcdat = getCRC16(TX_Buff,Modbus_Buff_Len - 2);//前5个字节校验
- TX_Buff[5] = crcdat & 0xff;
- TX_Buff[6] = (crcdat >> 8) & 0xff;
- }break;
- case 0x06: //主机下发动作,本模块未用
- {
- ;
- }break;
- }
- }
复制代码 |
|