![]() |
![]() |
|||||||||||||||
Домашний термометр
Автор: Guaho_150, guaho150@gmail.com Привет всем, друзья! К дню рождения нашего любимого РадиоКота предлагаю вашему вниманию описание простого, но весьма полезного в хозяйстве прибора - двухканального домашнего термометра. Особенности данной конструкции (в отличие от представленных в Инете):
Технические характеристики прибора:
Примечания
Схема прибора электрическая принципиальная
Главным элементом, обеспечивающим весь функционал устройства, является микроконтроллер PIC16F690. В его порт С выводится образ символа для динамической индикации, а порт В используется для подсветки разрядов. Линии порта А используются для обмена данными с термодатчиками, а также для АЦП напряжения с "фоторезисторного" делителя PH1-R5-R6. Конденсатор С7, включенный параллельно светодиоду D1, предотвращает паразитную засветку последнего.
Конструкция прибора и используемые детали Прибор собран на двухсторонней печатной плате. Число межслойных переходов - 12; число перемычек (типоразмера 1206) - 1 (перемычка на схеме не указана). Фото платы (извините за качество, сделано плохим аппаратом):
В конструкции использован микроконтроллер PIC16F690 в SMD корпусе SO20-300. На плате предусмотрено место под кварцевый резонатор любого типа - как для монтажа в отверстия (устанавливается на верхней стороне), так и в SMD исполнении (устанавливается на нижней стороне). Светодиодные 7-сегментные индикаторы - с общим анодом, под статическую индикацию; маркировка использованных в авторском варианте - RL-D5623 (красный) и TOD-5263BG-N (зелёный). Транзисторы VT1...VT4 - полевые типа IRLML9301. Их можно заменить на любые подходящие по цоколёвке Р-канальные MOSFET. Также они легко могут быть заменены на биполярные транзисторы P-N-P структуры - BC856 (цоколёвка полностью совпадает: эмиттер-исток, база-затвор, колектор-сток) и им подобные; яркость свечения индикаторов при этом получается такая же, как и с полевыми транзисторами. В случае такой замены величины R16...R19 должны быть увеличены до 1 кОм. Конденсатор C5 - танталовый. Фоторезистор может быть любой имеющийся в наличии; вместо него можно включить обратно-смещённый фотодиод. Все керамические конденсаторы - типоразмера 1206, за исключением С2, С3 (0805). Резисторы - типоразмера 1206, за исключением R9, R14, R15 (0805). В случаях, когда функция управления яркостью не нужна, её можно совсем отключить, исключив из схемы светочувствительный элемент (фоторезистор или фотодиод) и установив вместо него перемычку, либо сделать отключаемой, подключив параллельно светочувствительному элементу кнопку с фиксацией. Комнатный датчик вынесен за переделы корпуса прибора, крепится прозрачным скотчем на кабеле питания на расстоянии 10...15 см от корпуса (другой вариант - крепление этого датчика в отдельной коробке на стене). Так сделано потому, что датчик, будучи размещён в корпусе, реагирует на тепловое излучение светодиодных индикаторов (даже если проложить теплоизоляцию) и ощутимо завышает температуру в этом случае. Кабель (неэкранированный) от комнатного датчика запаивается на плату. Также методом пайки подключается и кабель питания. Кабель уличного датчика - неэкранированный; его концы заводятся на винтовой клеммник, расположенный на плате термометра (так сделано для удобства инсталляции этого датчика). Сам уличный датчик желательно разместить в коробке, защищающей его от прямого попадания капель дождя. В конструкции коробки необходимо предусмотреть отверстия/щели для качественной естественной вентиляции. Коробку желательно разместить так, чтобы исключить прямое попадание солнечных лучей, и подальше от поверхностей, сильно нагреваемых солнечным светом. Размер платы подобран под пластиковый корпус под заливку компаундом G1005025B (его внутренние размеры примерно 9,5 х 4,5 х 2,2 см). Такие корпуса привлекательны своей дешевизной. Переднюю панель можно выполнить либо из прозрачного пластика (закрасив его так, чтобы оставались прозрачные окошки под индикаторы), либо методом лазерной гравировки/резки, если такая возможность (такой вариант представлен выше на фото внешенго вида прибора).
Особенности программирования контроллера. Для подключения программатора на плате установлена штыревая планка U3. В данной схеме к двум линиям, использующимся при внутрисхемном программировании, подключены термодатчики. В процессе программирования они могут создавать конфликт на шине, поэтому программировать микроконтроллер нужно при отключенных датчиках. Также, для обеспечения монопольного доступа программатора к контроллеру по линии питания, джампер с контактов U2 перед программированием должен быть снят, а после программирования и отключения программатора - одет, т.к. через этот джампер на микроконтроллер поступает "+" питания.
Настройка. Она сводится к установке движка подстроечного резистора R6 в положение, при котором обеспечивается нужный пользователю порог переключения яркости: в темноте яркость должна быть низкой, а при освещении, которое пользователь считает соответствующим режиму бодрствования, - высокой. Переключение яркости происходит скачкообразно и с некоторой (примерно 1...2 сек) задержкой.
Программная реализация. Программа для контроллера написана на Ассемблере, её объём - около 3/4 килобайта. Смена разрядов при динамической индикации выполняется в прерываниях от 0-го таймера с частотой 244 Гц, т.е. обновление всех 4-х разрядов происходит с частотой 61 Гц; время между сменой разрядов - примерно 4 мс. Для управления яркостью индикаторов служит другой таймер, инициализирующийся в прерывании от 0-го таймера и по истечении времени около 700 мкс гасящий индикацию, если уровень внешнего освещения слишком мал. Ещё один таймер используется для отсчёта времени при формировании импульса сброса в процедурах измерения температуры. Для отсчёта времени мощной подтяжки 1-проводной шины на время измерения температуры используется счётчик, модифицируемый в прерываниях от 0-го таймера. Измерение температуры и индикация (запись результата в регистры образов символов) выполняется в основном цикле программы. Подпрограмма измерения - универсальная (одна на два термодатчика); в качестве входной величины ей подаётся битовая маска, указывающая, на какой линии находится термодатчик, с которым в данный момент нужно работать. Процедура измерения - распределённая во времени, выполняющаяся в 13 этапов (для данной задачи так можно было не делать, это вообще заготовка для других проектов; такой подход позволяет минимизировать время, которое забирает за один раз процесс измерения температуры, и таким образом другим процессам достаётся больше процессорного времени). Когда все этапы пройдены, процедура измерения устанавливает флаг готовности результата. Обмен данными с термометром синхронизируется с прерываниями: обработчик прерывания устанавливает флаг, который сообщает процедуре измерения температуры, что недавно завершилось прерывание, и можно начинать приём/передачу данных. За один раз передаётся/принимается 1 байт данных; это сделано для минимизации времени, уходящего на процесс обмена, с целью получить возможность управления яркостью индикаторов (процесс передачи данных и прерывания от "гасящего" таймера не должны накладываться друг на друга во времени). Из принятых от термометра данных формируется модуль и знак температуры, результат раскладывается на разряды, а из числа для каждого разряда с помощью табличного преобразования получается образ символа, отображаемого на индикаторе. АЦП напряжения с "фоторезисторного" делителя производится тоже в основном цикле программы. Для облегчения настройки этой цепи порог переключения выбран равным половине напряжения питания. С целью уменьшения вероятности "дрожания" яркости на переходных областях между "днём" и "ночью" используется программное усреднение результатов АЦП.
Файлы проекта. В прилагаемых файлах - все необходимые для повторения устройства файлы: принципиальная схема, рисунки печатной платы, схема размещения деталей, прошивка для контроллера. Исходный код здесь не выкладывается (он хорошо откомментирован, но нуждается в тщательном "причёсывании", а времени на это нет). Кому очень нужно - пишите на электронную почту, поделюсь без проблем.
Файлы: Все вопросы в Форум.
|
|
|||||||||||||||
![]() |
![]() |


![]() |
![]() |
|||
|
||||
![]() |
![]() |