Hi,大家好!上一次,我們給大家介紹了一位新成員,代號叫Arduino Mega2560,在這里跟大家提個醒兒,在以后的學習中,只要Arduino UNO能完成的實驗,用Mega2560也一定能完成。好,就醬!下面繼續我們今天新的內容。
在實際使用中,我們很有可能會遇到一種情況,將模擬信號接口獲取到的數值進行重新校準,以方便我們在項目中接下來的實際操作中,使用起來更加便捷。今天我們就來一起看看,關于這個問題,到底是如何解決的。
首先,還是先來看看,我們都需要哪些硬件吧。
硬件方面
arduino-data-calibration-parts.jpg (130.46 KB, 下載次數: 211)
下載附件
2016-1-30 18:43 上傳
圖片來源:Arduino電路硬件
具體如下:
- Arduino UNO(1塊)
- 面包板(1塊)
- 220Ω電阻(1個)
- 10KΩ電阻(1個)
- LED神燈(1個)
- 光敏電阻(1個)
- 面包線(若干)
嗯,看起來沒有陌生的面孔,之前我們都見過的。好,繼續。
軟件方面Arduino官方提供的IDE
連接電路
arduino-data-calibration.jpg (129.33 KB, 下載次數: 204)
下載附件
2016-1-30 18:43 上傳
圖片來源:Arduino電路連接
還好還好,電路連接也不是特別復雜。在之前的學習中,我們已經對光敏電阻學習過,所以對它的電路連接應該也比較熟悉了。如果一切順利,讓我們進行最后一步。
添加幾行代碼首先,還是新建一個項目窗口。
arduino-ide-new.jpg (70.98 KB, 下載次數: 210)
下載附件
2016-1-30 18:43 上傳
圖片來源:Arduino官方IDE
然后向其中添加幾行代碼:
- // 定義光敏電阻模擬信號引腳常量
- const int sensorPin = A0;
- // 定義LED神燈數字信號引腳常量
- const int ledPin = 9;
- // 定義接收光敏電阻模擬信號數值變量
- int sensorValue = 0;
- // 定義光敏電阻模擬信號最小數值變量,
- // 初始化為最大常見整數值1023。
- int sensorMin = 1023;
- // 定義光敏電阻模擬信號最大數值變量,
- // 初始化為最小常見整數值0。
- int sensorMax = 0;
- // 對Arduino電路板或相關狀態進行初始化方法
- void setup() {
- // 定義13號數字引腳為輸出類型引腳
- pinMode(13, OUTPUT);
- // 將13號引腳的狀態初始化為高電壓,
- // 也即將Arduino UNO電路板上自帶的
- // 那盞LED神燈點亮。
- // 點亮此LED神燈的目的是為了清晰的指示
- // 接下來要進行的5秒鐘操作。
- digitalWrite(13, HIGH);
- // 在最開始的5秒鐘,不停地獲取光敏電阻的
- // 數值,以此在這5秒鐘內得到其中的最大和
- // 最小數值。
- while (millis() < 5000) {
- sensorValue = analogRead(sensorPin);
- // 比較獲取到的數值,
- // 如果比sensorMax數值大,
- // 則賦值給sensorMax,以此記錄最終得到
- // 的最大值。
- if (sensorValue > sensorMax) {
- sensorMax = sensorValue;
- }
- // 比較獲取到的數值,
- // 如果比sensorMin數值小,
- // 則賦值給sensorMin,以此記錄最終得到
- // 的最小值。
- if (sensorValue < sensorMin) {
- sensorMin = sensorValue;
- }
- }
- // 5秒鐘過后,將13號數字引腳的數值
- // 設置為低電壓,以此熄滅Arduino UNO
- // 電路板自帶的那盞LED神燈。
- digitalWrite(13, LOW);
- }
- // 系統調用,無限循環方法
- void loop() {
- // 讀取光敏電阻的數值
- sensorValue = analogRead(sensorPin);
- // 使用map()方法,將獲取到的sensorValue數值,
- // 從sensorMin~sensorMax的數值范圍內,
- // 映射到0~255數值范圍內的某個數值。
- sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255);
- // 保證映射完成之后的sensorValue數值在0~255范圍內。
- // 第一個參數是輸入值,
- // 第二個參數和第三個參數是數值的取值范圍。
- // 返回值被限定在0~255之間。
- sensorValue = constrain(sensorValue, 0, 255);
- // 將最終校準后的數值設置給LED神燈
- analogWrite(ledPin, sensorValue);
復制代碼
好!代碼一共就這幾行,只有一個新面孔,那就是constrain()方法。這個方法的使用也很簡單,代碼的注釋里已經說明了使用方法,這里不再啰嗦。
arduino-menu.jpg (9.87 KB, 下載次數: 204)
下載附件
2016-1-30 18:43 上傳
圖片來源:Arduino官方IDE的文件編輯菜單選項
點擊上圖中標有向右指向的箭頭圖標,將編寫完成的代碼燒入Arduino電路板。如果一切順利,LED神燈的亮度會隨著光敏電阻的光線強弱進行變化。
總結通過這次學習,我們知道了如何校準數值。這對于主要以模擬信號的傳感器而言,有時候是非常必要的,可以過濾掉忽高忽低的數值,并將最終數值強制變換到指定的某個數值范圍內,對于數值的穩定起到很關鍵的作用。在我們做的這個實驗中,光敏電阻越亮,產生的數值越大,相應的LED神燈也就越亮。那如果想讓光敏電阻越暗,LED神燈變的越亮應該怎么辦呢?如果改裝一下,就可以變身一款時髦的應急燈嘍!可以開動腦筋想一想!
下期預告對于模擬信號的傳感器,產生的數值有可能不是非常的穩定,或者說偶爾有可能會產生忽高忽低的數值,那如何讓獲取到的模擬數值變的連貫平滑呢?好!下一次我們就解決這個問題!
|