本教程将手把手教你使用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/蓝牙传输,构建完整物联网系统!