Цифровой термометр на контроллере своими руками. Электронный термометр с выносным датчиком DS18B20 на микроконтроллере Attiny2313. Двухканальный термометр на микроконтроллере ATmega8 и датчиках DS18B20

Двухканальный термометр на микроконтроллере ATmega8 и датчиках DS18B20

Характеристики термометра:
— 2 канала измерения текущей температуры, датчики подключены к разным разрядам порта микроконтроллера
— каждый канал позволяет измерять текущую температуру в интервале от +125 ºС до -55 ºС с разрешением до 0,1 ºС
— погрешность измерения температуры ±0,5 ºС
— обнаружение и индикация возможных ошибок в работе с датчиками температуры
— интервал измерения текущей температуры — 2 сек

Уважаемые читатели сайта!
Если вас интересует именно конструкция двухканального термометра, то могу посоветовать для прошивки микроконтроллера использовать прошивку для конструкции (здесь более оптимизированный и «причесанный» код)

Сегодня, в продолжении развития проекта на ATmega8 , мы рассмотрим конструкцию «Двухканальный термометр с датчиками температуры DS18B20 «.
Предложенная Вашему вниманию конструкция проста, содержит минимум деталей, не требует настройки.

(Хочу сразу предупредить, что время не стоит на месте и после публикации статьи программа термометров была доработана — в нее внесены три изменения: в работе задействован только один таймер Т0, повышена внутренняя тактовая частота микроконтроллера до 8 МГц, изменен алгоритм определения десятых температуры (теперь десятые не рассчитывается а принимают значение в зависимости от числа записанного в младший полубайт регистра LS-bite. Новая программа выложена ниже описанной в этой статье))

Индикация текущей температуры осуществляется на два трехразрядных семисегментных светодиодных индикатора, при этом:
— температура ниже +100 ºС — индикация осуществляется на трех разрядах с точностью до десятых
— температура выше +99,9 ºС — индикация осуществляется на трех разрядах с точностью до градуса
— температура выше -10 ºС — индикация осуществляется: первый разряд знак «-«, второй и третий разряд — единицы и десятки градусов
— температура ниже -9,9 ºС — индикация осуществляется: первый разряд знак «-«, второй и третий разряды — десятки и единицы градусов
— незначащие нули не выводятся
При возникновении возможных ошибок в работе с датчиками температуры на индикаторы выводится:
— нет высокого уровня на линии DQ датчика — «Er1»
— нет импульса присутствия от датчика — «Er2»
— после импульса присутствия линия DQ не вернулась в состоянии логической «1» — «Er3»
Индикация ошибок позволяет своевременно выявить и устранить неисправность.

Схема двухканального термометра на ATmega8 и датчиках DS18B20:


Детали, примененные в конструкции термометра

Микроконтроллер ATmega8-16PU с внутренней тактовой частотой — 4 мГц.
Индикаторы — трехразрядные семисегментные светодиодные индикаторы со схемой включения — «общий катод».
Транзисторы — «NPN»-структуры BC547 (транзисторы можно заменить на любые другие маломощные структуры NPN).
Постоянные сопротивления — любого типа, мощностью 0,25 Вт, близкие к номиналам указанным в схеме.
Датчики — датчики температуры DS18B20. Разрешающая способность установлена «по умолчанию» — 12 bit, что соответствует дискретности измерения температуры 0,0625 ºС.

Общение датчиков с микроконтроллером происходит по 1-Wire шине , что позволяет, в принципе, «посадить» датчики на одну линию. В представленной конструкции датчики подсоединены к разным разрядам порта «PB» (6 и 7 — соответственно) из трех соображений:
— при необходимости разноса датчиков в разных направлениях упрощается прокладка соединительных линий
— упрощается программа — не надо определять 64-битные коды датчиков, соответственно уменьшается время затрачиваемое на общение с датчиками (что немаловажно в данной конструкции при динамической индикации 6 разрядов индикаторов)
— и так остается незадействованным целый порт
Циклический контроль избыточности (CRC) не определяется — в данной конструкции проверять правильность передачи результатов конвертирования температуры датчиками я не вижу смысла.
При больших расстояниях между датчиками и основным блоком возможно потребуется подобрать подтягивающие сопротивления (от 1 до 5 кОм). Возможно лучше будет подсоединять эти сопротивления непосредственно к датчикам .

