单片机设计基于STM32的燃气消费控制系统设计

概要

  本文主要是基于STM32微控制器为控制核心,以RC522射频模块和IC卡作为燃气计费的载体。该系统通过气体流量传感器实时监测燃气流量信息,把得到的数据传给微控制器,微控制器对气体流速积分运算得到的燃气量,然后根据燃气单价换算成金额后,更新IC卡内余额。并在OLED屏实时显示用户的余额信息。当余额低于阈值时,提示用户IC卡充值。当可用额度为零时,关断继电器,关闭燃气的供应,实现对燃气消费的自动控制。
经过调试后,系统可以对燃气消费量进行扣费,以及IC卡充值。并可以实时显示用户消费信息,同时可以根据卡内余额控制燃气关断和提醒用户提前充值。

关键字: STM32;燃气消费;流量计;RC522射频模块;OLED屏

一、本设计研究的内容和主要工作

  本设计研究的主要内容是基于STM32微控制器和IC卡实现对燃气消费系统的控制,实现对燃气消费系统的安全可靠,方便快捷控制。
  本设计的主要工作为:
  首先,查阅相关文献资料,了解燃气消费系统的研究背景和意义及国内外现状;
  其次,了解燃气消费系统的运行模式,确定需要控制的系统,明确相关生产规范,初步分析并设计子系统;
  再次,了解相关硬件并选定合适的系列,实现各个模块与微控制的焊接与连接,然后,根据逻辑顺序设计程序流程图和程序框架,熟练掌握嵌入式的编程方法,设计控制程序,完成相应的功能,然后进行系统调试工作。

二、总体方案设计

2.1 系统设计要求

  以燃气消费系统控制为对象,采用合适的嵌入式硬件和软件系统,设计并实现对燃气消费的自动控制。实现燃气流量的计费:并结合燃气单位价格计算燃价格,再通过读卡设备更新IC卡中的金额;流量控制:从读卡器中获得用户的插卡信息及IC卡内的金额信息,以判断是否开启或关闭控制阀门以及提醒用户充值后继续使用;信息提示:通过显示设备将IC卡的余额、燃气表状态及其他状态信息通过显示设备显示给用户,余额不足提醒用户充值。

2.2 方案论证

方案一:采用51单片机作为主控制芯片,51单片机结构经典、总线完善,而且具有位操作系统,操作起来也方便。对于轻量的控制系统来说,51单片机也是很好的选择。但是51单片机在运行速度方面相对较慢,外设资源较少,芯片保护机制不好,对于本设计的运行速度和后期系统升级都存在限制。
方案二:选择STM32F1系列处理器作为主控芯片,该系列单片机内核频率相对较高,运行内存和FLASH充足,运行速度快。而且外设资源丰富,且具备常用通信总线。可以完成本设计控制,而且方便后期系统升级。
方案三: 选用STM32F4系列芯片,该系列芯片属于高端处理器,系统频率高,运行内存大,性能强大,而且加入DSP图像处理和浮点型运算。但是本设计对于图像处理要求不高,而且这款芯片价格相对F1系列比较昂贵。
所以综合上诉三种方案,基于本设计对控制器的要求,从控制器处理性能、后期的系统升级、以及对芯片价格三个方面的综合考虑。选择STM32F1系列芯片作为本设计的主控芯片。

2.3 总体方案

  本设计采用STM32F103C8T6主控芯片对数据进行采集处理,通过CFA100流量检测燃气的流速,CFA100流量计的信号是模拟信号,单片机通过内部16位ADC,进行模数转换,然后计算出燃气的使用量,结合燃气单价,算出总消费额后,对M1的射频卡进行扣费。
  RC522与STM32主控芯片通过SPI进行通信,经过寻卡→防冲突→选卡→读取IC卡中的金额,根据用户使用的燃气流量计算出消费金额后扣除IC卡中的费用,当余额减到设定阈值时,蜂鸣器会报警一段时间,提醒用户燃气充值。当卡内金额减到0.0时,通过IO口控制外部继电器模块关断电磁阀切断燃气供应,并提醒用户IC卡充值。
  12864OLED屏与STM32主控芯片采用SPI通信,显示模块主要显示3个界面的芯片:一是用户没有插入IC卡时,消费控制系统的主界面,提示用户插卡消费燃气;二是用户插入IC后,显示用户的基本信息、账户余额、以及燃气使用总量,方便用户实时知道自己的卡内余额和燃气使用量,方便用户提前充值,避免突然切断燃气给消费用户带来的不便;三是余额低于设定阈值时,显示余额不足,提示用户提前进行燃气充值;四是燃气消费额为0.0时,显示余额为0.0,提醒用户充值。五是充值界面,显示用户余额,以及充值金额信息。
  继电器通过IO和主控芯片进行通信,主要用于根据用户的卡内余额,打开或者关闭燃气管道电磁阀。无源蜂鸣器模块主要是给用户提示信息,如果用户余额不足,会提起给予报警,提示用户提前充值,以避免给用户带来不便。
  根据上述硬件组成,基于STM32的燃气消费控制系统总体框图如图2.1所示。
在这里插入图片描述

图2.1 系统总体框图

三、系统硬件设计

3.1 单片机系统电路设计

3.1.1 电源电路设计

   嵌入式设计系统电源电路的设计肯定是必不可少,本设计中采用USB 5V供电,经过ASM117-3.3V稳压芯片输出3.3V电压,3.3v电压STM32F103C8T6,12864OLED屏幕、继电器、LED灯、蜂鸣器、射频卡模块以及流量传感器CAF100提供工作电压。
   该系统中还提供了两个5V和两个3.3V的扩展供电模块,以方便连接其他外设。电源电路如图3.1所示。
在这里插入图片描述

图3.1 电源电路

