термометр-термостат на микроконтроллере
Опубликованное в описание термометра на интегральном датчике температуры DS18B20 и микроконтроллере PIC16F84 заинтересовало, судя по откликам на радиолюбительских интернет-форумах, многих радиолюбителей. Простота конструкции позволила повторить ее даже начинающим. Однако уже при первом включении многие столкнулись с проблемой "трех тире", постоянно выведенных на экран вместо значения температуры.

Дело оказалось в том, что в ассемблерном исходном тексте программы, по которой работает микроконтроллер, отсутствует директива
__COnfig _XT_OSC & _WDT_OFF & _PWRTE_ON,
означающая, что используется кварцевый резонатор среза XT, сторожевой таймер микроконтроллера WDT выключен и действует таймер PWRT, задерживающий начало работы микроконтроллера после включения питания на время, необходимое для "раскачки" кварцевого резонатора. Именно невыключенный сторожевой таймер, периодически возвращая микроконтроллер в исходное состояние, не дает термометру возможности нормально работать.

Устранить дефект можно несколькими способами. Первый из них — вписать в исходный текст программы приведенную выше строку с директивой конфигурации (в любое удобное место между директивой «include и завершающей программу директивой end), повторить трансляцию и получить новый НЕХ-файл. Второй способ — дополнить строкой: 02400EOOF13F80 уже имеющийся НЕХ-файл. Ее можно ввести в любое место этого файла до завершающей его строки: 00000001FF. Естественно, придется повторить загрузку в микроконтроллер кодов из полученного в результате повторной трансляции или исправленного НЕХ-файла.

Многие программы—оболочки программирования позволяют задать нужную конфигурацию микроконтроллера, не внося в НЕХ-файл информацию о ней. Видимо, именно так поступил автор исходной программы, забыв рассказать об этом в статье. Например, работая с оболочкой IC-Prog, можно выключить сторожевой таймер, сняв "галочку" в окошке WDT на панели конфигурации. Это нужно сделать после загрузки в буфер программных кодов, но до выполнения операции программирования микроконтроллера. Панель должна иметь показанный на рис. 1 вид независимо от способа, которым установлена конфигурация.
 
При повторении термометра возникла необходимость установить в него четырехразрядный светодиодный индикатор BQ-M51DRD с общими анодами разрядов взамен использованных в исходной конструкции индикаторов с общими катодами. Схема термометра после такой замены показана на рис. 2. Он дополнен также узлом управления исполнительным устройством термостата на более мощном, чем в первоначальном варианте, транзисторе VT1 и реле К1.
 
Транзистор открыт, и к обмотке реле приложено напряжение, когда измеренное значение температуры меньше заданного. Если термостат управляет электронагревателем, в цепь питания последнего следует включить нормально разомкнутые контакты реле. А при необходимости поддерживать отрицательную температуру в морозильной камере в цепь питания компрессора холодильного агрегата включают нормально замкнутые контакты реле.
Чертеж односторонней печатной платы предлагаемого варианта термометра изображен на рис. 3 Конденсаторы С1 и С2 — керамические, СЗ — оксидный (К50-35). Все резисторы — МЛТ, некоторые из них расположены под индикатором HG1, где имеется свободное место. Диод VD1 установлен со стороны печатных проводников, его выводы припаяны непосредственно к выводам обмотки реле.
 
Интегральный стабилизатор КР142ЕН5А можно заменить КР142ЕН5В или импортным 7805. У примененного автором реле SYS1-S-105L есть полный аналог HJR-4102-L-05V. Если имеется реле с большим напряжением срабатывания, верхний вывод его обмотки вместе с подключенным к нему катодом диода VD1 нужно соединить с плюсом источника соответствующего напряжения в обход стабилизатора DA1. Светодиод КИП-М01 Б-1К можно заменить любым другим подходящих размеров и цвета свечения, а индикатор BQ-M51DRD -CA56-21SRWA. Изготовленный термометр с выносным датчиком изображен на фотоснимке рис. 4 Потребляемый ток, если реле не сработало, не превышает 29, а при сработавшем реле — 80 мА.
Чтобы заставить микроконтроллер обслуживать новый индикатор, пришлось переработать программу, прежде всего, ее участок, отвечающий за установку на соответствующих выводах портов RA и RB высоких и низких уровней напряжения. Новая программа устанавливает их инверсными относительно прототипа, что и требуется при изменившейся полярности подключения светодиодов индикатора. В связи с этим претерпел изменения и алгоритм определения состояния кнопок SB1 и SB2, причем логика установки заданного значения температуры этими кнопками осталась прежней.

