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

Обсуждение DHT11 - десятые значения температуры

Cadil

New member
Загрузил тестовый скетч DHTtester.ino из библиотеки для датчиков температуры и влажности DHT.h в схему ESP8266+DHT11.
// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

#include "DHT.h"

#define DHTPIN 12 // 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");
}
В очередной раз убедился, что в датчике DHT-11 значение десятых и сотых частей влажности равно нулю (см. скрин).
Однако, как видно из этого же скрина, в индексе переменной
Код:
float hic = dht.computeHeatIndex(t, h, false);
десятые и сотые значения присутствуют. Программными методами их можно извлечь?
Очевидно, что 21.01 - это очень далеко от 22.00, которое выдает датчик. Методическая ошибка очень большая.
 

Вложения

Последнее редактирование:

nikolz

Well-known member
DHT11 - цифровой датчик влажности и температуры, состоящий из термистора и емкостного датчика влажности. Также датчик содержит в себе АЦП для преобразования аналоговых значений влажности и температуры в цифровой код. Датчик DHT11 не обладают высоким быстродействием и точностью, но зато недорог и отлично подходят для контроля влажности и температуры в помещении. DHT11 достаточно прост в использовании, но имеет минус при получении данных: недостатком этого датчика является время получения данных - не чаще чем один раз в две секунды.





Характеристики
  • Напряжение питания 3 - 5,5В
  • Максимальный ток в режиме измерения 0,5 - 2,5 мА
  • Максимальный ток в режиме ожидания 150 мкА
  • Измерение влажности
    Точность при температуре
    25 ℃ – 4 %
    0…50 ℃ – 5 %
    Диапазон измерений при температуре
    0 ℃ – 30…90 % RH
    25 ℃ – 20…90 % RH
    50 ℃ – 20…80 % RH
    Предельное время отклика 15 c
    Гистерезис 1 %
    Продолжительная температурная стабильность 1 % / год
  • Измерение температуры
    Точность 1…2 %
    Диапазон 0…50 ℃
    Предельное время отклика 30 c
  • Частота опроса не чаще 1 раза в 1 с.
  • Разрешающая способность 8 бит
  • Предельная длина экранированной линии связи 20 м.
  • Размеры датчика ДхШхВ: 15,5 х 12 х 5,5 мм
  • Размеры модуля датчика ДхШхВ: 28 х 12 х 5,5 мм
==================================================

Посылка состоит из пяти байт: 4 байта данных и контрольная сумма. В начале посылки передается целая часть значения влажности, потом десятичная дробная. Затем в таком же виде величина температуры. В дробной части всегда передаются нули, так как датчик восьмибитный.
Если надо дробную часть то это DH22,AM2302 .
 

Cadil

New member
DHT11 - цифровой датчик влажности и температуры, состоящий из термистора и емкостного датчика влажности. Также датчик содержит в себе АЦП для преобразования аналоговых значений влажности и температуры в цифровой код. ...
Вы говорите абсолютно правильные вещи, но я о другом:
Информация о десятых и сотых температуры в датчике DHT11 формируется и есть на шине данных (см. скрин) . Я предлагаю подумать о том, как выделить эту информацию.
 

Юрий Ботов

Moderator
Команда форума
"Индекс" или точнее "Ощущаемая температура" - продукт вычисления, умножений и делений на коэффициенты... там может быть все что угодно. Кстати вычисляется он некорректно, еще скорость ветра надо учитывать... Ну да бог с ними.
 
Последнее редактирование:

Cadil

New member
"Индекс" или точнее "Ощущаемая температура" - продукт вычисления, умножений и делений на коэффициенты... там может быть все что угодно. Кстати вычисляется он некорректно, еще скорость ветра надо учитывать... Ну да бог с ними.
Даже если и "Ощущаемая температура" - продукт вычисления, то , согласитесь, что коэффициенты, которые входят в формулу постоянны и вряд ли меняются от образца к образцу.
Задача о дробной части оказалась проще, чем я предполагал. В прилагаемом скрине - на монитор выведены влажность, температура и "ощущаемая температура". После выдоха на датчик влажность и температура возвращаются к равновесному состоянию. Период измерений - 2 сек.
Видно, что "ощущаемая температура" меняется с дискретностью 3 сотых(!) градуса - очень неплохая аппроксимация. "Ощущаемая температура" находится в пределах одного градуса от "истинной".
 