四、软件设计

4.1 软件设计的总体思路

本系统设计的功能如下:
1.开机后正常运行界面,在OLED屏会显示本设计系统的名字,并且下方有提示用户插入IC卡的提示图片。当用户插入有效IC卡后系统进入IC卡计费界面,屏幕会显示用户的楼层后以及卡内余额信息。
2.充值功能:本设计采用按键对IC卡进行模拟充值操作,当按下按键1时,进入充值界面,每按下一次设置的为充值10元。当按下按键2时,退出充值页面。
3.燃气检测和IC卡扣费功能:通过燃气流量计CFA100和和STM32内部的ADC检测当前燃气的状态,如果有气体流动,根据气体流速计算出气体的体积,进行扣费。
4.关断功能:当读卡器检测不到IC卡,继电器断开,断开燃气通道电磁阀,断开燃气的供应。当检测到IC卡余额不足时,继电器同样断开。
5.报警提醒功能:当检测到IC卡的钱数小于阈值时,会在OLED屏幕余额显示界面下方显示余额不足的界面。提示用户进行充值。
软件整体设计流程图如图4.1所示。

在这里插入图片描述

图4.1 软件整体设计流程图

每部分外设调试完成之后,就可以把各个外设统一起来,实现整体功能,如图整个系统处于开机没有IC卡插入,系统和开机界面相同,显示系统名字,以及提示用户插卡消费的提示简图。燃气关断状态的实物图如图5.7所示。
在这里插入图片描述

图5.7 燃气关断状态系统实物图
当有效IC卡插入,金额充足,OLED屏显示住户楼层信息、账户余额、以及消费的总气体量。继电器闭合,指示灯亮起,打开燃气阀,供应燃气。燃气处于供应状态的实物图如图5.8所示。
在这里插入图片描述

图5.8 燃气处于供应状态的体统实物图
当有效IC卡插入,金额小于设定阈值10.0但大于0.0时,蜂鸣器会报警一小段时间,提示用户余额不足。OLED屏显示住户楼层信息、账户余额不足提醒、以及消费的总气体量。继电器依然闭合,指示灯亮起继续供应燃气。余额低于设定阈值时的实物图如图5.9所示。
在这里插入图片描述

图 5.9 余额低于设定阈值的实物图
当有效IC卡插入,金额为0.0时时,蜂鸣器会报警一段时间,提示用户余额为零请充值。OLED屏显示住户楼层信息、余额不足0.0、余额不足请充值提醒。继电器断开,继电器断开指示灯熄灭,关闭燃气供应。卡内余额为0.0时的实物图如图5.10所示。
在这里插入图片描述

图5.10 卡内余额为0.0时的实物图
当用户充值IC卡时,本设计采用按键充值,每次按下充值10.0元,充值界面依然显示用户楼层信息、账户余额,以及充值的金额。IC卡充值界面如图5.11所示。
在这里插入图片描述

图5.11 IC卡充值界面

主要函数

主函数程序:
#include "main.h"
#include "main.h"

char oled_ic_new_value[16] ;
char oled_increment[16];
extern float oled_read_value;
extern float ic_old_value;
char disply_read_value[16];
char oled_sum_gas[16];
char user_name[16] ;
char oled_add[16];
float add_money = 0;
u8 lst_10 = 0;
u8 increment = 0;
u8 ui_2 = 0;
u8 ui_1 = 1;
u8 ui_0 = 1;
u8 BEEP_flag = 0;
u8 ui_0_clear = 0;
u8 ui_1_clear = 0;
u8 ui_2_clear = 0;
u8 BEEP_once = 0;
u8 BEEP_two = 0;
u8 beep_three = 0;
u32 beep_count = 0;
u8 gas_read_flag = 0;
int Increment_ret = 0;
int decrement_ret = 0;
extern float sum_gas ;
int main()
{
   
	Delay_Init();			//滴答定时器初始化
	Led_Config();			//LED灯初始化
	USART1_Config(115200);	//串口初始化
	Adc_Config();
	KEY_Config();
	ADC1_DMAConfig();
	char KEY = 0;
	printf("串口初始化成功\r\n");
	OLED_Init();
	RFIDGPIO_Config();
	ply_Config();
	Beep_Config_TIM3_CH4(7200,3000,0);
	while(1)
	{
   
		

		if(timekey[0]>timekey[1])
		{
   
			switch(Get_KeysValue())//KEY
			{
   
				case KEY1_PUSH :
					if(ui_2_clear == 0)
					{
   
						ui_0_clear = 0;
						ui_1_clear = 0;
						ui_2_clear = 1;
						OLED_Clear_once(0,127,0,7);
					}
					if(ui_2 == 1)
					{
   
						increment = 1;
					}
					ui_0 = 0;
					ui_1 = 0;
					ui_2 = 1;
				break;
				case KEY2_PUSH :
					 ui_2 = 0;
				     ui_1 = 1;
					 ui_0 = 0;
					add_money = 0;
					OLED_Clear_once(0,127,0,7);
				
				break;
				default : break;	
			}
				
		  timekey[0] = 0;
		}
		if(timeply[0] > timeply[1])
		{
   
			if(IC_Read_float(4) == MI_OK) 
			{
   
				BEEP_once = 1;
			}	
				
			if(ic_no_card_count<2 && ply_flag_value == 1)  //成功寻到卡余额大于0
			{
   
				printf("ply_flag == 1\r\n");
				OPEN_PLY;
			}
			else if(ic_no_card_count >2 || ply_flag_value ==0)  //超过2次没有寻到卡,或者余额不大于0
			{
   
				printf("ply_flag == 0\r\n");
				CLOSE_PLY;
			}
			if(ic_no_card_count >2)  //没有读到卡
			{
   
				if(ui_0_clear == 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值