ESP32_DHT_Node/main/app_dht.c

95 lines
2.6 KiB
C

#include <sys/time.h>
/* 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;
}