Вложения

Последнее редактирование:

gerkimuyda

New member
Точно также, как нельзя из 16 пикселей создать фотку 640x480, также и тут, из целого числа нельзя придумать дробные, если необходимой информации нет.
Посмотрите библиотеку, которую вы используете и даташит к сенсору - у вас есть только температура в Цельсиях (никаких фаренгейтов). Как вам сказали - температура датчиком отдается в виде целого числа. Откуда взяться дробной части? А тот индекс, который вы пытаетесь использовать, то ведь не температура!!! То просто расчетное значение, полученное из уравнения Ротфуша и Стидмана (Heat Index Equation)
При одинаковой температуре, но разной влажности - этот индекс у вас будет разным. Чего вы так привязались к его дробной части? А чем вам дробная часть фаренгейтов не нравится? Ведь фаренгейты - это хоть настоящая температура, правда она тоже расчетная, т.к. датчик не умеет отдавать фаренгейты, он отдает цельсия, которые переводятся библиотекой в фаренгейты.
зы: хочется точности в температуре и влажности - можете попробовать BME280 (датчик температуры, влажности, давления)
 

nikolz

Well-known member
Поясняю для тех, кто пропускал уроки физики.
Данный датчик позволяет измерить влажность с погрешностью 0.5% (половина младшего разряда) т е согласно документации он выдает целое значение процентов от 0 до 95 в виде старшего байта а младший байт всегда равен нулю.
Поэтому получаем такие значения:
00000000 00000000 -это 0.0 % или 0%
следующее значение будет
00000001 00000000 - это 1.0% или 1%
следующее значение будет
00000010 00000000 - это 2.0% или 2%
аналогично и для температуры
------------------------
Все остальные величины фаренгейты кажущиеся и пр - это вопрос выбора масштабного коэффициента, а не измерение со значащими цифрами в дробной части.
Т е измерили Вы скажем температуру и получили 25 гр. т е нет дробной части
А теперь делим это на 2 и получается
аля 12.5 - дробная часть есть УРА!!!
Именно так поступает автор этой темы.
Чему учат в школе?
 

Cadil

New member
Точно также, как нельзя из 16 пикселей создать фотку 640x480, также и тут, из целого числа нельзя придумать дробные, если необходимой информации нет.
Относительное разрешение 8-разрядного АЦП (младший разряд относительно всего диапазона) составляет 0,4%:
00000001/11111111 = 1/255 = 0,0039 (0,4%)
С учетом того, что скорее всего разработчики DHT11 используют 95% диапазона АЦП, диапазон измерений температуры DHT11: 0 С…50 С физическое разрешение DHT11 по температуре составляет: 50 С * 0,5%/100% = 0.25 C.
Вывод простой: производители DHT11 могли бы вывести десятые в показаниях температуры датчика, оговорив шаг (дискретность)их измерений, как это делают другие производители сенсоров.

Повторюсь - я благодарен Юрию Ботову за однозначный ответ. Он помог мне разобраться, а приведенные мной аргументы лишь иллюстрация его правоты. В скрине я даже отметил (подчеркнуто красным): изменение сотых в температуре - реакция на изменение влажности.
 
Последнее редактирование:

Юрий Ботов

Moderator
Команда форума
Читайте внимательно, а не так как хочется: диапазон измеряемых температур-0-50 и при этом точность около 5 % и только в "комнатном" диапазоне она немного выше. Хотя АЦП и 8 разрядный, диапазон измеряемых температур гораздо меньше, поэтому 0.4% это от лукавого. А для точных измерений есть соответствующие датчики. Нельзя требовать от запорожца комфорта мерседеса. Ну и ... спасибо.
 

Cadil

New member
Поэтому получаем такие значения:
00000000 00000000 -это 0.0 % или 0%
следующее значение будет
00000001 00000000 - это 1.0% или 1%
следующее значение будет
00000010 00000000 - это 2.0% или 2%
Вы, похоже, подзабыли перевод чисел из двоичной в десятеричную систему исчисления. Этот пример поможет вам вспомнить: 10000001 = 2^7 + 2^0 = 129
Пользуясь этим примером, пересчитайте те цифры, которые вы привели. В первой строке у вас ошибки нет: 00000000 – это действительно 0%!
 

Cadil

