Цифровой термометр на ds18b20

Цифровой термометр на ds18b20

Недавно занимался сборкой компьютера с полностью пассивным охлаждением. Чтобы было удобно контролировать температуру процессора, нужно было по быстрому собрать термометр. Всяческие программы типа «Everest», «Aida», и прочие мне не подходили по одной простой причине: хотелось контролировать температуру даже при выключенном мониторе. Или даже при полностью отключенном мониторе. Было решено собрать термометр на основе цифрового датчика DS18B20, дешёвого микроконтроллера AVR, и семисегментного индикатора. Сначала я хотел повторить схему термометра по одному из вариантов, предложенных в интернете. Но после анализа схем, размещённых в интернете, я пришёл к выводу, что придётся изобретать свой «велосипед».

Конструкции, представленные в интернете, имели ряд недостатков, а именно:
* низкая скорость динамической индикации (50. 100 герц), изза которой становится некомфортно смотреть на индикатор, если быстро бросить на него взгляд, кажется что цифры «шевелятся»;
* не все конструкции адекватно измеряли весь диапазон температур (от -55 до +125), попадались например конструкции, не измеряющие температуру ниже нуля градусов, или некорректно измеряющие температуру выше 100 градусов;
* отсутствовала проверка контрольной суммы (CRC);
* общие выводы сегментов подключались к одной ножке микроконтроллера без ключевых транзисторов, ПЕРЕГРУЖАЯ ПОРТЫ МИКРОКОНТРОЛЛЕРА.

При перегрузке портов МК, яркость свечения индикатора может снизиться, а также можно пожечь ножки микроконтроллера. Несколько лет назад я собирал термометр на ATtiny2313+DS18B20 по схеме с интернета. Схема была без ключевых транзисторов. При температуре 18 градусов, цифра «1» светилась ярко, а цифра «8» светилась заметно тусклее, надеюсь всем понятно почему всё происходит именно так. Поэтому я пообещал себе в будущем не перегружать ножки МК. Вот кстати фотка того термометра, собранного по схеме из инета, думаю что в комментариях не нуждается:

Также хотелось сделать несколько доработок:
* вывести на индикатор символ градуса (десятые доли градуса мне были не так критичны);
* затактировать микроконтроллер от внешнего кварца, так как протокол «1-Wire», который использует датчик, критичен к формированию временнЫх интервалов (тайм-слотов), поэтому молиться о стабильности встроенного тактового генератора мне не хотелось;
* ввести в программу проверку контрольной суммы, при несовпадении контрольной суммы выводить на индикатор: «Crc»;
* добавить в схему диод (для защиты схемы от переполюсовки питания);
* при подаче питания в течении 1 секунды засветить все сегменты (так называемый тест сегментов).

Проект я написал в среде AVR Studio 5, функции работы с датчиком нашёл где-то в инете, а остальное переписал на свой лад, обильно снабдив комментраиями исходный код. В конце статьи есть ссылка на скачивание прошивки и исходника.

Читайте также:  Максимальный срок жизни кошек

Семисегментный индикатор я использовал на 3 знакоместа, сегменты с общим анодом. Также в архиве (в конце статьи) есть прошивки под индикатор с общим катодом. Общие выводы сегментов я подключил сразу к двум выводам МК, соединённым параллельно. Таким образом, каждый общий вывод сегментного индикатора использует 2 ножки МК для повышения нагрузочной способности выводов.

Микроконтроллер я использовал ATtiny2313A (также можно использовать ATtiny2313 или ATtiny2313L), задействовал практически все свободные ножки (за исключением ножки сброса). Если собирать термометр на ATmega8, то можно соединять параллельно по 3 или по 4 ножки для повышения нагрузочной способности портов.

Прилагаю фотографии собранного термометра. Корпуса покачто нет, так как термометр будет встраиваться в корпус ПК.

Индикация.
Не подключен датчик температуры, либо короткое замыкание на линии данных:

Ошибка контрольной суммы (CRC):

Подключен датчик температуры, температура от -55 до -10 градусов:

Подключен датчик температуры, температура от -9 до -1 градуса:

Подключен датчик температуры, температура от 0 до 9 градусов:

Подключен датчик температуры, температура от 10 до 99 градусов:

Подключен датчик температуры, температура от 100 до 125 градусов:

Частота динамической индикации — несколько килогерц, благодаря чему мерцание на глаз не заметно даже при броском взгляде на индикатор.
Для желающих повторить конструкцию я скомпилировал несколько прошивок под разные кварцы: 4 МГц, 8 МГц, 10 МГц, 12 МГц, 16 МГц.
Также сделал прошивки под индикаторы с общим анодом (ОА), и с общим катодом (ОК). Все прошивки в архиве (см. ниже).

г.Вельск, Апрель 2014г.
P.S. Первоначально материал разместил тут.

UPD. Обновил прошивку. Мелкие исправления, мелкие плюшечки. Из основного — stdint типы данных, гибкая настройка ног под сегменты. Все изменения описаны в шапке исходника.
В связи с большим наплывом желающих выкинуть кварц из схемы, и не читающих зачем он в схеме нужен, отключил комментарии.

Дата публикации: 10 мая 2012 .

