【STM32开源项目】智能小区充电桩

目录

一、项目概述

二、实现功能

1、功能详解:

2、项目清单:

3、演示视频:

三、硬件介绍

PCB硬件设计:

四、程序设计

五、项目成品效果图

六、项目总结

七、包含资料



一、项目概述

本项目基于STM32F103C8T6单片机,设计了一款智能小区充电桩系统。系统通过光电红外传感器记录车辆进出数量,车辆出入时LED灯闪烁提醒。通过DHT11采集环境温湿度,MQ-7检测一氧化碳浓度,数据通过OLED显示屏实时显示,包括进出车辆个数、温湿度信息及一氧化碳浓度。当温湿度或危险气体超过阈值范围时,蜂鸣器报警。系统通过ESP8266 WiFi模块接入机智云平台,手机端App可远程监视环境信息数据并调节阈值。

二、实现功能

1、功能详解:

1)车辆进出数量记录:通过光电传感器采集并记录车辆出入个数。

2)LED灯指示:车辆出入时LED灯闪烁提醒。

3)环境采集:通过DHT11采集环境温湿度,MQ-7检测一氧化碳浓度。

4)数据显示:通过OLED显示屏显示进出车辆个数、温湿度信息及一氧化碳浓度。

5)报警功能:当温湿度或危险气体超过阈值范围时,蜂鸣器报警。

6)接入云平台:通过ESP8266 WiFi联网后,接入机智云平台。

7)App远程监控:手机端App可监视环境信息数据,并可调节阈值。

2、项目清单:

1)主控:STM32F103C8T6最小系统板

2)显示模块:OLED显示屏(4针IIC协议)

3)温湿度检测:DHT11温湿度传感器

4)车辆检测:光电红外传感器

5)气体检测:MQ-7一氧化碳传感器

6)报警模块:有源蜂鸣器

3、演示视频:

哔哩哔哩视频链接点击观看:https://www.bilibili.com/video/BV1QzNj6EEdi/?share_source=copy_web&vd_source=f4437c8e4429101e5bf1054c39d5474f

三、硬件介绍

PCB硬件设计:

四、程序设计

复制代码
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "key.h"
#include "stdio.h"
#include "control.h"
#include "oled.h"
#include "adc.h"
#include "dht11.h"
#include "IoData.h"
#include "timer.h"
#include "esp8266.h"
#include "aliyun.h"
//extern
//函数声明
void OLED_Show_OnePage();		//第一屏显示内容
void OLED_Show_TwoPage();		//第二屏显示内容
void net_page();
void get_all_sensor_data();		//  传感器采集的函数
void Key_event_handle(void);	//按键功能函数
void All_Pin_Init(void);		//系统初始化函数
void Sensor_Data_Handle();		//不同模式下控制效果




int temp_door = 35;	//温度阈值
int	hum_door =60;	//湿度阈值
int mq7_door = 3000;	//液化气阈值

int LN_door=0;		//进车辆
int OUT_door=0;		//出车辆


int auto_mode = 0;		//自动模式开关	0关闭	1开启


uint8_t keu_num 	= 0;		//按键
uint8_t page_num 	= 1;		//界面
uint8_t option 		= 0;		//选项	
uint8_t net_flag = 1;

	

int main(void)
{
	delay_init();		//系统延时函数初始化
	OLED_Init();		//屏幕初始化
	uart3_init(115200);	//串口3初始化,波特率9600
	uart1_init(115200);	//串口1初始化,波特率115200
	uart2_init(9600);	//串口2初始化,波特率9600
	KEY_Init();			//按键初始化
	DHT11_Init();		//DHT11温湿度初始化
	Adc_Init();			//烟雾,一氧化碳初始化
	IoData_Init();    	//火焰传感器、人体传感器
	Control_Init();		//声光报警,风扇、水泵初始化	
	Beep=0;
	TIME_Config();
	net_page();
	net_page();
	while(net_flag){
		keu_num = KEY_Scan(0);		//按键扫描赋值
		if(keu_num==1){net_flag=0;}
		else if(keu_num==2){net_flag=0;ESP8266_Init();}
	}
	OLED_Clear();
	while(1)
	{
//		delay_ms(100);
		if(Time_Period[0]>1000){
			Time_Period[0]=0;
			Mqtt_Publiash_Aliyun();
			get_all_sensor_data();
		}
		
		Key_event_handle();		//按键监测
		if(page_num == 1){		//屏幕更新
			OLED_Show_OnePage();
		}else if(page_num == 2){
			OLED_Show_TwoPage();
		}
     
		Sensor_Data_Handle();
	}
}
void Key_event_handle(void)		//(Key)按键 event(事情、逻辑)handle(处理)
{
	keu_num = KEY_Scan(0);		//按键=扫描赋值   
	switch(keu_num)
	{
		case 1:		//按键1按下
			if(page_num==1){	//如果页面1
				page_num=2;		//跳转页面2
				option=0;		//选择等于0
				OLED_Clear();	//屏幕清楚
			}else if(page_num==2){		//如果页面2
				page_num=1;				//跳转页面1
				option=0;				//选择等于0
				OLED_Clear();			//屏幕清楚
			}
			break;
	
		case 2:		//按键2按下
			if(page_num==2){	//如果页面2
				option++;		//选择增加
				if(option>3){	//如果选项大于3
					option=0;	//选项灯0  也就是不做任何选择
				}
			}
		   
			break;
		case 3:		//按键3按下
			if(page_num==1){	//页面等于1
				auto_mode=1;	//开启自动模式
			}else if(page_num==2){		//页面是2
				if(option==1)temp_door++;	//温度阈值+1
				else if(option==2)hum_door++;	//湿度阈值+1
				else if(option==3)mq7_door+=25;		//CO浓度+20
			}
				break;
		case 4:		//按键4按下
			if(page_num==1){	//页面等于1
				auto_mode=0;	//开启手动模式
			}else if(page_num==2){		//页面是2
				if(option==1)temp_door--;	//温度阈值-1
				else if(option==2)hum_door--;	//湿度阈值-1
				else if(option==3)mq7_door-=25;		//CO浓度-20
			}
	

			break;
	}
}



void get_all_sensor_data()   //获取所有传感器数据 
{		
	DHT11_Read_Data(&DHT_temp,&DHT_hum);	// 获取温度(temp),湿度数据(hum)  DHT代码传感器名称_代表连接 
	Get_MQ7_Value(&MQ7_Value);			//采集一氧化碳阈值
	
	Get_IN_Value(&IN_status);		//检测进状态(status)状态
	if(IN_status==1){			//如果进车辆状态=1
		if(IN_flag==0){			//如果进车辆标志位等于0 
			IN_flag = 1;		//标志位=1
			IN_num+=1;			//进车辆+1
		}
	}else{
		IN_flag = 0;			//标志位=0
	}
	
	
	Get_OUT_Value(&OUT_status);		//检测出状态
		if(OUT_status==1){			//如果离开量状态=1
			if(OUT_flag==0){		//如果离开标志位=0
				OUT_flag=1;			//标志位=1
				OUT_num+=1;			//离开量+1
			}
		}else {
			OUT_flag=0;				//标志位=0
		}
}



void Sensor_Data_Handle()			//传感器的采集数据的处理
{
	if(auto_mode==1){				//如果自动模式下

		if(DHT_temp>temp_door||DHT_hum>hum_door||MQ7_Value>mq7_door){	//温度>阈值或湿度>阈值或co>阈值
			Beep=1;		//蜂鸣器报警
		}else {
			Beep=0;		//不报警
		}
	}
	
	LN_LED = !IN_status;	//进车量=它状态
	OUT_LED = !OUT_status;		//离开量=它状态
}

// 温(0) 湿(1) 度(2)  (3) ℃(4) 光(5) 照(6) 强(7) 浓(8) 度(9) 进(10) 量(11) 出(12) 阈(13) 值(14) 手(15) 动(16) 自(17)
// 进(18) 入(19) 离(20) 开(21)
void OLED_Show_OnePage()
{
	OLED_ShowString(16*0,16*0,"T:",16,1);
	OLED_ShowNum(16*1,16*0,DHT_temp,2,16,1);		//显示温度数值
	OLED_ShowChinese(16*2,16*0,4,16,1);	//℃
	
	OLED_ShowString(16*4,16*0,"H:",16,1);
	OLED_ShowNum(16*5,16*0,DHT_hum,2,16,1);
	OLED_ShowString(16*6,16*0,"%RH",16,1);	//℃
	
	OLED_ShowChinese(16*0,16*1,18,16,1);			//进
	OLED_ShowChinese(16*1,16*1,19,16,1);			//入
	OLED_ShowString(16*2,16*1,":",16,1);	
	OLED_ShowNum(16*2+8,16*1,IN_num,3,16,1);
	
	OLED_ShowChinese(16*0,16*2,20,16,1);			//离
	OLED_ShowChinese(16*1,16*2,21,16,1);			//开
	OLED_ShowString(16*2,16*2,":",16,1);	
	OLED_ShowNum(16*2+8,16*2,OUT_num,3,16,1);
	
	OLED_ShowString(16*0,16*3,"CO",16,1);
	OLED_ShowChinese(16*1,16*3,8,16,1);			//浓
	OLED_ShowChinese(16*2,16*3,9,16,1);			//度
	OLED_ShowString(16*3,16*3,":",16,1);
	OLED_ShowNum(16*3+8,16*3,MQ7_Value,4,16,1);
	
	if(auto_mode==0){
        OLED_ShowChinese(16*7,16*2,15,16,1);	//手
        OLED_ShowChinese(16*7,16*3,16,16,1);	//动
	}else{
        OLED_ShowChinese(16*7,16*2,17,16,1);	//自
        OLED_ShowChinese(16*7,16*3,16,16,1);	//动
	}
	
	OLED_Refresh();
}

void OLED_Show_TwoPage()
{
	uint8_t a,b,c,d;
	if(option==1){a=0;b=1;c=1;d=1;}
	else if(option==2){a=1;b=0;c=1;d=1;}
	else if(option==3){a=1;b=1;c=0;d=1;}
	else if(option==4){a=1;b=1;c=1;d=0;}
	else{a=1;b=1;c=1;d=1;}

	OLED_ShowChinese(16*0,16*0,0,16,1);   //温
	OLED_ShowChinese(16*1,16*0,2,16,1);    //度
	OLED_ShowChinese(16*2,16*0,13,16,1);//阈
	OLED_ShowChinese(16*3,16*0,14,16,1);//值
	OLED_ShowString(16*4,16*0,":",16,1);
	OLED_ShowNum(16*4+8,16*0,temp_door,2,16,a);
	
	OLED_ShowChinese(16*0,16*1,1,16,1);//湿
	OLED_ShowChinese(16*1,16*1,2,16,1);    //度
	OLED_ShowChinese(16*2,16*1,13,16,1);//阈
	OLED_ShowChinese(16*3,16*1,14,16,1);//值
	OLED_ShowChar(16*4,16*1,':',16,1);//字符
	OLED_ShowNum(16*4+8,16*1,hum_door,3,16,b);//    数值   
	
	OLED_ShowString(16*0,16*2,"CO",16,1); // 二氧化碳 
	OLED_ShowChinese(16*1,16*2,13,16,1);//阈
	OLED_ShowChinese(16*2,16*2,14,16,1);//值
	OLED_ShowChar(16*3,16*2,':',16,1); // 字符
	OLED_ShowNum(16*3+8,16*2,mq7_door,4,16,c); //CO阈值
	
	OLED_Refresh();
}
void net_page()
	{

	uint8_t a,b,c,d,i;
	if(option==1){a=0;b=1;c=1;d=1;}
	else if(option==2){a=1;b=0;c=1;d=1;}
	else if(option==3){a=1;b=1;c=0;d=1;}
	else {a=1;b=1;c=1;d=1;}
	
	i = 22;
	OLED_ShowChinese(16*2,16,i,16,1);			//	"是"
	OLED_ShowChinese(16*3,16,i+1,16,1);			//	"否"
	OLED_ShowChinese(16*4,16,i+2,16,1);			//	"配"
	OLED_ShowChinese(16*5,16,i+3,16,1);			//	"网"
	OLED_ShowChar(16*6,16,'?',16,1);				//	":"
	
	OLED_ShowString(16*0,32,"KEY1        KEY2",16,1);
	OLED_ShowChinese(16*0,48,i+4,16,1);		//	"跳"
	OLED_ShowChinese(16*1,48,i+5,16,1);		//	"过"
	
	OLED_ShowChinese(16*6,48,i+6,16,1);		//	"确"
	OLED_ShowChinese(16*7,48,i+7,16,1);		//	"认"
	
	OLED_Refresh();
}

五、项目成品效果图

六、项目总结

本项目成功实现了车辆进出数量记录、环境温湿度及一氧化碳浓度监测、超限报警和远程监控功能。系统运行稳定,各模块协同良好,具备较强的实用性和扩展性,适用于智能小区及物联网教学实践。

七、包含资料

本资料免费分享,获取全套资料请看主页,并将告诉助手需要资料的项目编号,助手收到消息后,会发送资料。文章若对你有所帮助,期待点赞收藏,后续会持续分享各类单片机实战案例。
内容仅作为学习参考,有任何不妥之处,欢迎大家一起探讨!

资料获取:查看主页介绍"充哥单片机设计

以上归充哥单片机设计工作室所有,侵权盗图抄袭必究法律责任!

相关推荐
嵌入式-老费1 小时前
esp32开发与应用(如何解决SoC冷启动的问题)
单片机·嵌入式硬件
一 乐2 小时前
养老院管理系统|基于springboot + vue养老院管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕业设计
充哥单片机设计3 小时前
【STM32开源项目】智能语音台灯
stm32·单片机·嵌入式硬件·毕业设计·单片机设计·智能语音台灯
EatFan3 小时前
全栈自造 Status Deck(四):硬件终于到了,从点亮屏幕到跑通第一个 Demo
单片机·物联网·esp32
sunoo-2294 小时前
【嵌入式裸机开发Day04】i.MX6ULL 蜂鸣器驱动详解:从引脚地址查找到代码实现全流程
arm开发·单片机·嵌入式硬件·学习·串口·裸机
Brilliantwxx5 小时前
【STM32】 SPI阻塞式通信与HAL源码 (源码分析)
stm32·单片机·嵌入式硬件
Doraemomo5 小时前
IMX6ULL裸机开发——PWM
arm开发·嵌入式硬件·imx6ull
老当益壮梁奶奶6 小时前
ARM汇编学习笔记(五):从按键轮询到 GIC 中断控制器(ARM Cortex-A7 )
arm开发·笔记·单片机·嵌入式硬件
WWJA王文举6 小时前
Bootloader、App 和升级分区之间是什么关系?
stm32·freertos·嵌入式开发·在线升级