Питание конструкции осуществляется от стабилизированного источника напряжением 5 вольт. В качестве источника питания можно применить ненужное зарядное устройство от сотового телефона с выходным напряжением 5 вольт

Работа термометра

Программа двухканального термометра написана в среде «Algorithm Builder»


В программе задействовано два таймера микроконтроллера ATmega8 — Т0 и Т1 , которые настроены на вызов прерываний по переполнению счетчиков.
При включении устройства осуществляются предварительные настройки задействованных в работе портов микроконтроллера, занесение необходимых данных в переменные и разрешение прерываний, затем программа переходит в бесконечный цикл. В дальнейшем вся работа устройства осуществляется по перываниям от таймеров Т0 и Т1.
При этом:
При обработке прерывания от таймера Т0 осуществляется:
— динамическая индикация текущих значений температуры на светодиодных индикаторах
— поочередное считывание данных с датчиков температуры
— расчет и преобразование температуры для вывода на индикаторы
При обработке прерывания от таймера Т1 осуществляется
— поочередная подача команды на конвертирование температуры датчиками (с периодичностью — 1 сек)
Делители частоты таймеров при внутренней частоте микроконтроллера 4 мГц настроены:
— Т1 — СК/64 — вызов прерывания происходит почти через 1 секунду
— Т0 — настройка частоты делителя для таймера должна быть СК или СК/8 — 512mcs или 64mcs — не критично (но не менее 2ms). Это обусловлено тем, что время обработки прерывания от таймера Т1 равно времени которое затрачивает датчик на конвертирование температуры (по даташиту, при разрешающей способности 12bit, максимальное время конвертирования — 750ms, реально — намного быстрее)

Для более частого обновления текущей температуры можно настроить внутренний генератор микроконтроллера на частоту 8 мГц а делители частоты таймеров установить:
— T0 — СК/64 (периодичность вызова прерывания около 2ms)
— Т1 — СК/64 (периодичность вызова прерывания около 0,5sec)
что позволит обновлять текущую температуру с датчиков каждую секунду. Более частая подача команды на конвертирование температуры датчикам может привести к их нагреву, и, соответственно, к увеличению погрешности измерений.

Если вы «дружите» с программой «Algorithm Builder» то ее можно настроить для обновления текущей температуры непрерывно, сразу после конвертирования температуры датчиком. Для этого необходимо выполнить следующиу действия:
1. Отключить таймер Т1
2. Отключить подпрограмму обработки прерывания от таймера Т1 (можно и не отключать)
3. Включить кусок «серого кода» в «бесконечном цикле»
Возможно для предотвращения мерцания индикаторов тактовую частоту микроконтроллера придется увеличить до 8 мГц
4. Настроить делитель частоты таймера Т0 на периодичность прерывания не менее 2ms

Если индикаторы все же будут мерцать, попробуйте «поиграть» командами NOP в начале и в конце бесконечного цикла — добавьте или уберите. К примеру:


Часть кода программы отключена, она предназначена для уменьшения разрешающей способности датчиков. Для изменения разрешающей способности температурного преобразователя необходимо:
1. Включить часть кода на главной странице и подпрограмму изменения разрешающей способности на вкладке «DS18B20»:

2. Включить во вкладке «DS18B20» константы выделенные красным цветом:

Назначение констант:
— Read_Scratchpad — функциональная команда DS18B20 ($4E). Эта команда позволяет устройству управления записывать 3 байта данных в память DS18B20. Первый байт данных записывается в регистр (TH), второй байт записывается в регистр (TL), третий байт записывается в регистр конфигурации
— TH и TL — регистры Аварии верхнего и нижнего предела, константа b#01010101 — соответствует 85 ºС (как и установлено в датчиках по умолчанию)
bit11 — регистр конфигурации, запись константы b#01011111 изменит разрешение с 12 до 11 bit, что вдвое уменьшит время конвертирования температуры датчиками. Для 10-битного разрешения — b#00111111, для 9-битного разрешения — b#00011111
3. Изменить в подпрограмме расчета температуры на вкладке «DS18B20» число 625 на число дискретности измерения температуры для соответствующего разрешения (125, 25, 5) и числа 1000 и 999 соответственно (для 125 — 1000 и 999, для 25 — 100 и 99, для 5 — 10 и 9)

Если возникли вопросы, пишите, отвечу.

Приложения к статье:

(50,6 KiB, 26 984 hits)

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

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

