STM32项目分享:基于单片机的智能充电桩控制系统的设计

发布于:2025-08-17 ⋅ 阅读:(12) ⋅ 点赞:(0)

“我们不做一锤子买卖,只做技术成长的长期伙伴!”

目录

一、视频展示

二、项目简介

三、原理图设计

四、PCB硬件设计

五、程序设计

六、资料分享


一、视频展示

基于单片机的智能充电桩控制系统的设计 -视频分享

二、项目简介

题目:基于单片机的智能充电桩控制系统的设计
主控:STM32
显示:OLED显示屏
温湿度:dht11
MQ-2,火焰传感器
通信:蓝牙模块
电量计量模块:IM1253B
RC522刷卡计费消费
继电器控制充电开关
声光报警:LED+蜂鸣器
功能:
1、实时监测当前温湿度,烟雾浓度,火焰情况并显示在屏幕上。
2、可通过按键设置温度烟雾阈值和功率阈值,如果功率大于阈值时会触发关闭充电。
3、刷卡充电,再次刷卡则停止充电并结算
4、如果出现火情或者烟雾浓度过高则自动断电,停止充电,蜂鸣器警报。
5、计费可设置,根据用电量来计算。
6、卡片可充值,默认每次50。
7、手机连接蓝牙后可查看当前数据,修改阈值等操作。
 

三、原理图设计

四、PCB硬件设计

五、程序设计

#include "stm32f10x.h"                  // Device header
#include "delay.h"
#include "lcd.h"
#include "timer.h"
#include "IOput.h"
#include "usart.h"
#include "RC522.H"
#include "adc.h"
#include "processData.h"
#include "sim900a.h"
#include "dht11.h"
 #include <stdbool.h>


extern u8 receiving_flag; // 新增一个标志,用于标记是否开始接收数组
extern u16 buf[20],res,ress;
u8 mode,controlState,monney;
u16 money;

extern u8 resss;
void wifi()
 {
		if(resss==0x01)
		{
			resss=0;
			set_flag=1;
		}
		else if(resss=='b')
		{
			resss=0;
			add_flag=1;
		}
		else if(resss=='c')
		{
			resss=0;
			dec_flag=1;
		}
 }
 
void beep_1()
{
	BEEP=0;
	Delay_1ms(1000);
	Delay_1ms(1000);
	BEEP=1;
	Delay_1ms(1000);
	Delay_1ms(1000);
	
}
//extern u8 cou=1;
u8 mode,moneys=5,set=0,speed,ZL,distance,fault_flag=0,on_flage=0,off_flage,yw,max_fire=60,max_yw=60,max_wd=60,mode_flag=0;
u16 count=0,count1=0,count2,count3,count4,count5,count6,count7,dianya_max=280,gl_max=60;
extern u8 fault_flage;

u8 fire,send_flag1,send_flag,f;

bool open_flag;

char status;
unsigned char snr, read_buf[16],write_buf[16], TagType[2], SelectedSnr[4], DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

