Библиотека для датчиков DHT22, DHT21, DHT11


DHT

Билиотека для подключения нескольких датчиков к Ардуине, к разным пинам.




Скачать библиотеку.


Пример:


#include "stDHT.h"
DHT sens(DHT22); // Указать датчик DHT11, DHT21 или DHT22. (несколько датчиков вписывать не нужно)
// Подключать можно только одинаковые датчики, то есть нельзя использовать одновременно DHT11 и DHT22

void setup() 
{
  Serial.begin(57600);
  pinMode(2, INPUT);
  digitalWrite(2, HIGH);
  pinMode(3, INPUT);
  digitalWrite(3, HIGH);
}

void loop() 
{
  int t = sens.readTemperature(2); // чтение датчика на пине 2
  int h = sens.readHumidity(2);    // чтение датчика на пине 2
  delay(2000);
  
  int t2 = sens.readTemperature(3); // чтение датчика на пине 3
  int h2 = sens.readHumidity(3);    // чтение датчика на пине 3
  delay(2000);
  
  Serial.print("Hum: ");
  Serial.print(h);
  Serial.print(" %");
  Serial.print("Temp: ");
  Serial.print(t);
  Serial.println(" C ");
  Serial.print("Hum2: ");
  Serial.print(h2);
  Serial.print(" %");
  Serial.print("Temp2: ");
  Serial.print(t2);
  Serial.println(" C "); 
}

Схема подключения, на рисунке выше. Если резисторов нет, то можно и без них.

Важно! Между чтением датчиков необходимо делать паузу не менее 2 сек.

Можно подключать столько датчиков, сколько есть «цифровых» пинов.



Внутри датчиков серии DHT установлены два сенсора — влажности (sens.readHumidity) и температуры (sens.readTemperature).

Данные можно считывать независимо. Например, с одного датчика читать только влажность, а с другого только температуру:


...
  int t = sens.readTemperature(2); // чтение датчика на пине 3
  delay(2000);
  
  int h2 = sens.readHumidity(3);    // чтение датчика на пине 4
  delay(2000);
...



Что переделано

За основу была взята эта библиотека.

Убраны числа с плавающей запятой (float заменён на int), то есть показывает только целые числа.

Увеличена скорость чтения с 270мс до 70мс. (можно ещё уменьшать)
Если возникнут проблемы (у меня не возникало), то попробуйте «поиграться» этим значением, редактируя файл DHT.cpp.


