#include /* ESP drivers */ #include "driver/i2c.h" #include "esp_log.h" #include "esp_system.h" /* FreeRTOS */ #include "freertos/FreeRTOS.h" #include "freertos/task.h" /* DHT sensor */ #include "aht10/aht10.h" /* Log tag */ #define APP_LOG_TAG "APP_DHT" /* Configurations */ #define APP_DHT_I2C_SCL_IO CONFIG_APP_I2C_SCL_PIN #define APP_DHT_I2C_SDA_IO CONFIG_APP_I2C_SDA_PIN #define APP_DHT_I2C_INSTANCE 0 #define APP_DHT_I2C_TIMEOUT 100 #define APP_DHT_AHT10_ADDR 0x38 static aht10_ret_t app_dht_impl_xfer(void *pdev, aht10_xfer_desc_t *xfer); static aht10_ret_t app_dht_impl_delay(void *pdev, uint32_t delay_msec); static aht10_t aht = { .cb = { .xfer = app_dht_impl_xfer, .delay = app_dht_impl_delay, }, }; esp_err_t app_dht_init(void) { i2c_config_t cfg = { .mode = I2C_MODE_MASTER, .sda_io_num = APP_DHT_I2C_SDA_IO, .scl_io_num = APP_DHT_I2C_SCL_IO, .sda_pullup_en = GPIO_PULLUP_ENABLE, .scl_pullup_en = GPIO_PULLUP_ENABLE, .master.clk_speed = 100000, }; i2c_param_config(APP_DHT_I2C_INSTANCE, &cfg); if (i2c_driver_install(APP_DHT_I2C_INSTANCE, cfg.mode, 0U, 0U, 0U) != ESP_OK) { return ESP_FAIL; } aht10_init(&aht); return ESP_OK; } esp_err_t app_dht_read(float *temperature, float *humidity) { esp_err_t ret = ESP_OK; aht10_result_t result; if (aht10_measure(&aht, &result) != AHT10_OK) { return -1; } *temperature = result.temperature; *humidity = result.humidity; return ret; } static aht10_ret_t app_dht_impl_xfer(void *pdev, aht10_xfer_desc_t *xfer) { esp_err_t ret; if (xfer->rx_size == 0) { ret = i2c_master_write_to_device(APP_DHT_I2C_INSTANCE, APP_DHT_AHT10_ADDR, xfer->tx_data, xfer->tx_size, pdMS_TO_TICKS(APP_DHT_I2C_TIMEOUT)); } else if (xfer->tx_size == 0) { ret = i2c_master_read_from_device(APP_DHT_I2C_INSTANCE, APP_DHT_AHT10_ADDR, xfer->rx_data, xfer->rx_size, pdMS_TO_TICKS(APP_DHT_I2C_TIMEOUT)); } else { ret = i2c_master_write_read_device(APP_DHT_I2C_INSTANCE, APP_DHT_AHT10_ADDR, xfer->tx_data, xfer->tx_size, xfer->rx_data, xfer->rx_size, pdMS_TO_TICKS(APP_DHT_I2C_TIMEOUT)); } if (ret != ESP_OK) { return AHT10_FAIL; } return AHT10_OK; } static aht10_ret_t app_dht_impl_delay(void *pdev, uint32_t delay_msec) { vTaskDelay(pdMS_TO_TICKS(delay_msec)); return AHT10_OK; }