РадиоКот :: Контроллер температуры в погребе на ATmega
Например TDA7294

РадиоКот >Схемы >Цифровые устройства >Бытовая техника >

Теги статьи: Добавить тег

Контроллер температуры в погребе на ATmega

Автор: kitekat
Опубликовано 21.09.2015
Создано при помощи КотоРед.
Участник Конкурса "Поздравь Кота по-человечески 2015!"


Краткие характеристики


Каналов температуры – 3
Каналов влажности – 1
Каналов управления вентилятором – 1
Отображение – 1 канал, последовательно.
Применяемый МК – ATmega8 или ATmega48/88
Температурные датчики – DS18B20 (2 шт)
Датчик влажности – DHT11 или DHT21

Преамбула

Так получилось, что я поселился в частном доме. Человек я сугубо «квартирный», поэтому многие вещи для меня теперь являются проблемными. Например, погреб в доме оказался слишком теплым. Поэтому было решено сделать термометр, отображающий температуру в погребе. Дальнейшее исследование выявило наличие вентиляции, поэтому в задачу добавилось управление вентиляторами. В итоге первоначальная идея переродилась в полноценный контроллер управления температурой в погребе.
Итак, окончательная концепция – три датчика температуры (на полу, под потолком и наружный), датчик влажности, индикация температуры на 7-ми сегментном цифровом индикаторе, и вентиляторы на приточной и вытяжной трубах. Вывод различных значений производится последовательно, в течение нескольких секунд, с дополнительной индикацией, какой именно датчик сейчас используется.

Поскольку всяческих «исполнительных устройств» планировалось достаточно много, контроллер был выбран многоногий - чтобы избежать дополнительных регистров и усложнения схемы. Популярная ATmega8 вполне нам подходит.

Схема

Устройство представляет собой МК, окруженный «исполнительными устройствами». Схема выполнена в виде отдельных блоков, все соединения между блоками не нарисованы явно, а обозначены соответствующими метками на выводах. Это сделано для упрощении разводки платы. Здесь применяется известный прием – сначала приблизительно разводим плату, смотрим, где и как удобно соединить ножки МК с другими элементами, и затем правим схему – переставляем метки на выводах. А далее, уже глядя на готовую схему, пишем программу. Этот прием хорошо работает в «сквозных» системах проектирования, с контролем списка связей (нетлист), однако совсем не годится для любителей SprintLayout.

 

Транзисторный буфер из Q1 и Q2 требует отдельного пояснения.

Датчики температуры – цифровые устройства DS18B20, работающие по протоколу 1-wire. Эти датчики способны работать на общей шине, каждый имеет уникальный адрес. К сожалению, в МК AVR отсутствуют аппаратные средства поддержки 1-wire. Однако есть промежуточные решения, основанные на использовании интерфейса UART – об этом идет речь в Application Note от ATMEL AVR318[3]. Вместо управления одним пином МК и переключением его то на вход, то на выход (как это требуется по стандарту 1-wire) используется выход TX и вход RX, объединенные с помощью буферных транзисторов в некое подобие одного двунаправленного вывода. Временные диаграммы интерфейса 1-wire очень похожи на прием-передачу байтов по интерфейсу UART. Поэтому программная обработка протокола 1-wire заключается в приеме-передаче определенных символов.

На одну шину можно «повесить» несколько датчиков, а затем их опрашивать программно. Первоначально планировалось использовать три датчика DS18B20, однако появилась мысль измерять также влажность. Влажность можно измерить также цифровым датчиком DHT11 или DHT21, в котором присутствует также и датчик температуры. Однако DHT, хоть и также работают по «одному проводу», но не совместимы с 1-wire и не могут работать несколько на одной шине. Поэтому было решено оставить два датчика DS18B20 на одной шине и один DHT11 на другой. Решение ограничиться всего двумя изделиями от Dallas/Maxim позволило также упростить схему и упростить программу в части автоопределения датчиков.

Блоки R14-D6-D7 и R26-D8-D9 призваны защитить входы МК от помех, наводимых на длинных линиях проводов, ведущих к датчикам.

