dht11 Датчик влажности не могу запустить

knik777
Offline
Зарегистрирован: 26.09.2015

Добрый день!

написал программку для включения вентилятора в ванной по датчику влажности.

она запустилась, хорошо работала. а через две недели ардуина зависла (пришлось перезагрузить ее).

и после этого вентилятор включаться перестал.

Причем показания идут с датчика (проверял по выводу в ком порт командой Serial.println),

вентилятор по команде включается нормально.

а через программку автоматически не включается. то есть подозреваю, что условие включения не наступает. но вроде бы должно наступать, так как показания 70-90 процентов должны включать вентилятор по моему разумению.

может, дело в преобразовании типов?

подскажите, пожалуйста, что можно попоробовать! вот код:

#include <dht11.h> // библиотечка управления датчиком влажности dht11
dht11 DHT;               // Объявление переменной класса dht11 для датчика влажности в ванной. взял из примера в интернете как есть. не разобрался толком как это работает.
#define DHT11_PIN 5     // Датчик DHT11 подключен к цифровому пину номер 5 в ванной
#define vannacooler 6   // pin реле включения вентилятора в ванной
#define vannatimeshift 5*60*1000UL // через сколько минут после наступления влажности в ванной включаем вентилятор
int vannaflag=0; // проверка наступила ли влажность в ванной
unsigned long vannatime; // время, когда наступила влажность в ванной
int vannacoolerstate=0; // когда только включили ардуину, вентилятор выключен
int chk; // служебная переменная при считывании в влажности. брал ее из примера - как есть. не разобрался толком как она работает
int vannahumidity; //влажность в ванной

void setup() 
{
  pinMode(vannacooler, OUTPUT); //определяем пин вентилятора на вывод.
  digitalWrite(vannacooler,!vannacoolerstate);  // при включении ардуины вентилятор выключен.  
}  

  void loop() 
{
  chk = DHT.read(DHT11_PIN);    // Чтение данных
  vannahumidity=DHT.humidity; // переменная считывает показания влажности
  if (vannaflag==0 && vannahumidity>60 && vannahumidity<100)  //если влажность в первый раз превысила 60 процентов (<100 включил, так как датчик почему то иногда выдает показания 145, 189 и т д. то есть влажность больше 100 процентов. не разобрался почему. просто поставил заглушку. при этом все работало изначально.
  {  
    vannaflag=1; // признак включенности вентилятора
    vannatime=millis(); // засекаем время когда уровень влажности превысил 60 процентов
  }
  if (vannaflag==1 && millis()-vannatime>vannatimeshift) // если прошло более 5 минут с момента превышения влажности 60 процентов
  {
    vannacoolerstate=1; // включаем вентилятор   
  }
  if (vannahumidity<40) // если влажность меньше 40 процентов
  {
    vannacoolerstate=0; //выключаем вентилятор
    vannaflag=0; // признак включенности вентилятора: выключен.
  }
  digitalWrite(vannacooler,!vannacoolerstate); // включаем выключаем вентилятор в ванной
  //Serial.println(vannahumidity); // Выводим текст
  //Serial.println("///"); // Выводим текст
}

 

а вот библиотека DHT11

//
//    FILE: dht11.cpp
// VERSION: 0.4.1
// PURPOSE: DHT11 Temperature & Humidity Sensor library for Arduino
// LICENSE: GPL v3 (http://www.gnu.org/licenses/gpl.html)
//
// DATASHEET: http://www.micro4you.com/files/sensor/DHT11.pdf
//
// HISTORY:
// George Hadjikyriacou - Original version (??)
// Mod by SimKard - Version 0.2 (24/11/2010)
// Mod by Rob Tillaart - Version 0.3 (28/03/2011)
// + added comments
// + removed all non DHT11 specific code
// + added references
// Mod by Rob Tillaart - Version 0.4 (17/03/2012)
// + added 1.0 support
// Mod by Rob Tillaart - Version 0.4.1 (19/05/2012)
// + added error codes
//

