Лучшее из возможного!

Размер шрифта:  Aa Aa Aa Aa Aa



Термогигрометр на Arduino

Измеритель температуры и влажности

Термогигрометр

В этом приборе использован недорогой, но имеющий достаточно высокую точность датчик температуры и относительной влажности DHT22. Он имеет диапазон измерения температуры от -40 до +125 C°, относительной влажности от 0 до 100%. Точность измерения не хуже +/-2 C° и +/-5% соответственно. Рабочее напряжение 3,3 ... 5,5 В, потребляемый ток 2,5 мА в режиме передачи данных и 100 мкА в режиме ожидания. Правда, опрашивать датчик можно не чаще, чем один раз в 2 сек. Но ведь температура и влажность не изменяются мгновенно.

При этом стоимость DHT22 на Aliexpress около 2 USD. Есть и более дешевая модель DHT11, но она имеет более узкий диапазон измерения и меньшую дискретность отсчета. Для бюджета даже российского радиолюбителя 1 лишний USD не имеет принципиального значения, поэтому для изготовления единичного экземпляра термогигрометра я рекомендую использовать именно DHT22.

Может возникнуть вопрос, зачем делать еще один вариант метеостанции, если и так их выбор достаточно велик. На главной странице этого сайта я упоминал, что область деятельности радиолюбителя XXI века – это изготовление не стандартных устройств, а каких-то уникальных приборов, которые нельзя купить. Т.е. того, что нужно только Вам, но совершенно не интересует среднестатистического человека.

Датчик температуры и влажности DHT22

Основное назначение предлагаемого термогигрометра – дистанционное измерение температуры и влажности в серверной комнате. Компьютеры там есть, выход в интернет тоже есть, так что нужно только передать данные в компьютер, остальное дело техники. Но при этом на первый план выходит надежность, достоверные данные должны передаваться 24 часа в сутки, 7 дней в неделю. Интерфейс связи с компьютером – USB, альтернативы сейчас просто нет.

Удобнее всего реализовать этот интерфейс через виртуальный COM порт. Самое простое решение – плата Arduino Nano, на которой смонтирован конвертер USB-COM и установлен контроллер ATmega328P со всей необходимой обвязкой. Датчик DHT22 подключается всего по трем проводам – питание, "земля" и однопроводная шина данных. Потребуется всего два дополнительных дискретных компонента – блокировочный конденсатор по питанию и подтягивающий резистор на однопроводную шину данных. Тут даже принципиальную схему рисовать не нужно, все понятно из чертежа платы.

Все элементы смонтированы на печатной плате размерами 90x30 мм. Вид на плату со стороны печатных проводников (при печати из Sprint-Layout поставить галочку «зеркально»). Рекомендуемый номинал конденсатора 0,1 мкФ, а резистора – от 1 до 5 кОм. Чем длиннее соединительные провода, тем меньшего номинала нужно ставить подтягивающий резистор. Я разместил датчик в непосредственной близости от контроллера и установил резистор 3,3 кОм. Номинала 4,7 кОм просто не было под руками.

Печатная плата термогигрометра

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

Термогигрометр

Питание на датчик DHT22 подается с трех, соединенных параллельно выводов контроллера - PD4, PD5, PD6. Выводы промаркированы на плате D4, D5, D6. В принципе, достаточно и одного вывода, но их у контроллера много... Однопроводная шина данных – PD7 (D7). Номера выводов портов не принципиальны, с соответствующей коррекцией программы их можно при необходимости поменять.

Описание протокола обмена можно найти в Интернет и в datasheet на датчик. Каждая посылка состоит из 5 байт: 2 байта – влажность, 2 байта – температура и последний байт контрольная сумма посылки. Замечу, что в большинстве источников неправильно указывается формат передаваемых данных.

Протокол обмена DHT22

Обычно пишут, что старший байт это целая часть значения влажности и температуры, а младший – их дробная часть. В реальности это не совсем так, вернее совсем не так. Каждые два байта – это двоичное значение со знаком – переменная signed int. Чтобы получить реальное значение температуры и влажности нужно принятое двухбайтное значение перевести из двоичной в двоично-десятичную форму и разделить на 10. Например, если принято 0x01FF, что соответствует десятичному числу 511, влажность равна 51,1%. Аналогично для температуры, но со знаком. Более подробно протокол описан в прилагаемом datasheet. Ссылка в конце странички.

