0 前言
大家好!我叫樂創物聯,我主要是做工業自動化方面和物聯網方面的。了解熟悉工業自動化領域的,也開發過物聯網相關的産品。我的初衷是做工業物聯網的,但這個系統太過于龐大,後續也會自主去學習一下。是以就先做小的系統,例如建構一整套智能家居系統,從硬體到軟體全系列。下面就開始這套智能家居系統是如何在物聯網基礎上建構。在這裡你可以0開始,然後到1質變,僅僅需要一起跟我學樂創物聯物聯網架構的學習。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yNjZGZ5MTZwIzN4MGOyUzMhdTMwYjZjRmY1YTO3EDMl9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
樂創物聯物聯網學習路線
回顧一下上節《樂創物聯物聯網架構之硬體層中間件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調速或音樂播放。
Arduino
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
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 Celcius
return Temp;
}
void setup() {
Serial.begin(9600);
}
void loop() {
val=analogRead(A0);
Serial.print(Thermister(val)); // display Fahrenheit
Serial.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 2
void 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(" output=");
Serial.println(outputValue);
delay(2000);
}
PWM調LED亮度例子
7 結論
這些都是經過實踐檢驗的,本來想等開專欄,放專欄裡的,現在不掙錢,交個朋友!跟我一起入門物聯網吧!