Следует иметь в виду, что при первом включении термометра в энергонезависимой памяти микроконтроллера находятся случайные данные, не соответствующие, как правило, никаким разумным значениям температуры По этой причине светодиод HL1 может беспорядочно мигать, а реле К1 —срабатывать. Все приходит в норму после первой же установки температуры кнопками SB1 и SB2.
 
В процессе налаживания термометра обнаружено, что он не всегда правильно работает при отрицательной температуре датчика и при заданном отрицательном значении температуры стабилизации. Некоторые радиолюбители, с которыми пришлось обсуждать эту проблему, считали ее несущественной, утверждая, что "мороз стабилизировать не нужно" Тем не менее недостаток есть недостаток. Чтобы устранить его, пришлось довольно существенно переделать программу в части правильного считывания с датчика и обработки отрицательных значений температуры.
 
Принцип действия датчика DS18B20 достаточно подробно описан в [1], поэтому повторяться не буду. Приведу лишь взятую из [2] табл. 1 где указаны коды, передаваемые датчиком при различной температуре. Их двоичные значения при положительной темпера туре имеют в старших разрядах нули, а при отрицательной — единицы. На этом и основан анализ значений температуры в переработанной программе. Он ведется с использованием флага переноса С в регистре STATUS. После добавления в программу блоков, начинающихся в ее ассемблерном тексте метками L2A, L2B, L2C, L2D и L2E правильно обрабатываются все возможные ситуации:
- заданная температура положительна и выше измеренной положительной;
- заданная температура положительна и ниже измеренной положительной;
- заданная температура положительна, а измеренная отрицательна;
- заданная температура отрицательна, а измеренная положительна;
- заданная температура отрицательна и выше измеренной отрицательной;
- заданная температура отрицательна и ниже измеренной отрицательной.

Теперь при заданной температуре +10 "С высокий уровень на линии RA3 (выводе 2) микроконтроллера будет установлен при измеренном значении ниже +10°С и вновь станет низким при температуре + 12 °С — на 2 "С выше заданной Эта логика сохранится и при заданной температуре -10 °С. Высокий уровень будет установлен при температуре ниже -10 °С, а низкий — как только температура возрастет до -8 "С.

Ширину зоны гистерезиса (в рассмотренном случае 2 °С) можно изменить, откорректировав следующий фрагмент программы:
MOVLW 0x02; гистерезис в градусах
MOVWF DT_ALARM

Нужное значение (в целых градусах) указывают в качестве аргумента его первой команды, затем повторяют трансляцию и перепрограммируют контроллер. Как и в случае с конфигурацией микроконтроллера, изменить можно и НЕХ-файл, не трогая исходный текст программы. В том, содержимое которого приведено в табл. 2 (это коды новой программы термометра со всеми описанными выше изменениями), значение ширины зоны гистерезиса находится в байте, выделенном цветом. Изменив его, не забудьте откорректировать и контрольную сумму соответствующей строки, иначе программатор зафиксирует ошибку. Значение последнего байта этой строки нужно изменить на столько же единиц, что и выделенный байт, но в противоположную сторону.

Скачать исходник и прошивку

Обновление от RGB :

Схема:

 

Скачать печатку и прошивку измененную

Скачать [75,59 Kb] (cкачиваний: 1504) прошивки,исходники, схемы для PIC16F628 / 84 от agette 

Скачать [84,86 Kb] (cкачиваний: 1374) прошивку, доработанную, схемы для  PIC16F628 / 84   от agette 

Скачать [82,08 Kb] (cкачиваний: 1420) прошивку, доработанную, схемы для  PIC16F628 / 84 для ОК индикатора   от agette

Скачать [161,32 Kb] (cкачиваний: 1731)  прошивки для общего анода и катода обновленные на 01.02.2012 от agette
 

"Радио" №1 2006г.

Обсуждение на ФОРУМЕ



   
alexkrup # 31
 
 
Очень интересно. Странный у Вас алгоритм регулирования. Похоже на то, что Вы собираетесь с помощью этого термостата охлаждать, а в нагрузку ему включаете нагреватель. Таким образом он конечно не выключится.
Две штуки соблал. Работают замечательно. Сейчас им сотворяю нужные мне цепи дальнейшего управления.
Правда, у них разница показаний примерно 1.5 градуса. Пока не разбирался почему. Это буду проверять позднее.


   
an_muz # 32
 
 
Ладно, спасибо alexkrup.

