2016-04-28 118 views

回答

0
static class DHT22 
{ 
    private const int intGpioData = 18; 
    private static GpioPin gpioData; 

    public static void Start() 
    { 
     //Init GPIO And Capture Data Every 2000ms 
     GpioController gpioController = GpioController.GetDefault(); 
     gpioData = gpioController.OpenPin(intGpioData); 
     gpioData.SetDriveMode(GpioPinDriveMode.InputPullUp); 
     new Timer(new TimerCallback((obj) => { GetData(); }), null, 2000, 2000); 
    } 

    private static void GetData() 
    { 
     byte[] data = new byte[40]; 
     gpioData.SetDriveMode(GpioPinDriveMode.Output); 
     gpioData.Write(GpioPinValue.Low); 
     Task.Delay(1).Wait(); 
     gpioData.SetDriveMode(GpioPinDriveMode.InputPullUp); 

     //Record Data 
     while (gpioData.Read() == GpioPinValue.High) ; 
     while (gpioData.Read() == GpioPinValue.Low) ; 
     while (gpioData.Read() == GpioPinValue.High) ; 
     byte low; 
     for (int i = 0; i < 40; i++) 
     { 
      low = 0; 
      data[i] = 0; 
      while (gpioData.Read() == GpioPinValue.Low && low <= byte.MaxValue) 
        low++; 
      while (gpioData.Read() == GpioPinValue.High && data[i] <= byte.MaxValue) 
        data[i]++; 
     } 

     //Analyze Data 
     byte humiH = 0; 
     byte humiL = 0; 
     byte tempH = 0; 
     byte tempL = 0; 
     byte sum = 0; 
     for (short i = 7; i >= 0; i--) 
     { 
      byte bit = data[7 - i] >= 11 ? (byte)1 : (byte)0; 
      humiH += (byte)(bit << i); 
     } 
     for (short i = 7; i >= 0; i--) 
     { 
      byte bit = data[15 - i] >= 11 ? (byte)1 : (byte)0; 
      humiL += (byte)(bit << i); 
     } 
     for (short i = 7; i >= 0; i--) 
     { 
      byte bit = data[23 - i] >= 11 ? (byte)1 : (byte)0; 
      tempH += (byte)(bit << i); 
     } 
     for (short i = 7; i >= 0; i--) 
     { 
      byte bit = data[31 - i] >= 11 ? (byte)1 : (byte)0; 
      tempL += (byte)(bit << i); 
     } 
     for (short i = 7; i >= 0; i--) 
     { 
      byte bit = data[39 - i] >= 11 ? (byte)1 : (byte)0; 
      sum += (byte)(bit << i); 
     } 

     //Verify Data 
     if ((byte)(humiH + humiL + tempH + tempL) == sum) 
     { 
      double humidity = (double)(humiH * 256 + humiL)/10; 
      double temperature = (double)(tempH * 256 + tempL)/10; 
      Debug.WriteLine(humidity + "% " + temperature + "°C"); 
     } 
    } 
} 
+2

虽然此代码可能会回答问题,但提供有关如何解决问题和/或为何解决问题的其他上下文将提高​​答案的长期价值。 – kayess

0

如果您转到教程选项卡,它会显示一些示例代码和用于点亮LED的布线。 我希望这能回答你的问题。

CodeMaster5678

+0

欢迎来到堆栈溢出!这并没有提供这个问题的答案。 – zhon

0

如果您使用的是C++,这里就是一个例子。 https://github.com/Microsoft/Windows-iotcore-samples/tree/develop/Samples/GpioOneWire

此外,如果你想坚持到C#,这是行不通的。今天我用了2个dht11传感器。

这是GitHub的链接: https://github.com/porrey/Dht

NuGet包: https://www.nuget.org/packages/Dht/

如果您熟悉C++,然后使用。如果没有,我推荐Nuget包,只是因为我证实它今天有效。 dht11传感器似乎有很大的差异。我在两个传感器上有3度不同。

相关问题