int main (void)
{
	delay_init();
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

	
	OLED_Init();
	delay_ms(1);
	OLED_Clear();
	
	

	
	uart_init(4800); // 串口初始化为4800
	Usart2_Init(9600);
	Adc_Init();
	input_init();
	output_init();
	
	PcdInit();
	PcdAntennaOff();
	PcdAntennaOn();
	PcdReset();
	M500PcdConfigISOType('A');
	TIM2_Int_Init(71,9999);
	read_data();
	DHT11_Init();
	
	TIM_Cmd(TIM2, DISABLE);
	money=0;
	while(1)
	{
		
		delay_ms(100);
		clear_data();
		delay_ms(100);
		Analysis_data();
		count3++;
		DHT11_Read_Data(&temp,&humi);
		yw= 100-Get_Adc_Average(0,10)*100/4096;
		fire= Get_Adc_Average(1,10)*100/4096;
		wifi();
		key_scan(1,1,1);
		time_count++;
		if(time_count>=100)
		{
			time_count=0;
			money++;
			if(money>=200)
				money=200;
			
		}
		if(set_flag==1 || resss=='a')
		{
			resss=0;
			set_flag=0;
			set++;	
			if(set>=4){set=0;}
		}
		if(set==0)
		{ 
			OLED_ShowCH(0,0,"   智能充电桩   ");
			OLED_ShowCH(64,2,"烟雾:");
			OLED_ShowCH(0,2,"火焰:");
			OLED_ShowCH(0,4,"温度:");
			OLED_ShowCH(64,4,"湿度:");
			OLED_ShowNum(40,2,yw,2,16);
			OLED_ShowNum(104,2,fire,2,16);
			OLED_ShowNum(40,4,temp,2,16);
			OLED_ShowNum(104,4,humi,2,16);
			OLED_ShowCH(0,6,"单价:");
			OLED_ShowNum(40,6,moneys,2,16);
			if(add_flag==1)
			{
				add_flag=0;
				set = 11;
				OLED_Clear();
			
			}
			if(dec_flag==1)
			{
				dec_flag=0;
				moneys++;
				if(moneys>=11)
					moneys=1;
			}
		}
		if(set==1)
		{
			OLED_ShowCH(0,0,"   智能充电桩   ");
			OLED_ShowCH(0,2,"请用RFID");
			OLED_ShowCH(0,4,"电桩状态:");
			OLED_ShowCH(0,6,"用时:");
			OLED_ShowNum(64,6,money,3,16);
			if(JDQ==0)
			{
				OLED_ShowCH(72,4,"开");
			}
			else
			{
				OLED_ShowCH(72,4,"关");
			}
			status = PcdRequest(REQ_ALL , TagType);  // 请求卡片
			
			if(!status)  // 如果请求成功
			{
				status = PcdAnticoll(SelectedSnr);  // 防冲突操作,获取唯一序列号(UID)
				if(!status)  // 如果防冲突操作成功
				{
					status=PcdSelect(SelectedSnr);  // 选择指定序列号的卡片
					if(!status)  // 如果选择卡片成功
					{
						snr = 1;  // 设置扇区号为1
						status = PcdAuthState(KEYA, (snr*4+3), DefaultKey, SelectedSnr);  // 使用密钥A对指定扇区进行验证
						if(!status)  // 如果验证成功
						{
							status = PcdRead((snr*4+0), read_buf);  // 从指定扇区的块0读取数据到缓冲区
							if(!status)  // 如果读取成功
							{
								WaitCardOff();  // 等待卡片离开感应区
								if(read_buf[0] == 0)  // 如果卡片状态为0
								{
									write_buf[0] = 1;
									
									while(1)
									{
										status = PcdRequest(REQ_ALL , TagType);  // 请求卡片
										if(!status)
										{
											status = PcdAnticoll(SelectedSnr);  // 防冲突操作
											if(!status)
											{
												status = PcdSelect(SelectedSnr);  // 选择卡片
												if(!status)
												{
													snr = 1;  // 设置扇区号为1
													status = PcdAuthState(KEYA, (snr*4+3), DefaultKey, SelectedSnr);  // 使用密钥A对指定扇区进行验证
													if(!status)
													{
														status = PcdWrite((snr*4+0), write_buf);  // 写入数据到指定扇区的块0
														if(!status)
														{
															WaitCardOff();  // 等待卡片
															break;
														}
													}
												}
											}
										}
									}
									BEEP = 0;
									delay_ms(100);
									BEEP = 1;
									delay_ms(100);
									BEEP = 0;
									delay_ms(100);
									BEEP = 1;
									delay_ms(100);
									OLED_Clear();
									JDQ=0;
									TIM_Cmd(TIM2, ENABLE); 
								
								}
								else if(read_buf[0] == 1)  // 如果卡片状态为1
								{
								
									if(money >= 200)
										money = 200;
									if(read_buf[7] >= moneys*money)  // 如果余额充足
									{
										money=moneys*money;
										monney=money;
										write_buf[0] = 0;
										write_buf[7] = read_buf[7] - money;
										while(1)
										{
											status = PcdRequest(REQ_ALL , TagType);  // 请求卡片
											if(!status)
											{
												status = PcdAnticoll(SelectedSnr);  // 防冲突操作
												if(!status)
												{
													status = PcdSelect(SelectedSnr);  // 选择卡片
													if(!status)
													{
														snr = 1;  // 设置扇区号为1
														status = PcdAuthState(KEYA, (snr*4+3), DefaultKey, SelectedSnr);  // 使用密钥A对指定扇区进行验证
														if(!status)
														{
															status = PcdWrite((snr*4+0), write_buf);  // 写入数据到指定扇区的块0
															if(!status)
															{
																WaitCardOff();  // 等待卡片
																break;
															}
														}
													}
												}
											}
										}
										BEEP = 0;
										delay_ms(100);
										BEEP = 1;
										delay_ms(100);
										BEEP = 0;
										delay_ms(100);
										BEEP = 1;
										delay_ms(100);
										OLED_Clear();
										JDQ=1;
										money=0;
										time_count=0;
										TIM_Cmd(TIM2, DISABLE);
										set = 9;
									}
									else
									{
										OLED_Clear();
										set = 10;
									}
								}
							}
						}
					}
				}
			}
			
		}
		if(set==11)
		{
			OLED_ShowCH(0,2,"充值50元,请刷卡");  // 显示充值提示
			while(1)
			{
				status = PcdRequest(REQ_ALL,TagType);  // 请求卡片
				if(!status)  // 如果请求成功
				{
					status = PcdAnticoll(SelectedSnr);  // 防冲突操作,获取唯一序列号(UID)
					if(!status)  // 如果防冲突操作成功
					{
						status = PcdSelect(SelectedSnr);  // 选择指定序列号的卡片
						if(!status)  // 如果选择卡片成功
						{
							snr = 1;  // 设置扇区号为1
							status = PcdAuthState(KEYA, (snr*4+3), DefaultKey, SelectedSnr);  // 使用密钥A对指定扇区进行验证
							if(!status)  // 如果验证成功
							{
								status = PcdRead((snr*4+0), read_buf);  // 从指定扇区的块0读取数据到缓冲区
								if(!status)  // 如果读取成功
								{
									WaitCardOff();  // 等待卡片离开感应区
									break;
								}
							}
						}
					}
				}
			}
			if(read_buf[7] >= 150)
				write_buf[7] = 200;
			else
				write_buf[7] = read_buf[7] + 50;
			while(1)
			{
				status = PcdRequest(REQ_ALL , TagType);  // 请求卡片
				if(!status)
				{
					status = PcdAnticoll(SelectedSnr);  // 防冲突操作
					if(!status)
					{
						status = PcdSelect(SelectedSnr);  // 选择卡片
						if(!status)
						{
							snr = 1;  // 设置扇区号为1
							status = PcdAuthState(KEYA, (snr*4+3), DefaultKey, SelectedSnr);  // 使用密钥A对指定扇区进行验证
							if(!status)
							{
								status = PcdWrite((snr*4+0), write_buf);  // 写入数据到指定扇区的块0
								if(!status)
								{
									WaitCardOff();  // 等待卡片
									break;
								}
							}
						}
					}
				}
			}
			BEEP = 0;
			delay_ms(100);
			BEEP = 1;
			delay_ms(100);
			BEEP = 0;
			delay_ms(100);
			BEEP = 1;
			delay_ms(100);
			
			while(1)
			{
				count4++;
				OLED_ShowCH(0,2,"充值成功余额:");  // 显示充值成功余额
				OLED_ShowNum(104,2,write_buf[7],3,16);  // 显示余额数值
				if(count4 >= 30)
				{
					count4=0;
					OLED_Clear();
					set = 1;
					break;
				}
			}
		}
		if(set==10)
		{
			count5++;
			OLED_ShowCH(0,2,"余额不足,请充值");  // 显示余额不足
			
			if(count5 >= 30)
			{
				count5 = 0;
				OLED_Clear();
				set = 1;
			}
		}
		if(set==9)
		{
			count6++;
			OLED_ShowCH(0,2,"用电缴费:");  // 
			OLED_ShowNum(72,2,monney,3,16);  
			OLED_ShowCH(0,4,"余额");  // 显示余额
			OLED_ShowNum(40,4,write_buf[7],2,16);  // 显示余额数值
			if(count6 >= 30)
			{
				count6 = 0;
				OLED_Clear();
				set = 1;
			}
			
		}
		if(set==8)
		{
			count7++;
			OLED_ShowCH(0,2,"开始充电");  
			if(count7 >= 30)
			{
				count7 = 0;
				OLED_Clear();
				set = 1;
			}
			
		}
		if(set==3)
		{
			OLED_ShowCH(0,0," 最大功率 ");
			OLED_ShowCH(0,2,"MAX功率:");
			OLED_ShowNum(40,4,gl_max,3,16);
			OLED_ShowCH(0,6,"功率:");
			OLED_ShowNum(40,6,Power_data,3,16);
			if(add_flag==1)
			{
				add_flag=0;
				gl_max++;
			}
			if(dec_flag==1)
			{
				dec_flag=0;
				gl_max--;
			}
			if(gl_max>=100 || gl_max<=0)
				gl_max=0;
		}
		if(set==2)
		{
			OLED_ShowCH(0,0," 最大烟雾 ");
			OLED_ShowCH(0,2,"烟雾:");
			OLED_ShowNum(40,2,max_yw,2,16);
			if(add_flag==1)
			{
				add_flag=0;
				max_yw++;
			}
			if(dec_flag==1)
			{
				dec_flag=0;
				max_yw--;
			}
			if(max_yw>=100 || max_yw<=0)
				max_yw=0;
		}

		
		if(Power_data>=gl_max || yw >= max_yw || fire>=50)
		{
			JDQ=1;
			beep_1();
		}
			

		
		if(count3>=30)
		{
			count3 = 0;
			UsartPrintf(USART2,"temp:%d\r\n",temp);
			UsartPrintf(USART2,"humi:%d\r\n",humi);
			UsartPrintf(USART2,"fire:%d\r\n",yw);
			UsartPrintf(USART2,"MQ-2:%d\r\n",fire);
			UsartPrintf(USART2,"Power_data:%d\r\n",Power_data);
			UsartPrintf(USART2,"\r\n\r\n");
		}

				
	}
}

六、资料分享

点击即可查看当前资料分享。


网站公告

今日签到

点亮在社区的每一天
去签到