Термометр на ATmega8 и датчике DS18B20

Термометр на ATmega8 и датчике температуры DS18B20

Схема термометра на ATmega8 и DS18B20
Микроконтроллер ATmega8
Цифровой термометр DS18B20
Семисегментный светодиодный индикатор
Алгоритм программы термометра
Программа цифрового термометра на DS18B20

Схема и программа очень простого цифрового термометра с использованием микроконтроллера ATmega8 и датчика температуры DS18B20. Термометр позволяет измерять температуру от 0 до 99 градусов с точностью до 0,5 градусов с разрешением 0,1 градуса

Термометр на ATmega8 и датчике DS18B20

Термометр по своим характеристикам очень прост, и его можно использовать только как термометр для измерения «комнатной» температуры. Использовать в этой конструкции микроконтроллер с памятью 8 килобайт конечно расточительно, можно применить микроконтроллер и попроще. Но дело в том, что эта конструкция — основа для дальнейшего развития проекта с использованием цифрового датчика температуры DS18B20. В следующей статье будет опубликована конструкция другого термометра — на двух датчиках DS18B20, что позволит измерять температуру не только в комнате, но и «за бортом». Естественно, будет добавлена возможность измерять и отрицательные температуру. В дальнейшем в конструкцию будет добавлена функция термостата, часы, возможность работы с различными нагрузками, что позволит уже собрать несложную конструкцию — основу «умного дома». Ну а сегодня первая статья из этой серии.


Схема термометра на ATmega8 и датчике температуры DS18B20

Давайте посмотрим на схему термометра:

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

Напряжение питания конструкции — 5 вольт. Если вы примените микроконтроллер с низковольтным питанием (линейка микроконтроллеров ATmega), то можно и понизить питающее напряжение конструкции, но в этом случае, возможно придется уменьшить номинал гасящих сопротивлений в сегментах индикатора. Приблизительно номиналы сопротивлений можно брать:
— при питании 5 вольт — 200-300 Ом
— при питании 2,7 — 3 вольта — 100-150 Ом
(здесь вы можете ознакомиться с расчетом гасящих сопротивлений для семисегментных индикаторов)
(здесь вы можете ознакомиться с маркировкой микроконтроллеров)
Транзисторы — любые, маломощные, структуры NPN.
Датчик температуры — DS18B20 (ознакомиться с датчиком температуры DS18B20)
Семисегментный индикатор — любой трехразрядный с общим катодом. Если вы захотите применить другие, с общим анодом, тогда придется заменить транзисторы на PNP и внести изменения в программу (заменить массив двоичных кодов для вывода цифр на индикатор). Я применил индикатор красного цвета свечения, и заодно, для следующей схемы, приготовил такой-же, но голубого цвета свечения.


Детали термометра на микроконтроллере ATmega и DS18B20

Микроконтроллер ATmega8:

Распиновка микроконтроллера ATmega8:


Трехразрядный семисегментный индикатор FYT-5631AUR-21:
Распиновка семисегментного индикатора:


Датчик температуры DS18B20:


Транзисторы BC547C:


Алгоритм работы программы термометра на ATmega и DS18B20

Все установки микроконтроллера заводские, FUSE-биты трогать не надо.

Для работы программы задействовано два таймера/счетчика микроконтроллера:
восьмиразрядный Т0
шестнадцатиразрядный Т1
С помощью восьмиразрядного таймера Т0 настроенного на вызов прерывания по переполнению, с внутренней частотой СК/8 (период 2 миллисекунды) организован:
— расчет текущей температуры
— динамический вывод результатов измерения температуры датчиком DS18B20
С помощью шестнадцатиразрядного таймера Т1 настроенного на вызов прерывания по переполнению, с внутренней частотой СК/64 (период 4 секунды) организованно:
— подача команды датчику DS18B20 на измерение температуры
— считывание измеренной температуры с датчика
В принципе, можно задействовать и один восьмиразрядный таймер/счетчик, также настроенный на вызов прерывания по переполнению, с внутренней частотой СК/8, и всю работу схемы организовать в процессе обработки прерывания. Но дело в том, что смысла в этом нет — датчику DS18B20 необходимо чуть меньше 1 секунды (при 12-ти битном разрешении) для конвертирования (определения) температуры, т.е., чаще чем 1 раз в секунду мы не сможем обновлять данные температуры. Кроме того, столь частое обновление температуры приведет к нагреву датчика и, соответственно, к искажению реальных данных. Использование второго счетчика позволяет отдельно задавать промежутки времени измерения температуры.