Может есть у кого какие то соображения по изменению прошивки:
1. поддержание температуры по установленому значению. а не на два градуса выше.
2. как предлагает agette кнопка 3 (уменшение).


   
agette # 33
 
 
an_muz,
Для поддержания температуры по установленному значению необходимо чтобы гистерезис был равен нулю ничего сложного. По просьбе написал программу оперативного изменения значений гистерезиса добавлена кнопка позволяющая изменять данные.


   
Nick71 # 34
 
 
Собрал вариант на PIC16F628A (гистерезис). Все заработало сразу, спасибо agette за прошивку для индикатора с ОК.


   
ASUS # 35
 
 
не плохо бы еще в меню добавить выбор нагрев или охлаждение
--------------------
против лома нет приема, разве что законы ома, лом ужасен и велик, он хороший проводник)))


   
agette # 36
 
 
В принципе не сложно, только невижу смысла я мало знаю устройств где необходимо смена охалождения на нагрев в оперативном режиме, если нужен нагрев то охладитель уже не включают. При сборке устройства не сложно заменить КТ829А на КТ837А или КТ503 на КТ502 эмитеры соответственно меняем местами с коллекторами тоесть нагрев поменять на охалаждение.


   
ASUS # 37
 
 
та єто для универсальности устройства, или он в боллере будет стоять или как в меня в холодильнике!
--------------------
против лома нет приема, разве что законы ома, лом ужасен и велик, он хороший проводник)))


   
an_muz # 38
 
 
Согласен с agette. Изготавлеваетя и устанавливается в конкретном устройстве.
Проще иметь необходимые разводки плат.


   
lazar # 39
 
 
кто-нибудь обратил внимание на то, что в исходнике неверно составлены п/программы записи и чтения в EEPROM? Поэтому при выключении устройства теряется установка температуры и при включении имеем 0 град. Мне удалось устранить это и листание сделал от 125 через 0. В "протеусе" все работает!


   
agette # 40
 
 
Не хорошо лгать! Собрано 5 устройств всё работает нормально! Иногда теория от недомыслия подводит....


   
agette # 41
 
 
Потрудитесь собрать устройство а потом даватьзаключение!
Я давно не доверяю всяким тестирующим программам они часто расходятся с практикой…


   
lazar # 42
 
 
Прошу прощения, но на тот момент я не просматривал доработанные исходники, а в памяти остался факт неправильной записи-чтения EEPROM. С третьей кнопкой всё получилось за что благодарю.


   
agette # 43
 
 
И всётаки она вертиться!


   
SokolOFF # 44
 
 
А нельзя ли программно изменить состояние RA3, чтобы работало наооборот? Так чтобы при температуре, выше заданной на RA3 появлялась бы единица. Если так сделать можно - скажите где и что изменить, а то я в программировании - 0. Заранее благодарен!


   
SokolOFF # 45
 
 
Это устройство у меня используется как термореле, которое защищает от перегрева. В таком виде как есть, всегда сработано реле, а от этого сильно греется КРЕНка (за минуту). А устройство должно быть в дежурном режиме часами. Плату переделывать тоже не желательно, поэтому второй транзистор тоже не поставить, остаётся только програмное решение. Подскажите что нужно изменить в исходнике, чтобы инвертировать выход!!! Срочно надо!


   
agette # 46
 
 
Для инверсии второй транзистор не нужен, необходимо заменить КТ 829 на КТ 837 поменяв местами коллектор с эмитером база остаётся на месте придётся отформовать ножки транзистора то-есть подогнуть по месту и самое главное если прочитать внимательно статью Констаньтина Трищенко автора основной статьи, у него написана и выложена версия программы с инверсией RA3. Всего 3 версии таймер, нагрев и охалождения.


   
SokolOFF # 47
 
 
Я скачал всё, что было по этой теме на разных сайтах, заливал все прошивки в контроллер, но не одна не работает так, чтобы при измеренной температуре выше уставки на RA3 появлялась бы единица ! :( Буду пробовать вариант с транзистором.


   
SokolOFF # 48
 
 
Замена КТ829 на КТ837 не спасла. Светодиод загорается, а релюха не срабатывает (большая утечка в базу, соответственно нагрев транзистора). Переделал плату, поставив транзисторный ключ (КТ837) на запитку реле по плюсу. Эмиттер на +, коллектор на релюху, база там и осталась. Теперь работает так, как мне нужно.


   
agette # 49
 
 
Всё будет правильно работать при общем питании 5 вольт, при запитки реле по схеме как на этой страничке pic16f628 схема работать не будет.
Если есть необходимость в програмной инверсии RA3 присылайте Ваш рабочий исходник asm переработаю только в выходные.


   
ASUS # 50
 
 
Интересно бы было чтоб в меню это реализовать эту задержку, в плюсовую или в минусовую сторону с выбором диапазона))
--------------------
против лома нет приема, разве что законы ома, лом ужасен и велик, он хороший проводник)))


   
16f628 # 51
 
 
Собрал, работает. Но хотелось бы, чтоб гистерезис был как можно меньше. Я использую реле, которое позволяет коммутировать 4 нагрузки. Я цепляю две. И когда прибор находится на пороге срабатывания, то эти две нагрузки переключаются поочередно, пока температура не выйдет за пределы гистерезиса. Поправьте плз, кто может. Пусть гист. будет равен 0,1 С

Забыл сказать, что МК 16f628, а икдикатор ОК

Или как разумнее поступить? Гистерезис в принципе нужен, но как избежать бестолковаго переключения нагрузок?


   
Zozulataras # 52
 
 
Уважаемый Agette!!! На выходных сделал термостат на PIC16f84, индикатор ОА, все сразу заработало температуру измеряет, но обнаружился 1 БАГ… recourse При установке температуры стабилизации НИЖЕ нуля, при нажатии на кнопку Гистерезис - на индикаторе высвечивается отрицательная температура стабилизации, а не гистерезис… Т.е. выставленный ранее гистерезис нормально отрабатывается, но не высвечивается на индикаторе при выставленной ОТРИЦАТЕЛЬНОЙ температуре стабилизации…НЕ совсем удобно пользоваться, а хотелось бы иметь полностью функциональное устройство… Это можно как-то подправить в прошивке ? Может, кто-то, кто силен в программировании могут это сделать? С благодарностью и нетерпением жду коррекции прошивки....


   
agette # 53
 
 
Уважаемый Zozulataras!!! Не переживайте ошибку исправил в ближайшее время выложу.


   
16f628 # 54
 
 
agette, а как насчет моей проблемы? :) Выставляю температуру 25, и при достижении 24 градусов реле начинает щелкать постоянно


   
agette # 55
 
 
Ошибку исправил теперь есть возможность просмотра установок гитерезиса при стабилизации отрицательных температур.

16f628, мне не очень понятно, какую схему Вы собрали? Математика программы сравнения температур не менялась, работает корректно у меня работают две схемы 84 и 628 обе поддерживают +3. Если Вы поддерживаете температуру +25 то при падении температуры до +25 реле должно влючиться и отключиться при дотижении +27 это при гистерезисе 2 градуса. Гистерезис моно установить 0 тогда наверное реле будет щелкать хотя нет есть инерционность мгновенно неможет остыть или нагрется…


   
Zozulataras # 56
 
 
Уважаемый AGETTE! Мое почтение Вам, респект и уважуха! winked Если гистерезис исправили - то это просто отличная работа!!! Ждем релиза на тесты!!! Это , пожалуй, самая доступная конструкция термостата на недифицитных компонентах из всего, что я искал, а нашел только здесь, на Вашем сайте!!! Так мало того, она еще и сильно доработана и технически поддерживается автором, по сравнению с оригиналом, что не везде есть… Да еще и так оперативно! Нет слов, просто РЕСПЕКТ и УВАЖУХА!!! winked


   
Zozulataras # 57
 
 
УУУУххххххх!!! Класссс!!! Респект автору!! Все работает как надо! wink


   
16f628 # 58
 
 
agette, собрал ту схему, которая в самом низу статьи
https://bezkz.su/_pu/3/s59526500.jpg
У меня реле переключается, начиная с 24 гр, пока не нагреется до 25,1 гр. Если подьем температуры медленный, то щелкает до зубовного скрежета :) Сегодня днем видео работы выложу


   
ASUS # 59
 
 
может в тебя питание не вытягивает релле и оно не дотягивается
--------------------
против лома нет приема, разве что законы ома, лом ужасен и велик, он хороший проводник)))


   
16f628 # 60
 
 
Сделал видео, немного с опозданием :) На сайт его залить не смог. Прямая ссылка http://waper.ru/file/1795383/download/f1d734c30004f2b3fe2/Izobrazhenie_012.3gp

ASUS, у меня подключен аккумулятор от мото 12и :) На ролике температура установлена 22 гр. Реле начинает щелкать, начиная с 21 гр. и заканчивает на 22 гр. Где копать?


Обновления

Сообщения ФорумаОтветов
3D Модели для Авто0
Бакометр 2335
Touch Start-Stop Engine.587
Кодграберр17
Исправляем AVR фьюзы при помощ …109
Бакометр - измеритель остатка…4
IR конструктор на PIC12F62977
Универсальное зарядное устройство103
бaкoмeтр1974
Двунаправленный автомобильный…2
Программатор GENIUS G8401
Светодиодный тахометр34
Индикаторы ГРИ ИН1 - ИН141
Multiprog1
Управляющая программа LED CUB959
Универсальное зарядное устройство9
Изготовлю печатные платы29
Простой автоматический выключа…25