Термометр на ATmega8 и датчике температуры DS18B20
Схема термометра на ATmega8 и DS18B20
Микроконтроллер ATmega8
Цифровой термометр DS18B20
Семисегментный светодиодный индикатор
Алгоритм программы термометра
Программа цифрового термометра на DS18B20
Схема и программа очень простого цифрового термометра с использованием микроконтроллера ATmega8 и датчика температуры DS18B20. Термометр позволяет измерять температуру от 0 до 99 градусов с точностью до 0,5 градусов с разрешением 0,1 градуса
Термометр по своим характеристикам очень прост, и его можно использовать только как термометр для измерения "комнатной" температуры. Использовать в этой конструкции микроконтроллер с памятью 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:
Распиновка семисегментного индикатора:
Алгоритм работы программы термометра на 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 KiB, 7 567 hits)
Программа термометра в Algorithm Builder (7,1 KiB, 5 341 hits)
Второй вариант программы, без 4-х секундной задержки измерения температуры. Температура измеряется непрерывно (интервал менее 1 секунды)
Термометр 2 - HEX файл (2,4 KiB, 4 383 hits)
Термометр 2 в AlgorithmBuilder (11,1 KiB, 4 115 hits)
Скачать варианты программы с ЯндексДиска
Другие конструкции на микроконтроллерах
1. Простые электронные часы на микроконтроллере ATyni26, с использование микросхемы часов реального времени DS1307
2. Двухканальный термометр на микроконтроллере ATmega8 и датчиках температуры DS18B20
3. Двухканальный термостат, терморегулятор на ATmega8 и датчиках DS18B20
4. Двухканальный термометр, термостат, терморегулятор с возможностью работы по времени, одноканальный таймер реального времени на ATmega8 и датчиках DS18B20
5. Двухканальный термометр, часы на ATmega8, датчиках температуры DS18B20, RTC DS1307, LCD 1602
Кстати, а вот меня всегда интересовал вопрос - почему именно этот датчик температуры DS18B20 вызывает такой интерес? Почему не датчики LM35 и DHT11, которые часто фигурируют в моих статьях про Arduino? Что в датчике DS18B20 такого особенного?
здравствуйте. скажите в каких диапазонах измеряет данный термометр. спасибо
От 0 до 99 градусов
значит минусовую он не покажет ?
Нет
Люди добрые дайте печатную плату . Пожалуйста
Уважаемый админ в статье есть неточности вы пишете " Все установки микроконтроллера заводские, FUSE-биты трогать не надо." С такими установками термометр показывает одни нули я прошил такими
AVRDUDE -U lfuse:w:0xE2:m -U hfuse:w:0xD9:m и все заработало
За схему и идею спасибо.
Здравствуйте Админ! В этот термометр можно добавить функцию сигнализатора при достижении заданной температуры(по аналогии будильника в часах)?
Здравствуйте Андрей!
Добавить можно, только у меня нет на это времени.
С уважением, Admin.
Термометр показывает 00,0 . Микроконтроллер и датчик температуры менял, схему перепроверил.
У меня тоже всё по нулям. в схеме ошибок нет и датчик тот. в чём ещё подвох???
Здравствуйте Василий!
Была раньше проблема в схеме - неправильно подсоединены транзисторные ключи, сейчас схема правильная. Почему у Вас показывает нули, возможно есть одна причина.
Высылаю Вам на почтовый ящик измененный НЕХ файл, отпишитесь пожалуйста о результатах.
С уважением, Admin.
не пришло ничего
получил. спасибо. показывает первую секунду, а потом опять нули
Не подскажете, что было у Сергея?
Здравствуйте Хасан!
1. Проблема в датчиках
2. Проблема дисплеи
3. Проблемы в МК
С уважением, Admin.
И у меня как у Сергея показывает 97.2, 87.2, 47.2 и прыгает
Хасан,разряды местами поменяй,будет 27,9, 27,8, 27,4.
Здравствуйте Админ!Хочу собрать вашу схему, но так как имеется некое количество ATMega48 20AU нужна прошивка под этот МК,если конечно у вас найдётся свободное время.Заранее спасибо.
Здравствуйте, все собрал, залил прошивку, но при включении появляются нули и все, не подскажете
что делать?
Здравствуйте Даниил!
Где-то у Вас ошибка, проверьте схему.
С уважением, Admin.
частота контролёра не та.. датчик не успевает отвечать..
почему то при моделированнии в протеусе не хочет работать.
Здравствуйте Антон!
Попробуйте промоделировать на схеме без ключевых транзисторов.
С уважением, 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/
а вы сами знаете этот язык, или может кто то мне подскажет как написать, то есть какую команду дать на считывание с датчика, хранение в ячейки памяти атмеги а потом на вывод на индикатор. МОжет не вы может кто то другой подскажет.
Admin, выручай не качаются программы для того, чтобы разобраться получше что и как
Здравствуйте Dmitriy!
Выложил оба варианта программы на ЯндексДиске.
Ссылка в конце статьи.
С уважением, Admin.
извините, а алгоритм работы термомтра можно
Дико извиняюсь !!! ..вложения не грузятся
Здравствуйте Геннадий!
Проверил, вложения загружаются.
С уважением, Admin.
Что-то Админ совсем забросил эту тему. Я прошу дать вариант программы со сменой значений на дисплее 1 сек. Меня устроят те продостережения что даны в описании.
Здравствуйте Владислав!
Хорошо, сделаю для Вас вариант с секундной задержкой, скоро выложу.
С уважением, Admin.
Доброго дня Владислав!
Для Вас выложен второй вариант программы с непрерывным измерением температуры (интервал менее 1 секунды)
С уважением, Admin.
Я не увидел никакой разницы ни в работе, ни в НЕХ файлах - делал Compare, правда визуально.
Владислав, попробуйте в "железе", программа изменена для Вас.
С уважением, Admin.
Так я и пробовал в железе. Как было 4 сек так и осталось.
Владислав!
Я скачал файл, выложенный здесь, собрал схему, запрограммировал.
Результат: конструкция работает и измеряет температура с интервалом менее 1 секунда.
С уважением, Admin.
Предлагаю продолжить общение в личке.
Вадим, чудес не бывает. Если оба НЕХ-файла абсолютно одинаковы бит в бит, то и работают одинаково - 4 сек обмен. Укажите плз в каких адресах есть отличие между 4сек и 1сек?
Может разница в настройках МК - Fuses?
Здравствуйте Владислав!
Заменил HEX-файл
Скорее всего были происки "врагов":)
Спасибо за замеченную ошибку.
С уважением, Admin.
Совсем другое дело! Работает прекрасно. Спасибо огромное.
Есть ошибки в схеме. Перепутаны выводы от МК к транзистору индикатора. Первая прошивка работает, вторая молчит.
Здравствуйте Юрий!
Ошибки в схеме нет, просто второй вариант программы - программа для двух датчиков.
Разберусь конкретно, перезалью программы.
Спасибо.
С уважением, Admin
Еще раз здравствуйте Юрий!
Разобрался - не тот номер присвоил файлу на сервере для загрузки,
поэтому загружалась программа для двухканального термометра.
Ошибка исправлена.
Еще раз спасибо.
С уважением, Admin.
Работает нормально, но обновление надо сделать чаще, а то слишком большая задержка. Быстрое изменение температуры очень неудобно наблюдать.
Постоянно прыгают цифры то 96.2 то 86.2 то 46.2 и не перестают
как исправить
Здравствуйте Сергей!
В течении 2-3 дней соберу и проверю работу конструкции, после этого отпишусь.
С уважением, Admin.
Хорошо буду ждать могу видео скинуть
жду уже долго так и не исправили???
Здравствуйте Сергей!
Примите мои извинения за долгое ожидание.
К сожалению до 15 октября у меня не будет возможности проверить работу программы.
Перед выкладкой этой статьи на сайт, конструкция была собрана на макетной плате и работала без замечаний.
С уважением, Admin.