ARDUINO使用MLX90614红外温度传感器研究笔记

(温馨提醒:玩之前,建议把电脑上的计算器模式调成“程序员”模式,因为后面可能会用到大量二进制和十六进制的转换。)

相关资料:下载

由于最近由于公司项目,需要一款红外温度传感器,于是在某宝买到了一款GY-906传感器产品(HW-691模块)。以下就是产品的图片:

ARDUINO使用MLX90614红外温度传感器研究笔记_第1张图片

其核心是使用了Melexis公司(https://www.melexis.com/)的MLX90614传感器。如下图所示:

ARDUINO使用MLX90614红外温度传感器研究笔记_第2张图片

MLX90614传感器是一个系列,有许多的的子型号,在性能和外观上略有差异。有兴趣的同学可以自己研究一下。详细的内容可以参考官网发布的datasheet和相关的使用手册。

ARDUINO使用MLX90614红外温度传感器研究笔记_第3张图片

对于GY-906,我只知道是MLX90614ESF,具体版本店家没有写,也没有技术支持(有点坑)。只说是3-5V,保险起见,实验中用的都是3V,证实可用。

选用这颗传感器除了是因为使用红外的非接触测温外,最重要的是它的通讯方式是I2C通信协议(也有写成IIC的)主要用到SDA和SCL两条线。不过说明里写的都是SMBus,两者其实还是有点差异的,具体可以查阅相关资料,使用的时候到没什么感觉。Arduino有专门支持I2C的接口,实验中使用的模拟A4、A5口,其中A4为SDA,A5为SCL。顺便放一张Arduino接口定义图,如下图所示:

ARDUINO使用MLX90614红外温度传感器研究笔记_第4张图片

这里先说一下MLX90614的EEPROM和RAM,这两个相当重要。前者主要是用来存放地址、发射频率等参数的,有部分是可以用户自己修改的。后者不能修改,但是可以读取温度。具体内容如下所示:

ARDUINO使用MLX90614红外温度传感器研究笔记_第5张图片

ARDUINO使用MLX90614红外温度传感器研究笔记_第6张图片

通常,如果只是接了一个MLX90614的话,可以通过地址0x00或者0x5A来访问。其中0x00是单个I2C设备连接时,默认都能访问的。0x5A是MLX90614出厂时默认设置的。可以通过修改EEPROM中的0E地址来改变里面的值。换句话说,你如果不小心改了MLX90614的地址,然后又忘记了,你只要把它单独接在Arduino上,然后访问EEPROM中的0E地址就可以读出来了。这里要提醒一下,访问EEPROM中的0E地址,实际中输入的应该是0x2E,很多人一开始都搞不明白,其实原厂说明书里有写的,可能大家都没看懂下面这段:

ARDUINO使用MLX90614红外温度传感器研究笔记_第7张图片

如果你的计算机基础很扎实或者已经把计算器模式调成了“程序员”模式,那就可以开始计算了。比如说我要访问RAM中的TA,而TA在RAM中的地址是0x06,那么换算成二进制就是0000 0110,然后把右边5位拿出来与Opcode组合起来成为0000 0110,转换成十六进制就是0x06,这个就是真正的命令。

同样道理,如果要访问EEPROM中的SMBus Address,也就是表格中的0x0E,那么与Opcode组合后的二进制就是0010 1110,转换成十六进制就是0x2E。

知道了如何正确表示命令,那么接下来就好办了。对于Arduino来说,要访问I2C设备需要调用wire.h库。然后基本上按照如下的流程来读和写操作:

ARDUINO使用MLX90614红外温度传感器研究笔记_第8张图片

ARDUINO使用MLX90614红外温度传感器研究笔记_第9张图片

对于读操作来说,相对简单一点。其中:

Slave Adress:就是传感器的地址。默认的是0x5A,单个接的时候也可以用0x00,这个值被存放在EEPROM中0E位置,读取的默认值是0xBE5A,可以被修改。但是,只有低8位有效。换句话说,我如果改成0xBE10,那么地址就会编程0x10。而且这个高八位只能输BE,否则数据无效,这个大概就是很多人改地址失败的原因之一。

Command:也就是寄存器地址与Opcode组合,像前面的0x2E,0x06这样的。表示你要访问的是EPPROM或者RAM中的某个寄存器位置。

Data Byte Low:低八位的值。

Data Byte High:高八位的值。

PEC:这个是一个CRC-1的循环冗余校验码,本来是用来校验数据有没有发成功的,但是很多人在发送命令时忘记加了这个(或者说根本不知道怎么计算),结果导致修改数值失败。就直接说了,这个必须有,不能缺。

这样其实就介绍了差不多了,网上的资料里也有现成的代码可以用,一般都是读取RAM中的环境温度TA,物体温度TOBJ1,某宝店家的网盘里一大堆,这里就多说了。

另外,再强调一下,如果是写数据,先要把寄存器数据清零的。比如命令为0x24,也就是修改发射频率,第一次先对高低八位分别写一遍0x00,第二次再重新用这个命令写入你要改的数据。之前我就是没注意,所以一直都没改成功,折腾了两个礼拜。

你可能感兴趣的:(Arduino相关)