#include <stdio.h>
#include "esp_log.h"
#include "driver/gpio.h"
#include "dht.h" // DHT传感器库
#include "ssd1306.h" // OLED驱动库
#include "esp_lvgl_port.h" // LVGL移植层
// 定义使用的GPIO引脚
#define DHT_GPIO GPIO_NUM_21 // DHT22数据线连接到ESP32-S3的GPIO21
#define OLED_SCL_GPIO GPIO_NUM_19 // OLED SCL连接到ESP32-S3的GPIO19
#define OLED_SDA_GPIO GPIO_NUM_20 // OLED SDA连接到ESP32-S3的GPIO20
static const char *TAG = "main";
void app_main(void)
{
// 初始化DHT传感器
dht_sensor_t dht;
ESP_LOGI(TAG, "Initializing DHT sensor...");
if (dht_init(&dht, DHT_GPIO, DHT_TYPE_DHT22) != ESP_OK) {
ESP_LOGE(TAG, "Could not initialize DHT sensor.");
return;
}
// 初始化OLED显示屏
ssd1306_config_t oled_config = {
.scl = OLED_SCL_GPIO,
.sda = OLED_SDA_GPIO,
.address = 0x3C, // OLED的I2C地址
.width = 128, // OLED宽度
.height = 64 // OLED高度
};
ssd1306_t *oled = ssd1306_init(&oled_config);
if (oled == NULL) {
ESP_LOGE(TAG, "Could not initialize OLED display.");
return;
}
// 清除屏幕
ssd1306_clear(oled);
while (1) {
float humidity, temperature;
// 读取DHT22传感器
if (dht_read_float_data(&dht, &humidity, &temperature) == ESP_OK) {
ESP_LOGI(TAG, "Read humidity: %.2f%%, temperature: %.2f°C", humidity, temperature);
// 在OLED上显示信息
ssd1306_clear(oled);
ssd1306_draw_text(oled, "Humidity:", 0, 0, 1);
char hum_str[10];
sprintf(hum_str, "%.2f%%", humidity);
ssd1306_draw_text(oled, hum_str, 0, 16, 1);
ssd1306_draw_text(oled, "Temp:", 0, 32, 1);
char temp_str[10];
sprintf(temp_str, "%.2fC", temperature);
ssd1306_draw_text(oled, temp_str, 0, 48, 1);
ssd1306_refresh(oled); // 刷新屏幕以更新显示
} else {
ESP_LOGE(TAG, "Failed to read from DHT sensor!");
}
vTaskDelay(2000 / portTICK_PERIOD_MS); // 每2秒读取一次
}
}