stm32+HAL库制作红外测温枪
前言
本文展示用cubeMX+MDK制作一个红外测温枪的过程。
关注公众号小电动车,回复"测温枪"获取工程文件及其他资料,建议结合工程阅读本文。
效果
组成
{#fig:组成框图}
MCU
{#fig:组成框图}
电源
{#fig:电源模块1}
{#fig:电源模块MB102}
{#fig:电池盒}
上图的两种电源模块从功能上讲差不多,白色的可以用miniusb供电,可切换两路电压3.3或5v,黑色的可以用usb口对外输出电压,带一个开关等。
本文选用的是白色的那款,使用了充电宝供电。
传感器
{#fig:mlx90614}
{#fig:mlx90614(1m)}
这两款区别只是测量范围不同,都是用SMbus(类似iic)方式通信。淘宝各种价格都有(可能是因为电赛),如果需要购买注意甄别。
显示模块
{#fig:0.96寸OLED}
四线iic通信,线少,方便,显示信息不多的情况下非常实用。
控制
{#fig:8*8自锁开关}
笔者没有按钮,所以用这种开关代替,8*8大小可以刚好插到面包板上。
下载器
{#fig:下载器}
只需四根杜邦线,可下载也可供电。
其他
{#fig:面包板}
因为东西不多,用面包板方便搭出原型,这种带红蓝四路的面包板刚好适配上文的两种电源模块,非常方便。注意面包板红蓝线中间有断开,可以自己测一下。
还有面包板专用的线。
核心板
建立工程
{#fig:新建工程}
打开cubeMX,新建一个工程。
{#fig:选择芯片}
{#fig:配置晶振}
{#fig:配置时钟}
打开晶振后直接输入72,会自动配置好时钟树。
{#fig:LED}
为了确保核心板可以用,先点个灯看看:在核心板的丝印上看到LED对应引脚是PC13,在右边选择,打开输出模式。
一般LED都是负极接引脚,低电平亮,在中间设置默认输出高电平,避免初始化结束就亮。
选择推挽输出模式,用户标签输入LED,之后会自动生成LED的宏定义,方便调用。
{#fig:选择MDK工程}
输入地址,选择生成MDK工程。
{#fig:生成工程}
勾选此项,否则代码都会在一个c文件内,然后点击生成工程。
{#fig:弹出错误}
出现这个弹窗可能是因为中文路径的问题,导致启动s文件没找到,之后再MDK手动添加。
点亮LED
{#fig:添加启动文件}
打开MDK工程,右击这个文件夹,添加已存在的文件。
{#fig:选择.s文件}
添加完后,按快捷键F7编译。 在while添加代码:(建议打开代码补全)
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);//翻转引脚输出
HAL_Delay(500); //延时500ms
连接好下载器,F8下载程序(下载失败可能是启动方式等问题,需调整核心板上的跳帽),可以看到LED开始闪烁。
OLED屏显示
{#fig:开启iic}
打开iic模块,生成工程(此时需要关闭MDK)。
在工程文件夹内的./Core/Inc和./Core/Src分别添加OLED.h,
OLED.c文件(附件已提供),打开MDK,在main.c上方的注释之间包含已经做好的OLED.h头文件,打开它可以看到可调用的函数。
/* USER CODE BEGIN Includes */
#include "OLED.h"
/* USER CODE END Includes */
在main函数的注释之间添加初始化和刷新屏幕代码,打印HelloWorld。
/* USER CODE BEGIN 2 */
OLED_Init(); //初始化
OLED_CLS(); //清空屏幕,刷新
OLED_ShowStr(0, 0, "Hello World!", 2);//调用函数显示字符串
/* USER CODE END 2 */
把电源模块、核心板、屏幕插在面包板上,并用导线连接,下载程序。
到现在,OLED屏幕已经可以使用了。
温度传感器
与温度传感器的通信需要使用SMbus协议(类似iic),cubeMX也可以开启硬件外设,这里为了方便,使用模拟SMbus。
打开PB0, PB1,默认拉高,开漏输出,更改名字。
在工程文件夹内的./Core/Inc和./Core/Src分别添加mlx90614.h,
mlx90614.c文件(附件已提供),打开MDK,在main.c上方的注释之间包含已经做好的mlx90614.h头文件,打开它可以看到可调用的函数。
/* USER CODE BEGIN Includes */
#include "OLED.h"
#include "mlx90614.h"
/* USER CODE END Includes */
在下方找到一个用户代码区,定义变量。
/* USER CODE BEGIN 0 */
float Tem; //存储读取到的温度值
uint8_t String_Value[10]; //OLED的显示的字符串
/* USER CODE END 0 */
在循环内添加代码,每3ms读取一次温度值并显示。
/* USER CODE BEGIN WHILE */
while (1)
{
Tem = SMBus_ReadTemp();//温度读取函数
sprintf(String_Value," T = %.1f ^", Tem);//把浮点数转入到字符串内
OLED_ShowStr(0, 0, String_Value, 2);//显示字符串
HAL_Delay(3);
/* USER CODE END WHILE */
把温度传感器插在面包板上,并用导线连接,下载程序。
可以看到读取出的温度值。
到此温度传感器已经完成,按钮方面用中断或者查询可以完成,此处不在赘述。
下载
关注公众号小电动车,回复"测温枪"获取工程文件及其他资料,建议结合工程阅读本文。