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

news2024/10/8 10:28:06

目录

一、主要功能

二、硬件资源

三、程序编程

四、实现现象


一、主要功能

检测 分别是温湿度 光照 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(){
    //开启ADC1
  HAL_ADC_Start(&hadc1);
    //等待ADC转换完成,超时为100ms
    HAL_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);
  else
    BEEP(0);
  if(flag_led==1)
    LED(1);
  else
    LED(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.coloradmin.cn/o/2196120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【目标检测】木制地板缺陷破损数据集338张6类VOC+YOLO格式

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3383 标注数量(xml文件个数)&#xff1a;3383 标注数量(txt文件个数)&#xff1a;3383 标注…

fiddler抓包21_(性能测试)耗时分析

课程大纲 使用场景 1. 查看请求耗时。 2. &#xff08;更多&#xff09;前端性能分析、优化。 1. 查看单个请求耗时 耗时详情&#xff1a;选择请求 - 右侧标签菜单选择Statistics“请求统计”。 传输时间线&#xff1a;选择请求 - 右侧选择“TimeLine”。 2. 前端性能分析&a…

MYSQL 常见锁机制详解,常见锁问题排查及分析

1&#xff0c;锁分类 锁冲突是影响数据库性能的重要指标&#xff0c;本章节介绍MYSQL常见锁&#xff0c;及各种说的常用示例&#xff0c;mysql锁的分类如下&#xff1a; 从操作类型分类&#xff1a;读锁、写锁&#xff1b; 从操作粒度分类&#xff1a;表锁、页锁、行锁&#x…

【文献阅读】Transfer Learning For Text Classification Via Model Risk Analysis

前言&#xff1a;本文是以文本分类的迁移学习任务为例&#xff0c;对风险分析模型的整体框架流程做梳理。 目录 1. LearnRisk1.1 motivatio1.2 overall 2. LearnRisk-TC2.1 构造风险特征2.1.1 risk metric2.1.2 risk feature 2.2 构建风险模型2.3 训练风险模型2.4 微调base mod…

线性代数入门

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

边缘人工智能(Edge Intelligence)

边缘人工智能&#xff08;Edge AI&#xff09;是指在边缘设备上直接运行人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;算法的技术。机器学习是一个广泛的领域&#xff0c;近年来取得了巨大的进步。它所基于的原则是&#xff0c;计算机可以通过从数据…

Qt-QGridLayout布局类控件(43)

目录 描述 属性 使用 常规使用 垂直布局 水平布局 布局是按照相对大小进行的 拉伸系数 使用 设置水平拉伸系数 设置垂直拉伸系数 描述 Qt 中还提供了 QGridLayout ⽤来实现⽹格布局的效果.可以达到 M * N的这种⽹格的效果 属性 layoutLeftMargin左侧边距layoutRig…

Windows 安装 Maven 并配置环境变量

一、简介 Maven 是一款基于 Java 平台的项目管理和整合工具&#xff0c;用来构建项目的。也就是清理、编译、测试、运行、打包、安装整个过程都交给 Maven 管理&#xff0c;整个过程就是构建。 二、安装 Java JDK Maven 依赖 Java JDK&#xff0c;如果本机没有安装过 Java 的…

NASA:第三版大气痕量分子光谱(ATMOS)2 级产品,包含垂直高度(千米)网格上的痕量气体

目录 简介 摘要 代码 引用 网址推荐 0代码在线构建地图应用 机器学习 ATMOS L2 Trace Gases on Altitude Grid, Fixed Field Format V3 (ATMOSL2AF) at GES DISC 简介 高度网格上的 ATMOS L2 跟踪气体&#xff0c;固定字段格式 V3 (ATMOSL2AF) 这是第三版大气痕量分子…

CMake学习笔记:项目的导出和安装-install命令

一、基本语法与概念 1.文件的安装 install(FILES) 用Poco库 usr/local/poco/CMakeLists.txt中内容 举例如下&#xff1a; 2.目标安装 install(TARGETS) 3.导出目标与导出配置文件 将目标mylib导出名为MyModules的目标。MyModules导出目标包含了关于mylib的所有信息&#xf…

【初阶数据结构】冒泡排序和选择排序(用C语言实现,主要讲思维)

文章目录 前言1. 冒泡排序1.1 算法思想1.2 冒泡排序的代码实现1.3 冒泡排序算法的改进 2. 选择排序2.1 算法思想2.2 选择排序的代码实现 3. 写排序算法的小技巧 前言 讲到排序相信大家一定对一种排序很熟悉&#xff0c;它的名字就叫做冒泡排序。这个排序大家在学习各种语言时&…

【优选算法】(第二十六篇)

目录 两数相加&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 两两交换链表中的节点&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 两数相加&#xff08;medium&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#xff08;…

随着硬件水平的提升,LabVIEW有哪些过去的编程方法被淘汰掉了

随着硬件水平的不断提升&#xff0c;尤其是处理器性能、存储能力、通信速度等方面的飞跃&#xff0c;LabVIEW的一些早期编程方法逐渐被更高效、现代的编程技术所取代。以下是一些随着硬件升级而逐步淘汰的LabVIEW编程方法和技术&#xff1a; 1. 低效的数据流传输方式 过去由于…

SQL执行顺序是如何工作的,为什么它如此重要?

&#x1f3af;SQL执行顺序是如何工作的&#xff0c;为什么它如此重要&#xff1f; SQL查询按照以下顺序执行其语句&#xff1a; 1️⃣FROM / JOIN 2️⃣WHERE 3️⃣GROUP BY 4️⃣HAVING 5️⃣SELECT 6️⃣DISTINCT 7️⃣ORDER BY 8️⃣LIMIT / OFFSET 你在每个步骤中实现的技…

特定类型的图与应用 - 离散数学系列(六)

目录 1. 树和生成树 树的定义 生成树与最小生成树 2. 二分图 二分图的定义 示例&#xff1a;最大匹配问题 3. 欧拉图与哈密顿图 欧拉图 哈密顿图 4. 实际应用场景 1. 文件系统中的树结构 2. 网络优化中的最小生成树 3. 社交网络分析 5. 例题与练习 例题1&#xf…

sv标准研读第十三章-task和function

书接上回&#xff1a; sv标准研读第一章-综述 sv标准研读第二章-标准引用 sv标准研读第三章-设计和验证的building block sv标准研读第四章-时间调度机制 sv标准研读第五章-词法 sv标准研读第六章-数据类型 sv标准研读第七章-聚合数据类型 sv标准研读第八章-class sv标…

【直接原地起飞】3DMAX2025热门插件合集来啦!

强烈推荐8款3DMAX2025热门插件&#xff01; 在3DMAX的广阔世界里&#xff0c;插件如同魔法工具&#xff0c;为设计师们打开了无限创意的大门。今天&#xff0c;我们精心挑选了8款热门插件&#xff0c;它们不仅功能强大&#xff0c;而且易于上手&#xff0c;定能让你的3D设计之旅…

Python从0到100(六十二):机器学习实战-预测波士顿房价

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

增强分析:新时代的数据洞察工具

随着数据科学和人工智能的迅猛发展&#xff0c;分析数据的方式也发生了显著的变化。增强分析&#xff08;Augmented Analytics&#xff09;是近年来涌现出的新概念&#xff0c;它将人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&#xff09;和自然语言处理&…

操作系统 | 学习笔记 | 王道 | 4.2 目录

4.2 目录 4.2.1 目录的基本概念 文件目录指FCB的有序集合&#xff0c;一个FCB就是一个文件的目录项。与文件管理系统和文件集合相关联的是文件目录&#xff0c;它包含有关文件的属性、位置和所有权等。 目录管理的基本要求&#xff1a; 从用户的角度看&#xff0c;目录在用户…