Простой Цифровой Термометр/Гигрометр Для Am2302 (Dht22), Attiny13 И Max7219

Цифровой датчик температуры и влажности AM2302 (DHT22) довольно популярен в сегменте DIY, поскольку при невысокой стоимости (если рассматривать реплики китайского производства), обеспечивает хорошую точность измерений и очень прост в подключении (три провода, включая силовой).

).

Однако большинство примеров использования этого датчика предназначены для Arduino и написаны на языке программирования C/C++.

Это идеальный вариант, если вы хотите ознакомиться с функционалом датчика или «на скорую руку» прикрепить термометр к имеющемуся устройству.

Но если вы хотите собрать термометр/гигрометр и только это, использование целой платы Arduino (или просто большого МК с парой десятков контактов) вполне справедливо может показаться ненужным.

В этой статье речь пойдет о простом термометре/гигрометре (далее просто термометр), выполненном на одном из самых маленьких микроконтроллеров - ATtiny13 с весьма скромными характеристиками - 1Кб программной памяти, 64 байта оперативной памяти и 5-й (6-й при отключении контакт сброса) интерфейсные контакты.

В статье предполагается, что читатель уже имеет некоторые знания о микроконтроллерах AVR и их программировании, но статья в основном предназначена для новичков в этой области.

Кстати, о языке программирования — программа термометра полностью написана на языке ассемблера.

Итак, начнем.

Для отображения информации о температуре и влажности был выбран 8-значный 7-сегментный светодиодный дисплей, позволяющий отображать оба параметра одновременно без необходимости переключения между ними.

Этот индикатор имеет 16 контактов (8 сегментов + 8 цифр), что явно выходит за рамки возможностей маленького контроллера ATtiny13. К счастью, компания Maxim выпускает чип MAX7219, специально предназначенный для таких случаев — чип содержит весь функционал 8-битного динамического дисплея плюс SPI-совместимый последовательный интерфейс.

Таким образом, с помощью этой микросхемы весь наш индикатор можно подключить к МК всего тремя проводами (не считая земли и питания).

Это уже вполне подходит для контроллера с 5 интерфейсными выводами.

Кстати, стоимость одного комплекта индикатора, микросхемы и печатной платы в сборе на aliexpress составила всего $1,3. Как уже говорилось выше, AM2302 используется в качестве датчика температуры и влажности.

К МК он подключается при помощи всего одного провода.

Таким образом, из имеющихся 5 интерфейсных контактов МК используются только 4, а на оставшиеся 5-е можно «повесить» любую дополнительную функцию.

Также, если у вас есть программатор HVSP, вы можете отключить пин сброса и использовать его как 6-й интерфейсный пин, но это несколько затруднит обновление прошивки МК.

Итак, вся схема термометра представлена на рисунке ниже:

Простой цифровой термометр/гигрометр для AM2302 (DHT22), ATtiny13 и MAX7219

Поскольку все интерфейсы работы с внешними устройствами МК реализованы программно, выбор выходов (пинов), к которым подключается тот или иной сигнал, сугубо произволен и производился, скорее всего, по принципу «где было больше».

удобно вставлять эту проводку в макетную плату».

Так что можете смело выбирать другие пины, нужно лишь подправить их количество в коде.

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

зрения.

Теперь, когда с подключением датчика и индикатора все понятно, приступим к написанию самого кода.

И здесь нас ждет новый «вызов» — ATtiny13 не имеет на борту никаких последовательных интерфейсов, т.е.

всю их логику придется реализовать программно.

К счастью, реализовать SPI для MAX7219 не представляет особой сложности, т.к.

протокол синхронный, микросхема работает на частоте до 10 МГц, а интерфейс в нашей схеме работает только на вывод. А вот общение с AM2302 будет более сложной задачей, поскольку он соединен всего одним проводом, по которому данные передаются в обе стороны и скорость передачи полностью определяется самим датчиком.

Здесь следует сказать, что большинство библиотек для работы с AM2302 идут по «простому пути» — отключают прерывания и считывают всю информацию с датчика одним вызовом функции.

Это простое и надежное решение, но оно вряд ли подойдет, если на МК возложены какие-либо другие функции реального времени (например, динамическое отображение или непрерывный анализ данных из других источников), поскольку весь цикл считывания информации о температуры и влажности занимает от 4-х до 6 миллисекунд (в зависимости от передаваемых данных).

Несмотря на то, что никаких других функций реального времени у этого термометра нет, было решено написать универсальный код, который бы считывал информацию с датчика «в фоновом режиме», т.е.

при прерываниях.

Чтобы максимально упростить схему, ATtiny13 тактируется встроенным RC-генератором, вырабатывающим около 9,6 МГц.

Это позволяет, вызывая прерывание каждые 128 тактов процессора, получить частоту опроса AM2302 75 КГц или 13,33 микросекунды между соседними опросами.

Согласно спецификации AM2302, минимальная длительность импульса на его выходе составляет 26 микросекунд, что почти в два раза превышает интервал опроса и гарантирует стабильное чтение данных.

Конечно, 128 тактов между двумя прерываниями - это не очень много для реализации алгоритма опроса, но большинство команд AVR выполняет за 1 такт, так что написать работающую программу в таких условиях вполне возможно, и время еще будет. для выполнения основной программы.

Согласно спецификации AM2302 можно опрашивать не чаще одного раза в две секунды.

Однако практика показывает, что он вполне способен выдавать результаты чаще — до нескольких раз в секунду, при условии, что после включения питания ему дается 1-2 секунды (по спецификации — 2) на инициализацию.

В этом термометре опрос датчика осуществляется раз в секунду, но интервал опроса можно легко изменить на любое другое значение.

К сожалению, AM2302 (возможно, это связано с его китайским происхождением) имеет достаточно большую погрешность результата — два последовательных запроса температуры могут вернуть разницу в 0,5 и даже более градусов, поэтому было решено программно усреднить данные последних 8 измерений, так чтобы показания термометра не прыгали.

Теперь перейдем непосредственно к коду.

Исходный asm и полученный hex файл находятся в приложении в конце статьи, здесь я поясню основные моменты.

Будет удобно открыть исходный код программы в другом окне и смотреть туда во время чтения статьи.

В начале программы есть два важных определения:

   

#define SKIPNEXT1W (PC + 2) #define DS(var) Y + var - _dataStart

Первый позволяет условно перепрыгнуть следующую 16-битную инструкцию (1 слово, большинство инструкций AVR), т.е.

пропустить ее без введения дополнительной метки, например: Теги: #Сделай сам #Электроника для начинающих #гигрометр #attiny13 #dht22 #термометр #AM2302

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.