Все остальные выводы МК используются только как обычные порты ввода-вывода (general purpose input-output), без специальных функций. Десять пинов отведены под 3-х разрядный 7-ми сегментный индикатор на светодиодах. 4 пина – под индикацию режимов отображения датчиков. Остальные выводы распределены под управление вентиляторами, включение аварийной «пищалки» и перемычку нумерации датчиков.

Транзистор Q3 управляет вентиляторами. Транзистор Q4 включает «пищалку».
Резисторы R27, R28, R29 - виртуальные, нужны только для моделирования схемы в Proteus, на плате не устанавливаются.

Программа

Ради упрощения разводки платы было решено управлять каждым пином по отдельности, а не целыми портами. Это немного усложняет программу, зато появляется полная независимость в распределении ножек МК – за исключением RX/TX. Поэтому схема представляет собой набор блоков, без явных графических соединений – их заменяют метки на выводах.

Программа представляет собой простое подобие флагового автомата. TIMER0 считает «тики», выставляет флажки таймаутов, которые обрабатываются в главном цикле. Функции работы с 1-wire напрямую списаны с того же Application Note AVR318[4] – вариант работы с портами UART по опросу (polled). Вариант с прерываниями достаточно сложен и в данном изделии было решено не применять.

Программа на Си написана в среде AtmelStudio 4.6 и WinAVR.

Большой блок текста в первой части программы – строки, начинающиеся с #define – предопределение различных опций, таймаутов, условий включения вентиляторов, макросы работы с пинами, макросы вывода цифр на 7-ми сегментник.
Основное внимание при изменении программы следует обращать на определения макросов работы с портами. Все они сгруппированы по назначению. Каждый пин участвует в трех макросах – включение/выключение «исполнительного устройства», и инициализация пина.
Блок определений и функций, начинающийся с OWI_ (One Wire Interface) – списан напрямую из AVR318 (polled)[4].

Вывод в выходные порты МК делаются побитовыми операциями SBI и CBI – это сделано для универсальности назначения выводов. Поэтому для формирования цифр на дисплее используются не массив значений, выводимых в порты, а массив указателей на функции вывода различных цифр.

Алгоритм достаточно простой. Вначале опрашивается шина 1-wire, и определяются адреса (идентификаторы) датчиков. Адреса заносятся в массив. Далее запускается основной цикл, где по определенным таймаутам опрашиваются датчики и выводятся цифры на дисплей. Датчикам DS сначала выдается команда на преобразование температуры в функции poll_termo(), а затем через определенный таймаут (не менее 94мс для 9-битного режима) выдается команда на прием значения температуры функцией get_termo(). Датчик DHT11[6] работает проще – после специального сигнала от МК датчик сразу начинает слать данные, и их остается только принять. Пока было решено отказаться от чтения/вычисления CRC от датчиков DS, и ограничиться 9-битным режимом для отображения целых чисел градусов.

При определенных условиях включается или выключается вентилятор. Главное условие – если наружная температура больше 4 и меньше 15 и внутренняя температура (внизу) выше на два градуса наружной.
При падении внутренней температуры внизу до 1 градуса дополнительно включается прерывистый звуковой сигнал, а также мигают цифры индикатора – для привлечения внимания.
Кроме всего, при старте устройство исполняет функцию prestart(), в которой на несколько секунд зажигаются все светодиоды.

Детали и конструкция.

Устройство собрано на односторонней печатной плате размерами 100х83мм. При разработке использовались детали как выводные, так и SMD. DIP-корпус МК в данном устройстве был выбран только по наличию его у автора. На плате располагаются МК, дисплей, индикаторы режимов и стабилизатор питания. Внешние устройства подключаются кабелем «витая пара» из 4 пар, посредством разъема RJ45.

Защитные диоды в этой первоначальной ревизии платы ошибочно были забыты.

Все устройство собрано внутри металлического корпуса от компьютерного привода CD-ROM. На верхней крышке вырезаны отверстия под цифровой дисплей и индикаторы режимов. В качестве боковин можно также использовать пластиковые заглушки от 5-дюймовых отсеков компьютерных корпусов.

