zoukankan      html  css  js  c++  java
  • DHT11温度传感器

    下面是Uno上能用的,直接使用AVR的端口号,注意与arduino的区别

    #include <avr/io.h>
    #define DHT11_PIN 5
    
    
    
    void setup() {
      
      DDRC|=_BV(DHT11_PIN);
      PORTC|=_BV(DHT11_PIN);
    
    
    
      Serial.begin(9600);
      delay(300);
    
      Serial.println("
    DHT11 - A Digital humidity and temperature sensor
    ");
      delay(700);
    
    
    }
    
    
    void loop()
    {
     double t=0;
     double h=0;
     bool isOK=false;
     //===Test========
     isOK=readDHT11Data(t,h);
    
    
      delay(2000);
    }
    
    //================DHT11 Code==================
    bool readDHT11Data(double &t,double &h){
      t=-888;
      h=-888;
      
     
      byte dht11_dat[5];
      byte dht11_in;
      byte i;
      PORTC &= ~_BV(DHT11_PIN);
      delay(18);
      PORTC|=_BV(DHT11_PIN);
      delayMicroseconds(40);
      DDRC &= ~_BV(DHT11_PIN);
      delayMicroseconds(40);
      dht11_in = PINC & _BV(DHT11_PIN);
      if(dht11_in)
      {
        Serial.println("dht11 start condition 1 not met");
        return false;
      }
    
      delayMicroseconds(80);
      dht11_in=PINC & _BV(DHT11_PIN);
      if(!dht11_in)
    
      {
        Serial.println("dht11 start condition 2 not met");
        return false;
      }
    
      delayMicroseconds(80);
      for(i=0;i<5;i++)
        dht11_dat[i]=read_dht11_dat();
      DDRC|=_BV(DHT11_PIN);
      PORTC|=_BV(DHT11_PIN);
      byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];
      if(dht11_dat[4]!=dht11_check_sum)
      {
        Serial.println("DHT11 checksum error");
        return false;
      }
    
    
    
    
     t= dht11_dat[2] + (double)dht11_dat[3]/100;
     h=dht11_dat[0] + (double)dht11_dat[1] /100;
     
    
      Serial.print("temperature = ");
      Serial.print(t,DEC);
      Serial.print("C");
      Serial.print("Current humdity= ");
      Serial.print(String(h));
      Serial.println("%");
    
      
      return true;
    }
    byte read_dht11_dat()
    {
      byte i = 0;
      byte result = 0;
      for(i=0;i<8;i++)
      {
        while(!(PINC&_BV(DHT11_PIN)));
        delayMicroseconds(30);
        if(PINC&_BV(DHT11_PIN))
          result|=(1<<(7-i));
        while((PINC&_BV(DHT11_PIN)));
      }
      return result;
    }
    
    //================End DHT11 Code==================
    View Code

    下面使用的是dth11类库,类库需要安装IDE目录下的libraries, Uno与mega2560都可用使用

    #include <avr/io.h>
    #include <avr/pgmspace.h>
    #include <SPI.h>
    #include <Ethernet.h>
    #include <IRremote.h>
    //#include <avr/wdt.h>  
    
    #include <dht11.h>
    
    dht11 DHT11;
    
    #define DHT11PIN A5
    double Fahrenheit(double celsius) 
    {
            return 1.8 * celsius + 32;
    }    //摄氏温度度转化为华氏温度
    
    double Kelvin(double celsius)
    {
            return celsius + 273.15;
    }     //摄氏温度转化为开氏温度
    
    // 露点(点在此温度时,空气饱和并产生露珠)
    // 参考: http://wahiduddin.net/calc/density_algorithms.htm 
    double dewPoint(double celsius, double humidity)
    {
            double A0= 373.15/(273.15 + celsius);
            double SUM = -7.90298 * (A0-1);
            SUM += 5.02808 * log10(A0);
            SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
            SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
            SUM += log10(1013.246);
            double VP = pow(10, SUM-3) * humidity;
            double T = log(VP/0.61078);   // temp var
            return (241.88 * T) / (17.558-T);
    }
    
    // 快速计算露点,速度是5倍dewPoint()
    // 参考: http://en.wikipedia.org/wiki/Dew_point
    double dewPointFast(double celsius, double humidity)
    {
            double a = 17.271;
            double b = 237.7;
            double temp = (a * celsius) / (b + celsius) + log(humidity/100);
            double Td = (b * temp) / (a - temp);
            return Td;
    }
    void setup()
    {
      Serial.begin(9600);
      Serial.println("DHT11 TEST PROGRAM ");
      Serial.print("LIBRARY VERSION: ");
      Serial.println(DHT11LIB_VERSION);
      Serial.println();
    }
    
    void loop()
    {
      Serial.println("
    ");
    
      int chk = DHT11.read(DHT11PIN);
    
      Serial.print("Read sensor: ");
      switch (chk)
      {
        case DHTLIB_OK: 
                    Serial.println("OK"); 
                    break;
        case DHTLIB_ERROR_CHECKSUM: 
                    Serial.println("Checksum error"); 
                    break;
        case DHTLIB_ERROR_TIMEOUT: 
                    Serial.println("Time out error"); 
                    break;
        default: 
                    Serial.println("Unknown error"); 
                    break;
      }
    
      Serial.print("Humidity (%): ");
      Serial.println((float)DHT11.humidity, 2);
    
      Serial.print("Temperature (oC): ");
      Serial.println((float)DHT11.temperature, 2);
    
    //  Serial.print("Temperature (oF): ");
    //  Serial.println(Fahrenheit(DHT11.temperature), 2);
    //
    //  Serial.print("Temperature (K): ");
    //  Serial.println(Kelvin(DHT11.temperature), 2);
    //
    //  Serial.print("Dew Point (oC): ");
    //  Serial.println(dewPoint(DHT11.temperature, DHT11.humidity));
    //
    //  Serial.print("Dew PointFast (oC): ");
    //  Serial.println(dewPointFast(DHT11.temperature, DHT11.humidity));
    
      delay(2000);
    }
    View Code

    使用类库读出的温度居然比上面的高2度,见鬼了

    --------折腾了半天原来读不出来是,数据连接线有问题,中间短路了

     https://files.cnblogs.com/files/wdfrog/Dht11.rar

  • 相关阅读:
    170821-关于SpringMVC的知识点
    170820-关于JSP页面的知识点
    170819-关于JSTL的知识点
    170819-关于EL表达式的知识点
    170817关于文件下载的知识点
    170814关于Cookie的知识点
    170817关于文件上传的知识点
    170817关于JSON知识点
    170817关于AJAX的知识点
    爬虫框架Scrapy之详解
  • 原文地址:https://www.cnblogs.com/wdfrog/p/13914373.html
Copyright © 2011-2022 走看看