#include "dht11.h"

// Return values:
// DHTLIB_OK
// DHTLIB_ERROR_CHECKSUM
// DHTLIB_ERROR_TIMEOUT
int dht11::read(int pin)
{
        // BUFFER TO RECEIVE
        uint8_t bits[5];
        uint8_t cnt = 7;
        uint8_t idx = 0;

        // EMPTY BUFFER
        for (int i=0; i< 5; i++) bits[i] = 0;

        // REQUEST SAMPLE
        pinMode(pin, OUTPUT);
        digitalWrite(pin, LOW);
        delay(18);
        digitalWrite(pin, HIGH);
        delayMicroseconds(40);
        pinMode(pin, INPUT);

        // ACKNOWLEDGE or TIMEOUT
        unsigned int loopCnt = 10000;
        while(digitalRead(pin) == LOW)
                if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;

        loopCnt = 10000;
        while(digitalRead(pin) == HIGH)
                if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;

        // READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUT
        for (int i=0; i<40; i++)
        {
                loopCnt = 10000;
                while(digitalRead(pin) == LOW)
                        if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;

                unsigned long t = micros();

                loopCnt = 10000;
                while(digitalRead(pin) == HIGH)
                        if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;

                if ((micros() - t) > 40) bits[idx] |= (1 << cnt);
                if (cnt == 0)   // next byte?
                {
                        cnt = 7;    // restart at MSB
                        idx++;      // next byte!
                }
                else cnt--;
        }

        // WRITE TO RIGHT VARS
        // as bits[1] and bits[3] are allways zero they are omitted in formulas.
        humidity    = bits[0]; 
        temperature = bits[2]; 

        uint8_t sum = bits[0] + bits[2];  

        if (bits[4] != sum) return DHTLIB_ERROR_CHECKSUM;
        return DHTLIB_OK;
}
//
// END OF FILE

 

exez
exez аватар
Offline
Зарегистрирован: 04.04.2015

А чему равно значение тут?

  pinMode(vannacooler, OUTPUT); //определяем пин вентилятора на вывод.

А вобще не понимаю зачем такие сложности??

я бы написал примерно так:

if (vannahumidity > 60) {digitalWrite(2, HIGH);} else {digitalWrite(2, LOW);}

к стати глючить в выдаче показаний может при сильно частых запросах. я когда с этим датчиком работал обратил внимание, если его опрашивать чаще чем раз в секунду он выдает пургу. пришлось поставить задержку.

knik777
Offline
Зарегистрирован: 26.09.2015

vannacooler=6 (определил pin вверху через define)

delay не могу поставить, так как параллельно еще плата управляет светом и вентилятором в туалете по датчику движения.

но готов реализовать более редкие запросы через millis, если это повлияет.

предлагаемый вами алгоритм немного другой, чем хочется мне. хочу чтобы включалось через 5 минут после того как будет влажность 60 процентов. и высасывало влагу вентилятором до тех пор пока влажность не опустится до 40 процентов. поэтому написал именно такой код. в принципе не считаю его сильно сложным :)

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

exez пишет:

я бы написал примерно так:

if (vannahumidity > 60) {digitalWrite(2, HIGH);} else {digitalWrite(2, LOW);}

По мне, так лучше бы гистерезис оставить, а то, если так, боюсь дрыгаться будет много раз при переходе влажности через 60

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я правильно понимаю, что строка 15 включает вентиллятор при включении ардуины? Зачем?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Чтобы включить Вам что нужно потать на пин vannacooler, HIGN или LOW? А то меня смущает отрицание (!vannacoolerstate) в строке 36 (да и в 15 тоже).

А так, замечаний по коду нет. кроме того что спрашивать надо не чаще. чем раз в 5 секунд, и строку 36 я бы оттуда уьрал, а внёс бы в соотевтствуюие if'ы, но это не критично.

