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

一.前言

该作品是我在学校电工开放实习的作品,本作品由七部分组成。中央为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        类型:点赞、关注即可直接下载。
评论 141
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冬瓜~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值