添加对额外 UI 资源和火焰状态变量的支持
- 增加了 `ui.h` 中资源数组的大小以容纳新的 UI 元素。 - 更新了 `ui_font_chinese_16.c`,添加了更多中文字符以更好地支持本地化。 - 在 `vars.h` 中添加了用于管理火焰状态的新函数,增强了系统的监测能力。
This commit is contained in:
@@ -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) ? "危险" : "安全");
|
||||
}
|
||||
|
||||
// 读取 JW01(TVOC/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;
|
||||
|
||||
Reference in New Issue
Block a user