feat: 添加AHT30温湿度传感器驱动及显示功能
实现AHT30温湿度传感器的I2C驱动 新增传感器任务定期读取数据 优化LCD显示界面,增加温湿度显示 添加I2C硬件和软件扫描功能 修复I2C引脚配置问题
This commit is contained in:
@@ -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 */
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user