Ниже представлена схема беспроводного датчика на микроконтроллере PIC12F675.

После подачи питания микроконтроллер считывает значение температуры с датчика BK1 и отправляет эти данные на радиопередатчик A1, после чего происходит переход в спящий режим. Пробуждение микроконтроллера происходит по прерыванию, которое генерируется изменением уровня на линии GP0. К этой линии подключена RC цепочка на элементах R2 и C4, которая выполняют функцию таймера. При выходе из спящего режима на линии GP0 устанавливается низкий логический уровень, тем самым конденсатор C4 разряжается. Перед уходом в “сон” линия настраивается на вход, конденсатор начинает заряжаться через резистор R4, при достижении порогового напряжения (около 1,2В) происходит прерывание и пробуждение микроконтроллера. При указанных на схеме номиналах R2, C4 период пробуждения составляет примерно 5 минут. Установив перемычку JP1, можно сократить период до 5,5 секунд. Путем подбора конденсатора и резистора можно настраивать желаемое время периода, но при этом надо учитывать ток заряда конденсатора, в плане энергопотребления.

Значение температуры по радиоканалу передается в виде пакета из 3-х байт, последний байт представляет собой контрольную сумму первых 2-х байт. Алгоритм передачи данных, который я использую, в принципе позволяет обходиться без контрольной суммы, вероятность приема неправильных данных низкая. Скорость передачи составляет 3,3 Кбит/сек. Каждый раз после измерения температуры отсылается 3 пакета байтов, пауза между пакетами составляет 10 мс, такой вариант передачи я применил для увеличения надежности получения данных приемником. Это связано с тем, что приемная сторона прерывает прием сигнала на 4-5 мс, во время измерения температуры с внутреннего (домашнего) датчика.

В качестве питания используется батарея 6F22 на 9В (“Крона”), модуль радиопередатчика A1 питается напрямую от батареи. Для питания микроконтроллера используется микромощный стабилизатор напряжения DA1 (MCP1702) на 5В, собственный ток потребления стабилизатора составляет всего 1-2 мкА, максимальный ток нагрузки до 250 мА. Стабилизатор MCP1702 можно заменить на LP2950, ток потребления которого выше и составляет 75 мкА. Обычные стабилизаторы напряжения типа L78хх имеют большой ток потребления в несколько миллиампер, поэтому не годятся для аппаратуры с батарейным питанием. Ток потребления устройства в спящем режиме меняется с течением времени по мере заряда конденсатора С4, первые 2,5 минуты потребление составляет 10 мкА, последующие 2,5 минуты ток плавно увеличивается, до момента выхода из спящего режима. Данное явление возникает из-за наличия токов переключения входного буфера микроконтроллера.

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

Ниже представлена схема термометра на микроконтроллере PIC16F628A.


Дисплей HG1, датчик BK1 и микроконтроллер питаются напряжением 3,3В от стабилизатора DA2. Такое значение было выбрано в связи с характеристиками дисплея, максимальное напряжение питания которого составляет 3,3В, кроме этого отпадает необходимость в согласовании уровней напряжения между линиями ввода/вывода дисплея и микроконтроллера. Модуль приемника A1 питается от стабилизатора DA1, с выходным напряжением 5В. Резисторы R6, R7 установлены для согласования уровней напряжения.

Микроконтроллер DD1 считывает значение температуры с датчика BK1 каждые 2 секунды, параллельно принимает сигнал с приемника, при получении пакета байтов от передатчика вспыхивает светодиод HL1. В верхней части дисплея отображается надпись “Дом”, под которой выводится значение температуры с внутреннего (домашнего) датчика, ниже отображается надпись “Улица” и температура, полученная от беспроводного датчика. После приема данных по радиоканалу, микроконтроллер запускает таймер, который ведет отсчет времени для контроля получения данных. Если данные не были получены за период отсчета таймера, вместо показаний температуры, на дисплее высвечивается символы тире “- – – – -”. Время отсчета можно задать в пределах 1-15 минут с шагом в одну минуту. Для этого, перед программированием микроконтроллера, необходимо записать число от 1 до 15 в ячейку EEPROM с адресом 0x00. По умолчанию устанавливается период в 7 минут. При неисправности датчиков BK1, для обоих устройств, вместо значения соответствующей температуры, выводится надпись “ERROR”. Кнопка SB1 управляет подсветкой дисплея, по умолчанию подсветка включена. Кнопка SB2 предназначена для регулировки контрастности дисплея, так как у разных экземпляров она может отличаться.

