這三種方式,各有優缺點,第一種往往價格比較便宜,但是溫濕度傳感器要和采集晶片必須很近才成,并且必須要實作單總線相關的代碼,開發和調試相對比較複雜;第二種使用相對最容易,一般情況下直接和PC通信居多,不過價格也是最高的;第三種價格适中,并且傳輸的距離也比單總線方式要遠的多。
AD方式的溫濕度傳感器和另兩種有所不同,前兩種一般溫濕度已經處理好,通過協定解析就可以直接擷取溫濕度的數值。而AD方式采集的隻是電壓值,需要根據一定的公式進行資料計算,才能擷取最終的溫濕度值。
今天我們就介紹如何用紫藤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相關資料手冊)。
下面簡單介紹一下AMT1001溫濕度傳感器(如下圖):
傳感器采用四線方式,5V供電,并提供了一些以供計算的标準參數。對濕度采集來說,非常簡單,相應管腳直接輸出0~3V的電壓值,然後直接查表就可以很容易計算出濕度值來。而溫度采集卻不同,輸出的電壓範圍大概是0~0.8V,變化非常小,并且不能通過這個電壓值,直接查表擷取溫度值,而是間接計算出電阻值,然後再查表擷取相關溫度值。
溫度采集除了這些和濕度采集不同外,還需要外加一個電阻,該電阻的阻值要和傳感器子產品中的溫敏電阻25度時的阻值一樣(主要目的是便于計算)。外接電阻和溫敏電阻其實是串聯在一起,AD采集的就是這10K上的電壓值。那麼溫敏電阻的阻值就可以這樣計算:假設10K上的電壓值為V,那麼溫敏電阻上的電壓就是5-V(因為子產品供電電壓為5V),根據等比公式就可以知道目前溫敏電阻的值R= (5 - V) / V * R0。
紫藤207子產品和ATM1001子產品電路連接配接圖如下(圖中的電阻就是10K):
相關代碼如下:
//濕度
static double ConvertHumidity(double value)
{
double V = (value / 4096) * 3.3;
return DataTransition(V, AMT1001_Voltage, AMT1001_Humidityvalue);
}
//溫度
static double ConvertTemperature(double value)
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)。
程式運作後的最終效果圖如下:
<a href="http://weibo.com/1804832611?s=6uyXnP"></a>