• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь DHT11+ESP-01+Arduino IDE

Georgio

New member
Добрый день!
Проблема с плавающими показаниями DHT11 совместно с ESP-01.
Сама сборка проработала всю ночь и дальше бы работала если бы не выключил. Глючит именно опрос датчика dht11. Готовый DHT11 с делителем подключен напрямую к пину 2, ESP-01 подключен напрямую к FTDI232 откуда получает питание 3.3 v, FTDI232 питается от USB компьютера.

Вот графики с сервера:

Снимок экрана 2017-01-06 в 18.40.34.png Снимок экрана 2017-01-06 в 18.40.15.png
Значения как температуры так и влажности плавают при этом большая часть значений все таки попадает в реальные значения.
Датчик проверен на этой же библиотеке но с arduino mega там все хорошо.
Библитотека GitHub - adafruit/DHT-sensor-library: Arduino library for DHT11DHT22, etc Temp & Humidity Sensors
Не буду приводить весь текст скетча, только инициализация датчика и чтение:
DHT dht(2, DHT11, 11); // 11 works fine for ESP8266

чтение каждые 30 секунд и отдача результата по MQTT протоколу на сервер.
humidity = dht.readHumidity();
temp_f = dht.readTemperature();
 

Юрий Ботов

Moderator
Команда форума
Учитывая форму, интереснее не скетч а то как подключено и как запитано
 

Scorpio

New member
Готовый DHT11 с делителем подключен напрямую к пину 2
Фраза не очень понятна. Зачем там делитель, что значит "напрямую", в контекте с "делителем" :) Датчик цифровой и, если исправен, то в принципе не умеет выдавать не правильные значения - выдает ошибку измерения. При питании 3.3 отлично работает. Хотя у него внутре МК и 2 аналоговых датчика t и h. Раз глючат оба одновременно, может скачет опорное напряжение. Т.е. питания достаточно, чтобы вести обмен с ESP, но аналоговый замер сбоит. Во как!
 
Последнее редактирование:

Anton_IOT

