- 在CMakeLists.txt中添加SU-03T语音模块依赖。 - 在main.cpp中实现SU-03T接收回调函数,处理接收消息。 - 完善各UI源文件文档,包括动作、屏幕和字体,明确模块作用与数据流向。 - 更新主应用逻辑,初始化并启动SU-03T接收器。 - 修改过程中确保兼容性,保留原有接口。
102 lines
2.8 KiB
C
102 lines
2.8 KiB
C
/*
|
|
* 文件: components/MQ-2/MQ-2.c
|
|
* 角色: MQ-2 模拟气体传感器采样与百分比映射
|
|
* 说明:
|
|
* - 本文件用于实现当前模块的核心功能或接口定义。
|
|
* - 修改前请先确认该模块与其它任务/外设之间的数据流关系。
|
|
* - 涉及协议与硬件时,优先保持现有接口兼容,避免联调回归。
|
|
*/
|
|
|
|
#include "MQ-2.h"
|
|
|
|
#include "esp_adc/adc_oneshot.h"
|
|
#include "esp_check.h"
|
|
|
|
#define MQ2_ADC_UNIT ADC_UNIT_1
|
|
#define MQ2_ADC_CHANNEL ADC_CHANNEL_7
|
|
#define MQ2_SAMPLE_COUNT 8
|
|
|
|
static const char *TAG = "MQ2";
|
|
static adc_oneshot_unit_handle_t s_adc_handle = NULL;
|
|
static bool s_inited = false;
|
|
|
|
/* 函数: mq2_init
|
|
* 作用: 执行模块内与函数名对应的业务逻辑。
|
|
* 重点: 关注输入合法性、返回码与并发安全。
|
|
*/
|
|
esp_err_t mq2_init(void)
|
|
{
|
|
if (s_inited) {
|
|
return ESP_OK;
|
|
}
|
|
|
|
adc_oneshot_unit_init_cfg_t init_cfg = {
|
|
.unit_id = MQ2_ADC_UNIT,
|
|
.ulp_mode = ADC_ULP_MODE_DISABLE,
|
|
};
|
|
ESP_RETURN_ON_ERROR(adc_oneshot_new_unit(&init_cfg, &s_adc_handle), TAG, "adc new unit failed");
|
|
|
|
adc_oneshot_chan_cfg_t chan_cfg = {
|
|
.atten = ADC_ATTEN_DB_12,
|
|
.bitwidth = ADC_BITWIDTH_DEFAULT,
|
|
};
|
|
ESP_RETURN_ON_ERROR(adc_oneshot_config_channel(s_adc_handle, MQ2_ADC_CHANNEL, &chan_cfg),
|
|
TAG, "adc channel config failed");
|
|
|
|
s_inited = true;
|
|
return ESP_OK;
|
|
}
|
|
|
|
/* 函数: mq2_read_raw
|
|
* 作用: 执行模块内与函数名对应的业务逻辑。
|
|
* 重点: 关注输入合法性、返回码与并发安全。
|
|
*/
|
|
esp_err_t mq2_read_raw(int *raw_out)
|
|
{
|
|
ESP_RETURN_ON_FALSE(raw_out != NULL, ESP_ERR_INVALID_ARG, TAG, "raw_out is null");
|
|
ESP_RETURN_ON_FALSE(s_inited, ESP_ERR_INVALID_STATE, TAG, "mq2 not inited");
|
|
|
|
int sum = 0;
|
|
for (int i = 0; i < MQ2_SAMPLE_COUNT; ++i) {
|
|
int sample = 0;
|
|
ESP_RETURN_ON_ERROR(adc_oneshot_read(s_adc_handle, MQ2_ADC_CHANNEL, &sample),
|
|
TAG, "adc read failed");
|
|
sum += sample;
|
|
}
|
|
|
|
*raw_out = sum / MQ2_SAMPLE_COUNT;
|
|
return ESP_OK;
|
|
}
|
|
|
|
/* 函数: mq2_read_percent
|
|
* 作用: 执行模块内与函数名对应的业务逻辑。
|
|
* 重点: 关注输入合法性、返回码与并发安全。
|
|
*/
|
|
esp_err_t mq2_read_percent(float *percent_out)
|
|
{
|
|
ESP_RETURN_ON_FALSE(percent_out != NULL, ESP_ERR_INVALID_ARG, TAG, "percent_out is null");
|
|
|
|
int raw = 0;
|
|
ESP_RETURN_ON_ERROR(mq2_read_raw(&raw), TAG, "read raw failed");
|
|
*percent_out = (raw * 100.0f) / 4095.0f;
|
|
return ESP_OK;
|
|
}
|
|
|
|
/* 函数: mq2_is_alarm
|
|
* 作用: 执行模块内与函数名对应的业务逻辑。
|
|
* 重点: 关注输入合法性、返回码与并发安全。
|
|
*/
|
|
bool mq2_is_alarm(float percent, float threshold_percent)
|
|
{
|
|
return percent >= threshold_percent;
|
|
}
|
|
|
|
/* 函数: mq2_get_adc_handle
|
|
* 作用: 执行模块内与函数名对应的业务逻辑。
|
|
* 重点: 关注输入合法性、返回码与并发安全。
|
|
*/
|
|
adc_oneshot_unit_handle_t mq2_get_adc_handle(void)
|
|
{
|
|
return s_adc_handle;
|
|
}
|