0 前言
大家好!我叫樂創物聯,我主要是做工業自動化方面和物聯網方面的。了解熟悉工業自動化領域的,也開發過物聯網相關的產品。我的初衷是做工業物聯網的,但這個系統太過於龐大,後續也會自主去學習一下。所以就先做小的系統,例如構建一整套智能家居系統,從硬體到軟體全系列。下面就開始這套智能家居系統是如何在物聯網基礎上構建。在這裡你可以0開始,然後到1質變,僅僅需要一起跟我學樂創物聯物聯網架構的學習。
回顧一下上節樂創物聯物聯網架構之硬體層中間件Arduino數字量,從Arduino數字量(數字 I/O、時間函數、串口收發函數),然後介紹Blink例子、按鈕控制LED例子,最後講解了按鍵消抖原理。本節就來講感知層下硬體層中間件Arduino模擬量。感知層是物聯網最基礎的部分,就像人的五官一樣去感受世界。
1 Arduino 模擬量
模擬 I/O
int analogRead(pin) 模擬IO口讀函數,pin表示為0~5(Arduino Diecimila為0~5,Arduino nano為0~7)。比如可以讀模擬傳感器(10位AD,0~5V表示為0~1023)。
analogWrite(pin, value) - PWM 數字IO口PWM輸出函數,Arduino數字IO口標註了PWM的IO口可使用該函數,pin表示3, 5, 6, 9, 10, 11,value表示為0~255。比如可用於電機PWM調速或音樂播放。
2 模數轉換功能
步驟:
1) 定義需要的模擬量輸入引腳,Arduino UNO 為 A0~A5;
2) 讀取對應的模擬量,10位精度,2的10次方,0~1023;
3) 把對應的模擬量進行比例變換,使用map()函數或者用其他函數;
4) 把最終數據顯示到串口、液晶、數碼管等設備上。
3 PWM脈寬調製
PWM是英文「Pulse Width Modulation」的縮寫,簡稱脈寬調製。它是利用微處理器的數字輸出來對模擬電路進行控制的一種有效的技術手段,廣泛應用於測量、通信、功率控制與變換等許多領域。PWM,頻率不變(周期不變),脈衝高電平寬度可以調節,實際是調試做功時間(單位時間做功),從而達到調節電壓、電流或者功率等參數。
PWM在一些情況下可以代替DAC(數模轉換)功能。所以在Arduino裡面使用函數analogWrite(pin, value) 寫模擬量,Arduino的PWM是8位,換算數字量是0~255。PWM使用晶片內部自帶的PWM發生器,只有主板上標有PWM標識的才能用。Arduino UNO的PWM引腳為3/5/6/9/10/11。
4 熱敏電阻溫度例子
該模塊是基於熱敏電阻(阻值隨外界環境溫度變化而變化)的工作原理,能夠實時感知周邊環境溫度的變化,我們把數據送到 Arduino 的 analog IO,接來下我們只要經過簡單的編程就能將傳感器輸出的數據轉換為攝氏溫度值,並加以顯示,使用起來還是方便、有效的呢,藉此廣泛應用於園藝、家庭警報系統等裝置中。與一般的溫度傳感器是一樣的,都是 3 線封裝,我們在使用時接好電源線後確定信號輸入端就行了,因為模塊輸出的是模擬信號,我們要把信號輸出端接到 Arduino 的模擬 IO上進行採樣,這樣才能正確讀出溫度值;熱敏電阻之所以也能測量溫度,就是因為它結合了 Steinhart-Hart Thermistor 方程,測試代碼中的函數 double Thermister(int RawADC)就是該方程的體現。溫馨提示:代碼中有用到關於 Steinhart-Hart Thermistor 方程的應用。
請參閱http://en.wikipedia.org/wiki/Thermistor
#include <math.h>int val;double Thermister(int RawADC) {double Temp;Temp = log(((10240000/RawADC) - 10000));Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp ))* Temp );Temp = Temp - 273.15; // Convert Kelvin to Celciusreturn Temp;}void setup() {Serial.begin(9600);}void loop() {val=analogRead(A0);Serial.print(Thermister(val)); // display FahrenheitSerial.println("C");delay(5000);}
5 土壤傳感器例子
用於土壤的溼度檢測。可通過電位器調節土壤溼度的閥值,順時針調節,控制的溼度會越大,逆時針越小;溼度低於設定值時,DO輸出高電平,模塊提示燈亮;溼度高於設定值時,DO輸出低電平,模塊提示燈滅。工作電壓3.3V-5V。3V時,在空氣中AO讀取的值最大為695 , 浸泡在水裡的 最小值245;5V時,在空氣中AO讀取的值最大為1023 ,浸泡在水裡的最小值 245。
#define PIN_AO 0#define PIN_DO 2void setup() {pinMode(PIN_AO, INPUT);pinMode(PIN_DO, INPUT);Serial.begin(9600);}void loop() {Serial.print("AO=");Serial.print(analogRead(PIN_AO));Serial.print(", DO=");Serial.println(digitalRead(PIN_DO));delay(5000);}
6 PWM調LED亮度
const int analogInPin = A0;//模擬量輸入const int analogOutPin = 9;//PWM輸出引腳int sensorValue = 0;//電位計電壓值int outputValue = 0;//模擬量輸出值(PWM)void setup() {// 串口初始化Serial.begin(9600);}void loop() {// 讀模擬量值sensorValue = analogRead(A0);//變換數據空間outputValue = map(sensorValue, 0, 1023, 0, 255);//輸出對應的PWM值analogWrite(analogOutPin, outputValue);//列印到串口Serial.print("sensor=");Serial.print(sensorValue);Serial.print("\t output=");Serial.println(outputValue);delay(2000);}
7 結論
這些都是經過實踐檢驗的,本來想等開專欄,放專欄裡的,現在不掙錢,交個朋友!跟我一起入門物聯網吧!