New member
Читайте внимательно, а не так как хочется: диапазон измеряемых температур-0-50 и при этом точность около 5 % и только в "комнатном" диапазоне она немного выше. Хотя АЦП и 8 разрядный, диапазон измеряемых температур гораздо меньше, поэтому 0.4% это от лукавого. А для точных измерений есть соответствующие датчики. Нельзя требовать от запорожца комфорта мерседеса. Ну и ... спасибо.[/QUзныхOTE]
Все верно. Но мы говорим о разных вещах. Вы - о точности, которая определяется стабильностью опорного напряжения АЦП и многими другими вещами, а я о разрешении, которое задается разрядностью АЦП.
 
Последнее редактирование:

gerkimuyda

New member
В скрине я даже отметил (подчеркнуто красным): изменение сотых в температуре - реакция на изменение влажности.
Еще раз повторяю, в температуре изменений не было!!! А то, что вы называете температурой - это индекс, который считается из температуры и влажности (скетчем, а не датчиком) по формуле:
[inline]HI = -42.379 + 2.04901523*T + 10.14333127*RH - .22475541*T*RH - .00683783*T*T - .05481717*RH*RH + .00122874*T*T*RH + .00085282*T*RH*RH - .00000199*T*T*RH*RH[/inline]
(отсюда и дробная часть). Не путайте значения.
 

Cadil

New member
Т е измерили Вы скажем температуру и получили 25 гр. т е нет дробной части
А теперь делим это на 2 и получается
аля 12.5 - дробная часть есть УРА!!!
Ну, это ваша трактовка. В скриншоте я даже отметил (подчеркнуто красным): изменение сотых в температуре - реакция на изменение влажности (влажность - это ПЕРЕМЕННАЯ величина).
Вам нужен только повод, чтобы вставить свои пять копеек ...
 

nikolz

Well-known member
Ну, это ваша трактовка. В скриншоте я даже отметил (подчеркнуто красным): изменение сотых в температуре - реакция на изменение влажности (влажность - это ПЕРЕМЕННАЯ величина).
Вам нужен только повод, чтобы вставить свои пять копеек ...
еще раз объясняю для Вас.
Скрипт на который Вы ссылаетесь на писан для нескольких датчиков, так как у них одинаковый интерфейс но различная точность.
На это указывают эти строки
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
----------------------
датчик DHT11 выводит лишь целую часть.
При этом результат с АЦП форматируется так, чтобы 1 байт результата предcтавлял целую часть, а 2 байт дробную.
Проще сказать АЦП DHT11 подключен лишь к 1 байту и напряжение на его входе пропорционально градусам и процентам влажности.
Т е например 100 градусов это 01100100 а 1 градус это 00000001. Т е нет никаких дробных значащих цифр в результате.
----------------------------
А если включите вместо DH11 DH22 то эта же программа даст вам дробную часть, так АЦП измерять более мелкое напряжение по причине большего числа разрядов.
----------------------
 

nikolz

Well-known member
Мне кажется, что вам сначала надо разобраться с переводом двоичных чисел в десятичные, а потом объяснять другим очевидные вещи. Успехов!
Надо не только изучать как переводить двоичный код в десятичный, но и читать документацию.
Еще раз специально два Вас.
upload_2017-12-25_13-29-4.png

Т е погрешность влажности 5%RH
Вы поняли чем это отличается от просто 5%?
А погрешность температуры +-2 гр цельсия.
А разрешение (это значит шаг АЦП) == 1(единица)
------------------------------
Поэтому в результате, который содержит два байта и в котором второй байт - это дробная часть
Если Вы не знаете, то такой формат называется -вещественные числа с фиксированной точкой.
Так вот это число из двух байт надо записывать так
Старший байт десятичная точка младший байт
В DH11 младший байт всегда ноль
Таким образом результат пишется так:
старший байт.00
Старший байт это целое двоичное число, которое переводится в десятичное путем сложения
положительной степени двоек показатель которой равен номеру позиции 1 в двоичном числе считая с нуля справа на лево.
Например, как я написал выше
старший байт 01100100=2^2+2^5+2^6=4+32+64=100.
младший байт - это дробная часть она переводится путем сложения двоек с отрицательным показателям.
Вот пример из документации:
upload_2017-12-25_13-39-39.png
----------------------------
Ученье - свет, но неучей - тьма.
 
Сверху Снизу