На Вашем емсте я бы поставил печати (или включения сведиодов) внутрь if'ов в строках 27 и 31 и понаблюдал бы. Если управление туда не попадает, разбирался бы с тем, что там за показания датчик выдаёт, а если попадает, тогда разбирался бы почему не включается. Надо отсекать возможные причины неприятностей.

knik777
Offline
Зарегистрирован: 26.09.2015

Евгений,

строка 15 выключает вентилятор. просто реле работает наоборот :) поэтому пришлось использовать !coolerstate вместо coolerstate. То есть 1 - это выключено. а 0 - это включено. чтобы не было путаницы в коде, я вынес заглушку этой проблемы в digitalwrite.

попробовал щас поморгать лампочкой в строке 27. влажность дошла до 70 процентов, но лампочка не загорелась.

думаю, что условие в строке 22 if (vannaflag==0 && vannahumidity>60 && vannahumidity<100) не выполнилось.

 

при этом показания считывал строчкой

Serial.println(vannahumidity); // Выводим текст

может ли быть что vannahumidity передается в каком нибудь текстовом формате или в процентном формате (значения от 0 до 1) и неверно преобразовывается, поэтому никогда не становится больше 60?

как правильно преобразовать типы данных?

 

 

 

exez
exez аватар
Offline
Зарегистрирован: 04.04.2015

ЕвгенийП пишет:

exez пишет:

я бы написал примерно так:

if (vannahumidity > 60) {digitalWrite(2, HIGH);} else {digitalWrite(2, LOW);}

По мне, так лучше бы гистерезис оставить, а то, если так, боюсь дрыгаться будет много раз при переходе влажности через 60

if (vannahumidity > 60) {digitalWrite(2, HIGH);}
if (vannahumidity < 50) {digitalWrite(2, LOW);}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

knik777 пишет:
влажность дошла до 70 процентов
Как Вы об этом узнали? Меряли чем-то другим или печатали свою переменную vannahumidity?

knik777 пишет:
при этом показания считывал строчкой

Serial.println(vannahumidity); // Выводим текст
Но печать в скетче закомментирована!
 
Я посмотрел вот эту библиотеку - https://github.com/adafruit/DHT-sensor-library
 
Но это явно не Ваша!
 
Вашу же библиотеку Вы поместили не полностью - не хватает .h файла
 
Давайте так, сейчас Вы
 
1. Аккуратно печатаете vannahumidity вне всяких условий (как сейча в комментарии)
2. Внутри условий (обоих) ставите печать, по которой можно понять, что управление попало внутрь условия (что оно сработало)
3. Выкладывате свежий (со всеми печатями) скетч и полную библиотеку, чтобы можно было всё посмотреть.
 
Я посмотрю и будем думать.
 
knik777
Offline
Зарегистрирован: 26.09.2015

Евгений! Я раскомментировал печать в скетче. так и узнал о влажности.

сейчас полез ковыряться с платой, и получил вообще неизменные показания влажности: 32.

вне зависимости от влажности.

похоже на то, что датчик накрылся.

дальнейшие эксперименты продолжу, когда приобрету новый датчик.

knik777
Offline
Зарегистрирован: 26.09.2015

добрый день!

только что поменял датчик - и все корректно заработало!

вопрос: может ли датчик выйти из строя из за слишком частого обращения к нему?

просто так как щас работает меня устраивает и не хочется переделывать программу на опрос датчика раз в секунду.

но грызет меня вопрос: из за чего тогда мог выйти из строя датчик??

 

bwn
Offline
Зарегистрирован: 25.08.2014

Из за слишком частого обращения, это вряд ли. Быстрее, на него кто то водичкой плеснул, зависла при вас или сама при ком то? Попробуйте разобрать и с лупой рассмотреть внимательно.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

в рекомендации к данному датчику обращаться не раз в 2 секунды.

ошибки которые у вас выскакивают (влажность больше 100%) могут быть из-за частых запростов.

датчик на плате или на ногах? Если на ногах тогда сопротивление 10 К Ом между +5 и сигн ногой должно быть ( у меня без него выдает неверные данные)