New member
Фраза не очень понятна. Зачем там делитель, что значит "напрямую", в контекте с "делителем" :) Датчик цифровой и, если исправен, то в принципе не умеет выдавать не правильные значения - выдает ошибку измерения. При питании 3.3 отлично работает. Хотя у него внутре МК и 2 аналоговых датчика t и h. Раз глючат оба одновременно, может скачет опорное напряжение. Т.е. питания достаточно, чтобы вести обмен с ESP, но аналоговый замер сбоит. Во как!
у меня вообще не получается прочить данные с датчика DHT22 подключенного к GPIO02 на esp8266-01 :(
проверял и датчик (на другом макете) и ПИН (моргал светодиодом)
подскажите, пожалуйста, в чем может быть загвоздка ?
 

Scorpio

New member
У ESP есть своя специфика, по сравнению с ардуино. Не все ардуиновские библиотеки работают по умолчанию на ESP. Аппаратные различия тоже есть. DHT22, например нельзя подключать ни на GPIO0 (не работает входом) ни на GPIO16 (не формирует аппаратное прерывание, используемое стандартной библиотекой). Попробуйте библиотеку из первого поста с идущим в комплекте примером.
 

Anton_IOT

New member
У ESP есть своя специфика, по сравнению с ардуино. Не все ардуиновские библиотеки работают по умолчанию на ESP. Аппаратные различия тоже есть. DHT22, например нельзя подключать ни на GPIO0 (не работает входом) ни на GPIO16 (не формирует аппаратное прерывание, используемое стандартной библиотекой). Попробуйте библиотеку из первого поста с идущим в комплекте примером.
все равно дает ответ "failed to read from DHT" :///
нашел еще A DHT library for the ESP8266 , но там синтаксис совсем другой - завтра буду пробовать
 

Scorpio

New member
Поэкспериментировал с библиотеками с DHT22 и ESP12. Библиотека из первого поста работает, но значения влажности и температуры не соответствуют реальным. Библиотека из последнего поста дает правильные значения, но переодически перезагружает ESP. Посмотрел даташит на DHT22, оказалось, что там все проще пареной репы. В результате написал простой скетч для прямой работы с датчиком безо всяких библиотек:
Код:
#define DHTPIN  D2
#define   SENOUT pinMode(DHTPIN, OUTPUT)          
#define   SENOUT0 digitalWrite(DHTPIN,LOW)
#define   SENOUT1 digitalWrite(DHTPIN,HIGH)
#define   SENIN pinMode(DHTPIN,INPUT_PULLUP) 
#define   SEN digitalRead(DHTPIN)
#define OVERTIME 150
#define UNOTIME 50

float Tdata;
float RHdata;
byte check;
byte checkb;

void setup() {
  Serial.begin(115200);

}

void loop() {
  if(ReciveSensorData())
  {
    Serial.println("T="+ String(Tdata/10)+"*C "); 
    Serial.println("H="+ String(RHdata/10)+"%  ");
    Serial.println("CS="+ String(check));
    Serial.println("CSb="+ String(checkb));
  }
  else Serial.println("Read DHT failed.");
Serial.println ();
   
delay(5000);
}

bool ReciveSensorData()
{
   int tbufer=0;
   int rhbufer=0;
   byte checksumbufer=0;
   byte checksum;

   //noInterrupts();    
   SENOUT;            //Стартовая последовательность
   SENOUT0;
   delay(20);
   SENIN; 
   delayMicroseconds(10);

   if(CheckSen(LOW)==-1)return false; // выход, если долго нет ответа от датчика.
   if(CheckSen(HIGH)==-1) return false;// "0" от датчика длительностью 80us
   if(CheckSen(LOW)==-1) return false;// "1" от датчика длительностью 80us

 int result;
 for(int bitscount=0;bitscount<40;bitscount++)   // считывание 40 бит данных
   {
    if(CheckSen(HIGH)==-1)return false; // "0" от датчика длительностью 50us   перед передачей бита данных
    result=CheckSen(LOW);
     if(result==-1)return false;  // "1" от датчика, информационный бит, длительностью  25us, если лог 0, или   70us, если лог 1.
    else
    {
      if (bitscount<16){rhbufer<<=1;if(result>UNOTIME)rhbufer++;}     //16 бит значения влажности в % *10.
          else
            {
             if(bitscount<32){tbufer<<=1;if(result>UNOTIME)tbufer++;}      //16 бит значения температуры в °C *10.
             else {checksumbufer<<=1;if(result>UNOTIME)checksumbufer++;}  //8 бит значения контрольной суммы.
            }  
     }
   }
     //interrupts();
   
     
    checksum=byte(tbufer);             //контрольная сумма определяется побайтным сложением значений температуры и влажности.
    checksum+=byte(tbufer>>8);
    checksum+=byte(rhbufer); 
    checksum+=byte(rhbufer>>8);
   
  // if (checksum!=checksumbufer)return false; // несовпадение контрольной суммы

      Tdata=(float)tbufer/10; 
      RHdata=(float)rhbufer/10; 
      check=checksumbufer; 
      checkb=checksum;
      return true;
}

 int CheckSen(byte level)
 {
  int timecount=0;
  delayMicroseconds(5);
   while(SEN!=level)
   {
    //delayMicroseconds(1);
    timecount++;
    if(timecount>OVERTIME) return -1;
   
   }
   return timecount; 
 }
 
Последнее редактирование:

Anton_IOT

New member
Поэкспериментировал с библиотеками с DHT22 и ESP12. Библиотека из первого поста работает, но значения влажности и температуры не соответствуют реальным. Библиотека из последнего поста дает правильные значения, но переодически перезагружает ESP. Посмотрел даташит на DHT22, оказалось, что там все проще пареной репы. В результате написал простой скетч для прямой работы с датчиком безо всяких библиотек:
Код:
#define DHTPIN  D2
#define   SENOUT pinMode(DHTPIN, OUTPUT)   
#define   SENOUT0 digitalWrite(DHTPIN,LOW)
#define   SENOUT1 digitalWrite(DHTPIN,HIGH)
#define   SENIN pinMode(DHTPIN,INPUT_PULLUP)
#define   SEN digitalRead(DHTPIN)
#define OVERTIME 150
#define UNOTIME 50

float Tdata;
float RHdata;
byte check;
byte checkb;

void setup() {
  Serial.begin(115200);

}

void loop() {
  if(ReciveSensorData())
  {
    Serial.println("T="+ String(Tdata/10)+"*C ");
    Serial.println("H="+ String(RHdata/10)+"%  ");
    Serial.println("CS="+ String(check));
    Serial.println("CSb="+ String(checkb));
  }
  else Serial.println("Read DHT failed.");
Serial.println ();

delay(5000);
}

bool ReciveSensorData()
{
   int tbufer=0;
   int rhbufer=0;
   byte checksumbufer=0;
   byte checksum;

   //noInterrupts();
   SENOUT;            //Стартовая последовательность
   SENOUT0;
   delay(20);
   SENIN;
   delayMicroseconds(10);

   if(CheckSen(LOW)==-1)return false; // выход, если долго нет ответа от датчика.
   if(CheckSen(HIGH)==-1) return false;// "0" от датчика длительностью 80us
   if(CheckSen(LOW)==-1) return false;// "1" от датчика длительностью 80us

int result;
for(int bitscount=0;bitscount<40;bitscount++)   // считывание 40 бит данных
   {
    if(CheckSen(HIGH)==-1)return false; // "0" от датчика длительностью 50us   перед передачей бита данных
    result=CheckSen(LOW);
     if(result==-1)return false;  // "1" от датчика, информационный бит, длительностью  25us, если лог 0, или   70us, если лог 1.
    else
    {
      if (bitscount<16){rhbufer<<=1;if(result>UNOTIME)rhbufer++;}     //16 бит значения влажности в % *10.
          else
            {
             if(bitscount<32){tbufer<<=1;if(result>UNOTIME)tbufer++;}      //16 бит значения температуры в °C *10.
             else {checksumbufer<<=1;if(result>UNOTIME)checksumbufer++;}  //8 бит значения контрольной суммы.
            }
     }
   }
     //interrupts();


    checksum=byte(tbufer);             //контрольная сумма определяется побайтным сложением значений температуры и влажности.
    checksum+=byte(tbufer>>8);
    checksum+=byte(rhbufer);
    checksum+=byte(rhbufer>>8);

  // if (checksum!=checksumbufer)return false; // несовпадение контрольной суммы

      Tdata=(float)tbufer/10;
      RHdata=(float)rhbufer/10;
      check=checksumbufer;
      checkb=checksum;
      return true;
}

int CheckSen(byte level)
{
  int timecount=0;
  delayMicroseconds(5);
   while(SEN!=level)
   {
    //delayMicroseconds(1);
    timecount++;
    if(timecount>OVERTIME) return -1;

   }
   return timecount;
}
Спасибо огромное !
загрузил скетч
взял новый дефолтовый esp8266-01 - прошил - и заработало )
наверное что-то с предыдущим esp8266-01 (там NodeMCU прошивка).
DHT (Data) все время на GPIO02 и между Data и Vcc стоит резистор на 220Ом
еще удалил деление на 10 чтобы правильно значения показывались, но из 10 попыток чтения - только 3 были успешные:
Read DHT failed.
T=25.50*C
H=32.70%
CS=71
CSb=71
теперь надо думать как увеличить количество успешных чтений :\

