Термометр для мультиметра своими руками ds1820

Добавил пользователь Skiper
Обновлено: 08.09.2024



Здравствуйте, друзья. Хочу предложить вашему вниманию несколько простых функций для работы с шиной 1-Wire и термометром DS18b20 на микроконтроллерах от ATMEL.

Содержание / Contents

↑ 1-Wire

Потребовалось мне узнать температуру радиатора в усилителе и как нельзя кстати в закромах была ATMega8 и DS18b20 – цифрой датчик температуры с протоколом 1-wire. Запустил CODEVISIONAVR, взял функции из стандартных библиотек, прошил, запустил и… датчик нагло врал на 3-5 градусов, я сравнивал с пирометром и комнатным термометром. В чем причина безобразия я не понял и решил сам написать все процедуры обмена данными, а заодно и изучить данную шину.

1-Wire — двунаправленная шина связи для устройств с низкоскоростной передачей данных подробнее можно почитать на Wikipedia

↑ Что нужно запомнить

  1. Передача данных и сигналов синхронизации происходит по одному проводу.
  2. Передачу данных всегда инициализирует МК.
  3. Биты данных передаются тайм-слотами со строго ограниченными временными рамками.
  4. На одной шине может находиться несколько устройств.
  5. У каждого устройства есть свой уникальный ROM код.

↑ Начинаем передачу

Для дальнейшей работы с шиной у нас должна быть подключена библиотека delay.h и определены три дефайна.

Прежде чем общаться с датчиком МК необходимо убедиться, что на проводе собственно присутствует устройство 1-wire. Для этого есть процедура инициализации. Взглянем на ее диаграмму 1 из даташита на датчик.

Диаграмма 1 — Инициализация.

  1. МК генерирует сигнала reset, удерживая шину в 0 состоянии в течении 480 микросекунд.
  2. Ждем не менее 15, но не боле 60 микросекунд. За это время подтягивающий резистор должен поднять уровень на шине до логической единицы.
  3. Датчик удерживает шину в нулевом состоянии в течении не менее 60 микросекунд. Если за это время шина не смени свое состояние на 0 значит на шине ошибки или датчик не исправен (Долго не мог понять, в чем дело, когда отпаялся подтягивающий резистор и на шине всегда считывался 0).

И собственно функция:

Исключён фрагмент. Полный вариант статьи доступен меценатам и полноправным членам сообщества. Читай условия доступа.

Данная функция возвращает 0 если все в порядке и 1 если нет.

↑ Обмениваемся данными

Передача данных осуществляется побитно так называемыми тайм слотами. Тайм слот – последовательность действий по передачи одного бита. Тайм слот продолжается от 60 до 120 микросекунд.
Снова посмотрим на диаграмму, которою нам предлагают разработчики.

Диаграмма 2 — чтение, запись.

  1. МК удерживает шину в 0 состоянии в течении 60 микросекунд.
  2. МК отпускает шину давая резистору подтяжки делать свое дело.
  1. МК удерживает шину в 0 состоянии в течении 15 микросекунд.
  2. МК отпускает шину.
  1. МК удерживает шину в 0 состоянии в течении 1 микросекунд.
  2. МК отпускает шину.
  3. ждем завершения переходных процессов 14 микросекунд.
  4. МК считывает состояние шины.
  5. Ждем еще 45 микросекунд до конца тайм слота.

Как и при записи для чтения одного байта необходимо 8 тайм слотов.
Функция чтения:

Мы научились читать и передавать байты, но для работы этого еще мало.
В связи с тем, что шина однопроводная и на ней может быть несколько устройств, возможны ошибки при передаче данных. Что бы поверить целостность данных необходимо проверить контрольную сумму. Существует два метода подсчета контрольной суммы – алгоритмический и табличный. Алгоритм не самый тривиальный и я решил использовать табличный.
Нашел на просторах интернета уже вычисленные сигнатуры. Определим их в массив и заведем переменную:

Исключён фрагмент. Полный вариант статьи доступен меценатам и полноправным членам сообщества. Читай условия доступа.

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

↑ Общение с датчиком

  • 0x33h – считать ромкод (уникальное имя каждого устройства). Применение возможно только, если на шине всего одно устройство.
  • 0x55h – обратиться по ром коду к конкретному устройству. После необходимо также передать 64 битный ром код. Только устройство у которого переданный код совпадет с записанным в него на заводе останется на шине, остальные отключатся.
  • 0xCCh — После приема данной команды все устройства останутся активными на шине. Удобно использовать если устройство одно или есть однотипные.
  • 0x44h – Запуск преобразования температуры. Если датчик питает не от линии данных, то после можно прочитать состояние шины 0 – если преобразование не завершено и 1 – если преобразование завершено.
  • 0xBEh – Считать 8 байт данных. Первые два байта – вычисленная температура.
  • 0x4Eh – запись в память датчика. Необходимо передать три байта – верхнюю границу термостата, нижнюю границу термостата и значение контрольного регистра.
  • 0x1Fh — 9 бит (±0,5 градуса Цельсия), преобразование примерно 94 миллисекунды;
  • 0x3Fh — 10 бит (±0,25 градуса Цельсия), преобразование примерно 188 миллисекунд;
  • 0x5Fh — 11 бит (±0,125 градуса Цельсия), преобразование примерно 375 миллисекунд;
  • 0x7Fh — 12 бит (±0,0625 градуса Цельсия), преобразование примерно 750 миллисекунд;

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

