作品分享:基于STM32的温度报警器含源码、原理图、PCB文件、作品报告

2023-05-16

文章目录

  • 一.前言
  • 二.材料准备
  • 三.硬件部分
  • 四.软件部分
    • 1. 底层封装库
    • 2.中间层
    • 3.应用层
  • 五.外壳设计
  • 六.资料链接

一.前言

该作品是我在华工电工开放实习的作品,本作品由七部分组成。中央为Stm32F405RG芯片,使用两节18650电池供电,在外围加入大量外设。

DBS18B20温度传感器用于外界温度的测量;舵机、蜂鸣器用于检测响应;增加三个按键用于报警临界值的设定;数码管用于温度的实时显示,也用于临界值设定(配合按键使用);两个串口中USART2用于蓝牙连接手机,通过手机APP能够远程监控外界温度,USART1可以通过有线或者无线的方式连接PC,通过上位机能够直观地实时监测外界温度。因为外设数量较多,故引入了开源操作系统FreeRTOS用于多线程任务管理。

下面我分为硬件部分软件部分外观设计给大家介绍一下这个温度报警器。关于该作品的所有资料我放到了博客的最后。

框架图:

二.材料准备

材料数量
STM32F405RG芯片1
DBS18B20温度传感器1
按键开关3
电源开关1
复位开关1
5V蜂鸣器1
共阳数码管1
HC-08蓝牙1
25M贴片晶振(C9006)1
HC-08蓝牙1
TPS54302 降压芯片1
MP2451 降压芯片1
0603/0805元件若干
表格仅供参考,详情看原理图为准。

三.硬件部分

开发环境:Altium Designer17

硬件部分并没有太复杂的电路,主要都是一些模块的拼凑。
在这里插入图片描述
原理图:
在这里插入图片描述

四.软件部分

开发环境:Keil 、 CubeMX
Vesion : 5.28 、 5.4.0
开发语言:C++

代码主要分为底层库中间层上层(应用层),底层主要用于对各种外设的封装,中间层一般用来放置一些跟上位机、算法、通信相关的东西,而上层应用层则是最终的执行代码,简单的说即是最终执行的任务。

1. 底层封装库

底层库的封装作用是将上层需要用到的外设驱动进行封装,外设包括:定时器延时、DBS18B20温度传感器、共阳数码管显示、舵机、串口。驱动层封装的函数只为上层文件所调用,而不能调用上层函数,将项目分层包装是为了增强项目的扩展性与可读性。
在这里插入图片描述
比如:Nixie_tube.cpp(共阳数码管驱动)

	uint8_t tens_temp=0;
	uint8_t ones_temp=0;
	uint8_t decimals=0;
void Nixie_tube_display(float value)
{
	//提取出value的个位、十位、小数位
	extern uint8_t tens_temp;
	extern uint8_t ones_temp;
	extern uint8_t decimals;
	
  uint16_t value_int=(uint16_t)(10*value);
	
	decimals=value_int%10;
	ones_temp=(value_int/10)%10;
	tens_temp=(value_int/100)%10;
	
	/*十位*/
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_11,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_10,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_15,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);
	Led_output(tens_temp);
	HAL_Delay(1);
	
	/*个位*/
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_11,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_10,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_15,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET);
	Led_output(ones_temp);
	HAL_Delay(1);
	
	/*小数位*/
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_11,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_10,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_15,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);
	Led_output(decimals);
	HAL_Delay(1);
	
}


代码只列部分,详情自己看源码工程。

2.中间层

中间层用于连接底层与应用层,我一般用来写上位机、算法、通信部分。温度报警器的代码比较简单,只用到上位机。

开机温度:


加入热水测试:


注:因为上位机的程序不是我写的,所以这一部分的代码被我删去了。

3.应用层

应用层用来编写最终最后执行的任务,使用FreeRTOS实时系统用作任务管理。FreeRTOS共创建5个任务,任务间通过调度器进行任务切换。任务间优先级相同,5个任务轮流占用时间片进行运行。线程1至线程4执行频率都为1000Hz(1ms执行一次),线程5执行频率为1Hz(1s执行一次)。线程之间相互独立,复杂程序经过底层驱动以及中间层封装为函数,应用层直接调用即可。

/* Private variables ---------------------------------------------------------*/
TaskHandle_t Temperature_collecting_Handle;
TaskHandle_t Upper_computer_Handle;
TaskHandle_t Temperature_display_Handle;
TaskHandle_t Beep_steering_Handle;
TaskHandle_t Bluetooth_sent_Handle;

