#打卡不停更#【FFH】OpenHarmony设备开发(六)-红外温度传感器 原创
Table of Contents
前言
最近的一个项目需要用到红外温度传感器,便想着能不能在Hi3861上开发这个外设,经过摸索了一阵子,终于把红外温度传感器简单的开起来了,后面还会追加对传感器的使用。
本次使用开发板:HiSpark_WiFi_IoT
红外温度传感器
介绍
红外温度传感器应用广泛,在疫情期间可做体温测量,在汽车上可做空调控制、防雾应用,在家庭中可做家电温度控制等等。
MLX90614是一款红外非接触温度计(下文多以gy906简称)。TO-39金属封装里同时集成了红外感应热电堆探测器芯片和信号处理专用集成芯片。用以阻碍可见光和近红外光辐射的光学滤波器(可传播长波)集成在封装内提供对环境和日光的免疫。需注意的是封装内部的温差会影响温度计测量的精度,需要尽量将传感器和环境隔离。
协议
查阅文档时,发现这个红外温度传感器是使用SMBus通信协议或者PWM(默认SMBus输出格式),其中SMBus协议需要IO口设置为开漏输出,在Hi3861的IO口模式选择中并未发现有开漏输出选项,因此暂时不选择SMBus协议
通过摸索了一大阵子得知,SMbus 规格是由 I2C 简化而来。两条信号线为 SMBCLK 和 SMBDATA. 这和 I2C 上的 Clock(SCL) 和 Data(SDA) 是一样的。SMBus的读取数据格式与I2C协议大差不差,差别只在于电平认定。
两者协议的电平认定虽有不同,但也有部分交集。
I2C协议中有两者电平认定:相对认定和绝对认定,其中的相对认定是依据Vdd的电压来决定,高电平为0.7 Vdd,低电平低于0.3 Vdd即可。
再看一看红外温度传感器上的SMBus协议(如下图),高电平需要高于Vdd-0.1,和I2C协议符合。而低电平最大只能0.6V,这里就只能希望Hi3861的I2C能将低电平拉得到0.6V以下了。但巧合了,经过验证Hi3861可以使用!
准备
本次使用到的是MLX90614BCC版本,该型号的供电是3V,注意不要不要插到5V的供电。!
接线:
VIN->3V3,GND->GND,SLK->SLK,SDA->SDA
既然已经使用到了I2C,那么便需要知道该设备的地址,查阅了挺久的,发现了该设置的默认地址为0X00或者是0XB4,其中0x00是单个I2C设备连接时默认都能访问到。并且可以修改EEPROM,对其进行修改I2C地址。如果不小心修改了地址,又忘记了地址,便可以把传感器单独插上去,读0X0E的数值便可以得到设备的地址。
传感器将温度数据存在RAM里面的Tojb1,而ram里面Tobj1的地址为0x07,则得知读取温度的指令则为0x07,向该设备发送0x07,便可读取到温度数据
代码编写
IO口初始化
老步骤,第一步先IO口初始化
流程:
GPIO口初始化(开发板背后有标注GPIO口:13,14)
IO口复用成I2C
I2C口初始化(从hi_io.h里面的GPIO口管脚功能列举可得知I2C口)
主函数及线程
查询相关文档,gy906反馈的信息有三个,第一个是低位数据,第二个是高位数据,第三个是校验位.将高位数据和低位数据拼接,再通过公式计算即可得出温度数据.
流程:
- 初始化I2c传输数据
- 接收传感器反馈回来的数据
- 判断数据的正确性
- 对数据做拼接计算,即可得出温度数据
校验算法
算法的代码如下(部分介绍打在注释上):
大佬文档读的真是细。
大佬太强了