Корпус для датчика температуры ds18b20 своими руками
Датчик температуры DS18B20 — первый серьезный датчик, который можно применять не только в образовательных целях, но и в реальных системах умного дома. Диапазон измеряемых температур составляет -55. +125°C, при этом точность в 0,5°C ( полградуса) обеспечивается в диапазоне -10. +85°C. Такие характеристики и герметичность позволяют использовать данный датчик для измерения температуры в различных агрессивных для обычных микросхем средах, таких как жидкости и почва, служить уличным датчиком температуры и т. д.
В то же время этот датчик не так прост как кажется — это программируемый цифровой термометр. Он снабжен энергонезависимой памятью EEPROM в которой хранятся значения триггеров срабатывания тревоги, а также данные регистра конфигурации.
Датчик температуры DS18B20 (только датчик)
Датчик температуры DS18B20 (на модуле)
Для организации использования нескольких датчиков с одним микроконтроллером ( МК) в памяти ROM каждого из датчиков хранится уникальный 64-битный идентификатор. Именно по нему и происходит идентификация конкретного датчика и персональное взаимодействие с ним.
Датчик обладает программируемой точностью — 9, 10, 11, 12 бит. Протокол обмена данными 1-Wire, а это значит что для общения с микроконтроллером ( МК) ему нужен всего один провод DQ — линия данных, остальные 2 подключаются к питанию ( Vdd ) и земле ( GND ). На одну линию данных можно вешать несколько 1-Wire-устройств.
Такой режим удобен при удаленном расположении датчика от МК, либо в случаях, когда к датчику уже протянут двухжильный провод.
По умолчанию датчик находится в состоянии покоя. Для осуществления измерения микроконтроллер должен отдать ему команду. Датчик умеет информировать микроконтроллер о том, что измерение происходит или завершено, делает он это по состоянию шины DQ : 0 — идет измерение, 1 — измерение завершено. По аналогии, состоянием шины датчик может говорить об осуществлении записи в/из EEPROM.
Данные о температуре хранятся в регистре температуры, который состоит из двух байт ( 16 бит) — LS Byte ( LSB, Least Significant — англ. наименее значимый) и MS Byte ( MSB, Most Significant — англ. наиболее значимый):
LS Byte | бит 7 | бит 6 | бит 5 | бит 4 | бит 3 | бит 2 | бит 1 | бит 0 |
2 3 | 2 2 | 2 1 | 2 0 | 2 -1 | 2 -2 | 2 -3 | 2 -4 | |
MS Byte | бит 15 | бит 14 | бит 13 | бит 12 | бит 11 | бит 10 | бит 9 | бит 8 |
S | S | S | S | S | 2 6 | 2 5 | 2 4 |
В битах S хранится информация о знаке ( Sign), для положительных значений S=0 , для отрицательных S=1 . Например:
Температура ( °C) | Полученное измерение ( BINARY) |
+125 | 00000111 11010000 |
+85 | 00000101 01010000 |
+25.0625 | 00000001 10010001 |
+10.125 | 00000000 10100010 |
+0.5 | 00000000 00001000 |
0 | 00000000 00000000 |
-0.5 | 11111111 11111000 |
-10.125 | 11111111 01011110 |
-25.0625 | 11111110 01101110 |
-55 | 11111100 10010000 |
При использовании меньшей точности измерений, биты 0-3 не используются: для 11-битной точности не используется 0 бит, для 10 — не используются 0-1 биты и т. д.
- при положительном значении ( S=0) нужно 16 бит перевести в десятичный код и умножить на 0,0625°C ( коррекция на десятичные $2^=0.0625$ — таким образом получается значение с заданным количеством знаков после запятой),
- при отрицательном значении ( S=1) нужно 16 бит сначала инвертировать и прибавить единицу, а затем перевести в десятичный код и умножить на 0,0625°C ( или разделить на $2^=16$).
При первом включении датчика значение температуры по умолчанию +85°С.
После того как измерение произведено, полученное значение сравнивается с установленными значениями триггеров тревоги, которые хранятся в регистрах TH и TL ( High и Low). Доступ к этим регистрам осуществляется при обращении к 2 и 3 байтам памяти. Формат обоих регистров одинаков:
TH/TL | бит 7 | бит 6 | бит 5 | бит 4 | бит 3 | бит 2 | бит 1 | бит 0 |
S | 2 6 | 2 5 | 2 4 | 2 3 | 2 2 | 2 1 | 2 0 |
При сравнении с регистрами TH и TL из регистра температуры сравниваются только 8 бит — с 11 по 4. Если полученное значение температуры будет равно или превышать TH, либо будет равно или ниже TL, то условие тревоги будет считаться выполненным и будет установлен соответствующий флаг. Этот флаг обновляется после каждого проведенного измерения. Управляющий МК может проверить статус флага и отреагировать на него. Если этот функционал не нужен, его можно просто игнорировать.
64-битный уникальный идентификатор ROM
Каждый датчик DS18B20 имеет присвоенный и доступный только для чтения ( ROM — Read Only Memory, ПЗУ) уникальный 64-битный ( 8 байт) идентификатор. Он состоит из 3 частей:
Производитель гарантирует, что единожды использованный адрес повторится в другом устройстве ( количество комбинаций в 48 битах: $2^ <48>\approx 2.81 \times 10^$) при ежегодном производстве 1000 млрд. устройств, не ранее чем через 281 год — и это только для одного семейства.48>
Оперативная память датчика DS18B20 ( SPM ( ScratchPad Memory) — т. н. блокнотная память, высокоскоростная внутренняя память используется для временного хранения данных) состоит из 9 байт и её структура выглядит следующим образом:
Байты отмеченные звездочкой, при включении заполняются данными из EEPROM
Желтым выделены байты только для чтения — 1, 2 и 8
Если в проекте регистры тревоги TH и TL не используются, то их можно использовать в качестве ячеек памяти общего назначения и хранить там произвольные данные.
Регистр конфигурации ( Configuration Register)
Регистр конфигурации — четвертый байт в SPM-памяти. И по сути все что можно настроить при помощи этого регистра — точность измерений. Она задается комбинацией всего 2 битов — шестого R1 и пятого R0 :
Configuration Register | бит 7 | бит 6 | бит 5 | бит 4 | бит 3 | бит 2 | бит 1 | бит 0 |
0 | R1 | R0 | 1 | 1 | 1 | 1 | 1 |
Возможны следующие варианты:
R1 | R0 | Точность ( в битах) | Максимальное время измерения | |
0 | 0 | 9 | 93.75 мс | (tCONV/8) |
0 | 1 | 10 | 187.5 мс | (tCONV/4) |
1 | 0 | 11 | 375 мс | (tCONV/2) |
1 | 1 | 12 | 750 мс | (tCONV) |
Датчик температуры DS18B20 в сети всегда выступает в роли ведомого ( Slave). При передаче всех данных и команд первым отправляется младший бит ( LSB, Least Significant Bit).
- инициализация
- ROM-команда — обмен данными
- функциональная команда — обмен данными
Все эти этапы обязательны к исполнению именно в таком порядке. Исключения составляют только ROM-команды Search ROM [F0h] и Alarm Search [ECh] . После исполнения этих команд необходимо вернуться к шагу №1 — инициализация.
Любая передача-транзакция начинается с последовательности инициализации — сначала микроконтроллер ( мастер, ведущий) прижимает линию данных к нулю минимум на 480 мкс, затем мастер переходит в режим приема и следит, чтобы датчик ответно прижал линию данных к нулю на время 60-240 мкс, после этого подтягивающий резистор вернет линию в исходное положение HIGH :
После инициализации начинает происходит обмен данными. Единицей обмена является один бит, который передается/принимается в течение одного тайм-слота — временного отрезка, который не должен быть меньше 60 мкс. Пауза между тайм-слотами не должна быть менее 1 мкс — этого времени должно хватить, для подтягивания шины резистором к единице.
Существуют 4 вида тайм-слотов, при помощи которых происходит запись/чтение нулей и единиц в/из шины данных. Каждый из 4 видов начинается с притягивания мастером шины данных к нулю минимум на 1 мкс:
Для записи логической единицы HIGH мастер притягивает шину к нулю и держит до окончания тайм-слота, для записи логического нуля LOW , мастер начинает тайм-слот притягиванием линии данных к нулю, но тут же отпускает ( не позже 15 мкс). Через 15 мкс с начала тайм-слота датчик считывает значения линии данных.
Для чтения данных мастер дергает линию данных к нулю на не менее, чем 1 мкс для начала тайм-слота и сразу отпускает и считывает состояние линии данных до истечения 15 мкс с начала тайм-слота.
Таким образом, когда осуществлять чтение или запись, ведущий знает исходя из отправляемых команд. Рассмотрим на примере как происходит взаимодействие с одним датчиком ( напомню, TX — Запись ( Write), RX — Чтение ( Read)):
Мастер | Данные | Комментарии |
TX | Сброс ( Reset) | Мастер инициирует импульс сброса в линии |
RX | Присутствие ( Presence) | Датчик отвечает присутствием |
TX | 55h | Команда Match ROM ( 55h ) — начало передачи 64-битного уникального кода для идентификации конкретного датчика. |
TX | 64-битный идентификатор | Мастер отправляет 64-битный код адресата. После отправки, на дальнейшие команды будет реагировать только один датчик, с указанным идентификатором |
TX | 44h | Команда Convert T ( 44h ) — запускает измерения |
TX | Проверка шины DQ | После запуска измерения датчик притягивает линию данных к нулю 0 , и держит её до окончания измерений. Мастер в это время контролирует, когда шина будет отпущена к единице 1 . Это будет означать завершение измерений и можно будет считать полученное значение. |
Новая партия обмена данными снова начинается с блока инициализации | ||
TX | Сброс ( Reset) | Повторяется процедура идентификации |
RX | Присутствие ( Presence) | |
TX | 55h | |
TX | 64-битный идентификатор | |
TX | BEh | Команда Read Scratchpad ( BEh ) — после получения этой команды датчик начнет отправлять данные о своей SPM-памяти — все 9 байт |
RX | 9-байт памяти | Мастер считывает все 9 байт памяти, включая 8 байт — CRC, далее производится проверка — рассчитывается CRC на основе первых восьми полученных байт и сравнивается с полученным CRC. Если они совпадают, то Мастер продолжает работу, если нет — процедура чтения повторяется. |
- Search Rom [F0h] ( поиск ROM) — команда поиска всех 1-Wire-устройств на линии данных. Механизм поиска описан в спецификации iButton.
- Read Rom [33h] ( чтение ROM) — команда, после которой датчик передает 64-бита ROM. Нельзя использовать, если на линии большего одного датчика. Исполнение команды приводит к непредсказуемым результатам.
- Match Rom [55H] ( совпадение ROM) — команда сравнения идентификатора. После этой команды Мастер отправляет 64-битный идентификатор, после получения которого, на остальные команды будет реагировать только один датчик.
- Skip Rom [CCh] ( пропуск ROM) — команда пропуска процедуры идентификации конкретного датчика. После этой команды может быть отправлена команда запуска измерения температуры Convert T [44h] — все датчики находящиеся на линии начнут процедуру измерения.
После этой команды применять команду Read Scratchpad [BEh] ( чтения памяти SPM) можно только если на шине висит только один датчик. В противном случае исполнение команды приводит к непредсказуемым результатам. Также используется в случаях наличия на линии только одного датчика и идентификатор не нужен. - Alarm Search [ECh] ( поиск тревоги) — процедура поиска устройств, идентична команде Search Rom [F0h] за тем лишь исключением, что будут найдены устройства только находящиеся в режиме тревоги.
Подключается датчик следующим образом ( на примере Arduino Uno):
Для работы с датчиком понадобится библиотека. Можно использовать только библиотеку OneWire — её лучше использовать для понимания механизмов взаимодействия с датчиками, так как это библиотека более низкого уровня. Она предназначена для работы со всеми устройствами, поддерживающими протокол 1-Wire. Все преобразования придется производить вручную — температура из байтов, установки точности, копирование и т. д. Заранее заготовленных функций по работе именно с датчиком DS18B20 в ней нет. Вот так например выглядит поиск и отображение идентификаторов всех устройств 1-Wire на всех подключенных шинах к плате Arduino Uno:
Результат — на 10 пине Arduino Uno найден один датчик:
На примере библиотеки OneWire можно посмотреть как происходит поэтапный процесс отправки команд и чтения данных, например:
Результат, вывод данных только одного датчика подключенного к 10 пину:
ROM = 28 51 78 26 0 0 80 A1 Chip = DS18B20 Data = B9 1 FF FF 7F FF FF FF F1 CRC=F1 Temperature = 27.56 Celsius, 81.61 Fahrenheit No more addresses.
В примерах к библиотеке DallasTemperature приведены примеры помимо стандартного функционала, описанного ниже, также и примеры редких ситуаций, например работа с датчиками расположенными на нескольких шинах.
Подключили почти все самое важное кроме температурных датчиков. Куда же нам без них! В проекте используются цифровые датчики DS18B20. Цифровые – для нас это означает, что они обеспечивают достаточно хорошую точность и дальность подключения. Длина провода может составлять до 100м. Для подключения я использовал экранированный сигнализационный провод 4х0.22 Для тех, кто не умеет паять есть вариант купить готовый датчик в гильзе из нержавейки и с готовым проводом. Для тех, кто не ищет легких путей можно приобрести сам датчик в корпусе TO-92 и припаять к нему провода самостоятельно. Могу сказать, что заказать на aliexpress 5 готовых датчиков обычно выходит дешевле, чем купить по месту голые датчики и возиться с пайкой. Тут все зависит от вашего желания и времени.
Датчик DS18B20 в гильзе
Вот таблица соответсвия контактов DS18B20 и платы arduino:
Датчик T3, DS18B20 | Контакты Arduino |
GND | GND |
S | 8 |
VCC | 5V |
Схема подключения одного датчика T3:
Подключение одного датчика DS18B20
Все остальные датчики подключатся таким же образом.
Подключение четырех датчиков DS18B20
Схема может показаться сложной, на самом деле все просто – мы все контакты VCC подключили к +5V, все контакты GND подключили к GND, выходы из датчиков подключили на 8, 7, 6 и 5 контакты Arduino, при этом, между каждым выходом и +5V поставили по резистору 4.7К
Пример реального подключения:
Подключение одного датчика DS18B20
Подключение датчика DS18B20 без пайки
Подключение резистора 4.7К без пайки
Самое время загрузить тестовый скетч, и проверить, что датчик температуры для arduino подключен корректно! Сначала пример найдет датчик, затем начнет выводить на наш LCD дисплей его показания.
Проект - контроллер аквариума. Использую Uno R3, экран 16х2 + i2c, релле на 2 выхода и собственно сам датчик DS18B20. На этапе макетирования все работало, температуру меряло, выводило на экран.
Сейчас все собрал в коробку все спаял, подключил и начал проводить полевые испытания :) при первом погружении датчика в аквариум на глубину свыше 15 см сигнал от датчика начинает чудить пропадая на экране, если еще глубже погружать пропадает вовсе, кто подскажет в каком направлении рыть.
П.С. начинающий ардуинщик, опыта мало.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
А можно фото датчика?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Проверь герметичность датчика. Срежь термоусадку и посмотри, может там вода.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
У меня висевший на улице датчик в металлическом колпачке и термоусадке все равно где-то через год набрал воды. Следующая версия пошла уже с забитым внутрь колпачка теплопроводящим герметиком. Посмотрим, насколько такой вариант сдюжит.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
По поводу герментичности, у меня два этих датчика, причем 1 вообще никогда не использовался, я когда заметил проблему, подключил второй и сразу опустил на дно аквариума ,тот же эффект сигнал пропадает, вытаскиваешь все нормально .
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Срезать сразу термоусадку, герметик и обратно ставить.
Приятель просто голый даллас залил герметиком.
Пару лет уже работает в аквариуме.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
как бы очевидно, что датчик явно без гидроизоляции - срежь термоусадку, залей колпачёк силиконовым герметиком, воткни втуда датчик, вытри выдавившися силикон, установи термоусадку.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Первое что сделал, намертво перемотал изолентой и сунул в аквас, ничего особо не поменялось.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
И кстати напомнило:
Силикон бывает нейтральный и уксусный.
Сначала заливал нейтральным, потом решил проверить уксусный.
Щупы мультика в незатвердевшем уксусном силиконе на пределе 20 Мегаом показывали обрыв,
что было довольно неожиданно с учётом запаха уксуса вокруг.
Пошёл дальше, стал заливать кислотным платы блока питания камер для пробы:
трансформатор 220-15 ас, 4 диода, кондёры 2000.0, 7812, всё на платке
и этим-же силиконом залито в заднюю часть хаузинга камер
Залито основательно чтобы не отваливались провода при их дёргании( глю-ган не держит-плавится летом)
Сделано было штук 100-200 за много лет, 10-15 лет назад,
все блоки питания до сих пор живы.
Правда не все камеры.
Та что теперь спокойно отношусь к кислотному силикону и считаю его вполне " электротехническим"
То есть даже неплохим изолятором ( 220 на первичке тех трансформаторов)
Кстати для пробы подавал 220 сразу после заливки, никаких проблем.
И никакой коррозии не видел ( иногда приносили хаузинги на ремонт)
А у кого-то есть отрицательный опыт применения кислотного силикона в "изоляции" электротехники ?
Подробно про датчики температуры DS18B20 и работу с библиотекой DallasTemperature.
Характеристики датчика:
- Диапазон температур: –55 … 125°C ±2.0, –10 … 85°C ±0.5
- Разрешение: от 9 до 12 Бит, до 0.0625 °C
- Напряжение питания: от 3.0 В до 5.5 В. Возможно фантомное питание (питание по линии данных)
- Связь по 1-Wire. Каждый датчик имеет уникальный 64 битный серийный номер, по которому происходит общение с датчиком на шине.
- Тревожный сигнал, передает адрес датчика, если температуры вышла за заданные пределы.
Схема подключения датчиков:
Назначение выводов:
Также существует герметичная версия DS18B20, в таких датчиках смотрим на цвета проводов.
Подключение одного датчика:
Датчик (ногу DQ) можно подключать на любой свободный выход arduino, в данном случаи датчик подключен к аналоговому А1 (он же 15 цифровой). В коде, при необходимости, можно задать любой другой, на котором будет сконфигурирована шина 1-Wire.
Также необходимо притянуть линию данных к питанию резистором на 4,7к. Питание у датчика 5 вольт.
Подключение нескольких датчиков:
Дополнительные датчики подключаются параллельно.
Подключение датчика с фантомным питанием:
Не рекомендуется, без крайней необходимости подключать датчик подобным образом, это плохо сказывается на быстродействии и стабильности работы датчика.
Для работы с датчиками необходима библиотека OneWire, скачать можно тут или тут, благодаря которой можно работать со всей линейкой устройств от Maxim/Dallas с однопроводной шиной (1-Wire), включая DS18B20.
Также, для удобства работы с датчиками DS18B20, рекомендуется использовать библиотеку DallasTemperature, особенно если датчиков на шине несколько, можно скачать тут или тут, она работает поверх библиотеки OneWire. Библиотека обширная, возможно будет тяжела для освоения начинающим, особенно по примерам из комплекта.
Открываем пример DS18x20_Temperature.pde из библиотеки OneWire.
ROM = 28 A8 3E F9 5 0 0 12 — Адрес датчика на шине в HEX формате.
Chip = DS18B20 — Тип датчика, вычисляется из адреса датчика.
Data = 1 C0 1 4B 46 3F FF 10 10 6F CRC=6F — Данные о температуре в HEX формате.
Temperature = 28.00 Celsius, 82.40 Fahrenheit — Температура в двух системах.
Алгоритм получения данных с датчика:
Получение температуры в примере DS18x20_Temperature.pde, происходит в три этапа.
Первым нужно узнать адрес датчика на шине и подключен ли он вообще,
за это отвечает код выше и функция ds.search(addr), которая, если найдет устройство, положит его адрес в массив addr. Можно эту процедуру опустить, если адрес датчика заранее известен.
Вторым отправляется команда на датчик, чтобы он прочитал температуру и положил данные в регистр.
на это датчику требуется относительно много времени, порядка 750мс.
Третьем даем команду на чтение данных из регистра и в цикле считываем ответ в массив
Пример целиком, на всякий случай
Получать температуру с датчиков библиотекой DallasTemperature можно разными методами, у каждого метода есть свои особенности, но по порядку.
Работа с датчиками по индексу:
Родными примерами из библиотеки пользоваться не будем, разберем упрощенную версию, что ниже. Датчик температуры все также подключен ко входу А1.
Метод не стабилен при работе с несколькими датчиками, ибо если будут проблемы с обнаружением одного из нескольких датчиков на шине, индексы перестроятся и будем получать ошибочные показания. Также такой метод, не всегда имеет смысл использовать при работе с одним датчиком, зачем использовать тяжелую библиотеку, если достаточно одной функции в коде?
Работа с датчиками по ID:
и в данном случаи мы исключаем возможность считать температуру с неправельного датчика, но нужно зарание задать серийный номер. Если задавать его в коде, то устройство будет привязано к конкретному датчику, что осложнит замену датчика при его неисправности.
Еще один пример из видео, работающий по такому принципу ниже. Он отображает полученную температуру с датчика на LCD сшилде.
Работа с ID:
Следом вызываем функцию getAddress(sensor0, 0), в функцию передаем массив sensor0 который в нашем случаи объявлен в 7 строке кода и индекс датчика, адрес которого функция присвоит в sensor0.
Следом, в цикле for отправляем в монитор порта содержимое массива sensor0, в котором должен содержатся серийный номер датчика, если все прошло успешно
В функции setResolution(sensor0, 11) устанавливаем разрешение получаемой с датчика sensor0 температуры по его серийному номеру, может быть 9, 10, 11, 12 бит, данный параметр не влияет на точность датчика.
Зачем нужен этот пример? если с таким же успехом, можно написать ds.getTempCByIndex(0), с одним датчиком так и нужно, а если их много? серийный номер датчика можно записать в EEPROM с привязкой к конкретной задачи, отслеживать получение верных данных с конкретного датчика, все это повышает надежность устройства.
Купить DS18B20:
можно на али, тут, в герметичном исполнении тут.
Видео:
Читайте также: