ZHCAFX9 August 2025 HDC1010 , HDC1080 , HDC2010 , HDC2021 , HDC2022 , HDC2080 , HDC3020 , HDC3020-Q1 , HDC3021 , HDC3021-Q1 , HDC3022 , HDC3022-Q1 , HDC3120
在本例中,已将 HDC2010 传感器配置为按需触发(单次触发)模式,并禁用了自动测量模式 (AMM)。该过程首先写入配置寄存器 (0x0E),以将器件设置为按需触发模式。图 2-3 中提供了配置寄存器设置的图示。
| 位 | 字段 | 类型 | 复位 | 说明 |
|---|---|---|---|---|
| 7 | SOFT_RES | R/W | 0 | 0 = 正常工作模式,此位会自行清除 1 = 软复位 EEPROM 值重新加载且寄存器复位 |
| [6:4] | AMM[2:0] | R/W | 000 | 自动测量模式(AMM) 000 = 禁用。通过 I2C 启动测量 001 = 1/120Hz(每 2 分钟进行 1 次采样) 010 = 1/60Hz(每分钟进行 1 次采样) 011 = 0.1Hz(每 10 秒钟进行 1 次采样) 100 = 0.2Hz(每 5 秒钟进行 1 次采样) 101 = 1Hz(每秒钟进行 1 次采样) 110 = 2Hz(每秒钟进行 2 次采样) 111 = 5Hz(每秒钟进行 5 次采样) |
| 3 | HEAT_EN | R/W | 0 | 0 = 加热器关闭 1 = 加热器开启 |
| 2 | DRDY/INT_EN | R/W | 0 | DRDY/INT_EN 引脚配置 0 = 高阻抗 1 = 启用 |
| 1 | INT_POL | R/W | 0 | 中断极性 0 = 低电平有效 1 = 高电平有效 |
| 0 | INT_MODE | R/W | 0 | 中断模式 0 = 电平敏感型 1 = 比较器模式 |
Wire.beginTransmission(0x40); // initiate communication with HDC2x sensor
Wire.write(0x0E); // write to Config Register
Wire.write(0x00); // configure device to Trigger-On Demand
Wire.endTransmission();接下来,按 图 2-4 中所示配置测量配置寄存器 (0x0F)。
测量配置寄存器定义以下内容:
| 位 | 字段 | 类型 | 复位 | 说明 |
|---|---|---|---|---|
| 7:6 | TRES[1:0] | R/W | 00 | 温度分辨率 00:14 位 01:11 位 10:9 位 11:不适用 |
| 5:4 | HRES[1:0] | R/W | 00 | 湿度分辨率 00:14 位 01:11 位 10:9 位 11:不适用 |
| 3 | RES | R/W | 0 | 保留 |
| 2:1 | MEAS_CONF[1:0] | R/W | 00 | 测量配置 00:湿度 + 温度 01:仅温度 10:NA 11:不适用 |
| 0 | MEAS_TRIG | R/W | 0 | 测量触发 0:无操作 1:开始测量 测量完成时自行清除位 |
图 2-4 提供了测量配置寄存器的图示。
Wire.beginTransmission(0x40); // initiate communication with HDC2x sensor
Wire.write(0x0F); // write to Measurement Config Register
Wire.write(0x01); // set output to 14-bit temperature/humidity data
// and trigger measurements
Wire.endTransmission();在按需触发模式下,可以根据系统的需求将此序列放置在循环内以进行定期轮询。
要读取 HDC2x 的温度和湿度测量值,用户可以在两种可能的方法中进行选择。第一种方法是使用 TEMP_LOW/HUM_LOW 和 TEMP_HIGH/HUM_HIGH 分别读取/存储温度和湿度字节,并将 MSB 和 LSB 位组合为一个 16 位值,或在一个通信帧中突发读取多个字节,如以下湿度数据采集代码中所示:
读取测量数据
HDC2x 通过两个 8 位寄存器存储测量结果:
一种方法是分别读取每个字节并将它们组合在一起:
uint16_t getHum() {
// RH LSB Acquisition
Wire.beginTransmission(0x40); // start communication with HDC2x
Wire.write(0x02); // set a pointer for Humidity Low register (0x02)
Wire.requestFrom(0x02, 2); // request 2 bytes from HDC2x
uint8_t humLow = Wire.read(); // store Humidity LSB data
Wire.endTransmission();
// RH MSB Acquisition
Wire.beginTransmission(0x40); // start communication with HDC2x
Wire.write(0x03); // set a pointer for Humidity High register (0x03)
Wire.requestFrom(0x40, 2); // request 2 bytes from HDC2x
uint8_t humHigh = Wire.read(); // store Humidity MSB data
Wire.endTransmission();
// combine MSB and LSB into 16-bit integer and return value
return ((uint16_t) humHigh << 8) | humLow;
}不过,更有效的方法是从 LSB 寄存器一次突发读取两个字节:
uint16_t getHum2() {
Wire.beginTransmission(0x40); // start communication with HDC2x
Wire.write(0x02); // set a pointer for Humidity Low register (0x02)
Wire.endTransmission(false);
Wire.requestFrom(0x40, 2); // request 2 bytes from HDC2x
uint8_t lsb = Wire.read(); // read and store LSB
uint8_t msb = Wire.read(); // read and store MSB
// adds MSB of data to an empty 16-bit variable
// shifts 8 bits left, then "or" with LSB for final value
return ((uint16_t) msb << 8) | lsb;
}此方法利用 HDC2x 的内部指针行为:从 HUMIDITY_LOW 寄存器读取 LSB 后,指针自动递增到 MSB 的 HUMIDITY_HIGH 寄存器。同样的机制也适用于读取温度。
请访问以下链接,查看 HDC2x 在按需触发模式下的完整示例代码。