ZHCAFX9 August 2025 HDC1010 , HDC1080 , HDC2010 , HDC2021 , HDC2022 , HDC2080 , HDC3020 , HDC3020-Q1 , HDC3021 , HDC3021-Q1 , HDC3022 , HDC3022-Q1 , HDC3120
在本例中,已將 HDC2010 傳感器配置為按需觸發(fā)(單次觸發(fā))模式,并禁用了自動測量模式 (AMM)。該過程首先寫入配置寄存器 (0x0E),以將器件設置為按需觸發(fā)模式。圖 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 | 測量觸發(fā) 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();在按需觸發(fā)模式下,可以根據系統(tǒng)的需求將此序列放置在循環(huán)內以進行定期輪詢。
要讀取 HDC2x 的溫度和濕度測量值,用戶可以在兩種可能的方法中進行選擇。第一種方法是使用 TEMP_LOW/HUM_LOW 和 TEMP_HIGH/HUM_HIGH 分別讀取/存儲溫度和濕度字節(jié),并將 MSB 和 LSB 位組合為一個 16 位值,或在一個通信幀中突發(fā)讀取多個字節(jié),如以下濕度數據采集代碼中所示:
讀取測量數據
HDC2x 通過兩個 8 位寄存器存儲測量結果:
一種方法是分別讀取每個字節(jié)并將它們組合在一起:
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 寄存器一次突發(fā)讀取兩個字節(jié):
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 在按需觸發(fā)模式下的完整示例代碼。