這三種方式,各有優缺點,第一種每每價格比較便宜,可是溫溼度傳感器要和採集芯片必須很近才成,而且必需要實現單總線相關的代碼,開發和調試相對比較複雜;第二種使用相對最容易,通常狀況下直接和PC通訊居多,不過價格也是最高的;第三種價格適中,而且傳輸的距離也比單總線方式要遠的多。spa
AD方式的溫溼度傳感器和另兩種有所不一樣,前兩種通常溫溼度已經處理好,經過協議解析就能夠直接獲取溫溼度的數值。而AD方式採集的只是電壓值,須要根據必定的公式進行數據計算,才能獲取最終的溫溼度值。.net
今天咱們就介紹如何用紫藤207物聯網智能網關的AD接口採集AMT1001溫溼度傳感器的溫溼度數值。調試
紫藤207物聯網智能網關一共有8路AD通道,對應的管腳爲PA4、PA6、PA5、PB1、PA0、PC3、PC2和PC0,分別對應AnalogInput類的0~7通道(AnalogChannel.ANALOG_0~ AnalogChannel.ANALOG_7),固然這個幾個管腳除了能夠做爲AD輸入通道外,還能夠做爲IO入、IO出和PWM輸出(僅PB1和PB5兩路)。對象
須要說明的是,該AD通道可採集的電壓範圍是0~3.3V(全部採集通道的總電路不要超過20mA),注意不要超出該範圍,以避免對芯片形成永久的損害(具體指標能夠參見STM32F207相關數據手冊)。blog
下面簡單介紹一下AMT1001溫溼度傳感器(以下圖):接口
傳感器採用四線方式,5V供電,並提供了一些以供計算的標準參數。對溼度採集來講,很是簡單,相應管腳直接輸出0~3V的電壓值,而後直接查表就能夠很容易計算出溼度值來。而溫度採集卻不一樣,輸出的電壓範圍大概是0~0.8V,變化很是小,而且不能經過這個電壓值,直接查表獲取溫度值,而是間接計算出電阻值,而後再查表獲取相關溫度值。開發
溫度採集除了這些和溼度採集不一樣外,還須要外加一個電阻,該電阻的阻值要和傳感器模塊中的溫敏電阻25度時的阻值同樣(主要目的是便於計算)。外接電阻和溫敏電阻實際上是串聯在一塊兒,AD採集的就是這10K上的電壓值。那麼溫敏電阻的阻值就能夠這樣計算:假設10K上的電壓值爲V,那麼溫敏電阻上的電壓就是5-V(由於模塊供電電壓爲5V),根據等比公式就能夠知道當前溫敏電阻的值R= (5 - V) / V * R0。get
紫藤207模塊和ATM1001模塊電路鏈接圖以下(圖中的電阻就是10K):源碼
相關代碼以下:it
//溼度
static double ConvertHumidity(double value)
{
double V = (value / 4096) * 3.3;
return DataTransition(V, AMT1001_Voltage, AMT1001_Humidityvalue);
}
//溫度
static double ConvertTemperature(double value)
{
double V = (value / 4096) * 3.3;
double R = (5 - V) / V * AMT1001_R;
return DataTransition(R, AMT1001_Resistance, AMT1001_Temperaturevalue);
}
爲了便於演示,我把相關的溫溼度值除了經過串口輸出外,還直接顯示在LCD上,其核心代碼以下。
screen.DrawRectangle(Color.Black, 0, 60, 70, 200, 200, 0, 0, Color.Black, 0, 0, Color.Black, 0, 0, 255);
screen.DrawText("溫度: " + T.ToString("F2") + " ℃?",font, Colors.Green,60,70);
screen.DrawText("溼度: " + H.ToString("F2") + " %", font, Colors.Blue, 60, 120);
screen.Flush();
screen 是一個位圖對象(Bitmap)。
程序運行後的最終效果圖以下:
本文源碼:http://www.sky-walker.com.cn/MFRelease/Sample/YF_AMT1001.rar