В качестве блока питания использовался внешний блок 9в/2А от какого-то устройства, вы можете использовать любой, который способен выдавать 9-12в и ток не ниже 0.3-0.5А.

Питание МК осуществляется стандартно через стабилизатор 7805, уложенный прямо на плату, что будет давать подобие радиатора.
Конденсаторы C1. C2 нужно располагать в непосредственной близости от стабилизатора, C3 рядом с выводами питания МК, С4 рядом с выходным разъемом.
На плате также присутствует разъем IDC10 для внутрисхемного программирования.

Светодиоды для индикации режимов измерения – разных цветов. Автор применил такие:
Температура вверху, под потолком – красный
Температура внизу, на полу – зеленый
Температура снаружи – белый,
Влажность – синий
Индикатор работы вентиляторов – желтый
В связи с разной субъективной яркостью светодиодов разных цветов токоограничивающие резисторы в их цепях разных номиналов.

«Пищалка» - с генератором, на 9-12в.

Примененный 7-ми сегментный индикатор – 3-хразрядный, с общим катодом. Автор использовал индикатор с цифрами 0.56” (13мм) высотой.
При необходимости легко заменяется на «общий анод» без переделки платы, требуется только использовать другую прошивку, или перекомпилировать программу, предварительно определив константу COMMON_ANODE. Для управления катодами/анодами транзисторы не применялись, поэтому токоограничивающие резисторы в цепях сегментов не должны быть менее 600 Ом, чтобы обеспечить ток сегмента не более 5мА. Расчет простой – максимальный ток через один пин МК – 40мА, сегментов 7, значит, ток светодиода сегмента не должен превышать 5,7мА.

МК – Atmega8 или ATmega48/88/168/328, которые полностью совместимы по ножкам, но слегка различаются по именам регистров. В программе есть анализ предопределенной переменной имени микроконтроллера, которая задается в свойствах проекта AtmelStudio.

Датчик влажности – DHT11 или DHT21, они также используются как верхний термометр Следует помнить, что DHT11 измеряет только положительную температуру, в отличие от DHT21. Показания данного датчика только выводятся на дисплей, в программе управления вентиляторами не участвуют.

Вентиляторы – от компьютерных блоков питания, на 12в, две штуки, в схеме не участвуют. Полевой транзистор Q3 в корпусе TO252 или TO263 – также был снят с материнской платы компьютера, его точное наименование не важно. Это любой N-канальный мощный MOSFET с логическим управлением.

Остальные транзисторы - npn общего назначения, например, BC547 или BC847.

Монтаж и наладка.

После установки всех деталей на плате необходимо «залить» прошивку в МК, и прошить фьюзы.
Основное отличие от фабричных установок:
ATmega8 – тактирование от внутреннего генератора 8МГц (CKSEL3:0 = 0100).
ATmega48/88 – убрать деление тактовой на 8 (CKDIV8 = 1).

При включении устройства на несколько секунд зажигаются все светодиоды, дисплей несколько раз мигает всеми сегментами, звучит пищалка. Далее начинается нормальная работа – на дисплее отображается число, а рядом светодиодами индицируется, какой датчик сейчас показывает. Каждый датчик отражает свое состояние примерно на 4 секунды. Без подключенных датчиков дисплей будет показывать ошибку.

Внешние датчики и вентиляторы подключаются 8-ми проводным кабелем «витая пара» для монтажа компьютерных локальных сетей Ethernet.
Автором был назначен такой порядок проводов,аналогично стандарту EIA/TIA-568B. 1-я пара (оранжевая, контакты 1-2) – на датчики DS, 2-я пара (зеленая, контакты 3-6) – на датчик DHT, 3-я пара (синяя, контакты 4-5) – на вентиляторы, 4-я пара (коричневая, контакты 7-8) – на питание +5в. Для монтажа "вилки" на кабель требуется специальный обжимной инструмент, можно попросить обжать кабель в компьютерных магазинах; либо отрезать от фирменного "патч-кабеля". Разводка и присоединение датчиков непосредственно в погребе была произведена по стенам и потолку, с применением монтажных коробок для монтажа электропроводки.

