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
相关产品推荐
相关产品推荐