Вот так выглядит основная часть программы в Algorithm Builder:

Где:

SP — настройка начального адреса стека 

Timer 0 — настройка таймера T0:

Timer 1 — настройка таймера Т1:

TIMSK — настройка прерываний от таймеров:

Init_Display — подпрограмма настройки разрядов портов, участвующих в динамической индикации вывода данных на трехразрядный семисегментный индикатор

1 —> I  —  глобальное разрешение прерываний

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

Если возникнут вопросы, если что-то изложено не понятно или есть вопросы по программе, пишите — отвечу.


  Программа термометра в HEX файле (2,4 КиБ, 8 410 hits)

  Программа термометра в Algorithm Builder (7,1 КиБ, 5 999 hits)


Второй вариант программы, без 4-х секундной задержки измерения температуры. Температура измеряется непрерывно (интервал менее 1 секунды)

  Термометр 2 - HEX файл (2,4 КиБ, 5 008 hits)

  Термометр 2 в AlgorithmBuilder (11,1 КиБ, 4 934 hits)


Скачать варианты программы с ЯндексДиска


Другие конструкции на микроконтроллерах
1. Простые электронные часы на микроконтроллере ATyni26, с использование микросхемы часов реального времени DS1307
2. Двухканальный термометр на микроконтроллере ATmega8 и датчиках температуры DS18B20
3. Двухканальный термостат, терморегулятор на ATmega8 и датчиках DS18B20
4. Двухканальный термометр, термостат, терморегулятор с возможностью работы по времени, одноканальный таймер реального времени на ATmega8 и датчиках DS18B20
5. Двухканальный термометр, часы на ATmega8, датчиках температуры DS18B20, RTC DS1307, LCD 1602


Примечание: к этой записи прикреплена форма для оценки. Чтобы оценить её, зайдите на сайт.
Схема, программа очень простого термометра на микроконтроллере ATmega8 с использование датчика температуры DS18B20
Published by: Мир микроконтроллеров
Date Published: 05/07/2015

76 ответов к “Термометр на ATmega8 и датчике DS18B20”

Добрый вечер. По ссылкам внизу статьи можно скачать и Hex файл, и исходник

Здраствуйте. Собрал термометр, прошил ATmega8 , фьюзы по умолчанию. На индикаторах меняются символы очень быстро, ничего не понятно, отключаю датчике температуры DS18B20 светятся черточки на трех индикаторах. Прошивка первая из сайта. Помогите разобраться, где ошибка?

Сергей, рад бы помочь, но, к сожалению, не могу. Эти статьи написаны предыдущим админом данного сайта. Сначала он некоторое время отвечал на комментарии к своим статьям, а потом куда то пропал

Кстати, а вот меня всегда интересовал вопрос — почему именно этот датчик температуры DS18B20 вызывает такой интерес? Почему не датчики LM35 и DHT11, которые часто фигурируют в моих статьях про Arduino? Что в датчике DS18B20 такого особенного?

Да, к сожалению у нас на сайте нет статьи про подключение датчика DHT11 к микроконтроллерам AVR. Но вот статей про подключение данного датчика к плате Arduino у нас на сайте достаточно много. Может быть, если вы посмотрите код библиотеки Arduino, которая работает с датчиком DHT11, у вас после этого появятся идеи как его подключить к ATmega8?

Возможно. Но у Ардуино многое запрятано в готовые библиотеки, не думаю, что получится. Мне ещё интересно, почему во многих статьях про подключение одного датчика (в том смысле, что никаких других типов датчиков и устройств не подключается) речь идёт о прерываниях? Нельзя без прерываний подключить тот же DS18B20?