Программа для Arduino написана на ассемблере. В данном конкретном случае нет никакой необходимости использовать Си или фирменную программную среду Arduino, т.к. данные о температуре и влажности не подвергаются в контроллере никаким преобразованиям. Но в процессе декодирования важно точно выдержать временнЫе интервалы порядка единиц-десятков микросекунд. А это проще всего сделать при программировании на ассемблере.

Алгоритм работы программы следующий. Каждые 30 секунд контроллер посылает датчику запрос на передачу данных. Датчик отвечает посылкой из 5 байт. Контроллер проверяет контрольную сумму и, если она совпадает, отправляет в COM порт посылку из 6 байт:
NN nn HH hh TT tt, где
NN - MSB счетчика посылок
nn - LSB счетчика посылок
HH - MSB влажности
hh - LSB влажности
TT - MSB температуры
tt - LSB температуры
Для температуры старший бит знаковый.

Счетчик посылок считает от 0x0000 до 0xFFFF, затем сбрасывается в 0000. Если сброс в 0000 произошел раньше, чем он досчитал до FFFF, значит был произведен перезапуск контроллера и датчика. В случае ошибки связи с датчиком вместо значений влажности и температуры передается 0xFF,0xFF,0xFF,0xFF. При ошибке контрольной суммы датчика – 0xFE,0xFE,0xFE,0xFE.

Если три попытки чтения датчика подряд были с ошибками, производится сброс контроллера по сторожевому таймеру и перезапуск датчика. Именно по этой причине питание датчика взято с выводов контроллера, а не с источника питания 5 В. При этом счетчик посылок сбрасывается в ноль. При нормальной работе светодиод на выводе D13 (PB5), установленный на плате Arduino Nano, мигает с периодом 2 сек индицируя, что все OK.

Перезапуск контроллера и датчика производится также при открытии COM порта в Windows, его можно произвести в любой момент положительным импульсом на линии DTR порта. Настройки порта жестко заложены в прошивку: скорость обмена 57600, 8N1. Передавать контрольную сумму нет необходимости, т.к. она контролируется на аппаратном уровне в протоколе USB.

В модулях Arduino китайского производства сейчас обычно устанавливается микросхема конвертера USB-COM типа CH340G. Чтобы порт появился в диспетчере устройств Windows предварительно нужно установить драйвер. Его лучше скачать с сайта производителя: http://www.wch.cn/. Сайт, к сожалению, на китайском языке. На всякий случай я выкладываю проверенный на Windows XP и Windows 7 драйвер для CH340G, ссылка в конце странички. В Linux, в том числе и на Raspberry Pi, никакой драйвер устанавливать не нужно. Там порт определяется как файл /dev/ttyUSB0 или что-то подобное.

Окно программы XLoader

Как использовать данные в компьютере – задача для системного программиста. Можно их визуализировать, сохранить в архиве для построения графиков в Excel, послать SMS в случае аварийной ситуации и т.п. Напомню, что этот термогигрометр предназначен для работы с серверным компьютером.

Протестировать его работу можно в терминальной программе, которая позволяет отображать HEX значения принимаемых данных. Имейте в виду, передаются именно байты, а не их текстовые ASCII символы. Ссылка на такой терминал есть в конце странички.

Ну и несколько слов о том, как запрограммировать Arduino. Скачиваем с сайта http://russemotto.com/xloader/ или по ссылке в конце этой странички с моего сайта программу XLoader и устанавливаем ее. Работа с программой проста и интуитивно понятна. Нужно выбрать тип платы - Nano(ATmega328) и номер виртуального COM порта. Скорость обмена 57600 установится сама, менять ее не нужно. Затем указываем путь к файлу прошивки DHT22.hex. О FUSE битах можно не беспокоиться, они уже выставлены и возможности испортить их нет. После этого нажимаем кнопку «Upload» и ждем несколько секунд до окончания загрузки.

Как я уже упоминал, программа написана на ассемблере в AVR Studio. Так что устанавливать фирменное программное обеспечение Arduino нет необходимости. Прошивка занимает в памяти контроллера менее 700 байт, поэтому есть возможность при необходимости добавить какие-нибудь дополнительные функции, например, отображение информации на индикаторе, звуковую сигнализацию и т.п. Исходный текст программы доступен для скачивания. Ссылка ниже.

© 2018г.


ZIP Плата термогигрометра в Sprint Layout
PDF Datasheet DHT22
ZIP Прошивка Arduino Nano
ZIP Исходный текст программы для ATmega328P (Arduino Nano)
ZIP Терминал для тестирования термогигрометра
ZIP Программа XLoader для программирования HEX файла в Arduino
ZIP Драйвер USB-COM CH341G для Windows 7, XP