feat: 添加AHT30温湿度传感器驱动及显示功能

实现AHT30温湿度传感器的I2C驱动
新增传感器任务定期读取数据
优化LCD显示界面,增加温湿度显示
添加I2C硬件和软件扫描功能
修复I2C引脚配置问题
This commit is contained in:
2026-02-23 23:00:00 +08:00
parent f5077adbe7
commit 43a5042c9e
7 changed files with 862 additions and 8 deletions

View File

@@ -33,6 +33,8 @@
#include "multi_button.h"
#include "spi_st7735s.h"
#include "stdio.h"
#include "bsp_aht30.h"
#include "i2c.h"
/* USER CODE END Includes */
@@ -110,6 +112,13 @@ const osThreadAttr_t button_attributes = {
.stack_size = 512 * 4,
.priority = (osPriority_t) osPriorityRealtime2,
};
/* Definitions for sensor */
osThreadId_t sensorHandle;
const osThreadAttr_t sensor_attributes = {
.name = "sensor",
.stack_size = 1024 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */
@@ -127,6 +136,7 @@ void StartDefaultTask(void *argument);
extern void wifi_task_mqtt(void *argument);
void LCD_Task(void *argument);
void button_task(void *argument);
void sensorTask(void *argument);
void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */
@@ -169,6 +179,9 @@ void MX_FREERTOS_Init(void) {
/* creation of button */
buttonHandle = osThreadNew(button_task, NULL, &button_attributes);
/* creation of sensor */
sensorHandle = osThreadNew(sensorTask, NULL, &sensor_attributes);
/* USER CODE BEGIN RTOS_THREADS */
/* add threads, ... */
/* USER CODE END RTOS_THREADS */
@@ -279,13 +292,13 @@ void LCD_Task(void *argument)
ST7735_FillScreen(bg_color);
ST7735_WriteString(2, 2, "Temp & Humi", &Font_7x10, text_color, bg_color);
// 显示温度
snprintf(display_str, sizeof(display_str), "T: %.1f C", sensor_data.temperature);
ST7735_WriteString(5, 20, display_str, &Font_11x18, text_color, bg_color);
// 显示温度(橙色 - 国际标准温度色)
snprintf(display_str, sizeof(display_str), "T: %.2f C", sensor_data.temperature);
ST7735_WriteString(5, 20, display_str, &Font_11x18, ST7735_ORANGE, bg_color);
// 显示湿度
snprintf(display_str, sizeof(display_str), "H: %.1f %%", sensor_data.humidity);
ST7735_WriteString(5, 45, display_str, &Font_11x18, text_color, bg_color);
// 显示湿度(青色 - 国际标准湿度色)
snprintf(display_str, sizeof(display_str), "H: %.2f %%", sensor_data.humidity);
ST7735_WriteString(5, 45, display_str, &Font_11x18, ST7735_CYAN, bg_color);
break;
case LCD_PAGE_FOOD_WEIGHT:
@@ -357,7 +370,7 @@ void LCD_Task(void *argument)
}
} else {
// 其他页面1秒刷新一次
osDelay(1000);
osDelay(2000);
}
}
/* USER CODE END LCD_Task */
@@ -384,6 +397,65 @@ void button_task(void *argument)
/* USER CODE END button_task */
}
/* USER CODE BEGIN Header_sensorTask */
/**
* @brief Function implementing the sensor thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_sensorTask */
void sensorTask(void *argument)
{
/* USER CODE BEGIN sensorTask */
elog_i(TAG, "启动传感器任务");
// 扫描I2C设备调试
AHT30_ScanI2C(&hi2c1);
// 如果硬件I2C扫描失败尝试软件I2C
uint8_t found = 0;
for (uint8_t addr = 1; addr < 128; addr++) {
if (HAL_I2C_IsDeviceReady(&hi2c1, addr << 1, 1, 50) == HAL_OK) {
found = 1;
break;
}
}
if (!found) {
elog_w(TAG, "硬件I2C未发现设备尝试软件I2C扫描...");
AHT30_ScanI2C_Soft();
}
// 初始化AHT30温湿度传感器
elog_i(TAG, "初始化AHT30温湿度传感器");
if (AHT30_Init(&hi2c1)) {
elog_i(TAG, "AHT30初始化成功");
} else {
elog_e(TAG, "AHT30初始化失败");
}
/* Infinite loop */
for(;;)
{
// 读取温湿度数据
AHT30_Data_t aht30_data;
if (AHT30_ReadData(&aht30_data)) {
// 数据读取成功更新sensor_data
sensor_data.temperature = aht30_data.temperature;
sensor_data.humidity = aht30_data.humidity;
elog_d(TAG, "温湿度数据 - 温度: %.2f℃, 湿度: %.2f%%",
aht30_data.temperature, aht30_data.humidity);
} else {
elog_w(TAG, "AHT30数据读取失败");
}
// 每2秒读取一次
osDelay(2000);
}
/* USER CODE END sensorTask */
}
/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */

View File

@@ -74,6 +74,7 @@ void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* I2C1 clock enable */