Hi,大家好!今天,我們將一起學習一種求均值的方法。有時候,我們會碰到一些傳感器,它們所產生的數值之間,有可能不連貫,或者說具有跳躍性,但我們又不想被某些“不和諧”的數值所干擾,所以我們就需要取之前的一小撮數,通過計算均值的方式,對數值進行處理。
好!簡單說明之后,讓我們看看,具體是怎樣實現的吧。
硬件方面
arduino-smoothing-parts.jpg (77.98 KB, 下載次數: 189)
下載附件
2016-3-3 01:54 上傳
圖片來源:Arduino電路連接
具體包括:
- Arduino UNO電路板(1塊)
- 旋轉電位計(1個)
- 面包板(1塊)
- 面包線(若干)
上面的配件,我們之前都已經見過,不用再多說什么。
軟件方面Arduino官方提供的IDE
連接電路
arduino-smoothing.jpg (149.28 KB, 下載次數: 170)
下載附件
2016-3-3 01:54 上傳
圖片來源:Arduino電路連接
電路的連接非常的簡單,不多講。
下面是最后一步,也是最重要的一步!
添加幾行代碼首先,新建一個項目窗口。
arduino-ide-new.jpg (70.98 KB, 下載次數: 172)
下載附件
2016-3-3 01:54 上傳
圖片來源:Arduino官方IDE
向其中添加幾行代碼:
- // 定義讀取數值的數目,
- // 初始化為 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.jpg (9.87 KB, 下載次數: 176)
下載附件
2016-3-3 01:54 上傳
圖片來源:Arduino官方IDE的文件編輯菜單選項
點擊上圖中,最右側放大鏡圖標的按鈕,打開串口調試窗口,大致如下圖所示。
arduino-smoothing-analog.jpg (68.88 KB, 下載次數: 156)
下載附件
2016-3-3 01:54 上傳
圖片來源:Arduino串口調試窗口
總結通過這次學習,我們了解了如何對讀取到的數值進行平均化,去掉當中偏大或偏小的數值。這是一種防止數值跳變的好方法。
下期預告我們已經學習了二十個星期,接下來,休息,休息一下!
|