/* Private function prototypes -----------------------------------------------*/
void Temperature_collecting(void *arg);
void Upper_computer(void*arg);
void Temperature_display(void*arg);
void Beep_steering(void*arg);
void Bluetooth_sent(void*arg);

/* Function Init -------------------------------------------------------------*/
void System_Tasks_Init(void)
{
  vTaskSuspendAll();
	
	/*温度采集*/
	xTaskCreate(Temperature_collecting,"Temperaturecollecting",Normal_Stack_Size,NULL,PriorityHigh,&Temperature_collecting_Handle);
	/*上位机*/
	xTaskCreate(Upper_computer,"Uppercomputer",Normal_Stack_Size,NULL,PriorityHigh,&Upper_computer_Handle);
	/*数码管显示*/
	xTaskCreate(Temperature_display,"Temperaturedisplay",Normal_Stack_Size,NULL,PriorityHigh,&Temperature_display_Handle);
	/*蜂鸣器、舵机任务*/
	xTaskCreate(Beep_steering,"Beepsteering",Normal_Stack_Size,NULL,PriorityHigh,&Beep_steering_Handle);
	/*蓝牙串口发送任务*/
	xTaskCreate(Bluetooth_sent,"Bluetoothsent",Normal_Stack_Size,NULL,PriorityHigh,&Bluetooth_sent_Handle);
  if (!xTaskResumeAll())
    taskYIELD();
}

/* Function Task -------------------------------------------------------------*/

/*1.温度采集任务*/
void Temperature_collecting(void *arg)
{
  static TickType_t _xPreviousWakeTime = xTaskGetTickCount();
  static TickType_t _xTimeIncrement = pdMS_TO_TICKS(10);
  for (;;)
  { 
	  Current_Temperature=DS18B20_Get_Temp();
		vTaskDelayUntil(&_xPreviousWakeTime, _xTimeIncrement);
  }
}

/*2.上位机任务*/
void Upper_computer(void*arg)
{
  static TickType_t _xPreviousWakeTime = xTaskGetTickCount();
  static TickType_t _xTimeIncrement = pdMS_TO_TICKS(1);
  for (;;)
  {
		//     Sent_Contorl(&huart6);//上位机发送(上位机代码已删,所以把这里注释)
		 vTaskDelayUntil(&_xPreviousWakeTime, _xTimeIncrement);
  }
}

/*3.数码管显示任务*/
void Temperature_display(void*arg)
{
	static TickType_t _xPreviousWakeTime = xTaskGetTickCount();
  static TickType_t _xTimeIncrement = pdMS_TO_TICKS(1);
  for (;;)
  { 
		/*当前温度显示*/
		if(Selet_Mode==Current_Temperature_display)
		{
		  Nixie_tube_display(Current_Temperature);
		}
		else 
		{
			/*报警值设定*/
			Nixie_tube_display(Alarm_Temperature);
		}
     
		 vTaskDelayUntil(&_xPreviousWakeTime, _xTimeIncrement);
  }
}

/*4.蜂鸣器、舵机任务*/
void Beep_steering(void*arg)
{
	static TickType_t _xPreviousWakeTime = xTaskGetTickCount();
  static TickType_t _xTimeIncrement = pdMS_TO_TICKS(1);
  for (;;)
  {   
		/*蜂鸣器报警*/
		if((Current_Temperature>Alarm_Temperature)&&(Systemtime>2))
		{
			if(Beep_flag==1800)
			{
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET);
			vTaskDelayUntil(&_xPreviousWakeTime, _xTimeIncrement);
			}
			else
			{Beep_flag++;}
		}
		else
		{
			Beep_flag=0;
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET);
			vTaskDelayUntil(&_xPreviousWakeTime, _xTimeIncrement);
		}
		
		/*舵机控制*/
		if(Current_Temperature<=30)
		{
			__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, 2500);
		}

	}
}

/*5.蓝牙数据发送任务*/
void Bluetooth_sent(void*arg)
{
	static TickType_t _xPreviousWakeTime = xTaskGetTickCount();
  static TickType_t _xTimeIncrement = pdMS_TO_TICKS(1000);
  for (;;)
  { 
		Systemtime=Get_SystemTimer()/1000000;
		
		My_printf2("\r\nSystemtime=%u\r\n",Systemtime);
		My_printf2("Alarm_Temperature=%f\r\n",Alarm_Temperature);
		My_printf2("Current_Temperature=%f\r\n",Current_Temperature);
		vTaskDelayUntil(&_xPreviousWakeTime, _xTimeIncrement);
	}
}

作品最终的效果的效果非常棒,预期的功能全部都能够完美实现。

本来是想拍一个展示视频的,但是后来作品交上去之后就再也拿不回来了。只留有之前的手机蓝牙接收消息的录屏,单片机通过蓝牙发送消息到手机,手机可以监控温度报警器的 开机时间 (s)报警温度 (℃)当前环境温度 (℃),执行频率为1Hz,所以是1s发送一次。

当温度超过设定值时,蜂鸣器就会响,舵机也会做出相应的反馈。三个按键可以调节报警温度。

蓝牙功能展示:

五.外壳设计

作品最后要上交展示,所以给它做了个外壳,电路板装在外边,里面主要用来走线以及放电池盒。黄色的材料是木头,白色的材料是薄PC板。

开发环境:Soildword2019
在这里插入图片描述
装上后的实物图:

上电后的实物图:

六.资料链接

  1. 温度报警器硬件(Altium Designer17)   类型:收费5元。
  2. 温度报警器固件(Keil5.28+CubeMX5.4) 类型:点赞、关注即可直接下载。
  3. 温度报警器实验报告PDF        类型:点赞、关注即可直接下载。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

作品分享:基于STM32的温度报警器含源码、原理图、PCB文件、作品报告 的相关文章

  • Redisson_布隆过滤器

    应用场景 去重 诞生背景 Java应用一般通过JDK自身提供的HashSet 去重 xff0c 通过contains 方法判断当前元素是否存在于Set中 该方式要求在调用contains 前 xff0c 已经将数据列表加载到内存中 xff0
  • ORB-SLAM3算法复现及遇到的问题解决 T265

    GitHub zhaozhongch orbslam3 ros https github com UZ SLAMLab ORB SLAM3 安装ORB SLAM3教程 Smile HT的博客 CSDN博客 参考以上作者 环境 xff1a u
  • 51单片机的蜂鸣器写歌的音阶

    直接上代码 xff01 span class token macro property span class token directive keyword include span span class token string lt r
  • 安装ROS版的ORB-SLAM3全过程并跑T265 的bag包

    请确保opencv eigen sophus等包已经安装好了 ORBSLAM3 下载ORBSLAM3 git clone https github com UZ SLAMLab ORB SLAM3 git 由于我们需要的是ROS版的安装 x
  • 2023 ROS版 realsense t265相机驱动安装

    安装librealsence https blog csdn net qq 43412584 article details 108357706 参考这个足够了 安装realsense ros 由于github上面已经更新了 xff0c 不
  • SLAM 轨迹评估方法 evo(包括GPS坐标转换成TUM)

    安装 evo pip span class token function install span evo upgrade no binary evo SLAM轨迹 运行ORBSLAM rosrun ORB SLAM3 Stereo Voc
  • 【SLAM】VINS-fusion,VINS-Mono 编译,使用T265测试

    安装 VINS fusion VINS Mono 将vins mono 下载到ros工作空间catkin ws里面 span class token builtin class name cd span home jiangz catkin
  • 总结使用layui-laydate日历控件遇到的问题

    一 利用layui laydate日历控件选择月份 1 问题 选择月份时不能实现鼠标直接点击选择 xff0c 选择之后需要按 确定 原来的代码 html文件 xff1a span class token operator lt span d
  • 【pytorch】torch1.7.1安装、查看torch版本、GPU是否可用

    在conda 虚拟环境下安装torch 61 61 1 7 1 43 GPU版本 本机环境 CUDA 11 0Python 3 7 安装torch1 7 1 官网搜索确认需要下载的对应本机cuda的torch版本 xff0c 使用在线下载即
  • S.BUS协议

    内容 本篇文章主要是S BUS协议原理介绍 xff0c 并实现了arduino输出S BUS数据 S BUS简介 SBUS是一个接收机串行总线输出 xff0c 通过这根总线 xff0c 可以获得遥控器上所有通道的数据 目前很多模型及无人机电
  • window10+TensorRT-8.2.5.1+yolov5 v6.2 c++部署

    一 准备工具 1 1 visual studio下载安装 参考 xff1a vs2019社区版下载教程 xff08 详细 xff09 Redamancy 06的博客 CSDN博客 vs2019社区版 1 2 显卡驱动 43 cuda 43
  • openstack创造实例报:找不到有效有效主机,没有足够主机,而且点击实例还报500

    第一次接触openstack时候 xff0c 再创建实例时候右上方就弹出创建失败 实例 xxx 执行所请求操作失败 xff0c 实例处于错误状态 请稍后再试 错误 找不到有效主机 xff0c 原因是 没有足够的主机可用 这个问题是因为你的o
  • Kubernetes v1.21 发布,新版本主要特性

    美国时间 4 月 8 日 xff0c Kubernetes v1 21 正式发布 xff0c 这是 Kubernetes 在 2021 年发布的第一个版本 此版本包含 51 项增强功能 xff1a 13 项增强功能已进入稳定阶段 xff0c
  • 基于51单片机的火焰报警器

    基于51单片机的火焰报警器 一 模块描述 1 可以检测火焰或者波长在760纳米心1100纳米范围内的光源 2 探测角度60度左右 xff0c 对火焰光谱特别灵敏3灵敏度可调 图中蓝色数字电位器调节 3 对火焰的探测距离 跟灵敏度和火焰强度有
  • STM32的大小端模式——什么是大小端模式?

    目录 1 什么是大小端模式2 为什么会有大小端模式之分3 什么情况需要考虑大小端模式4 常见的设备的大小端模式5 测试大小端模式例程6 大小端转化例程 1 什么是大小端模式 大端模式Big Endian xff1a 高字节存于内存低地址 x
  • MDK KEIL 烧录STM32下载错误:Flash Timeout.Reset the Target and try it again.解决办法(芯片解锁 解除读报护)

    使用keil开发STM32点下载时出现下面的报错 xff1a 点确定后 xff1a 出现如上情况很可能是该芯片锁死 xff0c 即设置了读写保护 解决方法是想办法解锁芯片 xff0c 可以使用ST Link配合stlink utility软
  • Visual Studio 如何创建C/C++项目

    这里不说Visual Studio安装过程 xff0c 默认已经安装好软件 对Visual Studio安装有疑问的可以参考 xff1a Visual Studio安装教程 1 打开软件Visual Studio xff0c 点击创建新项目
  • Visual Studio安装教程

    本文章主要记录Visual Studio2019的安装过程 xff0c 由于只用于开发C C 43 43 xff0c 因此关于其它语言支持将不安装 xff0c 仅供参考 一 下载 1 下载地址在微软官网 xff1a 微软官网 2 选择菜单栏
  • CAN波形解析实例(1)

    这里的CAN数据波形抓取的是两个STM32F103设备通过CAN通信一方发送另一方接收 xff0c CAN收发器使用的是TJA1051 xff08 扩展帧发送数据ID 61 0x18DAF110 Data 61 0x06 0x08 xff0
  • GPIO推挽输出和开漏输出模式区别详解

    以STM32参考手册中的GPIO输出配置图为例 xff1a 看到输出驱动器虚线框中的内容 xff0c 输出驱动器中的P MOS和N MOS两个MOS管就是实现推挽输出和开漏输出的关键 推挽输出模式下 xff0c P MOS和N MOS都正常

随机推荐

  • 树莓派新手入门教程

    截至目前 20210405 xff0c 树莓派最新版本为4B xff0c 如下图所示 xff1a 树莓派3B 43 的主要的部件位置 xff1a 下载最新Raspbian系统镜像 1 首先进入树莓派官网 xff1a https www ra
  • 公司研发工具链体系化建设,帮助公司从混乱走向正规

    一 软件发布平台 没办法对外提供二进制库下载便捷方式不方便部署 xff0c 不同版本之间预览和说明性欠缺问题 可以参考的解决方案 xff1a https www cnblogs com djlsunshine p 11164770 html
  • 关于写代码的几个看法

    最近在新公司负责bug的修复 xff0c 发现很多的代码逻辑理解起来有些困难 现在将其中观察到的现象列出来 xff0c 谈谈自己的看法 1 类过大 对于代码来说 xff0c 我们在编写的时候最好做到SRP Single Responsibi
  • 树莓派VNC server设置开机自启动

    目前已测试OK的几个方法 xff1a 方法1 xff08 作为服务自启动 xff09 xff1a 在 etc init d 中创建一个文件 例如tightvncserver xff1a span class token function s
  • 一个结构体 = 另一个结构体(同类型结构体之间可直接赋值操作)

    两个同类型结构体变量可以直接赋值 xff0c 不同类型结构体不能直接赋值 span class token macro property span class token directive hash span span class tok
  • FreeRTOS任务切换过程深层解析

    FreeRTOS 系统的任务切换最终都是在 PendSV 中断服务函数中完成的 xff0c uCOS 也是在 PendSV 中断中完成任务切换的 为什么用PendSV异常来做任务切换 PendSV 可以像普通中断一样被 Pending xf
  • QT C++入门学习(1) QT Creator安装和使用

    Qt官方下载 Qt 官网有一个专门的资源下载网站 xff0c 所有的开发环境和相关工具都可以从这里下载 xff0c 具体地址是 xff1a http download qt io 进入链接后 xff0c 是一个文件目录 xff0c 依次进入
  • QT初体验:手把手带你写一个自己的串口助手

    前言 本文记录一下用QT Creator 写一个基本功能齐全的串口助手的过程 xff0c 整个工程只有几百行代码 xff0c 跟着做下来对新手来说可以更快了解整个QT项目的开发过程和一些常用控件的使用方法 对新手学习QT能增强信心 xff0
  • QT如何打包生成独立可执行.exe文件

    一 将QT程序使用Release编译 二 新建一个文件夹 xff0c 将Release编译生成的exe文件复制到新建文件夹中 先找到Release编译生成的exe文件夹位置 xff0c 与项目创建的文件夹有关 xff1a 临时文件夹 rel
  • 利用OpenCV识别不规则图形轮廓并找其中心点和角度

    关于寻找图形的轮廓 xff0c 想来大家都不陌生 但平常寻找并进行识别的轮廓都是较为标准的图形 xff0c 如圆形 xff0c 矩形等 但在一些特殊情况下 xff0c 我们所检测的图形并不是理想的标准图形 比如说我们检测元件的引脚 xff0
  • 神经网络学习小记录21——InceptionV3模型的复现详解

    神经网络学习小记录21 InceptionV3模型的复现详解 学习前言什么是InceptionV3模型InceptionV3网络部分实现代码图片预测 学习前言 Inception系列的结构和其它的前向神经网络的结构不太一样 xff0c 每一
  • Ubuntu的快乐学习3——ros的launch用法

    Ubuntu的快乐学习3 ros的launch用法 学习前言launch是什么launch的使用方法一 简单使用二 常用标签1 launch标签2 node标签3 include标签4 remap标签5 param标签6 rosparam标
  • 三周年创作纪念日

    机缘 不知不觉已经开始分享三周年了 xff0c 最开始什么都不懂 xff0c 作为自动化的学生 xff0c 以为学点算法就可以变得厉害一些 xff0c 于是学了点C 43 43 相关就开始分享 后来立志于研究深度学习算法 xff0c 感觉强
  • win10+vs2017+opencv4.0.1+opencv_contrib-4.0.1详细教程

    最近想好好认真学习一下opencv4 0 xff0c 需要用到contrib扩展库 xff0c 配置完记录下 先写一下版本信息 xff1a opencv4 0 1 xff0c vs2017和 win10 其他opencv版本安装和配置原理一
  • OpenHD---低成本开源高清数字图传

    转载注明出处 文章目录 一 前言二 OpenHD简单介绍三 图传材料准备1 树莓派2 摄像头 排线 SD卡 读卡器4 网卡 四 硬件连接五 镜像刷写六 通电测试七 系统参数设置八 连接飞控九 关于二次开发十 最后 一 前言 这篇文章是对树莓
  • PS2手柄通讯协议解析---附资料和源码

    文章目录 一 PS2介绍二 PS2通讯协议介绍 xff08 1 xff09 PS2端口介绍 xff08 2 xff09 PS2通讯过程 三 基于STM32的PS2通信源码四 文档与源码下载链接 一 PS2介绍 今天就带大家来认识一下PS2的
  • Stm32延时与计时方法(HAL库)

    文章目录 一 延时的3种方法1 循环延时2 定时器中断延时与非中断延时 三 定时器中断式计时与延时二 定时器非中断式延时四 代码例程五 同系列博客 一 延时的3种方法 首先 xff0c 先了解一下什么延时 顾名思义 xff0c 延时即是延长
  • CAN通信知识梳理及在Stm32上的应用(HAL库)

    文章目录 一 CAN通信简介二 硬件连接三 CAN总线上的电平信号四 CAN帧的种类 xff08 1 xff09 遥控帧 xff08 2 xff09 数据帧 五 CAN的仲裁方法六 CAN在Stm32上的应用 xff08 1 xff09 C
  • C语言标准库函数大全(ctype、time 、stdio、stdlib、math、string)

    文章目录 C语言函数库 一 lt ctype h gt 二 lt math h gt 三 lt stdio h gt 四 lt stdlib h gt 五 lt time h gt 六 lt string h gt 文档资料 C语言函数库
  • 作品分享:基于STM32的温度报警器含源码、原理图、PCB文件、作品报告

    文章目录 一 前言二 材料准备三 硬件部分四 软件部分1 底层封装库2 中间层3 应用层 五 外壳设计六 资料链接 一 前言 该作品是我在华工电工开放实习的作品 xff0c 本作品由七部分组成 中央为Stm32F405RG芯片 xff0c