多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## **信号平滑** > 本例中程序不断的读取模拟信号值,计算平均值,并且将平均值输出到电脑。本例所展示的方法能够平滑飘忽不定或忽上忽下的模拟信号。例子中也展示了使用数组存储数据的方法。 ### **所需硬件** * Arduino板或Genuino板 * 10kΩ电位器 * 连接线 ### **电路搭建** ![图片来自官网](http://img.blog.csdn.net/20160511153938548)  将电位器两侧的引脚分别连接到5V和GND,将中间引脚连接到A0。 ### **原理图** ![图片来自官网](http://img.blog.csdn.net/20160511153950736) ### **代码** 下列代码按照次序存储10次读取值到数组,将这十个值求和,并且求取平均数,得到的平均数会起到平滑作用。由于计算平均值的时刻是每次添加新的传感器值时(每增加一个就计算一次)。因此,每次代码执行的时间都是相同的。 你可以增加数组的容量,来达到更好的平滑。 ~~~ /* 信号平滑 不断读取模拟信号值、求取平均值后输出到电脑。将10次数据存储到数组并且不断计算平均数。 电路连接: * 模拟信号传感器(电位器即可)连接到A0 代码是公开的. */ // 保存的数据个数越多,平滑效果就越好,不过每次计算时间就越长。 //注意:应该使用常量来定义数组容量,而非变量 // 我们且将元素个数限制为10 const int numReadings = 10; int readings[numReadings]; // 存储数组 int readIndex = 0; // 当前读到的位置(数组下标) int total = 0; // 和 int average = 0; // 平均值 int inputPin = A0; void setup() { // 初始化和电脑的串口连接: 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]; // 下表加一: readIndex = readIndex + 1; // 如果在数组的最后 if (readIndex >= numReadings) { // 从头开始: readIndex = 0; } // 计算平均值: average = total / numReadings; // 作为ASCII字符传到电脑 Serial.println(average); delay(1); // 为稳定,延迟1毫秒。 } ~~~ ### **相关资料** [array](https://www.arduino.cc/en/Reference/Array)  [if](https://www.arduino.cc/en/Reference/If)  [for](https://www.arduino.cc/en/Reference/For)  [serial](https://www.arduino.cc/en/Reference/Serial)