You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino中MovingAverage函数使用示例及调用问题咨询

Arduino 使用 MovingAverage 实现A0采样平均并输出到PORTD

问题描述

我需要用MovingAverage函数对A0引脚进行X次采样并取平均值,再将结果输出到PORTD(数字引脚0-7)。网上找了MovingAverage的示例但看不懂,已经添加了MovingAverage库,但不确定怎么调用,是否需要用#include语句?如果需要应该放在哪里?

需求补充:读取A0引脚的0.45V-4.7V直流电压,采样取平均后写入PORTD,以下是我的核心代码:

void setup() 
{
    DDRD = 0xFF;   // PORTD所有引脚设为输出
    PORTD = 0xFF;  // PORTD所有引脚初始为高电平
}

void loop() {
  int val = 0;  // 存储读取值的变量
  int analogPin = A0; // 对AD0进行AD转换

while(1)
{
    val = analogRead(analogPin);  // 读取输入引脚

    if (val >= 0 && val <= 50)  PORTD = 0b01111111;  // 低于范围,点亮D7错误LED  
    if (val > 50 && val <= 100)  PORTD = 0b01111111;  // 对应160米,点亮D7错误LED   
    if (val > 100 && val <= 150)  PORTD = 0b11011111;  // 对应80米,点亮D5
    if (val > 150 && val <= 200)  PORTD = 0b01111111;  // 对应60米,点亮D7错误LED
    if (val > 200 && val <= 250)  PORTD = 0b11101111;  // 对应40米,点亮D4
    if (val > 250 && val <= 300)  PORTD = 0b11110111;  // 对应30米,点亮D3
    if (val > 300 && val <= 350)  PORTD = 0b11111011;  // 对应20米,点亮D2
    if (val > 350 && val <= 400)  PORTD = 0b01111111;  // 对应17米,点亮D7错误LED
    if (val > 400 && val <= 450)  PORTD = 0b11111101;  // 对应15米,点亮D1
    if (val > 450 && val <= 500)  PORTD = 0b01111111;  // 对应12米,点亮D7错误LED
    if (val > 500 && val <= 550)  PORTD = 0b11111110;  // 对应10米,点亮D0
    if (val > 550 && val <= 1023)  PORTD = 0b01111111;  // 高于范围,点亮D7错误LED

}//endof while

}//endof main

解决方案

1. MovingAverage库的引用

必须添加 #include <MovingAverage.h>,放在代码的最开头,所有函数定义之前。

2. 初始化MovingAverage对象

在全局作用域(setup()之前)定义一个MovingAverage实例,指定采样次数X:

#include <MovingAverage.h>

// 定义采样次数为X,比如10次,可根据需求修改
MovingAverage avg(10);

3. 修改采样逻辑,获取平均值

在loop的while循环里,每次读取模拟值后添加到MovingAverage实例,然后获取平均值代替单次采样值:

void setup() 
{
    DDRD = 0xFF;   // PORTD所有引脚设为输出
    PORTD = 0xFF;  // PORTD所有引脚初始为高电平
}

void loop() {
  int val = 0;
  int analogPin = A0;

  while(1)
  {
      // 读取模拟值并添加到移动平均队列
      avg.addValue(analogRead(analogPin));
      // 获取移动平均值
      val = avg.getAverage();

      // 优化为else if,减少不必要的判断
      if (val >= 0 && val <= 50)  PORTD = 0b01111111;
      else if (val > 50 && val <= 100)  PORTD = 0b01111111;
      else if (val > 100 && val <= 150)  PORTD = 0b11011111;
      else if (val > 150 && val <= 200)  PORTD = 0b01111111;
      else if (val > 200 && val <= 250)  PORTD = 0b11101111;
      else if (val > 250 && val <= 300)  PORTD = 0b11110111;
      else if (val > 300 && val <= 350)  PORTD = 0b11111011;
      else if (val > 350 && val <= 400)  PORTD = 0b01111111;
      else if (val > 400 && val <= 450)  PORTD = 0b11111101;
      else if (val > 450 && val <= 500)  PORTD = 0b01111111;
      else if (val > 500 && val <= 550)  PORTD = 0b11111110;
      else if (val > 550 && val <= 1023)  PORTD = 0b01111111;
  }
}

4. 关键说明

  • MovingAverage库会自动维护最近X次采样的队列,调用getAverage()就能直接得到平均值,无需手动计算
  • 调整采样次数只需修改初始化时的数字(比如MovingAverage avg(20);就是20次采样平均)
  • 把原代码的独立if改为else if,避免每次执行所有判断,提升代码效率

内容的提问来源于stack exchange,提问作者gooberpat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 05:35:09