本来是打算利用板载的HTS221传感器来测量环境温湿度的,遗憾的是,因为获得的资料不多,本身我的英语也不好,在折腾了两天后,决定还是放弃了。转而使用国产的GXHT30温湿度传感器,还是利用CN2接口中PH4和PH5作为I2C接口测量温湿度。 简单介绍下GXHT-30的资料。GXHT-30的工作电压从 2.2 V 到 5.5 V都可以适应。采用I2C协议交换数据,访问地址为0x44。 一、温湿度测量 进行温湿度测量,需先发送一个开始信号,然后发送一个 I2C的写操作头,然后再跟随一个 16 位的温湿度转换命令。传感器收到上位机发送的每个字节数据后,会通过将 SDA 总线拉到低电平给出 ACK 信号。 单次转换模式的测量命令 第一个 SCL 空闲时间段表示至少等待 1ms (白色框代表上位机发送的数据,灰色框代表传感器芯片发送的数据)
输出的温湿度数据是 16 位无符号数据.,这些数据已经经过线性化处理和温度补偿。将这些原始数据转换成真实的温度和湿度数据需要经过用到下列公式: 相对湿度转换公式(%RH): 温度转换公式 (°C & °F): SRH和ST分别代表温湿度传感器芯片输出的湿度和温度原始码字。需要注意在公式计算 SRH 和 ST 必须换算为十进制数字。 二、通信时序 输入输出 pad 的时序图. SDA 方向是以传感器芯片端为参考。加粗的 SDA 是由传感器控制, 普通的 SDA 线是由上位机控制的。
三、 进入单次转换模式的命令 芯片收到这些命令后会进入单次转换模式,完成一次完整的温湿度转换后,将温湿度数据存放在接口寄存器,等待上位机读取测量数据。这组测量数据包括 16bit 的温度数据以及8bit 的 CRC,随后是 16bit 的湿度数据以及 8bit 的 CRC。 在单次转换模式中可以选择不同的 16 位转换命令,具体说明见下表。它们的区别在于转换重复率和 clock stretching 的开启和关闭。重复率越高,转换持续的时间越长,功耗越高,但是转换精度越高。 四、读取单次转换模式中温湿度数据 在传感器完成温湿度测量之后,上位机可以通过发送 START 信号+I2C 读取数据头来 读取温湿度数据,如果温湿度数据已经准备好,那么芯片会向上位机发送 ACK 信号,并随后发送 2 字节的温度数据加 1 字节的 CRC 校验数据,然后再发送 2 字节的湿度数据加 1 字节的 CRC 校验数据。上位机需要对接收到的每个字节数据发送 ACK,否则芯片会停止发送数据。 如果 clock stretching 功能关闭,那么发送温湿度转换命令后,如果温湿度转换还没有完成就开始读温湿度数据,这时候芯片会给出 NACK。只有等待时间足够长,保证温湿度转换已经完成再读数据才会得到芯片的响应。 当 clock stretching 开启时,不论温湿度测量是否完成,只要上位机发送读数据头,芯片都会给出 ACK,然后将 SCL 拉低。一旦测量完成会立刻释放 SCL 总线,然后芯片开始发送测量到的温湿度数据。 四、周期测量温湿度的命令 在收到周期转换温湿度命令后,芯片会周期性转换温湿度。可以选择不同的周期转换模式,如表所示。这些命令的主要差别在于重复率(高、中、低)和周期转换频率(如每秒 0.5次,1 次,2 次,4 次和 10 次)。在周期转换模式下 clock stretching 不能开启。周期转换频率和重复率的不同会影响测量的时间和功耗。 周期转换命令(白色框由上位机控制,灰色框由传感器芯片控制)注意最高转换频率可能会引起芯片的自发热问题。 五、读取周期测量的温湿度数据 读取周期测量得到的温湿度数据需要发送专用的数据读取命令。如果当前没有测量数据,那么芯片会对上位机发送的读数据头给出 NACK ,然后上位机需要停止通信。 如果上位机读出了温湿度数据,那么存储温湿度数据的缓存器会被清零,直到下一次测量出了温湿度数据,那么存储温湿度数据的缓存器会被清零,直到下一次测量得到的温湿度数据被装载进来。 六、测试结果 根据以上资料,在原来程序的基础上进行修改,追加GXHT30传感器通讯部分,配合OLED和生命检测,周期取得环境温湿度数据,以及是否有人存在。程序运行效果如下: 到这里,基本上就已经完成主体程序中数据区的部分了。剩下的是设置必要的参数,保证环境在有人状态下,如果环境温湿度不适合场合,启动车窗的开启处理了。
|