Infrared Temperature Sensor
| ||||||||||||||||||||
| ||||||||||||||||||||
说明
产品概述
本模块是一款非接触式红外温度传感器,能根据被测物体的红外辐射能量大小和波长分布来检测物体的表面温度。
产品特点
- 非接触式,高精度,高分辨率,响应时间快
- 出厂自带校准,带温度梯度补偿
- 内置电平转换电路,可直接接入3.3V或5V的MCU系
产品参数
参数名称 | 参数 |
工作电压 | 3.3V/5V |
环境温度测量范围 | -40°C ~ 85 °C |
物体温度测量范围 | -70°C ~ 380 °C |
分辨率 | 0.02°C |
精度 | ±0.5°C ( 0~50°C) |
视场角(FOV) | 35° |
总线接口 | I2C |
产品尺寸 | 28mm x 16 mm |
固定孔尺寸 | 2.0mm |
主要用途:
- 高精度非接触温度测量、工业温度控制、带温度控制的家用电器等
接口说明
引脚 | 功能 |
VCC | 电源正(3.3V/5V) |
GND | 电源地 |
SDA | I2C数据输入 |
SCL | I2C时钟信号 |
通讯方式
模块的通讯方式有PWM 和 SMBus(系统管理总线),这里只介绍SMBus接口通讯。SMBus是一种两线制接口。它基于I2C 总线原理演变而来,可以认为是简化版的I2C总线。
SMBus和I2C 总线一样,在传送数据过程中共有三种类型信号:开始信号、结束信号和应答信号。
开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。
结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。
应答信号:主机(从机)接收到从机(主机)的8bit数据后,需要向对方发送应答信号,使对方知道数据发送是否成功,即把SDA拉低一个完整的SCL周期。
SMBus 总线协议
在从机(SD)接收到每8位数据后,会回复 ACK/NACK 信息。当主机(MD)初始化通信,将首先发送SD的地址,只有能识别该地址的 SD 会确认,其它的会保持沉默。如果 SD 未确认其中的任意字节, MD 应停止通信并重新发送信息PEC 的计算结果是基于除 START、REPEATED START、STOP、ACK 和 NACK位外的所有位 。PEC 是 CRC-8 的多项式 X8+X2+X1+1。每个字节的最高有效位首先传送。
SMBus读数据时序
首先主机会发送一个Start信号,然后将从机的7位地址与“读”操作位组合成 8 位的数据发送给从机,从机接收到后会响应一个ACK,主机再发送8位格式的命令给从机,从机接收到后发送ACK,此时主机重新发送一个Start信号,然后将从机的7位地址与读操作位组合成 8 位的数据发送给从机,从机接收到数据后发送ACK,然后将其寄存器中的值发送给主机,主机每接收到一个字节数据后都要回应一个ACK,最后收到PEC后回应ACK,并且发送Stop信号结束通信。
SMBus写数据时序
首先主机会发送一个Start信号,然后将从机的7位地址与“写”操作位组合成 8 位的数据发送给从机,从机接收到后会响应一个ACK信号,主机再发送8位格式的命令给从机,从机接收到后发送ACK信号,然后主机发送低字节数据,收到从机的ACK后,再发送高字节数据,收到从机的ACK后,再发送PEC字节数据,收到从机的ACK后,主机发送Stop信号以结束通信。
MLX90614的RAM寄存器
MLX90614的EEPROM寄存器
注*: xxxxx 代表要读取/写入的上面的RAM、EEPROM寄存器地址的低5位。
注**: 行为类似读命令。 MLX90614 在传送外 16 位数据后会反馈 PEC,其中只有 4 位是主机(MD)需要的,它会在传送完第一个字节后停止通信,读取和读取标示符的区别在于后者没有重复起始位。
读取标示符:
- Data[7] - EEBUSY – 先前对 EEPROM 的读/写操作正在进行,高有效。
- Data[6] – 未使用
- Data[5] - EE_DEAD - EEPROM 发生双重错误,高有效。
- Data[4] - INIT – POR 初始化程序正在进行,低有效。
- Data[3] – 未执行。
- Data[2..0] 和 Data[8..15] – 都为 0。
MLX90614的命令格式
注*: xxxxx 代表要读取/写入的上面的RAM、EEPROM寄存器地址的低5位。
注**: 行为类似读命令。 MLX90614 在传送外 16 位数据后会反馈 PEC,其中只有 4 位是主机(MD)需要的,它会在传送完第一个字节后停止通信,读取和读取标示符的区别在于后者没有重复起始位。
读取标示符:
- Data[7] - EEBUSY – 先前对 EEPROM 的读/写操作正在进行,高有效。
- Data[6] – 未使用
- Data[5] - EE_DEAD - EEPROM 发生双重错误,高有效。
- Data[4] - INIT – POR 初始化程序正在进行,低有效。
- Data[3] – 未执行。
- Data[2..0] 和 Data[8..15] – 都为 0。
如何使用
程序分析
从上面的SMBus 总线协议和通讯时序可以知道,开始通讯时,首先主机会发送一个开始信号,然后将从机的7位地址(SA)与读/写操作位组合成 8 位的数据发送给从机,当我们的SMBus总线上只有一只MLX90614传感器时,7位的从机地址(SA)默认是0x00,当需要用同一总线操作多只MLX90614时,可以修改EEPROM中的从机地址。那么主机发送完开始信号后,如果我们要读MLX90614,那么就接着发送 (SA<<1) + 0 = 0x00,如果我们要写,那么就接着发送 (SA<<1) + 1 = 0x01。
根据上面的RAM寄存器地址表格,可以知道在RAM寄存器中,环境温度寄存器地址为0x06,物体温度寄存器地址为0x07,从命令表格知道,访问RAM的操作码是0x00,访问EEPROM的操作码是0x20,一般我们只需要从RAM中读取温度,不需要访问EEPROM。那么我们要访问RAM中的环境温度寄存器,命令为:0x00 | 0x06 = 0x06,访问RAM中的物体温度寄存器,命令为:0x00 | 0x07 = 0x07。
以STM32的程序为例,该驱动程序是通过PB8、PB9来模拟SMBus时序,驱动代码在smbus.c文件中。我们按照上面介绍的时序读取到环境温度、物体温度数据后,可以根据数据手册来计算环境温度、物体温度:
摄氏度值(°C): ((TempData_H <<8) + TempData_L )*0.02 - 273.15
测量原理
对于非接触式红外测温模块,很重要的一个概念是“视场 (FOV)”。 视场是由温差电堆接收到50%的辐射信号来确定的,并且和传感器的主轴线相关。测得的温度是视场内被测物体的温度加权平均值,所以当被测物体完全覆盖FOV视场时的准确度是最高的。
本模块的传感器型号是MLX90614ESF-BCC,上图为BCC的FOV图,FOV = 35°,即:
被测物体半径÷与传感器探头的距离 = tan35°,即当被测物体的半径为5CM时,最大的测量距离为7CM(指的是保证该温度值是准确的最大测量距离)。
而市面上常用的BAA的FOV图如下:
对比了一下两个型号的传感器,实际测试的结果是:
拿手掌作为温度参考物,当BCC距离手掌7CM以内时,温度基本不变,当距离扩大至15CM时,温度值才下降了1°C。而对于BAA,当距离手掌2CM以外时,温度就已经开始变化得很快,当距离扩大至4CM时,温度值就已经下降1°C。
区别很明显,BCC比BAA性能要好不少,可见测温的距离和准确度和FOV有关,FOV越小,性能就越好。
RPI使用教程
开启I2C接口
- 打开树莓派终端,输入以下指令进入配置界面
sudo raspi-config 选择 Interfacing Options -> I2C ->yes 启动 i2C 内核驱动
sudo reboot
安装库
如果使用bookworm系统,只能使用lgpio库,bcm2835跟wiringPi无法安装与使用,python库可以不安装,直接运行程序即可
BCM2835
#打开树莓派终端,并运行以下指令 wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.71.tar.gz tar zxvf bcm2835-1.71.tar.gz cd bcm2835-1.71/ sudo ./configure && sudo make && sudo make check && sudo make install # 更多的可以参考官网:http://www.airspayce.com/mikem/bcm2835/
wiringPi
#打开树莓派终端,并运行以下指令 cd sudo apt-get install wiringpi #对于树莓派2019年5月之后的系统(早于之前的可不用执行),可能需要进行升级: wget https://project-downloads.drogon.net/wiringpi-latest.deb sudo dpkg -i wiringpi-latest.deb gpio -v # 运行gpio -v会出现2.52版本,如果没有出现说明安装出错 #Bullseye分支系统使用如下命令: git clone https://github.com/WiringPi/WiringPi cd WiringPi ./build gpio -v # 运行gpio -v会出现2.70版本,如果没有出现说明安装出错
lgpio
wget https://github.com/joan2937/lg/archive/master.zip unzip master.zip cd lg-master sudo make install # 更多的可以参考官网:https://github.com/gpiozero/lg
- 安装Python函数库
#python3 sudo apt-get update sudo apt-get install python3-pip sudo apt-get install python3-pil sudo apt-get install python3-numpy sudo pip3 install RPi.GPIO sudo pip3 install spidev
下载测试程序
打开树莓派终端,执行:
sudo apt-get install p7zip-full -y sudo wget https://www.waveshare.net/w/upload/5/53/Infrared-Temperature-Sensor-Code.7z 7z x Infrared-Temperature-Sensor-Code.7z cd Infrared-Temperature-Sensor-Code/RaspberryPi/
硬件连接
MLX90614 | Raspberry Pi | 功能 |
Board物理引脚序号 | ||
VCC | 3.3V | 电源输入 |
GND | GND | 电源地 |
SDA | 3 | I2C数据输入 |
SCL | 5 | I2C时钟信号 |
运行测试程序
以下命令请在RaspberryPi下执行,否则不在索引不到目录;
C
- 重新编译,编译过程可能需要几秒
cd c sudo make clean sudo make sudo ./main
python
cd python sudo python3 MLX90614.py
现象
在树莓派运行程序后,就会实时输出环境温度跟探测到的物体温度,如下图所示:
C
python
STM32使用教程
我们提供的例程是基于STM32F103RBT6,提供的连接方式是对应的STM32F103RBT6的引脚为例,如果有需要使用其他STM32,请按实际引脚连接
硬件连接
MLX90614 | STM32 | 功能 |
VCC | 3.3V | 电源输入 |
GND | GND | 电源地 |
SDA | PB9 | I2C数据输入 |
SCL | PB8 | I2C时钟信号 |
软件说明
例程是基于HAL库进行开发的。
请在资料里面下载程序,找到STM32程序文件目录,打开Infrared-Temperature-Sensor-Code\STM32\STM32F103RB\MDK-ARM
目录下的Infrared-Temperature-Sensor.uvprojx,即可看到程序。
下载成功后,运行SSCOM,就会实时输出环境温度跟探测到的物体温度。
现象
打开串口调试软件,就会实时输出环境温度跟探测到的物体温度。
Arduino使用教程
本例程已经在Arduino uno上测试通过,直接按下表连接Arduino uno即可
硬件连接
您可以对照以下表格连线。
MLX90614 | Arduino | 功能 |
VCC | 5V | 电源输入 |
GND | GND | 电源地 |
SDA | SDA | I2C数据输入 |
SCL | SCL | I2C时钟信号 |
安装编译软件(Windows教程)
运行程序
在我们提供的资料里面下载程序,并解压,再进入Infrared-Temperature-Sensor-Code/Arduino/WaveShare_MLX90614
双击打开WaveShare_MLX90614.ino文件。
选择你的开发板,跟对应的端口。
进行编译下载,如下图:
下载成功后,运行SSCOM,就会实时输出环境温度跟探测到的物体温度。
现象
打开串口调试软件,就会实时输出环境温度跟探测到的物体温度。
FAQ
- 实际测试的结果,当拿手掌作为温度参考物,传感器距离手掌7cm以内时,温度基本不变,当距离扩大至15cm时,温度值才下降了1°C。准确度会随距离增加而下降。