“我们不做一锤子买卖,只做技术成长的长期伙伴!”
目录
一、视频展示
基于单片机的智能充电桩控制系统的设计 -视频分享
二、项目简介
题目:基于单片机的智能充电桩控制系统的设计
主控: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");
}
}
}
六、资料分享
点击即可查看当前资料分享。