添加对额外 UI 资源和火焰状态变量的支持

- 增加了 `ui.h` 中资源数组的大小以容纳新的 UI 元素。
- 更新了 `ui_font_chinese_16.c`,添加了更多中文字符以更好地支持本地化。
- 在 `vars.h` 中添加了用于管理火焰状态的新函数,增强了系统的监测能力。
This commit is contained in:
Wang Beihong
2026-04-21 02:25:20 +08:00
parent 64c56fcca9
commit 79b546632b
21 changed files with 978 additions and 401 deletions

View File

@@ -22,9 +22,11 @@
#include "MQ-2.h"
#include "JW01.h"
#include "human_door.h"
#include "fire_sensor.h"
#define TAG "MAIN"
#define CO2_SPOILAGE_THRESHOLD_PPM 1000.0f
#define CO2_SPOILAGE_THRESHOLD_PPM 1500.0f
#define FIRE_DANGER_THRESHOLD_PERCENT 35.0f
typedef struct
{
@@ -36,12 +38,15 @@ typedef struct
float tvoc;
float hcho;
float co2;
float fire_percent;
bool fire_danger;
bool human_present;
bool door_closed;
} env_data_t;
static env_data_t s_env_data;
static SemaphoreHandle_t s_env_data_lock = NULL;
static volatile bool s_ui_ready = false;
static bool wait_for_wifi_connected(TickType_t timeout_ticks)
{
@@ -76,6 +81,10 @@ static void ui_task(void *arg)
{
for (;;)
{
if (!s_ui_ready) {
vTaskDelay(pdMS_TO_TICKS(20));
continue;
}
env_data_update_system_info();
lvgl_port_lock(0);
ui_tick();
@@ -84,16 +93,31 @@ static void ui_task(void *arg)
}
}
static void ui_init_task(void *arg)
{
(void)arg;
lvgl_port_lock(100 / portTICK_PERIOD_MS);
ui_init();
lvgl_port_unlock();
s_ui_ready = true;
vTaskDelete(NULL);
}
static void status_task(void *arg)
{
(void)arg;
for (;;) {
for (;;)
{
human_door_state_t io_state{};
if (human_door_read(&io_state) == ESP_OK) {
if (human_door_read(&io_state) == ESP_OK)
{
set_var_hum_status(io_state.human_present ? "有人" : "无人");
set_var_door_status(io_state.door_closed ? "关闭" : "开启");
if (s_env_data_lock) {
if (s_env_data_lock)
{
xSemaphoreTake(s_env_data_lock, portMAX_DELAY);
s_env_data.human_present = io_state.human_present;
s_env_data.door_closed = io_state.door_closed;
@@ -116,22 +140,19 @@ extern "C" void app_main(void)
// 2. 初始化显示屏和 LVGL
start_lvgl_demo();
// 3. 初始化 UI
lvgl_port_lock(100 / portTICK_PERIOD_MS);
ui_init();
lvgl_port_unlock();
// 3. 在 CPU1 上执行 UI 初始化,避免 app_main 长时间占用 CPU0
xTaskCreatePinnedToCore(ui_init_task, "ui_init_task", 8192, NULL, 8, NULL, 1);
set_var_food_status("良好");
set_var_fire_status("安全");
// 7. 创建 UI 任务
xTaskCreate(ui_task, "ui_task", 8192, NULL, 5, NULL);
// 7. 创建 UI 刷新任务并固定在 CPU1与 ui_init_task 同核)
xTaskCreatePinnedToCore(ui_task, "ui_task", 8192, NULL, 5, NULL, 1);
if (wait_for_wifi_connected(pdMS_TO_TICKS(15000)))
{
set_var_system_ip(wifi_connect_get_ip());
}
// 5. 初始化 I2C 总线并注册传感器 (共享总线)
ESP_ERROR_CHECK(bh1750_user_init());
i2c_master_bus_handle_t i2c_bus = bh1750_get_i2c_bus_handle();
@@ -146,6 +167,9 @@ extern "C" void app_main(void)
// JW01 使用 UART0(GPIO43/44)
ESP_ERROR_CHECK(jw01_init());
// 火焰传感器使用 ADC(GPIO3)
ESP_ERROR_CHECK(fire_sensor_init());
// GPIO16: HC-SR312, GPIO17: Door switch(低电平=关门)
ESP_ERROR_CHECK(human_door_init());
set_var_hum_status("无人");
@@ -157,12 +181,13 @@ extern "C" void app_main(void)
aht30_handle_t aht30 = (aht30_handle_t)arg;
uint32_t log_cnt = 0;
for (;;) {
float lux = 0.0f, temp = 0.0f, hum = 0.0f, gas_percent = 0.0f;
float lux = 0.0f, temp = 0.0f, hum = 0.0f, gas_percent = 0.0f, fire_percent = 0.0f;
jw01_data_t jw01{};
esp_err_t bh_ret = ESP_FAIL;
esp_err_t aht_ret = ESP_FAIL;
esp_err_t mq2_ret = ESP_FAIL;
esp_err_t jw_ret = ESP_FAIL;
esp_err_t fire_ret = ESP_FAIL;
// 读取 BH1750
bh_ret = bh1750_user_read(&lux);
if (bh_ret == ESP_OK) {
@@ -181,6 +206,12 @@ extern "C" void app_main(void)
set_var_air_quity(gas_percent);
}
// 读取火焰传感器,更新火焰状态
fire_ret = fire_sensor_read_percent(&fire_percent);
if (fire_ret == ESP_OK) {
set_var_fire_status(fire_sensor_is_danger(fire_percent, FIRE_DANGER_THRESHOLD_PERCENT) ? "危险" : "安全");
}
// 读取 JW01TVOC/HCHO/CO2
jw_ret = jw01_read(&jw01, 200);
if (jw_ret == ESP_OK) {
@@ -197,10 +228,11 @@ extern "C" void app_main(void)
// 每 5 次打印一次综合状态,避免日志刷屏
if ((log_cnt++ % 10) == 0) {
ESP_LOGI(TAG,
"SENS bh=%s lux=%.1f | aht=%s t=%.1f h=%.1f | mq2=%s gas=%.1f | jw01=%s co2_valid=%d co2=%.1f",
"SENS bh=%s lux=%.1f | aht=%s t=%.1f h=%.1f | mq2=%s gas=%.1f | fire=%s fp=%.1f | jw01=%s co2_valid=%d co2=%.1f",
esp_err_to_name(bh_ret), lux,
esp_err_to_name(aht_ret), temp, hum,
esp_err_to_name(mq2_ret), gas_percent,
esp_err_to_name(fire_ret), fire_percent,
esp_err_to_name(jw_ret), jw01.co2_valid ? 1 : 0, jw01.co2);
}
@@ -212,6 +244,8 @@ extern "C" void app_main(void)
s_env_data.temp = temp;
s_env_data.humidity = hum;
s_env_data.gas_percent = gas_percent;
s_env_data.fire_percent = fire_percent;
s_env_data.fire_danger = fire_sensor_is_danger(fire_percent, FIRE_DANGER_THRESHOLD_PERCENT);
if (jw01.tvoc_valid) s_env_data.tvoc = jw01.tvoc;
if (jw01.hcho_valid) s_env_data.hcho = jw01.hcho;
if (jw01.co2_valid) s_env_data.co2 = jw01.co2;