И ещё теоретический вопрос: я могу вместо функции, передающей байт датчику, написать «#define WRITE1 DDRC|=0xFF; PORTB=~(0xFF); _delay_(60); DDRC~(0xFF);»? Ну и для случая передачи «0» написать подобную ей и просто в строчку записать 8 таких дефайнов, типа: WRITE0; WRITE0; WRITE1; WRITE1; WRITE0; WRITE0; WRITE1; WRITE1; (число 0xCC наоборот, младшим битом вперёд). Получится передача числа по одному биту, как требуется для DS18B20. Такую же замену я бы хотел сделать и вместо функции чтения бита от датчика с учётом всех временных значений, конечно. Или такое здесь не проходит?

На этот ваш вопрос, к сожалению, не могу подсказать ничего конкретного

Так я вам и предлагаю посмотреть код самих этих библиотек. У них же открытый исходный код. Вот статья про подключение DS18B20 к Arduino на нашем сайте — как видите, в ней не используется никаких прерываний. Честно говоря, не видел примеров чтобы датчики температуры подключались с помощью прерываний. А вот датчики Холла и инфракрасные датчики (в тахометрах, к примеру) обычно подключаются как раз через прерывания.

Здравствуйте! Разобрался с DS18B20! Хотел как обычно сам освоить, и с помощью вашего сайта удалось-таки, правда, отрицательные температуры мне не нужны и их там нет))) Спасибо! Если кому-то нужно на СИ с комментариями, могу поделиться, только забыл, как вы предлагали выкладывать здесь такой материал?

Вспомнил, как добавить программу) Вот ссылка на Яндекс.Диск: https://disk.yandex.ru/d/wJC0DBvIzxy-3Q

От админа: спасибо, Влад, за ценный совет другим посетителям нашего сайта.

На Али их куча. От чипа до герметичного варианта с разной длиной провода.

здравствуйте. скажите в каких диапазонах измеряет данный термометр. спасибо

Уважаемый админ в статье есть неточности вы пишете » Все установки микроконтроллера заводские, FUSE-биты трогать не надо.» С такими установками термометр показывает одни нули я прошил такими
AVRDUDE -U lfuse:w:0xE2:m -U hfuse:w:0xD9:m и все заработало
За схему и идею спасибо.

Здравствуйте Админ! В этот термометр можно добавить функцию сигнализатора при достижении заданной температуры(по аналогии будильника в часах)?

Здравствуйте Андрей!
Добавить можно, только у меня нет на это времени.
С уважением, Admin.

Термометр показывает 00,0 . Микроконтроллер и датчик температуры менял, схему перепроверил.

У меня тоже всё по нулям. в схеме ошибок нет и датчик тот. в чём ещё подвох???

Здравствуйте Василий!
Была раньше проблема в схеме — неправильно подсоединены транзисторные ключи, сейчас схема правильная. Почему у Вас показывает нули, возможно есть одна причина.
Высылаю Вам на почтовый ящик измененный НЕХ файл, отпишитесь пожалуйста о результатах.

С уважением, Admin.

получил. спасибо. показывает первую секунду, а потом опять нули

Здравствуйте Хасан!
1. Проблема в датчиках
2. Проблема дисплеи
3. Проблемы в МК
С уважением, Admin.

Здравствуйте Админ!Хочу собрать вашу схему, но так как имеется некое количество ATMega48 20AU нужна прошивка под этот МК,если конечно у вас найдётся свободное время.Заранее спасибо.

Здравствуйте, все собрал, залил прошивку, но при включении появляются нули и все, не подскажете
что делать?

Здравствуйте Антон!
Попробуйте промоделировать на схеме без ключевых транзисторов.
С уважением, Admin.

здравствуйте. в данной версии прошивки не подойдет датчик DS1820, DS18S20. после сборки показывает температуру по нулям.

Здравствуйте Антон!
Вы правы, эти датчики не подойдут.
DS1820 — 9 разрядный датчик, уже не выпускается.
DS18S20 — 9 разрядный, пришел на замену DS1820.
Заменить ими DS18B20, без изменения программного кода не получится.
С уважением, Admin.

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

К сожалению, у меня нет возможности переделать программу под DS18S20.
С уважением, Admin.

Здравствуйте Админ! Повторил Вашу схему, залил Ваши прошивки. Схема работает, но почему-то..:
1. Температура выдается несколько большая (подозрение есть на датчик конечно, но все же..) чем в реальности(например, в комнате 23 грд цельс, а на индикаторе 33-34 грд)?
2. Не загораются некоторые сегменты (индикатор проверил, он исправен. Тип Е30361-l китайский).Все подключения по схеме между МК и индикаторов проверил. Ок! ?
Ответьте пож-ста. С уважением Роман
P.S. ..Да, еще желательно исходники посмотреть на С. Такое возможно?

