1.选题背景与意义
经过了疫情的开端与发展,就目前我国已经处在疫情的常态化管理中。在疫情常态化管理下,与人们日常生活中的出行,总离不开测温、通行证明等等。
针对当前的疫情形式,我们设计一款智能防疫门禁管理系统。它能实现人们出行中测温的无人化和系统的区域进出管理化。
2.选题的要求及分析
2.1题目设计要求
智能防疫门禁管理系统。
1、系统能够采集进出人员的人体温度、记录人流量,
2、能在屏幕上显示人体温度、状态、人流量等。
3、语音播报提示进出人员体温是否正常,舵机动作(相当于打开闸门)。
4、后台记录进出人员人体温度、人流量。提醒后台工作人员进行上报和处理。
2.2题目设计分析
智能防疫门禁管理系统的设计与实现,设计所包含的模块主要有:
液晶显示电路、语音播报电路、非接触测温传感器电路、舵机驱动电路、物联网模块、按键电路模块及电源模块。
通过模块之间的配合实现对疫情的预警,一旦有温度异常将会通过闸门关闭和语音播报以及后台提醒来通知相应人员做出相关措施。
对于题目要求我们采用:
stm32f103c8t6实时采集红外传感器获取温度,当温度低于或高于指定阈值时,操作TFT显示屏显示温度异常和语音模块播报,同时控制舵机关闭,模拟门闸关闭状态,并将温度信息通过WIFI模块上传至后台,提醒后台工作人员进行上报和处理。
系统设计的难点在于stm32单片机程序设计、液晶显示、语音播报模块以及非接触式测温模块的使用。
3.设计综述
3.1实物设计综述
3.1.1总体设计框图
STM32F103C8t6做主控;MLX9614ESF-BCC做温度获取传感器;1.8寸TFT、SV 17F语言播报模块、蜂鸣器做显示与语音;MG996舵机模拟开关门;ESP8266 Mode传数据到后台;
3.1.2硬件设计原理图及主要部分讲解
1、采用stm32f103c8t6当主控模块
1.采集红外传感器获取温度
2.操作TFT显示屏显示温度、状态情况、人流量。
3.控制语音模块播报,舵机开关(模拟门闸关闭状态)
4.将温度信息通过wifi模块上传至后台
3.1.2 MLX90614ESF-BCC模块-非接触测温传感器
1.内部自带环境温度补偿和线性校准算法
2.通过IIC通信与单片机进行数据交换
3.本模块精度非常之高,可以满足无接触测温功能需求(本项目用的是10cm精度的)。
3.1.3 ESP12F系列模组-ESP8266
1、低功耗UART-WiFi芯片模组
2、方便地进行二次开发,接入云端服务,实现手机3/4G全球随时随地的控制
3、支持标准的 IEEE802.11 b/g/n 协议,完整的 TCP/IP 协议栈
4、采用该模块进行数据的上传,可以实时将数据上传给后台服务器,进行数据的存储和大数据处理等。
3.1.4 液晶显示-1.8寸128X160像素TFT屏幕
1、通过SPI串口与单片机进行通信,用来显示所测温度或显示其它必要信息。
2、支持16BIT RGB 65K色显示,显示色彩丰富。
3、军工级工艺标准,长期稳定工作,提供底层驱动技术支持
4.显示温度、状态、人流量等信息。
3.1.5语音播放-SV 17F语音播报模块
1、支持l0触发播放功能,8个l0口单独触发8首曲目或8个10口组
2、支持MP3、WAV解码格式。
3、24位DAC输出,动态范围支持90DB,信噪比支持85DB。
4、自带5WD类功放,可直接驱动4Q,3.5W喇叭。
总的设计原理图
实物成品
3.2关键技术及算法
3.2.1通信协议
串口通信协议:
IIC通信协议:
SPI通信协议:
3.2.2 CRC-8(PEC)校验原理以及实现
3.2.3 MLX90614ESF-DCC的温度算法研究
3.2.4 MLX90614ESF-DCC的使用研究
3.3主要代码展示
int main(void)
{
/* USER CODE BEGIN 1 */
float temp=0.0;
peoples = 0;
error_flag = 0;
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_USART2_UART_Init();
MX_TIM1_Init();
MX_USART1_UART_Init();
MX_TIM2_Init();
/* USER CODE BEGIN 2 */
LCD_Init();
LCD_ShowString(5,60,16,"initializing...",0);
__HAL_TIM_CLEAR_IT(&htim2, TIM_IT_UPDATE);
// 使能定时器2更新中断并启动定时器2
HAL_TIM_Base_Start_IT(&htim2);
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1); //启动定时器1 PWM舵机
Servo_Control(90); //舵机调到45度
HAL_Delay(1000);
display_init();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
//temper=(uint8_t)10*42.0-256;
//HAL_UART_Transmit (&huart1 ,&temper,1,100);
HAL_GPIO_TogglePin(led_GPIO_Port,led_Pin);
temp = mlx90614_read_temp()+2; //获取温度
LCD_Fill(64,48,lcddev.width,64,WHITE); //清空温度显示
LCD_Fill(64,80,lcddev.width,96,WHITE); //清空状态显示
if(temp >= 33){ //>=30度才会显示
if(temp < 37.4){
temper=(uint8_t)10*temp-256;
HAL_UART_Transmit (&huart1 ,&temper,1,100);
LCD_ShowFloatNum1(64,48,temp,4,GREEN,WHITE,16);
GUI_DrawFont16(96,48,GREEN,WHITE,"℃",0);
GUI_DrawFont16(64,80,GREEN,WHITE,"正",0);
GUI_DrawFont16(80,80,GREEN,WHITE,"常",0);
yuyin(0);
peoples++;
LCD_Fill(72,112,lcddev.width,128,WHITE); //清空人数显示
LCD_ShowNum(72,112,peoples,4,16); //显示人数
Servo_Control(135); //舵机调到135度 模拟开门
HAL_Delay(3000);
Servo_Control(45); //舵机调到45度 模拟关门
}else if(temp >= 37.4 && temp <= 45){
temper=(uint8_t)10*temp-256;
HAL_UART_Transmit (&huart1 ,&temper,1,100);
LCD_ShowFloatNum1(64,48,temp,4,RED,WHITE,16);
GUI_DrawFont16(96,48,RED,WHITE,"℃",0);
LCD_Fill(0,80,lcddev.width,lcddev.height,WHITE); //清空状态显示
GUI_DrawFont16(24,96,RED,WHITE,"注",0);
GUI_DrawFont16(40,96,RED,WHITE,"意",0);
GUI_DrawFont16(56,96,RED,WHITE,"!",0);
GUI_DrawFont16(72,96,RED,WHITE,"异",0);
GUI_DrawFont16(88,96,RED,WHITE,"常",0);
error_flag = 1;
peoples++;
while(error_flag){
yuyin(1);
HAL_Delay(1500);
}
display_init();
}
}
}
}
3.4实物展示及说明