иногда выплевывает такую ошибку:
ets Jan 8 2013,rst cause:4, boot mode:(3,0)

wdt reset
load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v09f0c112
~ld
юRead DHT failed.

UPDATE2: "не понос так золотуха"
вставил библиотеку в пример с thingspeak и перестал подключаться к wifi ((
Arduino IDE esp8266+dht22+bmp085
 
Последнее редактирование:

Scorpio

New member
GPIO 2 он же D4 хреново работает на вход. К томуже к нему анодом подключен синий светодиод на модуле. Лучше GPIO 4 или 5. Резистор 220 Ом сильно нагружает EPS. Вполне достаточно 10 кОм. Прошивка NodeMCU всяко стирается при загрузке первого скетча, так что дело не в ней. Попробуйте на другой вход с другим резистором.
 

zukum

New member
Удалось решение найти по перезагрузке по wdt?
Обнаружил что у меня аналогичная проблема.
После старта ESP идет опрос DHT11, при этом показания успешно считываются. После этого отправка на Majordomo по http. И так по кругу. На втором по последующих кругах DHT выдает ошибку чтения, после пятого цикла - перезагрузка по wdt, и снова первый заход считывание DHT11 успешно и т.д.
Библиотека DHT v1.2.3 от adafruit.com
Если без оправки показаний на http сервер - работает нормально.
DHT на GPIO12
Плана Wemos d1 mini

Кусок кода:
Код:
  unsigned long i = millis();
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);
  while (isnan(h) || isnan(t) || isnan(f)) {
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);  
  if  ((millis()-i)>5*1000) break; // ждем 5 сек
  }
  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
  Serial.println("Failed to read from DHT sensor!");
  //  return;
  }
 

Paul_B

Member
Подключил DHT11 к ESP-07 на пин GPIO12. Полет нормальный, в соответствии с приборами в комнате (влажность и температура). Библиотеку скачал на просторах инета.
 
Сверху Снизу