Настройка датчика:

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

Исключён фрагмент. Полный вариант статьи доступен меценатам и полноправным членам сообщества. Читай условия доступа.

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

Функция выдачи ром кода на шину:

И наконец чтение температуры с датчика с номером DSnum:

функция возвращает целое значение температуры, если она была положительная и 0 если были ошибки при чтении.

↑ Файлы

Даташит на DS18B20: 🎁 DS18B20.pdf 528.7 Kb ⇣ 73

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

Ниже я приведу пример, как просто сделать термометр на основе микроконтроллера Atmega16, датчика температуры DS18B20 и LCD (HD44780).





На рисунках показано как подключить к микроконтроллеру термометр, в зависимости от корпуса. Никаких сложностей это вызвать не должно. Теперь приведу полную схему термометра:



На схеме: Atmega16,наш управляющий микроконтроллер, LCD и сам термометр. Но просто собрать все детали в кучу и спаять как мы знаем мало, нужно написать программу в микроконтроллер. в одной из предыдущих статей я писал как работать с таким дисплеем, а сейчас покажу как снимать показания с термометра DS18S20.



Как видно из схемы термометр я подключил к ножке PD0 микроконтроллера, поэтому в строке 1 Wire PORT выбрал PORTD,а в строке Data Bit - 0. И обязательно нужно поставить галочку напротив Enabled,галочка напротив Multiple Device нужна в том случае если будет подключаться несколько датчиков на эту линию, чего я сейчас не планирую, поэтому и оставил пустым. С настройкой закончили, выбираем Ganerate Save and Exit и сохраняем наш проект. Теперь перейдем непосредственно к коду.

DS18B20 — это цифровой датчик, который применяется для измерения температуры (диапазон -55 °C до 125 °C), а также обладает программируемой уникальной точностью (до 12 бит).

DS18B20

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

Датчик DS18B20: схема построения

Датчик DS18B20

Прибор DS18B20 имеет сразу 3 ключевых корпуса:

  1. Сторона ТО-92;
  2. Стенка SO-150mil;
  3. Корпус uSOP.

Корпус ТО-92

Если говорить о внутренней структуре, то следует рассмотреть небольшую микросхему, которая представлена на рисунке:

Микросхема DS18B20

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

Подключение датчика DS18B20

Подключение датчика DS18B20

Подключение датчика DS18B20, как правило, происходит двумя-тремя простыми способами. Мы рассмотрим эти способы на примере подключений DS18B20 к плате Arduino и esp8266.

Подключение датчика DS18B20 к Arduino

Начнем с прямого подключения единичного датчика к Arduino:

DS18B20 и Arduino

Теперь перейдем к рассмотрению подключения несколькими датчиками DS18B20 к плате Arduino:

Пришла очередь третьего способа подключения DS18B20 к плате Arduino при помощи паразитного питания:

Подключение датчика DS18B20 к esp8266

Теперь перейдем к обсуждению подключения датчика DS18B20 к esp8266. Начнем, пожалуй, с прямого подключения:

Подключение датчика DS18B20 к esp8266

Наконец, поговорим о последнем способе подключения датчика DS18B20 к esp8266:

Способ подключения датчика DS18B20

Характеристики датчика DS18B20

Характеристики датчика DS18B20

Температурный датчик DS18B20 имеет множество особенностей не только в своей конструкции, но и в своей эксплуатации. Вот главные из них:

  • Измеритель DS18B20 питается напряжением, величина которого варьируется от 3-х Вольт до 5,5 Вольт;
  • Термодатчик DS18B20 способен измерять значения температур в диапазоне от -55 °C до 125 °C;
  • Пропускная способность датчика DS18B20 доходит до отметки 12 бит;
  • Величина погрешности прибора DS18B20 составляет (+,- ) 0,5 ° C;
  • Медленное перемещение измерителя DS18B20 относительно любого устройства не превышает единицы.

Взаимосвязь между разрешением датчика DS18B20 и температурой

На самом деле, рассмотреть взаимосвязь между разрешением прибора DS18B20 и температурой можно с помощью следующей картинки:

