|
Hi,大家好!今天,我們將一起學(xué)習(xí)一種求均值的方法。有時(shí)候,我們會(huì)碰到一些傳感器,它們所產(chǎn)生的數(shù)值之間,有可能不連貫,或者說(shuō)具有跳躍性,但我們又不想被某些“不和諧”的數(shù)值所干擾,所以我們就需要取之前的一小撮數(shù),通過(guò)計(jì)算均值的方式,對(duì)數(shù)值進(jìn)行處理。
好!簡(jiǎn)單說(shuō)明之后,讓我們看看,具體是怎樣實(shí)現(xiàn)的吧。
硬件方面
arduino-smoothing-parts.jpg (77.98 KB, 下載次數(shù): 189)
下載附件
2016-3-3 01:54 上傳
圖片來(lái)源:Arduino電路連接
具體包括:
- Arduino UNO電路板(1塊)
- 旋轉(zhuǎn)電位計(jì)(1個(gè))
- 面包板(1塊)
- 面包線(若干)
上面的配件,我們之前都已經(jīng)見(jiàn)過(guò),不用再多說(shuō)什么。
軟件方面Arduino官方提供的IDE
連接電路
arduino-smoothing.jpg (149.28 KB, 下載次數(shù): 170)
下載附件
2016-3-3 01:54 上傳
圖片來(lái)源:Arduino電路連接
電路的連接非常的簡(jiǎn)單,不多講。
下面是最后一步,也是最重要的一步!
添加幾行代碼首先,新建一個(gè)項(xiàng)目窗口。
arduino-ide-new.jpg (70.98 KB, 下載次數(shù): 172)
下載附件
2016-3-3 01:54 上傳
圖片來(lái)源:Arduino官方IDE
向其中添加幾行代碼:
- // 定義讀取數(shù)值的數(shù)目,
- // 初始化為 10
- const int numReadings = 10;
- // 定義存儲(chǔ)讀入數(shù)值的數(shù)組
- int readings[numReadings];
- // 定義指示數(shù)組數(shù)值的索引
- int readIndex = 0;
- // 定義存儲(chǔ)數(shù)組數(shù)值的總數(shù)
- int total = 0;
- // 定義數(shù)組數(shù)值的平均數(shù)
- int average = 0;
- // 定義旋轉(zhuǎn)電位計(jì)的模擬信號(hào)輸入針腳
- int inputPin = A0;
- // 對(duì)Arduino電路板或相關(guān)狀態(tài)進(jìn)行初始化方法
- void setup() {
- // 開(kāi)啟串行通信,并設(shè)置其頻率為9600。
- // 如果沒(méi)有特別要求,此數(shù)值一般都為9600。
- Serial.begin(9600);
- // 初始化存儲(chǔ)讀入數(shù)值的數(shù)組,
- // 講每個(gè)數(shù)值設(shè)置為 0 。
- for (int thisReading = 0; thisReading < numReadings; thisReading++) {
- readings[thisReading] = 0;
- }
- }
- // 系統(tǒng)調(diào)用,無(wú)限循環(huán)方法
- void loop() {
- // 總值中,減去數(shù)組的最后一個(gè)數(shù)值
- total = total - readings[readIndex];
- // 讀入當(dāng)前旋轉(zhuǎn)電位計(jì)的數(shù)值,
- // 并將其存儲(chǔ)到數(shù)組的最后一位。
- readings[readIndex] = analogRead(inputPin);
- // 將最新讀入的數(shù)值加入到總值中
- total = total + readings[readIndex];
- // 將數(shù)組指示索引值加1
- readIndex = readIndex + 1;
- // 判斷數(shù)組指示索引是否超出數(shù)組范圍,
- // 如果是,將數(shù)組指示索引重置為0
- if (readIndex >= numReadings) {
- readIndex = 0;
- }
- // 計(jì)算平均值
- average = total / numReadings;
- // 將最終計(jì)算的平均值輸出到串行調(diào)試窗口。
- Serial.println(average);
- // 延遲一毫秒,
- // 進(jìn)入下一個(gè)循環(huán)。
- delay(1);
- }
復(fù)制代碼
輸入完畢!上面的代碼里,沒(méi)有新方法,也沒(méi)有復(fù)雜的數(shù)據(jù)結(jié)構(gòu),只有一個(gè)數(shù)組而已。用到的算法也是蠻簡(jiǎn)單,每次循環(huán)的時(shí)候,減去數(shù)組最后的一個(gè)數(shù)值,隨后將從旋轉(zhuǎn)電位計(jì)新讀入的數(shù)值存入其中,然后計(jì)算總值以及最終的平均值,每次只修改數(shù)組的最后一個(gè)數(shù)值,并計(jì)算平均值。
arduino-menu.jpg (9.87 KB, 下載次數(shù): 176)
下載附件
2016-3-3 01:54 上傳
圖片來(lái)源:Arduino官方IDE的文件編輯菜單選項(xiàng)
點(diǎn)擊上圖中,最右側(cè)放大鏡圖標(biāo)的按鈕,打開(kāi)串口調(diào)試窗口,大致如下圖所示。
arduino-smoothing-analog.jpg (68.88 KB, 下載次數(shù): 156)
下載附件
2016-3-3 01:54 上傳
圖片來(lái)源:Arduino串口調(diào)試窗口
總結(jié)通過(guò)這次學(xué)習(xí),我們了解了如何對(duì)讀取到的數(shù)值進(jìn)行平均化,去掉當(dāng)中偏大或偏小的數(shù)值。這是一種防止數(shù)值跳變的好方法。
下期預(yù)告我們已經(jīng)學(xué)習(xí)了二十個(gè)星期,接下來(lái),休息,休息一下!
|
|