遗忘海岸

江湖程序员 -Feiph(LM战士)

导航

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("\nDHT11 - A Digital humidity and temperature sensor\n");
  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("\n");

  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

posted on 2020-11-02 14:42  遗忘海岸  阅读(350)  评论(0编辑  收藏  举报