找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13822|回复: 6
收起左侧

Arduino教程-求均值

[复制链接]
ID:99556 发表于 2016-3-3 01:53 | 显示全部楼层 |阅读模式
Hi,大家好!今天,我们将一起学习一种求均值的方法。有时候,我们会碰到一些传感器,它们所产生的数值之间,有可能不连贯,或者说具有跳跃性,但我们又不想被某些“不和谐”的数值所干扰,所以我们就需要取之前的一小撮数,通过计算均值的方式,对数值进行处理。
好!简单说明之后,让我们看看,具体是怎样实现的吧。
硬件方面 arduino-smoothing-parts.jpg
图片来源:Arduino电路连接
具体包括:
  • Arduino UNO电路板(1块)
  • 旋转电位计(1个)
  • 面包板(1块)
  • 面包线(若干)
上面的配件,我们之前都已经见过,不用再多说什么。
软件方面Arduino官方提供的IDE
连接电路 arduino-smoothing.jpg
图片来源:Arduino电路连接
电路的连接非常的简单,不多讲。
下面是最后一步,也是最重要的一步!
添加几行代码首先,新建一个项目窗口。
arduino-ide-new.jpg
图片来源: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-menu.jpg
图片来源:Arduino官方IDE的文件编辑菜单选项
点击上图中,最右侧放大镜图标的按钮,打开串口调试窗口,大致如下图所示。
arduino-smoothing-analog.jpg
图片来源:Arduino串口调试窗口
总结通过这次学习,我们了解了如何对读取到的数值进行平均化,去掉当中偏大或偏小的数值。这是一种防止数值跳变的好方法。
下期预告我们已经学习了二十个星期,接下来,休息,休息一下!


回复

使用道具 举报

ID:177116 发表于 2017-3-27 21:08 | 显示全部楼层
必须给楼主一个赞
回复

使用道具 举报

ID:137736 发表于 2017-4-28 18:21 来自手机 | 显示全部楼层
很好,简单易用
回复

使用道具 举报

ID:322034 发表于 2018-5-4 13:52 | 显示全部楼层
总值中,减去数组的最后一个数值为什么呢?
回复

使用道具 举报

ID:322213 发表于 2018-5-5 02:42 | 显示全部楼层
哇 谢谢楼主 初学者的福利啊
回复

使用道具 举报

ID:493412 发表于 2022-10-27 18:28 | 显示全部楼层
楼主写的真好,赞一个,专门登录论坛账号来赞美楼主,代码以修改到自己的程序了,相当经典而且写的通俗易懂!
回复

使用道具 举报

ID:137736 发表于 2023-2-2 20:37 | 显示全部楼层
滑动滤波算法?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表