本教程将手把手教你使用ESP32开发板实现传感器数据采集,并通过均值滤波 和卡尔曼滤波进行数据处理。代码逐行解析,适合各阶段开发者。
一、硬件准备
-
ESP32开发板(NodeMCU、DOIT等)
-
电位器模块(模拟噪声数据)
-
杜邦线若干
-
接线方式:
-
电位器中间引脚 → ESP32 GPIO34(ADC1_CH6)
-
其他两脚 → 3.3V和GND
-
二、开发环境配置
-
安装Arduino IDE 2.0+
-
添加ESP32支持:
复制
https://dl.espressif.com/dl/package_esp32_index.json
-
安装完成后选择开发板型号
三、基础数据采集
#define SENSOR_PIN 34 // 使用GPIO34作为模拟输入
void setup() {
Serial.begin(115200);
}
void loop() {
int rawValue = analogRead(SENSOR_PIN); // 读取ADC原始值(0-4095)
float voltage = rawValue * (3.3 / 4095.0); // 转换为电压值
Serial.print(voltage); // 原始电压值
Serial.print(","); // 分隔符
delay(50); // 采样间隔50ms
}
四、均值滤波实现
原理说明
连续采集N个样本,取算术平均值作为输出,有效抑制随机噪声。
#define SENSOR_PIN 34
#define WINDOW_SIZE 10 // 滤波窗口大小
float movingAverage(float *arr) {
float sum = 0;
for(int i=0; i<WINDOW_SIZE; i++){
sum += arr[i]; // 累加窗口内所有值
}
return sum / WINDOW_SIZE; // 计算均值
}
void setup() {
Serial.begin(115200);
}
void loop() {
static float dataWindow[WINDOW_SIZE]; // 存储历史数据
static int index = 0;
// 采集新数据
dataWindow[index] = analogRead(SENSOR_PIN) * (3.3 / 4095.0);
// 计算并输出均值
float filtered = movingAverage(dataWindow);
// 更新索引(循环覆盖旧数据)
index = (index + 1) % WINDOW_SIZE;
Serial.print(dataWindow[index]); // 原始值
Serial.print(",");
Serial.println(filtered); // 滤波值
delay(50);
}
关键参数调节:
- WINDOW_SIZE:建议5-20,值越大滤波效果越好但延迟增加
五、卡尔曼滤波实现
原理简述
通过预测-更新两阶段,动态估计最优值。适合时变系统。
class KalmanFilter {
private:
float Q = 0.01; // 过程噪声协方差
float R = 0.1; // 测量噪声协方差
float P = 0.0; // 估计误差协方差
float X = 0.0; // 最优估计值
float K; // 卡尔曼增益
public:
float update(float measurement) {
// 预测阶段
P = P + Q;
// 计算卡尔曼增益
K = P / (P + R);
// 更新估计
X = X + K * (measurement - X);
// 更新误差协方差
P = (1 - K) * P;
return X;
}
};
KalmanFilter kf; // 创建滤波器实例
void setup() {
Serial.begin(115256);
}
void loop() {
float raw = analogRead(SENSOR_PIN) * (3.3 / 4095.0);
float filtered = kf.update(raw); // 执行滤波
Serial.print(raw);
Serial.print(",");
Serial.println(filtered);
delay(50);
}
参数调节指南:
-
Q增大 → 跟踪更快但噪声增加
-
R增大 → 滤波平滑但响应变慢
六、效果对比与优化建议
-
串口绘图器使用:
-
Arduino IDE → 工具 → 串口绘图器
-
输入格式:
原始值,滤波值1,滤波值2
-
-
对比结果:
-
均值滤波:曲线更平滑,但存在相位延迟
-
卡尔曼滤波:响应更快,适合动态变化
-
-
优化方向:
-
根据传感器特性调整滤波参数
-
组合使用多种滤波算法
-
加入异常值剔除机制
-
七、实际应用扩展
-
温湿度监测(DHT11)
-
运动检测(MPU6050)
-
环境噪声监测(麦克风模块)
通过本教程,您已掌握ESP32数据采集与滤波的核心技能。建议根据实际需求调整算法参数,并尝试将数据处理结果通过WiFi/蓝牙传输,构建完整物联网系统!