添加 JW01 传感器支持,包含初始化和数据读取功能,判断CO2值来判断实物状态。1000为初始阈值

This commit is contained in:
Wang Beihong
2026-04-21 01:47:39 +08:00
parent f0d8b7fe6e
commit cdc35d323a
5 changed files with 274 additions and 8 deletions

View File

@@ -20,8 +20,10 @@
#include "bh1750_use.h"
#include "aht30.h"
#include "MQ-2.h"
#include "JW01.h"
#define TAG "MAIN"
#define CO2_SPOILAGE_THRESHOLD_PPM 1000.0f
typedef struct
{
@@ -30,6 +32,9 @@ typedef struct
float temp;
float humidity;
float gas_percent;
float tvoc;
float hcho;
float co2;
} env_data_t;
static env_data_t s_env_data;
@@ -92,6 +97,7 @@ extern "C" void app_main(void)
lvgl_port_lock(100 / portTICK_PERIOD_MS);
ui_init();
lvgl_port_unlock();
set_var_food_status("良好");
// 7. 创建 UI 任务
xTaskCreate(ui_task, "ui_task", 8192, NULL, 5, NULL);
@@ -114,32 +120,61 @@ extern "C" void app_main(void)
// MQ-2 使用 ADC(GPIO8)
ESP_ERROR_CHECK(mq2_init());
// JW01 使用 UART0(GPIO43/44)
ESP_ERROR_CHECK(jw01_init());
// 6. 创建传感器读取任务
xTaskCreate([](void *arg)
{
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;
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;
// 读取 BH1750
if (bh1750_user_read(&lux) == ESP_OK) {
bh_ret = bh1750_user_read(&lux);
if (bh_ret == ESP_OK) {
set_var_light_val(lux);
}
// 读取 AHT30
if (aht30_get_temperature_humidity_value(aht30, &temp, &hum) == ESP_OK) {
aht_ret = aht30_get_temperature_humidity_value(aht30, &temp, &hum);
if (aht_ret == ESP_OK) {
set_var_temp(temp);
set_var_humity_val(hum);
}
// 读取 MQ-2更新空气质量变量
if (mq2_read_percent(&gas_percent) == ESP_OK) {
mq2_ret = mq2_read_percent(&gas_percent);
if (mq2_ret == ESP_OK) {
set_var_air_quity(gas_percent);
}
// 读取 JW01TVOC/HCHO/CO2
jw_ret = jw01_read(&jw01, 200);
if (jw_ret == ESP_OK) {
if (jw01.co2_valid) {
if (jw01.co2 >= CO2_SPOILAGE_THRESHOLD_PPM) {
set_var_food_status("变质");
} else {
set_var_food_status("良好");
}
if (s_env_data_lock) {
xSemaphoreTake(s_env_data_lock, portMAX_DELAY);
s_env_data.gas_percent = gas_percent;
xSemaphoreGive(s_env_data_lock);
}
}
// 每 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",
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(jw_ret), jw01.co2_valid ? 1 : 0, jw01.co2);
}
// 数据存入共享结构体
@@ -148,6 +183,10 @@ extern "C" void app_main(void)
s_env_data.lux = lux;
s_env_data.temp = temp;
s_env_data.humidity = hum;
s_env_data.gas_percent = gas_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;
xSemaphoreGive(s_env_data_lock);
}
vTaskDelay(pdMS_TO_TICKS(1000));