第四章.4.3.1ESP32传感器数据采集与滤波处理实战教程

本教程将手把手教你使用ESP32开发板实现传感器数据采集,并通过均值滤波 和卡尔曼滤波进行数据处理。代码逐行解析,适合各阶段开发者。


一、硬件准备

  • ESP32开发板(NodeMCU、DOIT等)

  • 电位器模块(模拟噪声数据)

  • 杜邦线若干

  • 接线方式:

    • 电位器中间引脚 → ESP32 GPIO34(ADC1_CH6)

    • 其他两脚 → 3.3V和GND


二、开发环境配置

  1. 安装Arduino IDE 2.0+

  2. 添加ESP32支持:

    复制

    复制代码
    https://dl.espressif.com/dl/package_esp32_index.json
  3. 安装完成后选择开发板型号


三、基础数据采集

复制代码
#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增大 → 滤波平滑但响应变慢


六、效果对比与优化建议

  1. 串口绘图器使用:

    • Arduino IDE → 工具 → 串口绘图器

    • 输入格式:原始值,滤波值1,滤波值2

  2. 对比结果:

    • 均值滤波:曲线更平滑,但存在相位延迟

    • 卡尔曼滤波:响应更快,适合动态变化

  3. 优化方向:

    • 根据传感器特性调整滤波参数

    • 组合使用多种滤波算法

    • 加入异常值剔除机制


七、实际应用扩展

  1. 温湿度监测(DHT11)

  2. 运动检测(MPU6050)

  3. 环境噪声监测(麦克风模块)

通过本教程,您已掌握ESP32数据采集与滤波的核心技能。建议根据实际需求调整算法参数,并尝试将数据处理结果通过WiFi/蓝牙传输,构建完整物联网系统!

相关推荐
果壳science20 分钟前
张祥前最新研究成果登上SCI期刊!
笔记·嵌入式硬件·算法·硬件工程·几何学
路上有只喵30 分钟前
认识元器件 ·贴片电阻· 电阻选型
嵌入式硬件·硬件架构
zhenming_123q1 小时前
如何接入 PLC、上位机或物联网平台?
单片机·嵌入式硬件·物联网
TechVoyager_82461 小时前
IT66612 分路器三组DDC与两路检测解析
单片机·嵌入式硬件·分路器·ddc总线·热插拔检测
NamoAmitabha1281 小时前
Zynq 芯片的“上帝视角”--deepseek
嵌入式硬件·zynq--ps
艾芯微科技2 小时前
DMG2305UX-13|Diodes 20V/5A P 沟道 SOT-23 MOS 管参数、电路应用、替代与丝印避坑
网络·单片机·嵌入式硬件·集成测试·51单片机
zjxtxdy2 小时前
STM32HAL库开发-ADC
stm32·单片机·嵌入式硬件
国科安芯2 小时前
3 Ω 还是 5.5 Ω:ASL3157S 的供电电压、导通电阻与双路一致性怎么算
网络·嵌入式硬件·安全·模拟开关·抗辐射
传感器与混合集成电路3 小时前
28V输入又带浪涌怎么办?嵌入式计算机一次电源防护设计要点
嵌入式硬件
笨笨饿3 小时前
# 59_CSDN博客自动写流程文章
linux·jvm·stm32·单片机·嵌入式硬件·mcu·51单片机