智能安全驾驶检测
Binary Tree小队
张浩然 谢文倩 杜晓霞
智能安全驾驶检测系统
队员:张浩然 谢文倩 杜晓霞
摘要
现代社会频频发生车祸事件,为了减少各类车祸事故的发生,我们设计了一个智能安全驾驶检测系统,在汽车准备行驶或行驶过程中随时获取驾驶员状态,收集数据,进行系统的运算与分析,判别驾驶行为,实时监测驾驶员的驾驶行为以及驾车环境,从而预先让驾驶员察觉到可能发生的危险,有效增加汽车驾驶的安全性和舒适性。该系统可以为车主的身体健康和安全驾驶行为提供监测保护。
******第一部分 ****** 设计概述
1.1设计目的
根据调查显示,高达70%的交通事故都起因于驾驶员酒驾或驾驶员的疲劳驾驶。由于驾驶员自身操作原因所引发的事故高达 95%,剩余5%才是由于道路情况、恶劣天气或车辆故障等外部原因。因此,研发智能安全驾驶检测系统作为驾驶员的安全管家,对驾驶员行为进行监控,收集数据进行存储分析,实时显示重要空气指标,并对潜在的危险进行预测和警示,能够有效减少因驾驶员的疏忽大意或不良驾驶习惯引发的交通事故,具有十分重要的应用价值和现实意义。
1.2应用领域
(1)交通驾驶领域:智能安全驾驶系统是针对驾驶安全开发的。智能安全驾驶系统不仅突破了传统车载检测的时空限制,提高了驾驶员对自身安全了解渠道,而且降低了由于驾驶员而引起的交通事故的发生率,提高了城市行车道路的安全性,它将是是未来智能生活的重要组成部分。此外,智能安全驾驶系统的推广使用,将提升人们对驾驶安全的重视,让更多的人重视起每一次驾驶的安全。这样安全驾驶常识的普及,对提升公民素质,从根源上减少疏忽导致的交通事故起到了关键性的作用。这不仅有助于保护驾驶者及乘客额人身安全,也间接保护了行人的出行安全,促进了社会治安以及城市管理
(2)家庭、医疗、教育、工业等领域:疲劳检测系统可用于任何需要人像识别、疲劳和健康状况检测领域,可预防许多事故的发生。
1.3主要技术特点
- 传感器与单片机通信:各类传感器与单片机的串口连接,将采集到的数据通过串口传输至单片机。
- 运用esp8266WiFi模块进行数据传输:摄像头采集的数据通esp8266传输到手机终端,并将终端图像分析结果传输至单片机。
- 运用复杂的图像分析程序:终端程序通过识别分析摄像头拍摄的画面,判断驾驶员是否为疲劳驾驶并返回判断结果。
- 自动调节光线强弱:调用单片机的AP3216C环境光传感器模块进行环境光值的读取和判断,并调节光线强度。
- 实时监测并显示温湿度:调用单片机的AHT10温湿度传感器实时监测空气的温湿度并在LED屏显示。
- 蜂鸣器信号输出:单片机与蜂鸣器连接,使能驱动后可进行鸣音报警。
- LED屏提示重要信息:当监测到驾驶员有不同的危险驾驶行为,LED屏会显示对应的危驾行为类型,用以辅助蜂鸣器提醒驾驶员。
1.4关键性能指标
- 实用性强:随着车辆使用人数的增多,智能安全驾驶系统有很强的实用性,为驾驶员的安全出行提供很好的监测保护。
- 受众广泛:不同年龄阶段的人群、不同的车辆都可以使用智能安全驾驶系统。
- 便携性强;安全驾驶系统硬件封装后体积小,方便安装到不同大小的车辆。
- 实时性:摄像头的拍摄是实时的,数据传输和智能处理算法总延时<1s,使用时不会产生滞后感,对使用者提供及时的警示。
- 功能强大:可以同时监测多种气体和多项空气指标,具备摄像报警功能,实现一物多用。
1.5主要创新点
- 除了常见的酒精监测系统,还添加了二氧化碳浓度监测系统,用以监测与二氧化碳含量有关的异常情况和车内空气质量。
- 添加了温湿度传感器检测车内的温度和湿度,并在LED屏幕上实时显示所测数据,此数据还可辅助判断驾驶员是否为疲劳驾驶。
- 通过环境光传感器AP3216C监测驾驶员视野内的光线强弱并自动调节,省去了实际驾驶时驾驶员频繁调节远近光灯的烦恼,解决夜间驾驶时的光照问题。
- 实时监控车内情况,识别驾驶员使用手机、未系安全带、疲劳、等违规行为,及时预警,降低事故发生率,保障人身财产安全。针对每类属性行为,经人像分割图像分析返回分析结果,使蜂鸣器鸣音预警。
******第二部分 ****** 系统组成及功能说明
2.1整体介绍
该系统主要通过外接酒精传感器和二氧化碳传感器来实时监测车内的酒精和二氧化碳浓度,并通过蜂鸣器鸣音警示,同时还通过CH32V307芯片内部的环境光传感器来调节光线强弱,以及温湿度传感器检测车内的温湿度并显示在LED屏;此外,还通过摄像头、WiFi模块进行图片数据采集和传输,检测到疲劳驾驶时通过蜂鸣器鸣叫预警。
图2-1 整体功能一览
图2-2开发板结构图
图2-3系统总体框架图
图2-4系统实际连接图
2.2各模块介绍
2.2.1酒精/二氧化碳传感器模块——酒驾、其余意外状况监测功能
(a)实现功能
MQ-3酒精传感器和MG-812二氧化碳传感器都具有双路信号输出(模拟量输出及TTL电平输出),TTL输出有效信号为低电平,当输出低电平时信号灯亮,可直接接单片机。
当测量的酒精浓度大于设定浓度时,酒精传感器 MQ-3的指示灯变亮,单片机IO口输出低电平,通过单片机使能蜂鸣器鸣音报警。
当测量的酒精浓度小于设定浓度时,酒精传感器 MQ-3的指示灯熄灭,单片机IO口输出高电平,蜂鸣器不鸣音。
当测量的二氧化碳浓度大于设定浓度时,二氧化碳传感器MG-812的指示灯变亮,单片机IO口输出低电平,通过单片机使能蜂鸣器鸣音报警。
当测量的二氧化碳浓度小于设定浓度时,二氧化碳传感器MG-812的指示灯熄灭,单片机IO口输出高电平,蜂鸣器不鸣音。
图2-5 MQ-3酒精传感器模块 图2-6 MG-812二氧化碳传感器模块
(b)实际应用
将传感器与单片机组装完成后放置车内,监测车内酒精浓度的变化。如果驾驶员饮酒后驾车,车内酒精浓度则会上升。当车内的酒精浓度超过预设值之后,蜂鸣器就会鸣音报警,可以有效警示驾驶员停止酒后驾驶行为。
同理,当车内空气浑浊或者有其他异常情况时,二氧化碳浓度超过预设值之后,蜂鸣器就会鸣音报警,可以提示驾驶员停车检查车内情况,或开窗透气以防疲劳驾驶。
(c)程序实现:
2.2.2环境光传感器AP3216C——光线强度监测功能
(a)实现功能
AP3216C内部包含数字环境光传感器(ALS)、接近传感器(PS)和-一个红外LED(IR)。带有IIC接口,支持高达400Khz通信速率,内置温度补偿电路支持多种工作模式(ALS、PS+IR、 ALS+PS+IR 等)。
环境光值读取程序过程:先向0x00地址,写入0x03,ALS+PS+IR激活,然后等待12.5ms,开始读取0XOC地址的ALS低位值,两次读取需要大概2-4us的等待时间,然后读取0XOD地址的ALS高位值,然后返回到等待12.5ms,继续循环下去。当环境光值超过或低于设定值时,自动调节光值回到设定范围内。
图2-7环境光传感器结构
表
2-1AP3216C相关寄存器配置
(b)实际应用
用AP3216环境光传感器控制车辆的照明系统,驾驶时,当驾驶员视野内光线过亮或过暗时,自动调节灯光亮度,以保证驾驶员视野清晰,避免因视线模糊造成车祸。
(c)程序实现:
*2.2.3 温湿度传感器AHT10*——温湿度监测与显示****
(a)实现功能
AHT10温湿度传感器内置一个电容式感湿元件和一个高性能CMOS 微处理器相连接,采用标准IIC通信方式,支持较宽的工作电源电压范围,直接输出经温度补偿后的湿度、温度等信息,用户无需要对湿度进行温度补偿,便可得到准确的温湿度信息。
图2-8温湿度传感器AHT10内部结构
当传感器启动通信后,先发送命令 0xE1,使输出数据进入校准状态。在 0xE1 发送后需要等待不少于300ms 读取温湿度数据,而用于获取数据的指令是 0xAC。采集温湿度命令如下表:
表2-2
数据采集完毕后通过以下转换公式即可将温度和湿度显示在LED屏。
相对湿度RH都可以根据SDA输出的相对湿度信号SRH通过如下公式计算获得:
温度T都可以通过将温度输出信号代入到下面的公式计算得到(结果以温度℃表示):
(b)实际应用:
将系统组装完成后放置车内,监测车内温度与湿度的变化。每隔5秒左右会自动读取一次数据,并显示在屏幕上。实时向驾驶员显示车内的温度与湿度,以及辅助对驾驶者进行疲劳驾驶指数的判断。
(c)程序实现;
2.2.4 OV2640、esp8266模块——疲劳驾驶检测****
(a)实现功能
①利用OV2640摄像头实时拍摄驾驶员行为,通过esp8266WiFi模块上传图像到手机,手机发送数据到网页终端,终端反馈检测结果到开发板,当检测到驾驶员疲劳时,在LED屏幕显示具体的疲劳驾驶行为,如“cellphone,dangerous!”,且蜂鸣器鸣音警示;若未检测到疲劳驾驶,则在LED屏显示“SAFE”字样,驾驶员可正常驾驶。
图2-9 OV2640摄像头 图2-10 ESP82866模块
②疲劳驾驶行为图像分析
这个部分主要为云端网页终端对图像的识别和分析。首先,识别人体的轮廓范围,与背景进行分离。识别正常人像图片后,返回分割后的二值结果图、灰度图、透明背景的人像图(JPEG格式),并输出画面中的人数、人体坐标信息,可基于此对图片进行过滤、筛选。
人像识别成功后,进一步识别驾驶员的行为属性,可识别使用手机、未系安全带、双手离开方向盘、视线未朝前方、未佩戴口罩、打哈欠、闭眼7种典型行为姿态。对这7种姿态规范程度设定阈值和打分机制,当行为不规范程度超过阈值时对其进行打分评判,再根据所得分数判定是否为危险驾驶,如图:
图2-11 网页终端分析界面
疲劳驾驶行为图像分析过程可归纳为:
(b)实际应用
通过摄像头拍摄检测驾驶员是否为疲劳驾驶。若检测到驾驶员为疲劳驾驶,则蜂鸣器鸣音报警,LED屏显示对应疲劳驾驶行为,提醒驾驶员休息,这样可有效避免疲劳驾驶造成的交通事故。
(c)程序实现:
******第三部分 ****** 完成情况及性能参数
3****.1 ****硬件组装示意图
** **** **图3-1硬件外壳设计图
图3-2硬件外壳实体图
图3-3 硬件组装示意图
3**.2 **部份模块工作展示图
图3-4酒精传感器工作 图3-5温湿度传感器工作
3.3****系统工作成果展示
图3-6 图3-7
正常驾驶时,LED屏提示“SAFE”
图3-8 图3-9
未系安全带,LED屏显示“no buckling up dangerous!”, 蜂鸣器鸣音报警
图3-10 图3-11
行车时打哈欠,LED屏显示“yawning dangerous!”,蜂鸣器鸣音报警
图3-12 图3-13
行车时使用手机,LED屏显示“cellphone dangerous!”, 蜂鸣器鸣音报警
3.4****网页终端图像分析结果
图3-14 终端初始界面 图3-15正常驾驶图像分析结果
图3-16未系安全带图像分析结果 图3-17使用手机图像分析结果
图3-18未佩戴口罩、 图3-19未直视前方、闭目
打哈欠图像分析结果 图像分析结果
3**.5 **系统工作性能表
项目
单位
最小值
典型值
最大值
备注
开机启动时间
分钟
<1
1
待定
包括单片机开机时间
酒精传感器数据传输时延
秒
<1
1
待定
数据传输有一定延迟
二氧化碳传感器数据传输时延
秒
<2
2
待定
数据传输有一定延迟
环境光传感器感光范围
nm
无
400-700
无
根据传感器自身特性而定
温湿度传感器数据采集误差
温度:℃
0
0.5
待定
与传感器灵敏度有关
湿度:%RH
0
±3
待定
Esp8266传输时延
毫秒
1
20
待定
数据处理和传输有一定延迟
蜂鸣器声音大小
分贝
待定
70
85
根据蜂鸣器自身特性而定
系统工作温度
℃
-10
26
50
根据各类传感器工作范围而定
图像像素
pixel
无
1024*768
无
高清、夜视
图像分析准确度
%
待定
90
100
程序识别分析有一定误差
表3-1系统工作性能表
3.6模块功能测试表
测试内容
测试结果
检测到酒精是否鸣音报警
是
检测到二氧化碳浓度高是否鸣音报警
是
是否实时显示温湿度
是
是否自动调节光强
是
摄像头是否能拍摄高清画面
是
Esp8266是否能传输图像
是
终端是否能识别分析疲劳驾驶
是
检测到疲劳驾驶是否能鸣音报警
是
LED屏是否能正常显示提示信息
是
表3-2 模块功能测试表
******第四部分 ****** 总结
4.1可扩展之处****
(1)将系统设计得更加人性化,系统可以融入更多的人工智能技术,例如语音播报、语音对话、自动拨号等功能。
(2)可以组建制作可穿戴设备,使用现有成熟产品,测量驾驶员得体温、血压、血脂等指标,生成健康报表反馈给用户及其家人,更加精确地检测分析疲劳驾驶。
(3)可增加GPS定位功能,并反馈至家属手机端,若发生异常情况可自动定位寻找。
(4)应对不同程度的危险驾驶行为,采取不同的警告措施,如检测到酒驾会自动拨号联系家属并语音提示,看手机、闭眼等行为进行蜂鸣器鸣音警告。
4.2心得体会****
(1)嵌入式系统设计与开发是一个综合而富有挑战性的任务,并且有其特殊的学习方法。对于硬件学习,我们不能再按照以往的“先理论后实践”的步骤进行,而是要从实践中发现并解决问题,从而巩固对应的理论知识。
(2)嵌入式系统设计,既要熟悉软件编程知识,又要清楚各类硬件的工作方式。刚开始学习通信协议模块,觉得十分抽象难懂,反反复复解读代码才弄明白其工作方法。摄像头图像的传输失败是我们的拦路虎,尝试使用虚拟机、转换图片格式、换用不同的串口助手等方法都不能解决问题,最后回归图像的成像编码等原理性,才明白问题所在。
(3)解决问题的过程也是一个学习的过程。从前只明白对现成产品的使用,当我们自己要设计一个系统,便瞬间觉得知识不够用或者不会运用已有知识,于是不得不从实践运用的角度快速学习不会的知识。事实证明,学以致用才能真正掌握知识。
(4)团队合作也十分重要,大家通力合作各自发挥自己的长处,是一个提高效率的好方法。辛苦几个月后看着设计的系统正常工作,我们内心都充满了欣喜,也觉得所有的努力都是值得的。
******第五部分 ****** 参考文献
[1]强宇佶,申双琴.智能家居嵌入式人脸识别门禁系统的设计与实现[J].科学技术创新,2020(26):112-113.
[2]杨峰,唐华,毛昀,袁勇,刘文.基于OpenCV的人脸识别设计与实现[J].信息与电脑(理论版),2020,32(16):108-110.
[3] 常留学,黄志成.基于Arduino的车辆防酒驾系统设计[J].汽车实用技术,2019(24):130-132.
[4] 张博轩.基于STC12C5A60S2单片机的汽车防疲劳驾驶系统研究[J].中国高新技术企业,2016(11):26-27.
[5] 周昊,蔡雄友,阮太元.基于单片机的智能汽车驾驶安全辅助系统设计与制作[J].福建电脑,2017,33(2):122-123
******第六部分 ****** 附录
主要代码:
#include "debug.h"
#include "AHT_10.h"
#include "lcd.h"
#include "AP3216C.h"
#include "sensor.h"
#include "wifi.h"
#include "dvp.h"
void sensor_check(void){
lcd_clear(BLACK);
alcho_flag = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==SET?0:1;//检测酒精
CO2_flag = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==SET?0:1;
**if**(alcho_flag == 1&&CO2_flag == 0)
{
lcd_clear(BLACK);
lcd_set_color(BLACK,GBLUE);
lcd_show_string(80, 80, 32," ");
lcd_show_string(80, 80, 32, "ALCHO!");
GPIO_WriteBit(GPIOD, GPIO_Pin_3, RESET);
}
**else** **if**(CO2_flag == 1&&alcho_flag ==0)
{
lcd_clear(BLACK);
lcd_set_color(0x18E3, RED);
lcd_show_string(64, 100, 32, "CO2!");
GPIO_WriteBit(GPIOD, GPIO_Pin_3, RESET);
}
**else** **if**(CO2_flag == 1&&alcho_flag ==1)
{
lcd_clear(BLACK);
lcd_set_color(0x18E3, RED);
lcd_show_string(64, 50, 32, "ALCHO!");
lcd_show_string(64, 100, 32, "CO2!");
GPIO_WriteBit(GPIOD, GPIO_Pin_3, RESET);
}
**else**
{
lcd_clear(BLACK);
lcd_set_color(0x18E3, GREEN);
lcd_show_string(30, 100, 32,"SAFE.");
GPIO_WriteBit(GPIOD, GPIO_Pin_3, SET);
}
}
void temperature_and_light(void)
{
**float** temperature, humidity;
u16 ir, als, ps;
temperature = AHT10_Read_Temperature();
humidity = AHT10_Read_Humidity();
lcd_set_color(BLACK,GREEN);
lcd_show_string(30, 150, 24,"Temperature: %d", (**int**)(temperature));
lcd_show_string(30, 192, 24,"humidity: %d", (**int**)(humidity));
AP3216C_ReadData(&ir, &ps, &als); //读取数据
**if**(als <50)
{
//点亮led
//面板变亮
LCD_SetBrightness(100-als);
}
}
void dangerous_check(void)
{
**int** num = uartAvailableWiFi();
**if** (num > 0 ){
**char** buffer[1024]={"\0"};
uartReadWiFi(buffer , num);
**printf**("Revceived:%s\r\n",buffer);
Delay_Ms(100);
**switch**(buffer[11])
{
**case** '2':
**printf**("222\r\n");
lcd_clear(WHITE);
lcd_set_color(WHITE, RED);
lcd_show_string(30, 50, 32, "eyes");
lcd_show_string(30, 100, 32, "closed");
lcd_show_string(30, 150, 32, "dangerous!");
GPIO_WriteBit(GPIOD, GPIO_Pin_3, *RESET*);
**break**;
**case** '3':
**printf**("333\r\n");
lcd_clear(WHITE);
lcd_set_color(WHITE, RED);
lcd_show_string(30, 50, 32, "no");
lcd_show_string(30, 100, 32, "mask");
lcd_show_string(30, 150, 32, "dangerous!");
GPIO_WriteBit(GPIOD, GPIO_Pin_3, *RESET*);
**break**;
**case** '4':
**printf**("444\r\n");
lcd_clear(WHITE);
lcd_set_color(WHITE, RED);
lcd_show_string(30, 50, 32, "no");
lcd_show_string(30, 100, 32, "buckling up");
lcd_show_string(30, 150, 32, "dangerous!");
GPIO_WriteBit(GPIOD, GPIO_Pin_3, *RESET*);
**break**;
**case** '5':
**printf**("555\r\n");
lcd_clear(WHITE);
lcd_set_color(WHITE, RED);
lcd_show_string(30, 50, 32, "eyes");
lcd_show_string(30, 100, 32, "not facing");
lcd_show_string(30, 150, 32, "front!");
GPIO_WriteBit(GPIOD, GPIO_Pin_3, *RESET*);
**break**;
**case** '6':
**printf**("666\r\n");
lcd_clear(WHITE);
lcd_set_color(WHITE, RED);
lcd_show_string(30, 50, 32, "cellphone");
lcd_show_string(30, 100, 32, "dangerous!");
// lcd_show_string(30, 100, 32, "CONDITION!");
GPIO_WriteBit(GPIOD, GPIO_Pin_3, *RESET*);
**break**;
**case** '7':
**printf**("777\r\n");
lcd_clear(WHITE);
lcd_set_color(WHITE, RED);
lcd_show_string(30, 50, 32, "yawning");
lcd_show_string(30, 100, 32, "dangerous!");
GPIO_WriteBit(GPIOD, GPIO_Pin_3, *RESET*);
**break**;
**default**:
**printf**("ELSE\r\n");
lcd_set_color(WHITE, GREEN);
lcd_show_string(30, 100, 32,"SAFE.");
GPIO_WriteBit(GPIOD, GPIO_Pin_3, *SET*);
**break**;
}
}
}
int main(void)
{
int16_t key_count = 0;
u16 Prekeyvalue = 0;
u16 Curkeyvalue = 0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
Delay_Init();
USART_Printf_Init(115200);
printf("SystemClk:%d\r\n",SystemCoreClock);
GPIO_INIT();
LED_GPIO_Init();
lcd_init();
LCD_SetBrightness(40);
Delay_Ms(100);
GPIO_EXTI_INIT();
GPIO_INIT_sensor();
lcd_show_string(30, 100, 32, "CONNECTING");
wifi_init();
dvp_uart_init();
lcd_show_string(30, 100, 32, "CONNECTED");
///
**while**(AHT10_Init()) //初始化AHT10
{
**printf**("AHT10 Error");
Delay_Ms(200);
}
**while**(AP3216C_Init()) //初始化AP3216C
{
**printf**( "AP3216C Check Failed!");
Delay_Ms(200);
}
**printf**("Start \r\n");
Delay_Ms(20);
**while**(1)
{
Prekeyvalue = Curkeyvalue;
Curkeyvalue = Basic_Key_Handle();
**if** (Curkeyvalue!= Prekeyvalue) {
**if** (Curkeyvalue==sw2) {//sw2切换到下一模式
lcd_clear(BLACK);
key_count++;//key_count用于作为切换模式的标志
**if** (key_count>3) {
key_count=3;
}
}**else** {
**if** (Curkeyvalue ==sw1) {//sw1切换到上一模式
lcd_clear(BLACK);
key_count--;
**if** (key_count<0) {
key_count=0;
}
}
}
}
**switch** (key_count) {
**case** 0:
test_lcd();
key_count++;
**break**;
**case** 1:
actor();
**break**;
**case** 2:
sensor_check();
**break**;
**case** 3:
temperature_and_light();
**break**;
**default**:
**break**;
}
}
}
void wifi_init(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Delay_Init();
USART_Printf_Init(115200);
**printf**("SystemClk:%d\r\n",SystemCoreClock);
**printf**("8266 WiFi TEST\r\n");
DMA_INIT_wifi();
USARTx_CFG_wifi(); /* USART INIT */
USART_DMACmd(UART6,USART_DMAReq_Tx|USART_DMAReq_Rx,*ENABLE*);
ESP8266_Init();//8266初始化
/
//打印之前收到的信息
**int** num = uartAvailableWiFi();
**if** (num > 0 ){
**char** buffer[1024]={"\0"};
uartReadWiFi(buffer , num);
**printf**("Revceived:\r\n%s",buffer);
}
//等待后续回复
Delay_Ms(100);
**while**(uartAvailableWiFi()==0);
Delay_Ms(2000);
num = uartAvailableWiFi();
**if** (num > 0 ){
**char** buffer[1024]={"\0"};
uartReadWiFi(buffer , num);
**printf**("Revceived:\r\n%s",buffer);
}
Delay_Ms(500);
//连接服务器
num = uartAvailableWiFi();
**if** (num > 0 ){
**char** buffer[1024]={"\0"};
uartReadWiFi(buffer , num);
**printf**("Revceived:\r\n%s",buffer);
}
}
void GPIO_INIT_sensor(void){
GPIO_InitTypeDef GPIO_InitStructure = {0};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, *ENABLE*);//A1输出酒精
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = *GPIO_Mode_IN_FLOATING*;
GPIO_InitStructure.GPIO_Speed = *GPIO_Speed_50MHz*;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, *ENABLE*);//B1输出co2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = *GPIO_Mode_IN_FLOATING*;
GPIO_InitStructure.GPIO_Speed = *GPIO_Speed_50MHz*;
GPIO_Init(GPIOB, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, *ENABLE*);//D3输出蜂鸣器
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = *GPIO_Mode_Out_PP*;
GPIO_InitStructure.GPIO_Speed = *GPIO_Speed_50MHz*;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_WriteBit(GPIOD, GPIO_Pin_3, *SET*);
}
版权归原作者 cloud_for_moon 所有, 如有侵权,请联系我们删除。