Здравствуйте Роман!
Программа скачана более двух тысяч раз, проблем не было.
Возможна причина в микроконтроллере.
На С программы нет, пишу в Algorithm Builder
С уважением, Admin.

здравствуйте .хочу задать вопрос некоторым образом связанный с вашими часами ,но мне нужно немного изменить конструкцию ваших часом для применения ее в дальнейших самоделках ,а как это сделать я не знаю .и так начну рассказ ,мне нужно чтобы был некий термометр бытового измерения температуры .представим его работу по необычному принципу вывода информации измерений ,когда температура от 0-16градусов цельсия на выводах контроллера atmega появляется логический код на трех шинах 000,от16-25 градусов 100,ну и выше от25-… появляется код 010,а когда температура уменьшается то процесс происходит в обратном порядке.вот как можно собрать измеритель температуры как у вас на схеме но , информация о температуре преобразовывалась вот втакой код как я написала выше.мне очень надо такую схему сделать иначе я себе всю голову сломала ее придумывая и так пока ничего не придумала кроме как на atmege схему собрать

Здравствуйте Инна!
Постараюсь Вам помочь.
Несколько вопросов:
1. На индикатор будет выводится температура в нормальном виде или указанные коды?
2. Если на индикатор выводится температура в нормальном виде, то на какой порт и на какие его выводы должен выводиться трехзначный код?
С уважением, Admin.

Скажите а как будет выглядеть программа на С. Я например не знаю как читать данные с датчика и потом выводить их на индикатор. Часть программы для индикатора у меня есть.

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

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

Здравствуйте Dmitriy!
Выложил оба варианта программы на ЯндексДиске.
Ссылка в конце статьи.
С уважением, Admin.

Что-то Админ совсем забросил эту тему. Я прошу дать вариант программы со сменой значений на дисплее 1 сек. Меня устроят те продостережения что даны в описании.

Здравствуйте Владислав!
Хорошо, сделаю для Вас вариант с секундной задержкой, скоро выложу.
С уважением, Admin.

Доброго дня Владислав!
Для Вас выложен второй вариант программы с непрерывным измерением температуры (интервал менее 1 секунды)
С уважением, Admin.

Я не увидел никакой разницы ни в работе, ни в НЕХ файлах — делал Compare, правда визуально.

Владислав!
Я скачал файл, выложенный здесь, собрал схему, запрограммировал.
Результат: конструкция работает и измеряет температура с интервалом менее 1 секунда.
С уважением, Admin.

Вадим, чудес не бывает. Если оба НЕХ-файла абсолютно одинаковы бит в бит, то и работают одинаково — 4 сек обмен. Укажите плз в каких адресах есть отличие между 4сек и 1сек?

Здравствуйте Владислав!
Заменил HEX-файл
Скорее всего были происки «врагов»:)
Спасибо за замеченную ошибку.
С уважением, Admin.

Есть ошибки в схеме. Перепутаны выводы от МК к транзистору индикатора. Первая прошивка работает, вторая молчит.

Здравствуйте Юрий!
Ошибки в схеме нет, просто второй вариант программы — программа для двух датчиков.
Разберусь конкретно, перезалью программы.
Спасибо.
С уважением, Admin

Еще раз здравствуйте Юрий!
Разобрался — не тот номер присвоил файлу на сервере для загрузки,
поэтому загружалась программа для двухканального термометра.
Ошибка исправлена.
Еще раз спасибо.
С уважением, Admin.

Работает нормально, но обновление надо сделать чаще, а то слишком большая задержка. Быстрое изменение температуры очень неудобно наблюдать.

Здравствуйте Сергей!
В течении 2-3 дней соберу и проверю работу конструкции, после этого отпишусь.
С уважением, Admin.

Здравствуйте Сергей!
Примите мои извинения за долгое ожидание.
К сожалению до 15 октября у меня не будет возможности проверить работу программы.
Перед выкладкой этой статьи на сайт, конструкция была собрана на макетной плате и работала без замечаний.
С уважением, Admin.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *