我們封裝後的類庫如下:
public sealed class DHT11
{
public DHT11(DHT11.Timer timer, DHT11.Channels channel);
public bool Read(out float temperature, out float humidity);
public static bool ReadData(out float temperature, out float humidity);
public enum Channels
{
CH1 = 0,
CH2 = 1,
CH3 = 2,
CH4 = 3,
}
public enum Timer
{
T2 = 1,
T3 = 2,
T4 = 3,
T5 = 4,
}
}
T2、T3、T4、T5四個時鐘的四個通道都可以連接DHT11模塊,進行數據採集,其和Pin腳的對應關係如下:
|
通道1 |
通道2 |
通道3 |
通道4 |
Timer2 |
PA0 |
PA1 |
PA2 |
PA3 |
Timer3 |
PA6 |
PA7 |
PB0 |
PB1 |
Timer4 |
PB6 |
PB7* |
PB8* |
PB9 |
Timer5 |
PA0 |
PA1 |
PA2 |
PA3 |
注:以上信息,可以通過查原理圖獲知,其中帶“*”的管腳實際測試未能成功獲取數據。
設備接線,我們的示例程序選擇的是Timer3的第三通道,所以我們連接的Pin腳是PB0
示例代碼如下:
public static void Main()
{
//PB0
DHT11 dht11 = new DHT11(DHT11.Timer.T3, DHT11.Channels.CH3);
float temperature;
float humidity;
while (true)
{
dht11.Read(out temperature, out humidity);
Debug.Print(STR(temperature,2) + " " + STR(humidity,2));
Thread.Sleep(100);
}
}
值得一提的是,.NET Micro Framework的浮點數轉換字符串函數存在BUG,在某些MCU的.NET Micro Framework平臺上進行這個轉換操作會出錯,目前發現STM32F103和Atmel 9260芯片上都有這個BUG。由於和平臺相關,BUG較難消除,所以我提供了一個簡單的浮點數轉字符串的函數。
public static string STR(double f,int n)
{
if (n < 1 || n > 8) return "";
bool sign = (f < 0);
if (sign) f = -f;
string f1 = ((uint)f).ToString();
string f2 = ((uint)(f * System.Math.Pow(10,n) -((uint)f) * System.Math.Pow(10,n))).ToString();
return (sign ? "-" : "") + f1 + "." + "00000000".Substring(0,n-f2.Length) + f2;
}
程序運行後,在VS2008開發環境中,我們已經看到,溫溼度數據已經成功採集。
注:本文示例,需要紅牛開發板固件在 V1.1.1以上
本文源碼:http://www.sky-walker.com.cn/yefan/MFV40/SourceCode/DHT11Test.rar
MF快速參考: .NET Micro Framework 快速入門
MF中文討論組:http://space.cnblogs.com/group/MFSoft/
【低價開發板】http://item.taobao.com/item.htm?id=7117999726
參加了博客大賽,請大家投上一票!您的支持,將是我最大的動力,謝謝!http://2010blog.51cto.com/1635641