dht11 Датчик влажности не могу запустить
- Войдите на сайт для отправки комментариев
Втр, 08/12/2015 - 13:17
Добрый день!
написал программку для включения вентилятора в ванной по датчику влажности.
она запустилась, хорошо работала. а через две недели ардуина зависла (пришлось перезагрузить ее).
и после этого вентилятор включаться перестал.
Причем показания идут с датчика (проверял по выводу в ком порт командой 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
А чему равно значение тут?
pinMode(vannacooler, OUTPUT);//определяем пин вентилятора на вывод.А вобще не понимаю зачем такие сложности??
я бы написал примерно так:
if (vannahumidity > 60) {digitalWrite(2, HIGH);} else {digitalWrite(2, LOW);}к стати глючить в выдаче показаний может при сильно частых запросах. я когда с этим датчиком работал обратил внимание, если его опрашивать чаще чем раз в секунду он выдает пургу. пришлось поставить задержку.
vannacooler=6 (определил pin вверху через define)
delay не могу поставить, так как параллельно еще плата управляет светом и вентилятором в туалете по датчику движения.
но готов реализовать более редкие запросы через millis, если это повлияет.
предлагаемый вами алгоритм немного другой, чем хочется мне. хочу чтобы включалось через 5 минут после того как будет влажность 60 процентов. и высасывало влагу вентилятором до тех пор пока влажность не опустится до 40 процентов. поэтому написал именно такой код. в принципе не считаю его сильно сложным :)
я бы написал примерно так:
if (vannahumidity > 60) {digitalWrite(2, HIGH);} else {digitalWrite(2, LOW);}По мне, так лучше бы гистерезис оставить, а то, если так, боюсь дрыгаться будет много раз при переходе влажности через 60
Я правильно понимаю, что строка 15 включает вентиллятор при включении ардуины? Зачем?
Чтобы включить Вам что нужно потать на пин vannacooler, HIGN или LOW? А то меня смущает отрицание (!vannacoolerstate) в строке 36 (да и в 15 тоже).
А так, замечаний по коду нет. кроме того что спрашивать надо не чаще. чем раз в 5 секунд, и строку 36 я бы оттуда уьрал, а внёс бы в соотевтствуюие if'ы, но это не критично.
На Вашем емсте я бы поставил печати (или включения сведиодов) внутрь if'ов в строках 27 и 31 и понаблюдал бы. Если управление туда не попадает, разбирался бы с тем, что там за показания датчик выдаёт, а если попадает, тогда разбирался бы почему не включается. Надо отсекать возможные причины неприятностей.
Евгений,
строка 15 выключает вентилятор. просто реле работает наоборот :) поэтому пришлось использовать !coolerstate вместо coolerstate. То есть 1 - это выключено. а 0 - это включено. чтобы не было путаницы в коде, я вынес заглушку этой проблемы в digitalwrite.
попробовал щас поморгать лампочкой в строке 27. влажность дошла до 70 процентов, но лампочка не загорелась.
думаю, что условие в строке 22 if(vannaflag==0 && vannahumidity>60 && vannahumidity<100) не выполнилось.при этом показания считывал строчкойSerial.println(vannahumidity); // Выводим текстможет ли быть что vannahumidity передается в каком нибудь текстовом формате или в процентном формате (значения от 0 до 1) и неверно преобразовывается, поэтому никогда не становится больше 60?
как правильно преобразовать типы данных?
я бы написал примерно так:
if (vannahumidity > 60) {digitalWrite(2, HIGH);} else {digitalWrite(2, LOW);}По мне, так лучше бы гистерезис оставить, а то, если так, боюсь дрыгаться будет много раз при переходе влажности через 60
if (vannahumidity > 60) {digitalWrite(2, HIGH);} if (vannahumidity < 50) {digitalWrite(2, LOW);}Евгений! Я раскомментировал печать в скетче. так и узнал о влажности.
сейчас полез ковыряться с платой, и получил вообще неизменные показания влажности: 32.
вне зависимости от влажности.
похоже на то, что датчик накрылся.
дальнейшие эксперименты продолжу, когда приобрету новый датчик.
добрый день!
только что поменял датчик - и все корректно заработало!
вопрос: может ли датчик выйти из строя из за слишком частого обращения к нему?
просто так как щас работает меня устраивает и не хочется переделывать программу на опрос датчика раз в секунду.
но грызет меня вопрос: из за чего тогда мог выйти из строя датчик??
Из за слишком частого обращения, это вряд ли. Быстрее, на него кто то водичкой плеснул, зависла при вас или сама при ком то? Попробуйте разобрать и с лупой рассмотреть внимательно.
в рекомендации к данному датчику обращаться не раз в 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, не знаю насколько это критично...
Если производитель рекомендует что-либо я стараюсь так сразу делать, а не делать неправильно и ждать пока что-то накроется...
спасибо!
BWN, водой капнуть не могли, если только супервлажность в ванной.
Mr.Privet, спасибо за кусочек кода! сохранил себе. как полезу в потолок в туалете еще раз - обязательно вставлю апдейт в скетч :) а датчик на плате!
Датчик все таки разберите и посмотрите, не исключается и 220 где нибудь по конденсату. У меня такое на заводском вентиляторе с датчиком было, а это совсем нехорошо.
BWN, разобрал, но там внутри все чистенькое и красивенькое :) как понять проблему?
Тогда ищите непропай-коротыш и тому подобное. Ну не верю я в саму по себе погоревшую деталь. Это почти из области фантастики. ИМХО.
Здравствуйте!
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"); }в скетче закомментируйте строку 10 и раскомментируйте строку 9
Хаха... Вот спасибо. Даже я понял, что имеется в виду. Универсальный скетч, на три датчика - выбирай, какой надо. Но это для ПОЛЬЗОВАТЕЛЕЙ, а не для таких как я, умельцев от напильника... Пробую!
Всё работает. 33%, 23 С
Температура немного задрана, но это такое - будем разбираться дальше... Влажность тоже будем пытаться откалибровать по парам над реперными растворами.
Спасибо огромное!
зы: А ведь в комментариях чёрным по белому, ангельским языком написано ВСЁ. Стыдно...
Обернул влажной тряпкой. Примерно через час температура упала до 18 С, а влажность поднялась до 93%. Похоже, всё работает. Осталось проверить по реперам, вот здесь есть таблица насыщенных растворов солей:
http://chip.tomsk.ru/chip/chipdoc.nsf/cae24731d248549fc6256d53006dcde3/e0800ceba558ac1247257967002484fc!OpenDocument
В принципе, пока нужна одна, максимум две точки. Думаю, что в случае необходимости формулой можно добиться хорошей точности срабатывания реле увлажнителя.
Ещё раз большое спасибо за подсказку!
Бег с препятствиями, очередной барьер. Оставил логиться на ночь. Всю ночь в закрытой комнате работал увлажнитель. Открываю дверь - висит явно видимый невооружённым глазом туман. Увлажнитель остановился от автостопа (кончилась вода, 1 л - вечером банка была полная).
Открываю файл - НИЧЕГО. 33 .. 35 % - равнина. Никакого горба. Датчик просто лежал на столе мордой вверх, в десяти сантиметрах от увлажнителя. Накрываешь пальцем - через несколько секунд влажность лезет вверх, и бодро. Кратковременно подставляешь в струю выхлопа увлажнителя - примерно та же картина. А так - не реагирует совершенно. Удивлён. К нему что, кулер нужен? Воздушный поток прямо в решётку корпуса?
Принёс датчик на работу. Тоже 35%. )) Направил на него работающий кулер, дистанция 3 см, 9В, дует вполне ощутимо. 35%. Повесил на всас кулера мокрую тряпочку, почти вплотную, только чтобы лопасти не задевали. 35%. ))))) А на обёртывание в мокрую тряпку реагирует прекрасно. И на палец. Чюдеса...
берите AM2320 и все будет в порядке
Да, надо менять коней. По цифровой части, как я понимаю, проблем нет - всё передаётся и читается нормально, только датчик никуда не годен. Это какой-то влагомер зерна получился, а не гигрометр. Но вообще я был к этому готов, потому и заказал на Али si7021 неделю назад. Скоро должен приехать. Нашёл к нему хорошую библиотеку и туториал на ЮТ, вот ссылки (может кому-то будет нужно):
http://elchupanibrei.livejournal.com/23293.html
https://www.youtube.com/watch?v=kKjX2AiGm9g
А dht купил чисто попробовать - убедиться, действительно ли всё так печально. Убедился.
зы: Спасибо за AM2320, будет пока запасным вариантом.
Заказал и АМ2320 - гулять так гулять. На целый доллар дешевле, чем si7021. Надо пробовать.
Правильно ли я понимаю, что библиотека, скетч и схема подключения для АМ2320 остаются ровно те же, что и для DHT11? Или он подключается по I2C, и, соответственно, требует другой схемы подключения (A4, A5 для Нано)? Или он может подключаться И по I2C, И по 1wire, как DHT11, и надо только поправить (закомментить) скетч?
можно и по I2C или по 1 Wire, по 1Wire выбираете DHT22 и все