......
unsigned long last_time_update;
int time_update = 2000;
.....
void loop()
{
.....
if (millis()-last_time_update>time_update)
{
chk = DHT.read(DHT11_PIN);
last_time_update=millis();
}
......
}

вместо Вашего 

chk = DHT.read(DHT11_PIN);

тогда все остальное будет работать, а к датчику будем обращаться раз в 2 секунды

И еще, у меня влажность выводится в float, а у Вас в int, не знаю насколько это критично...

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

knik777
Offline
Зарегистрирован: 26.09.2015

спасибо!

BWN, водой капнуть не могли, если только супервлажность в ванной.

Mr.Privet, спасибо за кусочек кода! сохранил себе. как полезу в потолок в туалете еще раз - обязательно вставлю апдейт в скетч :) а датчик на плате!

 

bwn
Offline
Зарегистрирован: 25.08.2014

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

knik777
Offline
Зарегистрирован: 26.09.2015

BWN, разобрал, но там внутри все чистенькое и красивенькое :) как понять проблему?

 

bwn
Offline
Зарегистрирован: 25.08.2014

Тогда ищите непропай-коротыш и тому подобное. Ну не верю я в саму по себе погоревшую деталь. Это почти из области фантастики. ИМХО.

schabanow
Offline
Зарегистрирован: 23.10.2016

Здравствуйте!

DHT11 под nano (китайский клон) выдаёт у меня в комнате влажность 512% (при питании 5V) или 793% (при питании 3V3 от платы nano). На прижатый палец реагирует, показания изменяются раза в три. Я сделал лог в Экселе, графики, но не вижу куда их здесь можно прицепить. Какие данные ещё нужны для того, чтобы можно было дать какое-то заключение?

Вот библиотека, которой пользуюсь в данном случае:

 

/* DHT library
MIT license
written by Adafruit Industries
*/

#include "DHT.h"

#define MIN_INTERVAL 2000

DHT::DHT(uint8_t pin, uint8_t type, uint8_t count) {
  _pin = pin;
  _type = type;
  #ifdef __AVR
    _bit = digitalPinToBitMask(pin);
    _port = digitalPinToPort(pin);
  #endif
  _maxcycles = microsecondsToClockCycles(1000);  // 1 millisecond timeout for
                                                 // reading pulses from DHT sensor.
  // Note that count is now ignored as the DHT reading algorithm adjusts itself
  // basd on the speed of the processor.
}

void DHT::begin(void) {
  // set up the pins!
  pinMode(_pin, INPUT_PULLUP);
  // Using this value makes sure that millis() - lastreadtime will be
  // >= MIN_INTERVAL right away. Note that this assignment wraps around,
  // but so will the subtraction.
  _lastreadtime = -MIN_INTERVAL;
  DEBUG_PRINT("Max clock cycles: "); DEBUG_PRINTLN(_maxcycles, DEC);
}

//boolean S == Scale.  True == Fahrenheit; False == Celcius
float DHT::readTemperature(bool S, bool force) {
  float f = NAN;

  if (read(force)) {
    switch (_type) {
    case DHT11:
      f = data[2];
      if(S) {
        f = convertCtoF(f);
      }
      break;
    case DHT22:
    case DHT21:
      f = data[2] & 0x7F;
      f *= 256;
      f += data[3];
      f *= 0.1;
      if (data[2] & 0x80) {
        f *= -1;
      }
      if(S) {
        f = convertCtoF(f);
      }
      break;
    }
  }
  return f;
}

float DHT::convertCtoF(float c) {
  return c * 1.8 + 32;
}

float DHT::convertFtoC(float f) {
  return (f - 32) * 0.55555;
}

float DHT::readHumidity(bool force) {
  float f = NAN;
  if (read()) {
    switch (_type) {
    case DHT11:
      f = data[0];
      break;
    case DHT22:
    case DHT21:
      f = data[0];
      f *= 256;
      f += data[1];
      f *= 0.1;
      break;
    }
  }
  return f;
}

