diff --git a/main/main.cpp b/main/main.cpp index e9937e1..7f28869 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -62,6 +62,10 @@ typedef struct bool fire_danger; bool human_present; bool door_closed; + bool fan_on; + bool light_on; + bool cool_on; + bool hot_on; } env_data_t; static env_data_t s_env_data; @@ -166,6 +170,56 @@ static void status_task(void *arg) } } +static const char *relay_status_text(bool on) +{ + return on ? "开" : "关"; +} + +static void relay_status_task(void *arg) +{ + (void)arg; + + for (;;) + { + bool relay_on = false; + + if (relay_ctrl_get(RELAY_CTRL_ID_1, &relay_on) == ESP_OK) { + set_var_fan_status(relay_status_text(relay_on)); + if (s_env_data_lock) { + xSemaphoreTake(s_env_data_lock, portMAX_DELAY); + s_env_data.fan_on = relay_on; + xSemaphoreGive(s_env_data_lock); + } + } + if (relay_ctrl_get(RELAY_CTRL_ID_2, &relay_on) == ESP_OK) { + set_var_light_status(relay_status_text(relay_on)); + if (s_env_data_lock) { + xSemaphoreTake(s_env_data_lock, portMAX_DELAY); + s_env_data.light_on = relay_on; + xSemaphoreGive(s_env_data_lock); + } + } + if (relay_ctrl_get(RELAY_CTRL_ID_3, &relay_on) == ESP_OK) { + set_var_cool_status(relay_status_text(relay_on)); + if (s_env_data_lock) { + xSemaphoreTake(s_env_data_lock, portMAX_DELAY); + s_env_data.cool_on = relay_on; + xSemaphoreGive(s_env_data_lock); + } + } + if (relay_ctrl_get(RELAY_CTRL_ID_4, &relay_on) == ESP_OK) { + set_var_hot_status(relay_status_text(relay_on)); + if (s_env_data_lock) { + xSemaphoreTake(s_env_data_lock, portMAX_DELAY); + s_env_data.hot_on = relay_on; + xSemaphoreGive(s_env_data_lock); + } + } + + vTaskDelay(pdMS_TO_TICKS(200)); + } +} + static void sntp_task(void *arg) { (void)arg; @@ -318,6 +372,14 @@ extern "C" void app_main(void) {.pin = GPIO_NUM_9, .active_high = true}, }; ESP_ERROR_CHECK(relay_ctrl_init(relay_cfg)); + set_var_fan_status("关"); + set_var_light_status("关"); + set_var_cool_status("关"); + set_var_hot_status("关"); + s_env_data.fan_on = false; + s_env_data.light_on = false; + s_env_data.cool_on = false; + s_env_data.hot_on = false; // 5. 初始化 I2C 总线并注册传感器 (共享总线) ESP_ERROR_CHECK(bh1750_user_init()); @@ -422,4 +484,7 @@ extern "C" void app_main(void) // 独立任务:人体与门状态检测 xTaskCreate(status_task, "status_task", 4096, NULL, 6, NULL); + + // 独立任务:继电器状态同步到 UI + xTaskCreate(relay_status_task, "relay_status_task", 4096, NULL, 5, NULL); }