第四章.4.3.1ESP32传感器数据采集与滤波处理实战教程
本教程将手把手教你使用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/蓝牙传输,构建完整物联网系统!