//boolean isFahrenheit: True == Fahrenheit; False == Celcius
float DHT::computeHeatIndex(float temperature, float percentHumidity, bool isFahrenheit) {
  // Using both Rothfusz and Steadman's equations
  // http://www.wpc.ncep.noaa.gov/html/heatindex_equation.shtml
  float hi;

  if (!isFahrenheit)
    temperature = convertCtoF(temperature);

  hi = 0.5 * (temperature + 61.0 + ((temperature - 68.0) * 1.2) + (percentHumidity * 0.094));

  if (hi > 79) {
    hi = -42.379 +
             2.04901523 * temperature +
            10.14333127 * percentHumidity +
            -0.22475541 * temperature*percentHumidity +
            -0.00683783 * pow(temperature, 2) +
            -0.05481717 * pow(percentHumidity, 2) +
             0.00122874 * pow(temperature, 2) * percentHumidity +
             0.00085282 * temperature*pow(percentHumidity, 2) +
            -0.00000199 * pow(temperature, 2) * pow(percentHumidity, 2);

    if((percentHumidity < 13) && (temperature >= 80.0) && (temperature <= 112.0))
      hi -= ((13.0 - percentHumidity) * 0.25) * sqrt((17.0 - abs(temperature - 95.0)) * 0.05882);

    else if((percentHumidity > 85.0) && (temperature >= 80.0) && (temperature <= 87.0))
      hi += ((percentHumidity - 85.0) * 0.1) * ((87.0 - temperature) * 0.2);
  }

  return isFahrenheit ? hi : convertFtoC(hi);
}

boolean DHT::read(bool force) {
  // Check if sensor was read less than two seconds ago and return early
  // to use last reading.
  uint32_t currenttime = millis();
  if (!force && ((currenttime - _lastreadtime) < 2000)) {
    return _lastresult; // return last correct measurement
  }
  _lastreadtime = currenttime;

  // Reset 40 bits of received data to zero.
  data[0] = data[1] = data[2] = data[3] = data[4] = 0;

  // Send start signal.  See DHT datasheet for full signal diagram:
  //   http://www.adafruit.com/datasheets/Digital%20humidity%20and%20temperatur...

  // Go into high impedence state to let pull-up raise data line level and
  // start the reading process.
  digitalWrite(_pin, HIGH);
  delay(250);

  // First set data line low for 20 milliseconds.
  pinMode(_pin, OUTPUT);
  digitalWrite(_pin, LOW);
  delay(20);

  uint32_t cycles[80];
  {
    // Turn off interrupts temporarily because the next sections are timing critical
    // and we don't want any interruptions.
    InterruptLock lock;

    // End the start signal by setting data line high for 40 microseconds.
    digitalWrite(_pin, HIGH);
    delayMicroseconds(40);

    // Now start reading the data line to get the value from the DHT sensor.
    pinMode(_pin, INPUT_PULLUP);
    delayMicroseconds(10);  // Delay a bit to let sensor pull data line low.

    // First expect a low signal for ~80 microseconds followed by a high signal
    // for ~80 microseconds again.
    if (expectPulse(LOW) == 0) {
      DEBUG_PRINTLN(F("Timeout waiting for start signal low pulse."));
      _lastresult = false;
      return _lastresult;
    }
    if (expectPulse(HIGH) == 0) {
      DEBUG_PRINTLN(F("Timeout waiting for start signal high pulse."));
      _lastresult = false;
      return _lastresult;
    }

    // Now read the 40 bits sent by the sensor.  Each bit is sent as a 50
    // microsecond low pulse followed by a variable length high pulse.  If the
    // high pulse is ~28 microseconds then it's a 0 and if it's ~70 microseconds
    // then it's a 1.  We measure the cycle count of the initial 50us low pulse
    // and use that to compare to the cycle count of the high pulse to determine
    // if the bit is a 0 (high state cycle count < low state cycle count), or a
    // 1 (high state cycle count > low state cycle count). Note that for speed all
    // the pulses are read into a array and then examined in a later step.
    for (int i=0; i<80; i+=2) {
      cycles[i]   = expectPulse(LOW);
      cycles[i+1] = expectPulse(HIGH);
    }
  } // Timing critical code is now complete.

  // Inspect pulses and determine which ones are 0 (high state cycle count < low
  // state cycle count), or 1 (high state cycle count > low state cycle count).
  for (int i=0; i<40; ++i) {
    uint32_t lowCycles  = cycles[2*i];
    uint32_t highCycles = cycles[2*i+1];
    if ((lowCycles == 0) || (highCycles == 0)) {
      DEBUG_PRINTLN(F("Timeout waiting for pulse."));
      _lastresult = false;
      return _lastresult;
    }
    data[i/8] <<= 1;
    // Now compare the low and high cycle times to see if the bit is a 0 or 1.
    if (highCycles > lowCycles) {
      // High cycles are greater than 50us low cycle count, must be a 1.
      data[i/8] |= 1;
    }
    // Else high cycles are less than (or equal to, a weird case) the 50us low
    // cycle count so this must be a zero.  Nothing needs to be changed in the
    // stored data.
  }

  DEBUG_PRINTLN(F("Received:"));
  DEBUG_PRINT(data[0], HEX); DEBUG_PRINT(F(", "));
  DEBUG_PRINT(data[1], HEX); DEBUG_PRINT(F(", "));
  DEBUG_PRINT(data[2], HEX); DEBUG_PRINT(F(", "));
  DEBUG_PRINT(data[3], HEX); DEBUG_PRINT(F(", "));
  DEBUG_PRINT(data[4], HEX); DEBUG_PRINT(F(" =? "));
  DEBUG_PRINTLN((data[0] + data[1] + data[2] + data[3]) & 0xFF, HEX);

  // Check we read 40 bits and that the checksum matches.
  if (data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) {
    _lastresult = true;
    return _lastresult;
  }
  else {
    DEBUG_PRINTLN(F("Checksum failure!"));
    _lastresult = false;
    return _lastresult;
  }
}

// Expect the signal line to be at the specified level for a period of time and
// return a count of loop cycles spent at that level (this cycle count can be
// used to compare the relative time of two pulses).  If more than a millisecond
// ellapses without the level changing then the call fails with a 0 response.
// This is adapted from Arduino's pulseInLong function (which is only available
// in the very latest IDE versions):
//   https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/core...
uint32_t DHT::expectPulse(bool level) {
  uint32_t count = 0;
  // On AVR platforms use direct GPIO port access as it's much faster and better
  // for catching pulses that are 10's of microseconds in length:
  #ifdef __AVR
    uint8_t portState = level ? _bit : 0;
    while ((*portInputRegister(_port) & _bit) == portState) {
      if (count++ >= _maxcycles) {
        return 0; // Exceeded timeout, fail.
      }
    }
  // Otherwise fall back to using digitalRead (this seems to be necessary on ESP8266
  // right now, perhaps bugs in direct port access functions?).
  #else
    while (digitalRead(_pin) == level) {
      if (count++ >= _maxcycles) {
        return 0; // Exceeded timeout, fail.
      }
    }
  #endif

  return count;
}

 

Вот сам скетч:

// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

#include "DHT.h"

#define DHTPIN 2     // what digital pin we're connected to

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors.  This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println("DHTxx test!");

  dht.begin();
}

void loop() {
  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  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);

  // 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;
  }

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(f);
  Serial.print(" *F\t");
  Serial.print("Heat index: ");
  Serial.print(hic);
  Serial.print(" *C ");
  Serial.print(hif);
  Serial.println(" *F");
}

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

в скетче закомментируйте строку 10 и раскомментируйте строку 9

schabanow
Offline
Зарегистрирован: 23.10.2016

