在上一篇《DHT11温湿度传感器通信(上)》中,我们介绍了DHT11的通信原理及实现通信的底层代码,当时由于没有封装成托管代码库,所以应用开发的用户还不能直接获取DHT11的数据。不过今天这个工作我们已经完成,用户仅需编写几行代码就可以获取传感器数据了。
我们封装后的类库如下:
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脚的对应关系如下:
注:以上信息,可以通过查原理图获知,其中带“*”的管脚实际测试未能成功获取数据。
设备接线,我们的示例程序选择的是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 快速入门