В этой статье займемся изучением практического применения цифровых датчиков температуры DS18B20. Сделаем простой термометр на семисегментных индикаторах, который будет показывать положительную и отрицательную температуру с разрешением 0,1 градус Цельсия. Для этой цели используем микроконтроллер Atmega8, который работает от внутреннего генератора частотой 8 МГц, семисегментный индикатор с общим анодом(четырехразрядный) и датчик температуры DS18B20. Схема устройства показана на рисунке 1. Шину данных датчика подключаем к порту PC0, а также подключаем к плюсу питания через резистор R1 номиналом 4,7 кОм, поскольку выходной транзистор датчика имеет открытый сток. При питании датчика от шины данных(паразитное питание) вывод 3 датчика остается свободным.

Читайте также:  Печь для запекания стекла

Как уже известно последовательность действий при работе с одним датчиком будет такая:

1) послать сигнал обнуления линии (480. 960 мкc);
2) принять импульс присутствия или заполнить время паузой (60. 240 мкc);
3) послать команду пропуска идентификации 0xCC;
4) послать команду начала преобразования 0x44;
5) пауза не менее 500 мкc для завершения процесса преобразования;
6) обнулить линию;
7) послать команду пропуска идентификации 0xCC;
8) послать команду считывания блокнота 0xBE;
9) принять 12 байт(по умолчанию);
10) выделить и проанализировать бит десятых долей градуса с установленной точностью, в нашем примере это 0,0625;
11) проанализировать бит знака;
12) если знак отрицательный, то перевести значение температуры в дополнительный код;
13) делаем преобразование целой и дробной части значения температуры и выводим на дисплей.

Рисунок 1.

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

Для общения микроконтроллера с датчиком понадобятся три функции:

  • функция инициализации или сброса датчика DS18B20_init;
  • функция чтения одного байта из датчика read_18b20;
  • функция записи одного байта в датчик write_18b20;

Теги статьи: Добавить тег

Термометр "ГНОМ" (Attiny2313+LED+DS18B20)

Автор: Михаил
Опубликовано 14.09.2011
Создано при помощи КотоРед.

Уважаемый РадиоКОТ, поздравляю тебя с таким знаменательным для всех радиолюбителей днем – днем твоего рождения. 6 лет – серьезный возраст, и я хочу пожелать тебе долгих лет жизни, душевного равновесия и взаимного уважения на этом замечательном сайте. Пусть в твоем доме всегда будет уют и покой, а радиолюбители пусть радуют полезными и интересными творениями. Прими и от меня сей скромный подарок.

Несмотря на тот факт, что в сети очень много схем термометров, тема эта всегда будет актуальна. Ведь сколько людей – столько и представлений о том, каким он должен быть. Лично мне необходимо было следующее:

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

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

Нет смысла постоянно отображать температуру. Вполне достаточно по нажатию кнопки пробудить термометр и считать показания. А все остальное время термометр может спать. Удобно. Да и батарейки гораздо дольше проживут.

Собственно, вот и все пожелания. В результате, на свет появилась следующая конструкция:

Краткие характеристики :

— Диапазон измеряемых температур: от -55°С до +125°С

— Время измерения: 1 сек

— Время отображения: 3 сек

— Питание: 3В (CR2032)

О времени работы хотел бы сказать отдельно. Вообще, эта статья должна была появиться на свет, когда термометр откажется работать. И станет понятно, сколько же он может проработать на одном элементе питания. Термометр был собран в феврале сего года. Затем наступила весна, на смену ей пришло лето, затем осень.… А термометр так и работает уже 7 месяцев. Что само по себе неплохо для батарейки за 15 рублей. Учитывая, что температура измеряется ежедневно и регулярно.

Схема:

Подключение датчика DS18B20 стандартное, но питается он непосредственно от вывода микроконтроллера, и только на время измерения температуры. Индикатор семисегментный, с общим анодом. Перевернут для получения символа °С в последнем разряде.

Термометр собран на двусторонней печатной плате, размеры корпуса 65 x 45 x 22:

Лицевая панель нарисована в CorelDraw, и после печати / ламинирования приклеена на тонкий двусторонний скотч:

На ответной части корпуса просверлено отверстие для крепления термометра. С обратной стороны была сделана ниша, дабы случайно не уронить что-нибудь внутрь корпуса:

О формате вывода температуры на индикацию:

Температура положительная, менее 10 градусов

Температура положительная, более 10 градусов

Температура отрицательная, менее 10 градусов

Температура отрицательная, более 10 градусов

Температура 0 градусов

Температура положительная более 99 градусов

Ошибка чтения датчика

Принцип работы:

Кратковременное нажатие на кнопку SB1 переводит термометр из режима сна в рабочий режим. Через 1 секунду, если датчик отозвался, на индикатор выводится измеренная температура. Еще через 3 секунды индикатор гаснет, и термометр переходит в спящий режим.

Программирование фьюзов :

Тактирование выполнено от внутреннего генератора 4 MHz (CKSEL3..0 = 0010; SUT1..0 = 10), делитель тактовой частоты на 8 отключен (CKDIV8 = 1), слежение за напряжением питания отключено (BODLEVEL2..0 = 111).

Спасибо за уделенное внимание, и успехов Вам в этом увлекательном и безграничном мире радиоэлектроники.

Ссылка на основную публикацию
Adblock detector