前言
主要思路:定义一个数组存储传感器读取到的值,然后去掉最小值和最大值,然后中间部分的数据取平均。
程序参考:
B站UP:孤独的二进制
气泡排序获取传感器最佳读数 - 孤独的二进制 - 每天5分钟 带你走近Arduino开发板的神奇世界_哔哩哔哩_bilibili
程序说明:在原有的基础上去除了按键控制和打印输出原数组的数据
把传感器接入A0即可正常使用
#define SENSORPIN A0
const byte dataReadinglength = 10; //数组总数
int dataReading[dataReadinglength] = {0}; // 0 - 9 10个度数
void setup() {
Serial.begin(9600);
pinMode(SENSORPIN, INPUT);
}
void loop() {
for (int i = 0; i < dataReadinglength; i++) {
// 将读数放入到数组中
dataReading[i] = analogRead(SENSORPIN);
delay(50);
}
getValue(dataReading, dataReadinglength, true);
}
//气泡排序,去掉最小的,去掉最大的,然后平均
int getValue(int array[], int size, bool printlog) {
bubbleSort(array, size); //气泡排序
if (printlog) {
Serial.print("After Sorting ");
printArray(dataReading, size);
}
//对于array size小于3个的数组,选择全部数据
byte arrayBegin = 0;
byte arrayEnd = size - 1;
//对于array size 大于3个的数据,
//去掉最小和最大,然后选择中间的30%数据
if (size > 3) {
arrayBegin = size * 0.3;
arrayEnd = size * 0.7;
}
int readingSum = 0;
for (int i = arrayBegin; i < arrayEnd; i++) {
readingSum += dataReading[i];
}
int readingAvg = readingSum / (arrayEnd - arrayBegin);
if (printlog) {
Serial.print("Average :");
Serial.println(readingAvg);
}
return readingAvg;
}
//气泡排序 size 为数组的length
void bubbleSort(int array[], int size) {
//外循环 : 循环总次数为 (size -1) : step = 0 to size -2
for (int otter = 0; otter < size - 1; ++otter) {
// 内循环 - 总次数为 (size-1-step) : i = 0 to size - 2 - step
for (int inner = 0; inner < size - 1 - otter; ++inner) {
// 比较数组中当前数值和下一个的数值
// 如果当前数值大,则交换位置
if (array[inner] > array[inner + 1]) {
int temp = array[inner];
array[inner] = array[inner + 1];
array[inner + 1] = temp;
}
}
}
}
// 打印数组
void printArray(int array[], int size) {
for (int i = 0; i < size; ++i) {
Serial.print(array[i]);
Serial.print(", ");
}
Serial.println("");
}
运行结果: