标题: Arduino教程-求均值 [打印本页]

作者: 51黑电子论坛    时间: 2016-3-3 01:53
标题: Arduino教程-求均值
Hi,大家好!今天,我们将一起学习一种求均值的方法。有时候,我们会碰到一些传感器,它们所产生的数值之间,有可能不连贯,或者说具有跳跃性,但我们又不想被某些“不和谐”的数值所干扰,所以我们就需要取之前的一小撮数,通过计算均值的方式,对数值进行处理。
好!简单说明之后,让我们看看,具体是怎样实现的吧。
硬件方面
图片来源:Arduino电路连接
具体包括:
上面的配件,我们之前都已经见过,不用再多说什么。
软件方面Arduino官方提供的IDE
连接电路
图片来源:Arduino电路连接
电路的连接非常的简单,不多讲。
下面是最后一步,也是最重要的一步!
添加几行代码首先,新建一个项目窗口。

图片来源:Arduino官方IDE
向其中添加几行代码:


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



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

图片来源:Arduino官方IDE的文件编辑菜单选项
点击上图中,最右侧放大镜图标的按钮,打开串口调试窗口,大致如下图所示。

图片来源:Arduino串口调试窗口
总结通过这次学习,我们了解了如何对读取到的数值进行平均化,去掉当中偏大或偏小的数值。这是一种防止数值跳变的好方法。
下期预告我们已经学习了二十个星期,接下来,休息,休息一下!



作者: 海洋lhk    时间: 2017-3-27 21:08
必须给楼主一个赞
作者: zmc419    时间: 2017-4-28 18:21
很好,简单易用
作者: chaoyangengr    时间: 2018-5-4 13:52
总值中,减去数组的最后一个数值为什么呢?
作者: kevin10120    时间: 2018-5-5 02:42
哇 谢谢楼主 初学者的福利啊
作者: 787384900    时间: 2022-10-27 18:28
楼主写的真好,赞一个,专门登录论坛账号来赞美楼主,代码以修改到自己的程序了,相当经典而且写的通俗易懂!
作者: zmc419    时间: 2023-2-2 20:37
滑动滤波算法?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1