Вентиляторы подключаются своим плюсом (красный провод вентилятора) на провод +12в (контакт 5 разъема  X3), а своим минусом (черный провод) - на провод FAN (контакт 4 разъема X3).

Ответственная операция – монтаж датчиков на проводах. Автор использовал кабель неэкранированной витой пары, что используется для монтажа компьютерных локальных сетей. Однако сами выводы датчиков рекомендуется сначала припаять к мягкому монтажному проводу, а уже потом этот провод припаивать непосредственно к достаточно жесткому проводу витой пары. Промежуточный датчик DS18B20 требуется монтировать «петлей» хотя бы по линии данных (DQ), хотя вполне возможна работа и при монтаже «звездой». Очень желательно разместить дополнительные керамические конденсаторы емкостью 0.1-0.3 мкФ прямо на выводах датчиков между питанием и «землей» (на схеме не показаны). Перед пайкой датчиков воспользуйтесь даташитом[5,6] на конкретный датчик для определения выводов. Выводы и места пайки изолируются термоусадкой. Датчик DHT герметизировать не нужно – он должен мерить влажность. А датчики DS18B20 и место присоединения кабеля требуется герметизировать, не забывая также места пайки. Например, упаковать в несколько слоев термоусадочной трубки, замазать «холодной сваркой». Наилучшим вариантом будет отрезок медной или стальной трубки, в которую плотно входит корпус датчика. Трубка с датчиком и кабелем заливается эпоксидной смолой.

При первом запуске после присоединения датчиков требуется определить соответствие датчиков DS и их очередности. Для наглядности требуется явная разница в температуре датчиков – нужно один из них нагреть или охладить. Если показания индикатора соответствуют порядку датчиков – то нам повезло, мы угадали. Если показания наоборот – то требуется поставить перемычку JP1 на плату, и перезапустить контроллер выключением питания. Программа будет опрашивать датчики в обратном порядке.

При отсутствии датчиков, или их неисправности, на индикатор выводится сообщение об ошибке, например Er1. Номера ошибок определены в программе: Er1 = отсутствие первого датчика DS; Er2 – отсутствие второго датчика DS; Er3 – общая ошибка датчиков DS при опросе; Er7, Er9 – отсутствие и ошибка датчика DHT.

Возможные пути модернизации.

Применение более мощных вентиляторов – возможно при минимальной переделке схемы. Можно применить реле или симистор, но обязательно с опторазвязкой.

Больше термодатчиков? Да, их можно навесить на общую шину и поболее. В программе при минимальных изменениях возможен опрос большого кол-ва, однако встает вопрос о соответствии их адресов и реальном местоположении. Например, для трех термодатчиков DS18B20 есть уже 6 вариантов расположения, и понадобится уже 3 перемычки. Тут уже нужно или переделывать схему и программу, или определять адреса датчиков и физически располагать их в порядке возрастания адресов.

Приложения.

В приложениях схема в формате ISIS Proteus; плата в формате ARES Proteus, также схема и плата в графических форматах.
Прошивки различных вариантов МК и индикаторов, и исходник программы на Си для AtmelStudio (WinAVR).

Литература и источники

1. ATmega48 Datasheet: https://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf
2. ATmega8 Datasheet: https://www.atmel.com/Images/Atmel-2486-8-bit-AVR-microcontroller-ATmega8_L_datasheet.pdf
3. AVR318: Dallas 1-wire master : https://www.atmel.com/images/doc2579.pdf
4. AVR318 Software: https://www.atmel.com/Images/AVR318.zip
5. DS18B20 Datasheet: https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf
6. DHT11 Datasheet: https://avrproject.ru/DHT-11/DHT11.pdf

 


Файлы:
Плата
Текст программы
Файлы схемы и платы для Протеуса
Прошивки


Все вопросы в Форум.




Как вам эта статья?

Заработало ли это устройство у вас?

19 10 11
1 0 0