Oh!Coder

Coding Life

好玩的Arduino-求均值

| Comments

Hi,大家好!今天,我们将一起学习一种求均值的方法。有时候,我们会碰到一些传感器,它们所产生的数值之间,有可能不连贯,或者说具有跳跃性,但我们又不想被某些“不和谐”的数值所干扰,所以我们就需要取之前的一小撮数,通过计算均值的方式,对数值进行处理。

好!简单说明之后,让我们看看,具体是怎样实现的吧。

硬件方面

arduino-smoothing-parts

图片来源:Arduino电路连接

具体包括:

  • Arduino UNO电路板(1块)
  • 旋转电位计(1个)
  • 面包板(1块)
  • 面包线(若干)

上面的配件,我们之前都已经见过,不用再多说什么。

软件方面

Arduino官方提供的IDE

连接电路

arduino-smoothing

图片来源:Arduino电路连接

电路的连接非常的简单,不多讲。

下面是最后一步,也是最重要的一步!

添加几行代码

首先,新建一个项目窗口。

arduino-ide-new

图片来源:Arduino官方IDE

向其中添加几行代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// 定义读取数值的数目,
// 初始化为 10 
const int numReadings = 10;
// 定义存储读入数值的数组
int readings[numReadings];
// 定义指示数组数值的索引
int readIndex = 0;
// 定义存储数组数值的总数
int total = 0;
// 定义数组数值的平均数
int average = 0;
// 定义旋转电位计的模拟信号输入针脚
int inputPin = A0;
// 对Arduino电路板或相关状态进行初始化方法
void setup() {
  // 开启串行通信,并设置其频率为9600。
  // 如果没有特别要求,此数值一般都为9600。
  Serial.begin(9600);
  // 初始化存储读入数值的数组,
  // 讲每个数值设置为 0 。
  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }
}
// 系统调用,无限循环方法
void loop() {
  // 总值中,减去数组的最后一个数值
  total = total - readings[readIndex];
  // 读入当前旋转电位计的数值,
  // 并将其存储到数组的最后一位。
  readings[readIndex] = analogRead(inputPin);
  // 将最新读入的数值加入到总值中
  total = total + readings[readIndex];
  // 将数组指示索引值加1
  readIndex = readIndex + 1;
  // 判断数组指示索引是否超出数组范围,
  // 如果是,将数组指示索引重置为0
  if (readIndex >= numReadings) {
    readIndex = 0;
  }
  // 计算平均值
  average = total / numReadings;
  // 将最终计算的平均值输出到串行调试窗口。
  Serial.println(average);
  // 延迟一毫秒,
  // 进入下一个循环。
  delay(1);
}

输入完毕!上面的代码里,没有新方法,也没有复杂的数据结构,只有一个数组而已。用到的算法也是蛮简单,每次循环的时候,减去数组最后的一个数值,随后将从旋转电位计新读入的数值存入其中,然后计算总值以及最终的平均值,每次只修改数组的最后一个数值,并计算平均值。

arduino-menu

图片来源:Arduino官方IDE的文件编辑菜单选项

点击上图中,最右侧放大镜图标的按钮,打开串口调试窗口,大致如下图所示。

arduino-smoothing-analog

图片来源:Arduino串口调试窗口

总结

通过这次学习,我们了解了如何对读取到的数值进行平均化,去掉当中偏大或偏小的数值。这是一种防止数值跳变的好方法。

下期预告

我们已经学习了二十个星期,接下来,休息,休息一下!

Comments