#ifndef __DHT20_H__ #define __DHT20_H__ #include "../common/i2c_device.h" #include // DHT20 I2C address (fixed) #define DHT20_I2C_ADDR 0x38 // DHT20 register addresses #define DHT20_RESET_REG 0xBA #define DHT20_CALIBRATE_REG 0xE1 // Status register bits #define DHT20_STATUS_BUSY_BIT 0x80 // bit[7]: 1 = measuring, 0 = idle #define DHT20_STATUS_CALIBRATED_BIT 0x08 // bit[3]: 1 = calibrated, 0 = not calibrated /** * @brief DHT20 temperature and humidity sensor driver * * This driver implements the complete DHT20 I2C protocol including: * - Sensor initialization and calibration check * - Temperature and humidity measurement * - Automatic sensor reset and configuration */ class DHT20 : public I2cDevice { public: /** * @brief Construct a new DHT20 sensor * * @param i2c_bus I2C bus handle */ DHT20(i2c_master_bus_handle_t i2c_bus); /** * @brief Initialize and calibrate the sensor * * This function performs: * 1. Sensor reset * 2. System configuration (register 0xE1) * 3. Calibration status verification * * @return esp_err_t ESP_OK on success */ esp_err_t Initialize(); /** * @brief Read temperature and humidity from sensor * * This function: * 1. Triggers a new measurement * 2. Waits for measurement completion (~80ms) * 3. Reads and parses the sensor data * * @param temperature Output: temperature in Celsius * @param humidity Output: relative humidity in percentage * @return esp_err_t ESP_OK on success */ esp_err_t ReadTempAndHumidity(float& temperature, float& humidity); /** * @brief Check if sensor is calibrated * * @return true if calibrated (bit[3] of status = 1) */ bool IsCalibrated(); private: /** * @brief Reset the sensor * * Sends reset command (0xBA) to the sensor * * @return esp_err_t ESP_OK on success */ esp_err_t Reset(); /** * @brief Configure system registers * * Writes [0xE1, 0x08, 0x00] to configure the sensor * * @return esp_err_t ESP_OK on success */ esp_err_t SetSystemConfig(); /** * @brief Read status register * * @return uint8_t Status byte (bit[7]=busy, bit[3]=calibrated) */ uint8_t ReadStatus(); /** * @brief Trigger a new measurement * * Sends measurement trigger command [0xAC, 0x33, 0x00] * * @return esp_err_t ESP_OK on success */ esp_err_t TriggerMeasurement(); /** * @brief Read raw data from sensor * * Reads 7 bytes: [status, humi_H, humi_M, humi_L|temp_H, temp_M, temp_L, CRC] * * @param buffer Output buffer (must be at least 7 bytes) * @param len Number of bytes to read * @return esp_err_t ESP_OK on success */ esp_err_t ReadData(uint8_t* buffer, size_t len); /** * @brief Write multiple bytes to sensor * * @param data Data buffer to write * @param len Number of bytes to write * @return esp_err_t ESP_OK on success */ esp_err_t WriteBytes(const uint8_t* data, size_t len); /** * @brief Write a single byte to sensor * * @param byte Byte to write * @return esp_err_t ESP_OK on success */ esp_err_t WriteByte(uint8_t byte); }; #endif // __DHT20_H__