Хаха... Вот спасибо. Даже я понял, что имеется в виду. Универсальный скетч, на три датчика - выбирай, какой надо. Но это для ПОЛЬЗОВАТЕЛЕЙ, а не для таких как я, умельцев от напильника... Пробую!

schabanow
Offline
Зарегистрирован: 23.10.2016

Всё работает. 33%, 23 С

Температура немного задрана, но это такое - будем разбираться дальше... Влажность тоже будем пытаться откалибровать по парам над реперными растворами.

Спасибо огромное!

зы: А ведь в комментариях чёрным по белому, ангельским языком написано ВСЁ. Стыдно...

schabanow
Offline
Зарегистрирован: 23.10.2016

Обернул влажной тряпкой. Примерно через час температура упала до 18 С, а влажность поднялась до 93%. Похоже, всё работает. Осталось проверить по реперам, вот здесь есть таблица насыщенных растворов солей:

http://chip.tomsk.ru/chip/chipdoc.nsf/cae24731d248549fc6256d53006dcde3/e0800ceba558ac1247257967002484fc!OpenDocument

В принципе, пока нужна одна, максимум две точки. Думаю, что в случае необходимости формулой можно добиться хорошей точности срабатывания реле увлажнителя.

Ещё раз большое спасибо за подсказку!

schabanow
Offline
Зарегистрирован: 23.10.2016

Бег с препятствиями, очередной барьер. Оставил логиться на ночь. Всю ночь в закрытой комнате работал увлажнитель. Открываю дверь - висит явно видимый невооружённым глазом туман. Увлажнитель остановился от автостопа (кончилась вода, 1 л - вечером банка была полная).

Открываю файл - НИЧЕГО. 33 .. 35 % - равнина. Никакого горба. Датчик просто лежал на столе мордой вверх, в десяти сантиметрах от увлажнителя. Накрываешь пальцем - через несколько секунд влажность лезет вверх, и бодро. Кратковременно подставляешь в струю выхлопа увлажнителя - примерно та же картина. А так - не реагирует совершенно. Удивлён. К нему что, кулер нужен? Воздушный поток прямо в решётку корпуса?

schabanow
Offline
Зарегистрирован: 23.10.2016

Принёс датчик на работу. Тоже 35%. )) Направил на него работающий кулер, дистанция 3 см, 9В, дует вполне ощутимо. 35%. Повесил на всас кулера мокрую тряпочку, почти вплотную, только чтобы лопасти не задевали. 35%. ))))) А на обёртывание в мокрую тряпку реагирует прекрасно. И на палец. Чюдеса...

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

берите AM2320 и все будет в порядке

schabanow
Offline
Зарегистрирован: 23.10.2016

Да, надо менять коней. По цифровой части, как я понимаю, проблем нет - всё передаётся и читается нормально, только датчик никуда не годен. Это какой-то влагомер зерна получился, а не гигрометр. Но вообще я был к этому готов, потому и заказал на Али si7021 неделю назад. Скоро должен приехать. Нашёл к нему хорошую библиотеку и туториал на ЮТ, вот ссылки (может кому-то будет нужно):

http://elchupanibrei.livejournal.com/23293.html

https://www.youtube.com/watch?v=kKjX2AiGm9g

А dht купил чисто попробовать - убедиться, действительно ли всё так печально. Убедился.

зы: Спасибо за AM2320, будет пока запасным вариантом.

 

schabanow
Offline
Зарегистрирован: 23.10.2016

Заказал и АМ2320 - гулять так гулять. На целый доллар дешевле, чем si7021. Надо пробовать.

Правильно ли я понимаю, что библиотека, скетч и схема подключения для АМ2320 остаются ровно те же, что и для DHT11? Или он подключается по I2C, и, соответственно, требует другой схемы подключения (A4, A5 для Нано)? Или он может подключаться И по I2C, И по 1wire, как DHT11, и надо только поправить (закомментить) скетч?

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

можно и по I2C или по 1 Wire, по  1Wire выбираете DHT22 и все