Двухканальный термометр на микроконтроллере 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 ºС.
Соединение датчиков с микроконтроллером осуществляется по трехпроводной линии - "GND, +5V, линия данных DQ", подключение по двухпроводной линии (паразитное питание) не предусмотрено по причинам:
- возможной ошибки при конвертирование температуры выше +100 ºС
- необходимости применения дополнительных MOSFET транзисторов
Общение датчиков с микроконтроллером происходит по 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)
Распиновку примененных деталей можно посмотреть здесь
Если возникли вопросы, пишите, отвечу.
Приложения к статье:
Схема двухканального термометра на ATmega8 и DS18B20 в формате SPL (50,6 КиБ, 28 057 hits) Программа двухканального термометра в формате HEX (4,8 КиБ, 28 204 hits) Программа двухканального термометра в Algorithm Builder (19,5 КиБ, 32 819 hits)
Вторая версия программы термометра в НЕХ-файле (5,0 КиБ, 2 936 hits) Вторая версия программы термометра в Algorithm Builder (20,1 КиБ, 27 081 hits)
Скачать программу с ЯндексДиска
Другие конструкции на микроконтроллерах
1. Простые электронные часы на микроконтроллере ATyni26, с использование микросхемы часов реального времени DS1307
2. Простой термометр на микроконтроллере ATmega8 и датчика температуры DS18B20
3. Двухканальный термостат, терморегулятор на ATmega8 и датчиках DS18B20
4. Двухканальный термометр, термостат, терморегулятор с возможностью работы по времени, одноканальный таймер реального времени на ATmega8 и датчиках DS18B20
5. Двухканальный термометр, часы на ATmega8, датчиках температуры DS18B20, RTC DS1307, LCD 1602
Добрый день, скажите пожалуйста в каких диапазонах измеряет данный терметр?
Добрый. Этот проект тоже от прежнего админа поэтому по нему, к сожалению, тоже ничем конкретным помочь не смогу. Могу помочь только по тем проектам, которые добавлены с моего аккаунта
Ответьте пожалуйста где админ этого сайта мне очень хочется с ним пообщаться может быть с ним можно общаться ещё как то?
Здравствуйте. Послал сообщение по рекомендованному вами Email. Походу адрес не рабочий. По крайней мере вышло сообщение, что письмо не передано. Я продублировал сообщение на ваш личный адрес.
Письмо получил, завтра отвечу
Здравствуйте. у меня есть вопросы касательно небольшой разработки-доработки двух-канального термометра. Захламлять тут сайт своей писаниной не хочу. Как с вами связаться в личку? По этому Email что с левой стороны страницы? И как к вам обращаться?
Если кому интересно, адаптировал схему под индикатор с общим анодом, но на один датчик/индикатор, схема + печатка https://easyeda.com/mdmby/termometr_on_atmega8. Прошивка вторая рабочая, фьюзы на 8 МГц.
Здравствуйте. Какой корпус лучше использовать для этого устройства?
Добрый день!
Помогите пожалуйста. Собрал девайс, но он не работает. Описываю признаки:
- при отсутствии DS18B20 оба индикаторы, как и написано выше показывают "Er1", при подключении датчиков температуры - на индикаторах "Er2". Сначала я подумал что приобретенные в интернет магазине датчики неисправны, поехал в радиомагазин купил два новые результат не изменился. Менял номиналы подтягивающих резисторов сот 1Ком до 5,1Ком ситуация не меняется. Пробовал обе прошивки из этой статьи и прошивку из статьи «Двухканальный термостат/терморегулятор», фюзы - 8Мгц, внутренняя генерация. При этом наблюдаестся следующая ситуация при прошивке 1 варианта нет мерцания сегментов индикаторов, при загрузке второй версии программы и программы со статьи «Двухканальный термостат/терморегулятор» происходит мерцание сегментов индикаторов. Критал Atmega8A-AU. Подскажите куда копать.
С уважением А.Тесенчук
Здравствуйте Анатолий!
1. В статье два вида прошивки:
- 1-я версия на тактовую частоту 1 МГц
- 2-я версия на частоту 8 МГц
Может не ту частоту устанавливаете?
2. Попробуйте очищать кристалл перед новой прошивкой
3. Правильно ли установлены датчики, обычно они выдерживают переполюсовку, но работать естественно не будут
4. Примените ATmega8 (бывает, что при замене 8 на 8А программы начинают глючить)
С уважением, Admin.
Выставьте фьюзы на 8 МГц
https://yadi.sk/d/6GUYKTbS3Lhmfc
попробуйте посмотреть здесь.
Кнопка себя оправдывает. Батарейку до сих пор ещё не менял, причём устройство получилось компактное и мобильное.Взял на алиекспресс водонпроницаемый датчик с длиной провода 1 метр за 70 руб, маленький оставил на плате. Теперь можно таскать с собой хоть в поход хоть на дачу.
Батарейки хватило на 2 года.
здравствуйте. Я собирался печаткой поделиться. Сначала никому ненадо было я и забыл об этом. А сейчас случайно залез и увидел что кому-то все-таки понадобилась. Предупреждаю сразу это первая разводка в моей жизни. Размеры скорей всего несовпадают. это просто схема разводки. Я глядя на нее рисовал на листочке в клеточку уже в размер потом сверлил отверстия в плате и рисовал на плате женским гель-лаком 9 который твердеет в УФ лучах )
осталось понять как ее выложить...
в чем отличия версий какая стабильнее
Здравствуйте Владимир!
Вторая версия более часто измеряет текущую температуру и выводит результаты на индикаторы.
Кроме того, я бы порекомендовал прошить программой от двухканального термостата (тактовая частота внутренняя - 8 МГц)
С уважением, Admin.
https://microkontroller.ru/wp-content/uploads/2016/03/Ustanovka-FUSE-bitov.jpg
скажите пожалуйста такие настройки подойдут?
это настройки 2х канального термостата терморегулятора
нескачивается ни один файл
не нашел где стоит резистор R17
R17 в схеме не ставится. Это если я правильно понял подтягивающее сопротивление, если очень длинная магистраль от блока до датчика.
Спасибо за схему и прошивку. С удовольствием занимался этим проектом. Т.к. мк только начинаю осваивать. Спасибо всем за комментарии. У меня сначала тоже все мерцало на второй прошивке, пока фьюзы не поставил на 8мгц.
Файл spl не смог открыть. И нигде не смог найти схему печатки. Пришлось осваивать sprint layout. На этом проекте первый раз в жизни сам развел печатную плату.Печатка оказалась вполне жизнеспособна. Если кому надо, пишите здесь, выложу.
Когда один датчик сжег(перепутал полярность), перестала видеть второй датчик. Поставил новый вместо горелого, все заработало.
Питание сделал от кроны, хватило ровно на одну ночь работы, поэтому в плюс питания добавил нормальноразомкнутую кнопку. Надо узнать температуру - нажал кнопку, подождал секунду,посмотрел. Экономия батарейки ОГО-ГО! Пользуюсь уже месяц полет нормальный. Еще раз спасибо автору и всем участникам этого замечательного проекта.
если можно печаткой поделитесь 🙂
Здравствуйте Roman!
Печатной платы нет.
С уважением, Admin.
да вот пост выше,человек предлагал...
Все равно спасибо. Хороший у Вас проект.
Здравствуйте Admin! А у Вас случайно нет прошивки для индикатора с общим анодом, или могли бы Вы переделать прошивку под данный индикатор?
Здравствуйте Руслан!
Прошивки для индикаторов с общим анодом нет.
Переделать прошивку пока возможности нет.
С уважением, Admin.
Христос воскрес.Чего-то вообще ничего невозможно скачать с данной страницы-пишет всё время загрузка прервана.А так хотелось бы повторить Вашу конструкцию.
Здравствуйте Александр!
Воистину воскрес!
Проверил, у меня все качается.
Отправляю файл в НЕХ-коде на Ваш почтовый ящик.
С уважением, Admin.
Спасибо большое
аналолгично не качается, хекс файл скачивается 99 процентов и останавливается,
Здравствуйте! подскажите, Atmega8 и Atmega8a в TQFP-корпусе в данной конструкции взаимозаменяемы? Установил Atmega8a, постоянно горит Er.2, на второй прошивке тоже самое но еще и сильно мерцает. датчики 100% рабочие.
Здравствуйте Виталий!
Микроконтроллеры взаимозаменяемы.
Программа проверена, работает без замечаний.
Ошибка Er.2 возникает в следующих случаях:
- отсутствие датчика
- обрыв линии DQ
- обрыв "-" питания датчика
Не забывайте установить Fuse-биты на тактовую частоту 8 МГц от внутреннего RC генератора.
Также попробуйте прошить МК программой двухканального термостата (схемы одинаковы).
С Уважением, Admin.
Извините, не подскажите какие именно фузы отвечают за 8 мгц на внутреннем генераторе?
прошивка от термостата распаковывается, но с сообщением "архив поврежден". то что распаковывается, прошиватся отказывается. программу использую avrdudeprog33.
Отвечу сам себе: в программировании я не спец, но какие фузы выставить для внутреннего генератора на 8 мгц, нашел в сети, выставил, все полетело! Автору огромное спасибо за конструкцию!!
Каждый канал показывает разную температуру. Разница 0,3 градуса. Но не понятно почему при смене местами датчиков , показания на дисплеях не меняется местами. Причина в программе???. Ответьте пожалуйста. Как исправить?
Здравствуйте Юрий!
В чем причина - сказать трудно, но не в программе. Оба канала работают по абсолютно одинаковым алгоритмам.
У меня, к примеру, был такой случай: два датчика стоят на макетной плате на расстоянии 1 см, разница в показаниях - 0,6 градуса. Меняю местами датчики - все по нулям (если менял местами только выводы DQ датчиков, то все равно разница в показаниях). Перепробовал 5 пар датчиков - такая же картина, только разница в показаниях немного разная. Попробуйте и Вы поменять местами датчики (именно датчики, а не выводы DQ).
С уважением, Admin.
Сменил 5 датчиков и пришел к выводу что среднее отклонение между датчиками около 0,3 градуса, что соответствует заявленной производителем норме. И меня такая погрешность вполне устраивает. Так что большое вам спасибо за схему и прошивку. Термометр работает нормально.
Доброго дня Юрий!
И Вам спасибо за "спасибо".
С уважением, Admin.