Для питания устройства подойдет нестабилизированный источник питания с выходным напряжением 8-12В. Оба устройства размещены в пластиковых корпусах. Антенна для радиомодулей выполнена в виде отрезка одножильного провода длиной 17 см (четверть длины волны несущей частоты).





Сразу хочется отметить, что печатная плата и конструкция были разработаны с расчетом на то, чтобы сделать компактное устройство, крепящееся на стене.

Управление устройством осуществляется с помощью одной кнопки. Программа для микроконтроллера написана на Си, снабжена комментариями, и пользователи могут модифицировать ее под свои конкретные задачи, или же расширить функционал. Для управления ЖК индикатором используется готовая библиотека Peter Fleury (архив для скачивания доступен в разделе загрузок). Дополнительно, данные могут отображаться в градусах Цельсия или Фаренгейта. Имеется несколько режимов управления подсветкой индикатора.

Также стоит отметить еще один важный момент: устройство может осуществлять беспроводную передачу данных по протоколу Bluetooth посредством специального модуля (опционально).

Принципиальная схема

С точки зрения схемотехники устройство несложное, и мы рассмотрим отдельно составляющие элементы.

Источник питания термометра выполнен на базе интегрального регулятора напряжения в стандартном включении (с соответствующими фильтрующими конденсаторами). Регулятор напряжения 3.3 В AMS1117 включен в состав схемы, но применяться может в случае использования Bluetooth модуля, т.к. зачастую питание таких модулей 3.3 В.

Индикатор используемый в устройстве - это стандартный двухстрочный индикатор на контроллере HD44780 . Транзистор предназначен для управления подсветкой индикатора логическими сигналами с микроконтроллера или же ШИМ сигналом с микроконтоллера. Резистор R3 ограничивает ток через базу транзистора, резистор R1 подтягивает базу к нулевому потенциалу.

Основа термометра - микроконтроллер , работающий на частоте 8 МГц и управляющий все окружающей периферией.

Датчик DHT-11 - это недорогой датчик температуры и относительной влажности, используемый в проекте в качестве уличного датчика. Он не отличается высоким быстродействием и точностью, однако находит свое применение в радиолюбительских проектах из-за своей невысокой стоимости. DHT-11 состоит из емкостного датчика влажности и термистора. Также, датчик содержит в себе простой АЦП для преобразования аналоговых значений влажности и температуры.

Основные характеристики:

  • низкая стоимость;
  • напряжение питания 3 В - 5 В;
  • предача данных по 1-Wire шине на расстояния до 20 м;
  • определение влажности 20-80% с 5% точностью;
  • максимальный потребляемый ток 2.5 мА;
  • определение температуры 0…50° с точностью 2%;
  • частота опроса не более 1 Гц (не более раза в 1 с);
  • размеры 15.5 × 12 × 5.5 мм;

Следует отметить, что в продаже можно найти датчик DHT-22, который имеет тот же интерфейс, но лучшие характеристики.

Датчик подключается к микроконтроллеру по шине 1-Wire (на схеме кннектор JP3) с использованием подтягивающего резистора по линии данных и блокирующего конденсатора по питанию.

В качестве внутреннего датчика используется широко распространенный аналоговый датчик температуры LM35 IC5, который подключается к каналу 1 АЦП микроконтроллера.

Коннектор J1 интерфейса внутрисхемного программирования микроконтроллера позволяет быстро сменить программный код или обновить ПО. Для подключения термометра по интерфейсу UART используется коннектор JP1. Кнопка управления SW1 подключена ко входу внешнего прерывания микроконтроллера, данный вход подтянут к питанию внутренним резистором порта.

Bluetooth модуль для беспроводной передачи данных, на схеме обозначен как IC3, GP-GC021 также подключается к интерфейсу UART микроконтроллера и позволяет передавать данные на ПК, мобильный телефон или web-сервер. На печатной плате предусмотрено место для установки модуля. В разделе загрузок имеется описание модуля, процесс взаимодействия и команды.

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

Внешний вид готовой печатной платы для термометра


Рисунок печатной платы в САПР Eagle

Плата с установленным Bluetooth модулем

Загрузки

Принципиальная схема и печатная плата (Eagle), ПО (исходный код, прошивка) -
Библиотека для работы с ЖК индикатором на контроллере HD44780 -
Техническое описание на Bluetooth модуль GP-GC021 -

