基于32单片机的博物馆安全监控系统设计

news/2024/10/8 8:49:43/

目录

一、主要功能

二、硬件资源

三、程序编程

四、实现现象


一、主要功能

检测 分别是温湿度 光照 PM2.5、烟雾、红外,然后用OLED屏幕显示,
红外超过阈值则蜂鸣器报警,这是防盗报警;温度或烟雾超过阈值,则蜂鸣器也报警,
并且继电器驱动电机转动进行撒水,这是火灾预警;电压超过阈值,则所有模块包括显示屏全部熄灭,系统不起作用,这是过载保护。

二、硬件资源

基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。

三、程序编程

#include "main.h"
#include "adc.h"
#include "gpio.h"
#include "./HAL/key/key.h"
#include "./HAL/OLED/OLED_NEW.H"
#include "./HAL/dht11/dht11.h"void Monitor_function(void);						//监测函数
void Display_function(void);						//显示函数
void Manage_function(void);							//处理函数#define LED(a) (a?HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET):HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET)) #define LED1(a) (a?HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET):HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET)) #define BEEP(a) (a?HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET):HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_SET)) uint8_t adc_ch;   										//adc的个数
uint32_t adc_buf[6];									//adc数值的存储数组uint16_t temp,humi;										//温湿度
uint16_t pm2,gz,hw,yw,dy;						
uint16_t pwyz=60,gzyz=60,hwyz=60,ywyz=60,dyyz=60,WDYZ=300,SDYZ = 700;		
uint8_t flag_led,flag_beep;						//灯、报警标志位uint16_t time_num;
static int flag = 0;void SystemClock_Config(void);uint16_t dong_get_adc(){//开启ADC1HAL_ADC_Start(&hadc1);//等待ADC转换完成,超时为100msHAL_ADC_PollForConversion(&hadc1,100);//判断ADC是否转换成功if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC)){//读取值return HAL_ADC_GetValue(&hadc1);}return 0;
}/****
*******监测函数
*****/
void Monitor_function(void)
{DHT11_Read_TempAndHumidity(&DHT11_Data);//调用获取温湿度、烟雾浓度、一氧化碳、甲烷、光照强度函数temp = DHT11_Data.temperature; 					//获取温度humi = DHT11_Data.humidity;    					//获取湿度//将获取的值存储到adc_buf中for(adc_ch=0;adc_ch<5;adc_ch++){//分别存放通道1、2、3、4、5的ADC值adc_buf[adc_ch]=dong_get_adc();}pm2=adc_buf[0]/4096.00*100;gz=adc_buf[1]/4096.00*100;hw=adc_buf[2]/4096.00*100;yw=adc_buf[3]/4096.00*100;dy=adc_buf[4]/4096.00*100;}/****
*******显示函数
*****/
void Display_function(void)
{//第一行Oled_ShowString(0,0,"PM2.5:");OLED_ShowNum(48,0,pm2,2,16);Oled_ShowCHinese(64,0,"光照:");Oled_ShowString(96,0,":");OLED_ShowNum(104,0,gz,2,16);//第二行Oled_ShowCHinese(0,2,"红外");Oled_ShowString(32,2,":");OLED_ShowNum(40,2,hw,2,16);Oled_ShowCHinese(64,2,"烟雾:");Oled_ShowString(96,2,":");OLED_ShowNum(104,2,yw,2,16);//第三行Oled_ShowCHinese(0,4,"电压");Oled_ShowString(32,4,":");OLED_ShowNum(40,4,dy,2,16);//第四行OLED_Show_Temp(0,6,temp);Oled_ShowCHinese(64,6,"湿度");Oled_ShowString(96,6,":");OLED_Show_Humi(96,6,humi/10);}/****
*******处理函数
*****/
void Manage_function(void)
{if(hw > hwyz)   //温度大于温度MAX{flag_beep=1;Oled_ShowCHinese(64,4,"有人");}else{Oled_ShowCHinese(64,4,"无人");}if(yw > ywyz)   //温度大于温度MAX{flag_beep=1;flag_led = 1;}if(temp > WDYZ)   //温度大于温度MAX{flag_led=1;flag_beep=1;}if(dy>dyyz){flag = 1;}if(humi > SDYZ)   //温度大于温度MAX{flag_led=1;flag_beep=1;}if(hw < hwyz  && yw < ywyz && dy < dyyz  && temp < WDYZ ){flag_led=0;flag_beep=0;}if(gz < gzyz){LED1(1);}else{LED1(0);}if(flag_beep==1)BEEP(1);elseBEEP(0);if(flag_led==1)LED(1);elseLED(0);
}int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_ADC1_Init();OLED_Init();									//OLED初始化OLED_Clear();									//OLED清屏while (1){if(flag == 0){Monitor_function();					//监测函数Display_function();					//显示函数Manage_function();					//处理函数HAL_Delay(10);}else if(flag == 1){OLED_Clear();									//OLED清屏}} 
}void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL4;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK){Error_Handler();}PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 */
/* USER CODE END 4 *//*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

四、实现现象

具体动态效果看B站演示视频:

基于单片机的博物馆安全监控系统设计

全部资料(源程序、仿真文件、安装包、原理图、演示视频):

百度网盘资料下载icon-default.png?t=O83Ahttps://pan.baidu.com/s/1X7A9j30IiWBQ-tuPJ-uHIA?pwd=ev05

 


http://www.ppmy.cn/news/1536043.html

相关文章

【Blender Python】2.结合Kimi生成

概述 结合Kimi这样的AI工具可以生成Blender Python代码&#xff0c;用来辅助生成一些或简单或复杂的图形。当然&#xff0c;出不出错这就不一定了。因为AI所训练的版本可能并不是Blender的最新版本&#xff0c;类似的问题也出现在Godot上。 测试 在kimi中提问&#xff0c;获…

Linux 性能优化之CPU 多级缓存

写在前面 博文内容为 Linux CPU 多级缓存认知内容涉及&#xff1a; 什么是CPU多级缓存认知&#xff0c;CPU 硬件缓存信息&#xff0c;缓存流程写入策略&#xff0c;映射算法认知CPU 缓存分析&#xff0c;使用 valgring 和 Perf 分析CPU 缓存命中情况编码方面 CPU 缓存优化&…

ubuntu的useradd和adduser命令

useradd vs adduser 1. useradd 类型&#xff1a;Linux 命令。功能&#xff1a;用于创建新用户&#xff0c;但不会自动创建用户的主目录和密码。参数&#xff1a; -c&#xff1a;添加备注。-d&#xff1a;指定用户主目录。-e&#xff1a;设置用户有效期。-f&#xff1a;设置密…

18 Shell Script sort和uniq命令

sort和uniq命令 一、sort命令的使用 ​ sort 命令是帮我们依据不同的数据类型进行排序&#xff0c;并将结果写到标准输出。如果File 参数指定多个文件&#xff0c;那么sort 命令将这些文件连接起来&#xff0c;并当作一个文件进行排序 ​ 选项与参数 ​ –f &#xff1a;忽…

线性代数入门

线性代数入门 线性代数&#xff08;Linear Algebra&#xff09;是数学的重要分支之一&#xff0c;广泛应用于工程、计算机科学、物理学、经济学等领域。它主要研究向量、矩阵及其在空间中的变换。对于程序员来说&#xff0c;掌握线性代数的基础知识能够帮助更好地理解数据处理…

[C++] 小游戏 征伐 SLG DNF 0.0.2 版本 zty出品

目录 大家好~ 今天zty带来的是 War and Expedition SLG DNF 0.0.2 version 讲人话就是 War and Expedition &#xff08;游戏名&#xff0c;即征伐&#xff09; SLG &#xff08;即时战略类游戏&#xff09; DNF &#xff08;Did Not Finish&#xff09; 0.0.2 &#xff…

【动态规划-最长公共子序列(LCS)】力扣97. 交错字符串

给定三个字符串 s1、s2、s3&#xff0c;请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下&#xff0c;其中每个字符串都会被分割成若干 非空 子字符串&#xff1a; s s1 s2 … sn t t1 t2 … tm |n - m| < 1 交错 是 s1…

微信步数C++

题目&#xff1a; 样例解释&#xff1a; 【样例 #1 解释】 从 (1,1) 出发将走 2 步&#xff0c;从 (1,2) 出发将走 4 步&#xff0c;从 (1,3) 出发将走 4 步。 从 (2,1) 出发将走 2 步&#xff0c;从 (2,2) 出发将走 3 步&#xff0c;从 (2,3) 出发将走 3 步。 从 (3,1) 出发将…