Views: 2175
Измерение температуры и влажности при помощи датчика DHT11.
Статья в PDF [wpdm_file id=220]
DHT11 недорогой цифровой датчик температуры и влажности. Он использует емкостной датчик влажности и терморезистор для измерения температуры окружающего воздуха, данные выдает в цифровой форме по шине типа 1-wire. В использовании он довольно прост, но требует точного определения длительности временных сигналов, чтобы декодировать данные. Единственный недостаток это возможность получения данных не чаще 1 раза в две секунды.
Особенности.
· Температурная компенсация во всем диапазоне работы
· Измерение относительной влажности и температуры
· Калиброванный цифровой сигнал
· Отличная долгосрочная стабильность показаний
· Не требуются дополнительные компоненты
· Возможность передачи данных на большое растояние
· Низкое энергопотребление
· 4-контактный корпус и полностью взаимозаменяемы
Детали.
Для преобразования данных внутри датчика используется 8-битный микроконтроллер, В процессе производства датчики калибруются и калибровочная константа записывается вместе с программой в память микроконтроллера. Однопроводный последовательный интерфейс дает возможность быстрой интеграции в устройство. Его небольшие размеры, низкое энергопотребление и до-20-метром передачи сигнала, что делает его привлекательным выбором для различных приложений.
Диапазон измеряемых параметров.
Обзор:
| Параметр | Диапазон измерения | Точность | Разрешение |
| Влажность | 20-90% | ±5% | 1 |
| Температура | 0-50°С | ±2°С | 1 |
Подробные спецификации:
| Параметр | Условия | Минимальное | Типичное | Максимальное |
| Влажность | ||||
| Разрешение | 1% | 1% | 1% | |
| 8 бит | ||||
| Стабильность | ±1%RH | |||
| Точность | 25°С | ±4%RH | ||
| 0-50°С | ±5%RH | |||
| Взаимозаменяемость | полностью взаимозаменяемы | |||
| Диапазон измерения |
0°С | 30%RH | 90%RH | |
| 25°С | 20%RH | 90%RH | ||
| 50°С | 20%RH | 80%RH | ||
| Время отклика (в секундах) |
1/e(63%)25℃, 1m/s Air |
6 | 10 | 15 |
| Гистерезис | ±1%RH | |||
| Долговременная стабильность |
типичная | ±1%RH/year | ||
| Температура | 1°С | 1°С | 1°С | |
| Разрешение | 8 бит | 8 бит | 8 бит | |
| Стабильность | ±1°С | |||
| Точность | ±1°С | ±2°С | ||
| Диапазон измерения |
0°С | 50°С | ||
| Время отклика (в секундах) |
6 | 30 | ||
Электрические параметры:
| Параметр | Режим | Мин | Типовое | Макс | Ед.изм. |
| Напряжение питания | DC | 3 | 5 | 5.5 | V |
| Ток потребления | Измерение | 0.5 | 2.5 | mA | |
| Ожидание | 100 | 150 | uA | ||
| Среднее | 0.2 | 1 | mA |
Габаритные размеры и подключение:
Питание DHT11 составляет 3-5.5V DC. После подачи питания на датчик, необходимо выдержать паузу длительностью не менее 1 секунды перед началом считывания данных. Для фильтрации напряжения питания можно добавить один конденсатор 0,1 мкФ между Vdd и Vss.
Последовательный интерфейс (Single-Wire Двусторонний)
Весь обмен данными выполняется по одной одному проводу (шине). На шине может присутствовать только один датчик. Для получения высокого уровня используется подтягивающий резистор (5-10 кОм), т.е в пассивном состоянии на шине высокий уровень. Формат обмена данными может быть разделен на три этапа:
1) Инициализации.
2) Преамбула.
3) Передача данных.
Инициализация.
Процесс чтения данных начинается с импульса инициализации который формирует микроконтроллер. Он должен установить на шине низкий уровень на время не менее 18 mS, для инициализации DHT-11.
Преамбула.
Микроконтроллер после формирования импульса инициализации должен сразу перевести порт в режим чтения (режим приема данных). Если датчик готов к передачи данных, он ответит сформировав преамбулу. Один период меандра длительностью ~160 us.
Микроконтроллер получив ответ от датчика, может начать чтение данных.
Передача данных.
Данные представляют собой 5 байт данных, которые читаются по битно микроконтроллером, т.е всего 40 бит.
Первые два байта данные влажности (относительная влажность), целая и дробная часть. Третий и четвертый температура (градусы Цельсия), целая и дробная часть и пятый последний байт контрольная сумма, которая равна сумме первых 4 байт. К сожалению хотя и присутствуют байты отвечающие за десятые доли градуса и процента, реально контроллер датчика их не вычисляет (хотя это и понятно при такой точности это бесполезно), поэтому в них всегда присутствуют нули. Если реально считывать эти байты то мы увидим, например:
bait0 = 41 // влажность
bait1 = 0
bait2 = 31 // температура
bait3 = 0
bait4 = 72 // контрольная сумма
Но нет худа без добра, если в этих байтах всегда нули, то можно это значение (аналогично как для контрольной суммы) использовать для достоверности передачи данных.
Данные кодируются длительностью высокого уровня в каждом бите, бит начинается стробом низкого уровня длительностью приблизительно 50-54uS, после строба идет высокий уровень, если длительность высокого уровня в пределах 24 uS, то это передается “0”, если в пределах 70 uS – передается “1”.
Бит ‘0 ‘:
По окончанию передачи данных датчик передает последний строб, устанавливает на шине высокий уровень и переходит в спящий режим.
Логика чтения данных может быть следующая.
Вид передачи полностью:
Датчик подключается ко входу который может формировать прерывания по изменению уровня на входе. Для определения длительности импульса можно использовать таймер микроконтроллера.
Для демо проекта используем плату ILLISSI_B4_primum с установленным микроконтроллером PIC16F1936. Для индикации данные будем выводить, через USB порт на терминал программы AN1310 Microchip.
Вариант построение программа для чтения данных с датчика для компилятора MPLAB® XC8 Compiler v1.20. Для измерение длительности мы применим таймер Timer0. А для контроля моментов изменения сигнала на входах будем использовать возможность микроконтроллера формировать прерывания по изменению состояния на входах. Всё декодирование данных будет выполняться в прерывании (благо там минимум работы), поэтому для основной программы остается только дать “толчек” для выдачи данных и обработать их когда данные будут готовы.
Настройка прерывание для работы с датчиком
IOCBP=0b00000000; // отключить все прерывания и сбросить все флаги IOCBN=0b00000000; IOCBF=0b00000000; INTCON=0b11001000; /* || | +---- сбросить флаг прерывания от изменеию состояния на входе * || +------- разрешить прерывания по изменению состояния на входе * |+---------- разрешить прерывания от переферии * +----------- разрешить глобальные прерывания */ OPTION_REG=0b11000010;// настройка таймера Timer0 /* |+++---- PS<2:0>:010-1 : 8 * +------- PSA:0 = Prescaler is assigned to the Timer0 module */
Функция запуска измерения (её можно в ставить в главный цикл для постоянного получения данных)
if(DHT11==0)// запуск измерения
{
DHT11=1; // включить цикл измерения
TRISB=0; // настроить порт на выход
LATB0=0; // установить низкий уровень
__delay_ms(18); // задержка в 18 миллисекунд (больше можно :))
IOCBP0=1; // настроить прерывание на входе RB0 на фронт
IOCBF0=0; // сбросить флаг прерывания
TRISB=1; // настроить порт на вход
PREAM=1; // поиск преамбулы
}
Вариант обработки прерываний
//=====================================прерывания==================================
void interrupt my_isr(void) //
{
if(IOCIF)
{
IOCIF=0; //сбросить флаг
IOCBF0=0; //сбросить флаг
if(DHT11)
{
if(IOCBP0)// если прерывания по фронту
{
IOCBP0=0; // отключить прерывание по фронту
IOCBN0=1; // включить прерывание по срезу
TMR0=0; // сбросить таймер
TMR0IF=0; // сбросить флаг переполнения
TMR0IE=1; // разрешить прерывания TMR0
}
else
{
dlinimp=TMR0; // сохранить значение таймера в регистр
TMR0=0; // сбросить таймер
TMR0IF=0; // сбросить флаг переполнения
IOCBP0=1; //включить прерывание по фронту
IOCBN0=0; //отключить прерывание по срезу
LATB1=!LATB1; // переключить светодиод
if(!TMR0IF)
{
if(PREAM)// поиск преамбулы
{
if(dlinimp>80)
{
PREAM=0;// преамбула принята
countbit=0;
}
}
else
{
if(countbit<8)
{
bait0<<=1;
if(dlinimp>30) bait0 |= 0b00000001;// определение бита и запись его в байт приема
}
else if(countbit<16)
{
bait1<<=1;
if(dlinimp>30) bait1 |= 0b00000001;// определение бита и запись его в байт приема
}
else if(countbit<24)
{
bait2<<=1;
if(dlinimp>30) bait2 |= 0b00000001;// определение бита и запись его в байт приема
}
else if(countbit<32)
{
bait3<<=1;
if(dlinimp>30) bait3 |= 0b00000001;// определение бита и запись его в байт приема
}
else if(countbit<40)
{
bait4<<=1;
if(dlinimp>30) bait4 |= 0b00000001;// определение бита и запись его в байт приема
}
countbit++;// увеличить счетчик бит
}
}
else
{
ERROR_DHT11=1; // неисправность датчика
}
}
}
}
if(TMR0IF)
{
TMR0IF=0;
DHT11=0;
TMR0IE=0; //запретить прерывания TMR0
}
}//===================================end_interrupt=================================
Вывод: простой недорогой датчик влажности и температуры, для проектов бытового назначения.
[box title=”Файлы для загрузки” color=”#521BDE”] Демонстрационный проект, MPLAB® X IDE v1.85, MPLAB® XC8 Compiler v1.20[wpdm_file id=219][/box]
Это может быть интересно
ch-светомузыка и AK4113Views: 1504 Пришло время вернуться к светомузыке. На сегодня использование аналогового входа стало непрактичным, на сегодня необходимо использовать S/PDIF и Toslink. С этим надо было как то разобрать, что это …
My libraries for Altium DesignerViews: 4399 Attention, this version of the database is outdated today. See updates in articles https://catcatcat.d-lan.dp.ua/altium-designer-my-setup-system-and-project-structure and https://catcatcat.d-lan.dp.ua/altium-designer-my-setup-system-and-project-structure-v23-2/ My libraries for Altium designer (Updated V – 29/05/2022) (c) 2021 …
Бегущие огни (ch-bo-36)Views: 2596 Проект на PIC-микроконтроллере PIC16F648A. Количество каналов 36. Для индикации используется подключение по матрице 6х6. Расположение светодиодов в одну линию. Все эффекты написаны для возможности увеличения количества светодиодов. Рекомендуется …
TM1650 драйвер LED семисегментного индикатораViews: 18366 UPDATES 2025/10/10 Китайский производитель Shenzhen Titan Micro Electronics Co., Ltd. Выпускает широкую линейку драйверов управления светодиодными дисплеями, которые позволяют разгрузить микроконтроллер для основной работы, главная особенность этих драйверов …
Сумеречное релеViews: 1640 Реле управления освещением, датчик день-ночь – одним словом фотореле для управления освещением или формирования сигнала для системы умный дом о понижении или повышении освещенности относительно заданного уровня. Реле выполнено по классической схеме, конденсаторный блок питания, от сети переменного тока …
Altium Designer my setup system and project structure V23.3Views: 401 Оновлення бази даних та шаблонів від березня 2023 року. Updating the database and templates from March 2023. Altium Designer my Libraries, Project templates, System settings by Catcatcat. Дивись …
Altium Designer – подготовка документации для производства и сборки печатных платViews: 3979 В процессе освоения Altium Designer много возникает вопросов по подготовке документации для производства плат, а также для её сборки. Altium Designer позволяет сделать все требуемые документы, хотя скажем …
Универсальный терморегулятор ch-c3000Views: 3206 Терморегулятор ch-c3000 предназначен для управления системами регулирования температуры в пределах от – (минус) 55 до + 125 С. Регулятор может использоваться как в системах отопления, так и в …
ch-4000 – универсальная печатная платаViews: 1127 На смену устаревшей плате ch-3000, пришла новая ch-4000. Плату уже можно приобрести в магазине Ворон. Схема. Плата позволяет создавать таймеры, часы реального времени, регуляторы температуры, регуляторы влажности, вольтметры, …
Простой цифровой милливольтметр постоянного токаViews: 4215 Простой цифровой вольтметр постоянного тока. Три диапазона измерений с автоматическим переключением 1 – 0,001 – 0,999 V, 2 – 0,01-9,99 V, 3 – 0,1-99,9. Четыре управляемых выхода с возможностью задания функции контроля …