boolean DHT::read(void) 
{
  uint32_t currenttime = millis();
  if(currenttime < _lastreadtime) 
    {
      _lastreadtime = 0;
    }
    
  if(!_firstreading && ((currenttime - _lastreadtime) < 2000)) 
    {
      return _lastresult; 
    }
    
  _firstreading = false;
  _lastreadtime = millis();

  data[0] = data[1] = data[2] = data[3] = data[4] = 0;

  digitalWrite(_pin, HIGH);
  delay(50);//////////////////////// Изначально это значение было - 250. Если что-то будет работать "криво", то
  ////////////////////////////////// попробуйте увеличивать значение с 50-ти до 60 и т.д.
...



На этом всё, если что-то не понятно, то пишите в комментариях…


Вступайте в Telegram-группу Arduino


  • +481
  • 37927
Telegram-канал istarik

Известит Вас о новых публикациях...



Комментарии (20)

0
День добрый. Повторил на плате Нано+ DHT11. Есть непонятка- датчик выдает значения влажности 8% и температуры 22 градуса.
Температура похожа на реальную, а влажность нет. Хотя если зажать датчик пальцами, то температура вырастает до 27 и влажность увеличивается до 17-30 %. Убавил скорость до 9600. В библиотеке выставил значение 250. Увеличил интервал до 3000 мс. Все без результатно. Подскажите, почему??
0
Здравствуйте.
Попробуйте другой датчик или попробуйте этот датчик с другой библиотекой. После экспериментов, если не затруднит, отпишитесь о результатах. Спасибо.
0
Да, вполне возможно, что влажность 8% — это нормально, подышите на датчик или на улицу высуньте.

Скорость порта (9600) не имеет отношения к работе датчика.
0
Большое спасибо за библиотеку. В отличии от оригинальной от Adafruit она без проблем и заморочек работает с другой библиотекой PrintTo7Seg, предназначенной для вывода инфы на светодиодный дисплей 4x7 с динамической индикацией.
0
Пожалуйста. Скажите, а какие конкретно проблемы с PrintTo7Seg?
0
Если после чтения температуры — влажности с DHT11 (с другим датчиком не пробовал) попытаться с помощью PrintTo7Seg вывести их значение на индикатор программа зависает. С вашей библиотекой этого не происходит.
0
Зависает вообще или на некоторое время?
0
Вообще, до и после вызова PrintTo7Seg, ставил печать результатов в com-порт. Если поможет — если несколько раз подрят нажать Reset, то можно было увидеть один результат на индикаторе, а потом все равно зависон.
0
Понятно.
0
Очень может быть, что это связано с количеством занимаемой ОЗУ.
Если интересно, то можете сравнить размер «Global variables» с моей либой и Adafruit.
0
Залил на Mega2560 на мониторе абракодабра. Уменьшил скорость до 9600 и всё заработало. Не знал, что DH22 может работать без сопротивления. Код::
#include «stDHT.h»
DHT sens(DHT22); // Указать датчик DHT11, DHT21, DHT22

void setup()
{
Serial.begin(9600);
pinMode(2, INPUT);
digitalWrite(2, HIGH);
}

void loop()
{
int t = sens.readTemperature(2); // чтение датчика на пине 2
int h = sens.readHumidity(2); // чтение датчика на пине 2
delay(2000);
Serial.print(«Hum: „);
Serial.print(h);
Serial.print(“ %»);
Serial.print(«Temp: „);
Serial.print(t);
Serial.println(“ C „);

}
0
А в самом мониторе то скорость меняли?
0
Добрый день! Подскажите пожалуйста как состыковать DHT22 с СВЕТОДИОДНЫЙ дисплей модуль трубка, 4 бит TM1637 водитель, 4-значный, 7-сегментный
Нашол видео того что мне нужно на ютьюбе но… При компиляции скетча
#include <dht.h>
#include "TM1637.h"

//{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
//0~9,A,b,C,d,E,F
 

 
#define dht_pin 2 // Pin sensor is connected to
#define CLK 3//Pins for TM1637       
#define DIO 4
 
TM1637 tm1637(CLK,DIO);
dht DHT;
 

void setup(){
  
  tm1637.init();
  tm1637.set(BRIGHT_TYPICAL); 
  //BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
 
  delay(1500);//Delay to let system boot

 
}//end "setup()"
 

 
void loop(){
 
  //Start of Program 
 
  DHT.read11(dht_pin);
 

 int temp = DHT.temperature;
 int humidity = DHT.humidity;
 
 int digitoneT = temp / 10;
 int digittwoT = temp % 10;
 
 int digitoneH = humidity / 10;
 int digittwoH = humidity % 10;
  

    tm1637.display(1,digitoneT); 
    tm1637.display(2,digittwoT);
    tm1637.display(3,12);  // put a C at the end
    
    delay (3000);
    
    tm1637.display(1,23); 
    tm1637.display(2,digitoneH); 
    tm1637.display(3,digittwoH);

    
  //Wait 3 seconds before accessing sensor again.
 
  //Fastest should be once every two seconds.
    delay(3000);
 
}// end loop()

пишет
-Arduino: 1.6.8 (Windows 7), Плата:«Arduino/Genuino Uno»
-exit status 1
-Ошибка компиляции для платы Arduino/Genuino Uno.
Подскажите пожалуйста что делать?
0
Кстати, попробовал компилировать для других плат, такая же ошибка
0
У меня нет таких библиотек, проверить не могу.
0
Всё, заработало!

Для этого понадобилось переустановить программу, исключить все рускоязычные папки и вкоде внести изменения:

добавил

#define DHTTYPE DHT22

изменил

с DHT.read11(dht_pin);

на DHT.read22(dht_pin);

заработало!

Всем спасибо!

Следующим шагом будет отправка и получение данных через WIFI.
0
int t,h;
#include <stDHT.h>
DHT sens(DHT11);

void setup(){
Serial.begin(57600);
pinMode(2,INPUT);
digitalWrite(2,HIGH);
}

void loop(){

t = sens.readTemperature(2);
h = sens.readHumidity(2);
delay(3000)

Serial.println(«Hum: „);
Serial.print(h);
Serial.print(“ %»);
Serial.println(«Temp: „);
Serial.print(t);
Serial.print(“ C „);
}
Такая программа, сижу ломаю голову, не понимаю где ошибка, вот она:

C:\Users\2481~1\AppData\Local\Temp\arduino_modified_sketch_197836\sketch_feb10a.ino: In function 'void loop()':

sketch_feb10a:17: error: expected ';' before 'Serial'

Serial.println(“Hum: „);

^

exit status 1
expected ';' before 'Serial'
0
уже обнаружил ошибку
0
Здравствуйте! Помогите, пожалуйста исправить библиотеку так, чтобы по влажности и температуре данные выводились в float, а не int. Спасибо за ответ, очень нужно!
0
К сожалению нет ни времени, ни желания этим заниматься.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.