ESP32基于ESP-IDF 5.1无法读取AHT25传感器数据求助
ESP32(ESP-IDF 5.1)读取AHT25温湿度传感器失败
我正在使用ESP32搭配ESP-IDF 5.1读取AHT25温湿度数据,此前用Arduino IDE能正常读取该传感器,但切换到ESP-IDF后无法获取数据,输出的错误日志如下:
E (2062) i2c: i2c_master_cmd_begin(1531): I2C timeout E (2062) AHT25_Sensor: i2c_master_cmd_begin failed: 0x103 E (3067) i2c: i2c_master_cmd_begin(1531): I2C timeout E (3067) AHT25_Sensor: i2c_master_cmd_begin failed: 0x103
以下是我的源代码:
#include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_system.h" #include "esp_log.h" #include "driver/i2c.h" static const char *TAG = "AHT25_Sensor"; #define I2C_MASTER_SCL_IO 22 // GPIO for I2C clock line #define I2C_MASTER_SDA_IO 21 // GPIO for I2C data line #define I2C_MASTER_NUM I2C_NUM_1 // I2C port number #define I2C_MASTER_FREQ_HZ 100000 // I2C clock frequency #define AHT25_I2C_ADDR 0x38 // I2C address of AHT25 sensor esp_err_t i2c_master_init() { i2c_config_t conf = { .mode = I2C_MODE_MASTER, .sda_io_num = I2C_MASTER_SDA_IO, .sda_pullup_en = GPIO_PULLUP_ENABLE, .scl_io_num = I2C_MASTER_SCL_IO, .scl_pullup_en = GPIO_PULLUP_ENABLE, .master.clk_speed = I2C_MASTER_FREQ_HZ, i2c_driver_install(I2C_MASTER_NUM, conf.mode, 0, 0, 0), }; return i2c_param_config(I2C_MASTER_NUM, &conf); } void aht25_task(void *pvParameters) { ESP_LOGI(TAG, "aht25_task has started"); uint8_t data[6]; while (1) { i2c_cmd_handle_t cmd = i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, (AHT25_I2C_ADDR << 1) | I2C_MASTER_WRITE, true); i2c_master_write_byte(cmd, 0xAC, true); i2c_master_write_byte(cmd, 0x33, true); i2c_master_stop(cmd); esp_err_t ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS); if (ret != ESP_OK) { ESP_LOGE(TAG, "i2c_master_cmd_begin failed: 0x%x", ret); } i2c_cmd_link_delete(cmd); vTaskDelay(1000 / portTICK_PERIOD_MS); cmd = i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, (AHT25_I2C_ADDR << 1) | I2C_MASTER_READ, true); i2c_master_read_byte(cmd, &data[0], I2C_MASTER_ACK); i2c_master_read_byte(cmd, &data[1], I2C_MASTER_ACK); i2c_master_read_byte(cmd, &data[2], I2C_MASTER_ACK); i2c_master_read_byte(cmd, &data[3], I2C_MASTER_ACK); i2c_master_read_byte(cmd, &data[4], I2C_MASTER_ACK); i2c_master_read_byte(cmd, &data[5], I2C_MASTER_NACK); i2c_master_stop(cmd); ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS); if (ret != ESP_OK) { ESP_LOGE(TAG, "i2c_master_cmd_begin failed: 0x%x", ret); } i2c_cmd_link_delete(cmd); float humidity = ((data[1] << 12) | (data[2] << 4) | (data[3] >> 4)) * 100 / 0x100000; float temperature = (((data[3] & 0xF) << 16) | (data[4] << 8) | data[5]) * 200 / 0x1000000 - 50; ESP_LOGI(TAG, "Humidity: %.2f%%, Temperature: %.2f°C", humidity, temperature); vTaskDelay(5000 / portTICK_PERIOD_MS); } } void app_main() { esp_err_t ret = i2c_master_init(); if (ret != ESP_OK) { ESP_LOGE(TAG, "I2C master initialization failed"); return; } while (1) { aht25_task(NULL); // Manually call the task function vTaskDelay(5000 / portTICK_PERIOD_MS); // Delay between iterations } }
我是ESP-IDF新手,希望能得到解决该问题的方法。
内容的提问来源于stack exchange,提问作者Kuralmozhi
相关产品推荐
相关产品推荐

