5 红外测温枪实现
5.1 MLX90614温度读取
MLX90614是基于I2C的,根据MLX90614的读写时序,其核心函数如下。
int8_t BSP_MLX90614_ReadReg(i2c_master_ctrl_t * const p_api_ctrl, uint8_t regAddr, uint16_t *pReadData)
{
uint8_t writeBuf[1] = {0};
uint8_t readBuf[3] = {0};
uint8_t ValBuf[6] = {0};
uint8_t prcRegVal = 0;
ValBuf[0] = MLX90614_ADDR << 1;
ValBuf[1] = (uint8_t)(regAddr);
ValBuf[2] = (MLX90614_ADDR << 1) | 0x01;
fsp_err_t err;
writeBuf[0] = (uint8_t)(regAddr);
err = R_IIC_MASTER_Write(p_api_ctrl, writeBuf, 1, true);
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS);
err = R_IIC_MASTER_Read(p_api_ctrl, readBuf, 3 , false);
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS);
err = R_IIC_MASTER_Write(p_api_ctrl, writeBuf, 1, true);
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS);
err = R_IIC_MASTER_Read(p_api_ctrl, readBuf, 3 , false);
if (err != FSP_SUCCESS)
{
return -1;
}
else
{
ValBuf[3] = readBuf[0];
ValBuf[4] = readBuf[1];
ValBuf[5] = readBuf[2];
prcRegVal = CRC8_Calc(ValBuf, 5);
if(prcRegVal == ValBuf[5])
{
*pReadData = (uint16_t)((readBuf[1] << 8) + readBuf[0]);
}
}
return 0;
}
float BSP_MLX90614_ReadTemp(i2c_master_ctrl_t * const p_api_ctrl)
{
float temp;
uint16_t data;
if( 0 == BSP_MLX90614_ReadReg(p_api_ctrl, MLX90614_TOBJ1, &data))
{
temp = (float)(data * 0.02f - 273.15f);
}
else
{
temp = MLX90614_TEMP_READ_ERR_CODE;
}
return temp;
}
最后在Temperature任务中调用BSP_MLX90614_ReadTemp ()函数不断读取温度值。
5.2 MLX90614体温矫正
非接触式红外温度传感器测额温或是体表温度和实际体温是有一定的差异的。因此采用了迈来芯原厂提供的额温转体温参考算法来提高测温精度,以补偿后的温度作为人体体温输出。其核心算法如下:
float TF_to_Tbody(float ta, float tf)
{
float tf_low, tf_high = 0;
float tbody = 0;
if(ta <= TA_LEVEL)
{
tf_low = 32.66f + 0.186f*(ta-TA_LEVEL);
tf_high = 34.84f + 0.148f*(ta-TA_LEVEL);
}
else
{
tf_low = 32.66f + 0.086f*(ta-TA_LEVEL);
tf_high = 34.84f + 0.1f*(ta-TA_LEVEL);
}
if((tf_low <= tf) && (tf <= tf_high))
{
tbody = 36.3f + 0.5f/(tf_high - tf_low)*(tf - tf_low);
}
else if(tf > tf_high)
{
tbody = 36.8f + (0.829321f + 0.002364f*ta)*(tf-tf_high);
}
else if(tf < tf_low)
{
tbody = 36.3f + (0.551658f + 0.021525f*ta)*(tf-tf_low);
}
return tbody;
}
5.3 红外测温枪顶层应用实现
关于OLED、按键等具体实现就赘述了,整个工程的代码结构如下。

Figure 5‑1 工程的代码结构
这里只讲解红外测温枪顶层应用实现。看看几个任务的实现。
按键KEY1用于控制温度测量,按键KEY2用于导数历史数据,通过串口输出。OLED会实时显示温度值。
不同的温度值,不同的LED会闪烁,代表不同的温度等级,LED3表示发烧,LED2表示体温正常,LED1表示低温。
6 功能演示
按下按键KEY1,蜂鸣器会发出滴答声,OLED会显示人体温度,同时回通过串口输出温度值。


7 总结
1.测试结果
经过上述方案的检测,能满足预期要求,测温误差在正常范围内。
2.主要误差分析
当测量距离增加时,由于红外温度测量系统的视场不变,如果被测物体不能填满视场,那么系统检测到的来自被测物体的红外辐射能量就会减少,从而导致测量精度降低。另一方面,当测量距离增加时,在大气吸收的影响下,温度测量系统接收的辐射将减少,导致测温系统产生误差。因此推荐距离为2-4cm。
Note:红外体温枪用到了很多外设,相关的原理和使用方法请参看笔者的帖子,这里重点讲解MLX90614的实现。