Как то попался мне на глаза телефон Nokia 3310 - внук бегал с ним игрался, естественно давно не рабочий. И тут вспомнил, что где-то видел схемы на дисплей от него. Погуглил, выдало несколько ссылочек, на устройства, мне понравился градусник, порывшись в коробочках нашел нашел термодатчик DS18B20, ну и решил собрать по этой схеме, тем более деталей в ней минимум. ЖК дисплей поддерживает два варианта работы: нормальный (на светлом фоне) и противоположный (на темном фоне). Менять режимы можно перемычкой JP1. Ниже смотрим саму схему термометра на микроконтроллере PIC12F629:

Технические параметры устройства:

* Voltage ....................... 3 - 3.3 В
* Мин. шаг темп............. 0,1 " C
* Погрешность................... +/- 0,5 " C Темп.
* Обновляется каждые.... 1,2 sec.
* Amperage ................. 0,2 mA - 0,8 mA
* Диапазон измеряемых температур … от -55 до 125°C

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


Протравил плату, в архиве есть рисунок для технологии ЛУТ. Прошил и просто спаял. можно скачать тут. Сначала датчик подключил через разъем, но он иногда отключался, поэтому его просто припаял.


Самое трудное было припаять проводки к дисплею, на это ушло часа 2 сначала использовал компьютерный шлейф 40 пиновый - очень тяжело и не удобно, так что отказался от него и взял 80 пиновый шлейф, распустил, и все удачно получилось за 5 минут. Подал питание и... термометр заработал.



После небольших манипуляций с дрелью и напильником получилось такое окошко.


Осталось закрепить там родное стекло, даже не стекло, а пластик, но со свойством увеличения. Далее силиконовым пистолетом делаем точечную сварку - тут главное не перегреть дисплей. Так как аккумулятора на 3.6 вольта не было, поставил пока три слабенькие батарейки, они тоже дают 3.3 вольта. Со временем поставлю аккумулятор.


А вот весь термометр на микроконтроллере в сборе:


Работает без глюков и меряет температуру с точностью, не хуже чем у промышленных аналогов. Поэтому данную схему можно смело рекомендовать для повторения. Автор статьи: Ear.

На рисунке показана схема термометра выполненного на основе микроконтроллера PIC16F628A, в качестве датчика используется цифровой датчик температуры DS18B20. Индикатор термометра состоит из 4-х разрадного семисегментного индикатора. Диапазон измеряемой температуры от -55 до + 125 градусов Цельсия. Температура считывается каждые 15 секунд, время считывания можно изменить в коде.

Напряжение питания термометра 5В, ток потребления 90 мА. В схеме используются транзисторы BC337 или аналогичные. Ток потребления каждого сегмента индикатора 15 мА (динамическая индикация), который ограничен резисторами 220 Ом (индикатор с общим катодом).

Файл прошивки —

DS18B20 цифровой термометр с программируемым разрешением, от 9 до 12–bit, которое может сохраняться в EEPROM памяти прибора. DS18B20 обменивается данными по 1-Wire шине и при этом может быть как единственным устройством на линии так и работать в группе. Все процессы на шине управляются центральным микропроцессором.

Диапазон измерений от –55°C до +125°C и точностью 0.5°C в диапазоне от –10°C до +85°C. В дополнение, DS18B20 может питаться напряжением линии данных (“parasite power”), при отсутствии внешнего источника напряжения.
Каждый DS18B20 имеет уникальный 64-битный последовательный код, который позволяет, общаться с множеством датчиков DS18B20 установленных на одной шине. Такой принцип позволяет использовать один микропроцессор, чтобы контролировать множество датчиков DS18B20, распределенных по большому участку. Приложения, которые могут извлечь выгоду из этой особенности, включают системы контроля температуры в зданиях, и оборудовании или машинах, а так же контроль и управление температурными процессами.

  • Похожие статьи

Войти с помощью:

Случайные статьи

  • 10.10.2014

    На рисунке показана схема предварительного усилителя с тембро-блоком, тембро-блок включен в цепь обратной связи предварительного усилителя. Напряжение питания уст-ва может варьироваться от 12 до 24В, потребляемый ток не более 10 мА. Входной сигнал поступает через разделительный конденсатор С1, резисторы R1 и R2 определяют напряжение смещения транзистора VT1, после предварительного усиления …