• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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
----------------------------
Ученье - свет, но неучей - тьма.
 
Сверху Снизу