Однако, предлагаю сделать это более детально.

Начнем с девяти-битного разрешения. При этой величине температура может принимать следующие значения:

Таким образом, при разрешении 9 бит можно сделать 10.5 измерений/сек для вышеназванных температурных величин.

При расширении 10 бит температура принимать такие величины:

  1. 0.00 °C;
  2. 0.25 °C;
  3. 0.50 °C;
  4. 0.75 °C;

Можно сделать вывод, что при разрешении 10 бит можно сделать 5.3 измерений/сек для вышеназванных температурных величин.

При разрешении 11 бит температура имеет возможность принять следующий вид:

  • 1) 0.00 °C;
  • 2) 0.125 °C;
  • 3) 0.25 °C;
  • 4) 0.375 °C;
  • 5) 0.50 °C;
  • 6) 0.625 °C;
  • 7) 0.75 °C;
  • 8) 0.875 °C.

Таким образом, при разрешении 11 бит можно сделать 2.6 измерений/сек для вышеназванных температурных величин.

При разрешении 12 бит температура может принимать следующие значения:

  • 1) 0,00 °C;
  • 2) 0,0625 °C;
  • 3) 0,125 °C;
  • 4) 0,1875 °C;
  • 5) 0,25 °C;
  • 6) 0,3125 °C;
  • 7) 0,375 °C;
  • 8) 0,4375 °C;
  • 9) 0,50 °C;
  • 10) 0,5625 °C;
  • 11) 0,625 °C;
  • 12) 0,6875 °C;
  • 13) 0,75 °C;
  • 14) 0,8125 °C;
  • 15) 0,875 °C;
  • 0,9375 °C.

Это говорит о том, что при расширении 12 бит можно сделать 1.3 измерений/сек для вышеназванных температурных величин.

Основные функциональные способности датчика DS18B20

Термодатчик DS18B20 имеет в своем функционале сразу несколько важнейших команд:

  1. Навык преобразования температур. (Данная способность может поместить температуру в двух-байтный блок оперативной памяти, после чего датчик переходит в состояние низкого потребления. В этом состоянии DS18B20 считывает код данных и определяет режим состояния процесса);
  2. Команда записи памяти. (Она дает возможность сохранить три байта данных в оперативной памяти DS18B20. При это, следует уточнить, что ведущий прибор перебрасывает информацию с наименьшего бита);
  3. Способность чтения памяти. (Применяется для прочтения оперативной памяти памяти прибора. Сброс данных осуществляется с самых наименьших битов или байтов, при этом, в случае необходимости, эта команда способна прекратить сброс данных);
  4. Команда копирования памяти. (Она помогает скопировать все данные внутренней памяти устройства в блок EEPROM, что приводит к осуществлению в дальнейшем питательной способности системы);
  5. Способность перезагрузки EEPROM. (Дает возможность регистрам передохнуть, перезагружая все значения на блоках. Кроме того, только после перезагрузки DS18B20 происходит процесс прочтения оперативной памяти памяти прибора и сообщается о ее состоянии).

Где можно купить датчик DS18B20?

Термодатчик DS18B20 является достаточно востребованным устройством в наше время. Если вы думаете, что найти его будет сложно, а цена вас испугает, то вы сильно ошибаетесь. Я советую вам приобрести данный прибор на Aliexpress. Там вы найдете DS18B20 и его аналоги по смешной цене, получите быструю, а самое главное качественную доставку.

Maneki Neko


DS1820, DS18S20, DS18B20 - популярные цифровые термодатчики фирмы DALLAS-MAXIM с однопроводным интерфейсом 1-Wire.

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

В данной статье рассматриваются только изделия в корпусе TO-92 как наиболее распространенные. Информацию по изделиям других корпусах смотрите в документации (data sheets).

Микросхема DS1820 снята с производства, для её замены рекомендуется микросхема DS18S20. Однако, следует обратить внимание на то, что микросхемы DS18S20 в корпусе TO-92 маркируются надписью "DS1820" (без буквы S). Новая микросхема DS18S20 программно совместима со старой DS1820 и, по заверению производителя, в большинстве случаев может быть непосредственной заменой старой DS1820. Возможно, маркировкой без буквы S производитель хотел указать на эту совместимость. Программная совместимость новой DS18S20 со старой DS1820 гарантированно обеспечивается если в программе применен алгоритм из data sheet.

Как видно из таблицы новая микросхема DS18S20 выполнена в стандартном корпусе TO-92, а старая DS1820 имела удлиненный корпус. По этому признаку Вы также можете убедиться, что продавцы Вам не "втюхивают" устаревшую микросхему.

Микросхема же DS18B20 всегда имеет соответствующую маркировку "DS18B20" и не может быть заменена на DS1820/DS18S20 и обратно без изменения программного кода.

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

Читайте также: