目录
一、项目概述
本项目基于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();
}
五、项目成品效果图

六、项目总结
本项目成功实现了车辆进出数量记录、环境温湿度及一氧化碳浓度监测、超限报警和远程监控功能。系统运行稳定,各模块协同良好,具备较强的实用性和扩展性,适用于智能小区及物联网教学实践。
七、包含资料
本资料免费分享,获取全套资料请看主页,并将告诉助手需要资料的项目编号,助手收到消息后,会发送资料。文章若对你有所帮助,期待点赞收藏,后续会持续分享各类单片机实战案例。
内容仅作为学习参考,有任何不妥之处,欢迎大家一起探讨!
资料获取:查看主页介绍"充哥单片机设计
以上归充哥单片机设计工作室所有,侵权盗图抄袭必究法律责任!