一、简介
我的测温模块是安服优的B-1的红外测温模块(最好在淘宝官方店购买,其他地方可能是盗版哦)
我自己就吃亏在拼多多买,然后买回来的模块一连接板子,板子的正常工作的指示灯就灭了,还让我自己买了一个万用表,最后测出来模块短路了(衰啊。。。。)
不过这个模块的优点就是精度了,官方温度说可以达到0.2的精确度,我查询到的所有测温模块这个精度属于最高了。
测温模块链接:安服优B-1红外测温传感器模块 体温物温采集IR温度UART/IIC接口 - Taobao
k210套件的话就是一系列套件链接在下面(这个我主要是做人脸识别的)
二、模块介绍
①模块协议转换(这个模块比较特殊,我也是第一次接触这种通信协议可以转换的)
②uart通信方式 帧格式
③uart通信方式设置
④测温命令
以上了解到基本这个模块就可以上手了!!!
三、代码部分
B_1_uart.h
#ifndef _B_1_INIT_H_
#define _B_1_INIT_H_
#include <uart.h>
#include <stdio.h>
#include <fpioa.h>
#include "sleep.h"
#include <string.h>
// 这些东西是因为 k210的IO口是FPIOA的,也就是它的IO引脚你可以自己设置为UART的rx、tx或者iic的scl/sda,所以按照人家官方的API接口就是这样
//pin num
#define PIN_B1_URAT_RX (32)
#define PIN_B1_URAT_TX (33)
//pin function
#define FUNC_B1_URAT_RX (FUNC_UART1_RX)
#define FUNC_B1_URAT_TX (FUNC_UART1_TX)
//gpio uart
#define UART_B_1 (UART_DEVICE_1)
#endif
mian.c
#include "B_1_init.h"
int B_1_init(void)
{
int B_1_init_flag;
B_1_init_flag = fpioa_set_function(PIN_B1_URAT_RX, FUNC_B1_URAT_RX);
if(B_1_init_flag != 0)
{
printf("B_1_init_fpioa_set_function_RX error!\r\n");
return -1;
}
B_1_init_flag = fpioa_set_function(PIN_B1_URAT_TX,FUNC_B1_URAT_TX);
if(B_1_init_flag != 0)
{
printf("B_1_init_fpioa_set_function_TX error!\r\n");
return -1;
}
return 0;
}
void B_1_uart_init(void)
{
uart_init(UART_B_1);
uart_configure(UART_B_1, 38400, UART_BITWIDTH_8BIT, UART_STOP_1, UART_PARITY_NONE);
}
void SETSendCmd(int cmd, char *para, char para_len)
{
char buf[128] = {0};
int chk = 0,i;
// 包头
buf[0] = 0xAA;
buf[1] = 0xA5;
// 包长
buf[2] = 3 + para_len;
// 包命令
buf[3] = cmd;
// 包内容
for(i = 0; i < para_len; i++)
{
chk += para[i];
buf[4 + i] = para[i];
}
// 校验和
chk = buf[2] + cmd + chk;
buf[4 + para_len] = chk;
// 包尾
buf[5 + para_len] = 0x55;
for(i = 0; i < strlen(buf); i++)
{
uart_send_data(UART_B_1, &buf[i], 1);
}
usleep(300);
printf("\n");
}
// 设置通信方式
int B_1_COMM_SET(void)
{
char para[10] = {0};
char recv_buf[128] = {0};
para[0] = 0x01;
SETSendCmd(0x05, para, strlen(para));
uart_receive_data(UART_B_1, recv_buf, 20);
usleep(300);
return 0;
}
int main()
{
// 这些主要就是初始化
B_1_init();
B_1_uart_init();
// 设置uart通信方式
B_1_COMM_SET();
char recv_buf[128] = {0};
while(1)
{
float tmp = 0;
SETSendCmd(0x01,NULL,0);// 发送测温命令
uart_receive_data(UART_B_1, recv_buf, 20);
usleep(100000);
//温度计算
tmp += (recv_buf[5] >> 4) * 256 * 16;
tmp += (recv_buf[5] & 0x0F) * 256;
tmp += (recv_buf[6] >> 4) * 16;
tmp += (recv_buf[6] & 0x0F);
tmp /= 10;
printf("tmp = %f\n",tmp);
sleep(1);
}
return 0;
}
四、结果展示
设置通信方式串口得到的数据(以上代码没有打印的这些操作是因为我完成功能后给删了)
测温串口得到的数据
五、重点问题点
我这边主要把我遇到的问题和大家分享一下;
① 测温模块是 上电内5秒内 要发送通信方式设置的命令,也就是先把程序烧录进去后,关掉开发板电源,再连接模块,然后再给开发板供电,然后复位,跑代码!(一定要理解上电5秒内,很重要!!!)
② 就是这个测温模块超级容易误触,接触不良,拿着它的时候一定要注意手势,不然心态真的会炸裂!!!