Простой термометр для дома с двумя датчиками ds18b20

Простой термометр для дома с двумя датчиками DS18B20

Автор – Антон Гаркуша .   Взято с сайта radiokot.ru

Данный проект родился в процессе изучения мной принципов работы интерфейса 1-wire. Для измерения температуры в этом проекте используются широко распространенные датчики фирмы “Dallas Semiconductor” типа DS18B20.

Устройство способно работать с одним или двумя датчиками. Предполагается использование термометра для домашних целей, где один датчик измеряет температуру в комнате, а второй измеряет температуру на улице. Индикация значений температуры осуществляется с помощью знакосинтезирующего ЖКИ дисплея на базе контроллера HD44780 или его аналогов.

При включении устройства на дисплее высвечивается заставка “Start”, которая появляется в виде бегущей строки, затем возможны следующие варианты:
1) если  устройство не обнаружит подключенных датчиков, появится сообщение “NOSIG”;
2) если устройство обнаруживает один датчик, то на дисплее появляется сообщение вида: “T  =,< десятые доли значения температуры>
3) если устройство обнаруживает два датчика, то на дисплее появляется сообщение вида: “T=,< десятые доли значения температуры>”, где k – сигнализирует о том, что идет работа с датчиком в комнате , y– сигнализирует о том, что идет работа с датчиком на улице.

Устройство автоматически определяет 64 разрядный код каждого датчика и различает их по первому несовпадению битов кода при последовательном сравнении, где бит 0 считается у датчика для комнаты, бит 1 считается у датчика для улицы.

Таким образом, достаточно легко определить какой датчик, где должен использоваться при подключении к устройству двух датчиков и, например, искусственном подогревании одного из датчиков.      
Датчики в устройстве работают в 12-битном режиме.

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

   Переключатель SA1 предназначен для переключения датчиков, с которыми ведется информационный обмен. Если переключатель разомкнут, то работа ведется с датчиком в комнате, если замкнут, то с датчиком на улице. При переключении датчиков присутствует инерционность (до 845 мс.), обусловленная проверкой состояния переключателя перед подачей команды измерения.

Переключатель SA2 служит для включения подсветки ЖКИ. Резистором R2 подбирается требуемая яркость. Резистором R3 регулируется контрастность дисплея. В устройстве использован кварц на 10 МГц. Схема работоспособна, если микроконтроллер работает от внутреннего генератора 8 МГц. (При программировании фуз в обоих случаях не забываем установить CKDIV8 в лог. 1, т.е.

отключить деление тактовой частоты на 8)

ЖКИ подойдет любой на контроллере HD44780 или его аналогах. В опытном образце автор использовал однострочный знакосинтезирующий ЖКИ размера 8×1 (BC0801A).

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

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

    Эту статью, как в начале и указал, взял целиком с радиокота,

   От себя хочу просто добавить, что при правильной сборке работает сразу. Правда за неимением применил дисплей на 16 символов, и зелёная подсветка.

 Кого пугает программируемый контроллер, то вот простой способ его запрограммировать пятью проводками при помощи PonyProg. Питание +5 как на схеме я не подавал вот – , всё получится если делать по инструкции и галочки также оставить где требуется.

Источник: http://radio-hobby.org/modules/news/article.php?storyid=744

Электронный термометр с беспроводным датчиком

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

Для измерения температуры я использовал распространенные датчики DS18B20, для отображения показаний применил не менее популярный ЖК дисплей Nokia 5110. Радиомодули и алгоритм передачи данных я рассматривал ранее в статье про передатчик и приемник на 433 МГц

Ниже представлена схема беспроводного датчика на микроконтроллере PIC12F675.

После подачи питания микроконтроллер считывает значение температуры с датчика BK1 и отправляет эти данные на радиопередатчик A1, после чего происходит переход в спящий режим.

Пробуждение микроконтроллера происходит по прерыванию, которое генерируется изменением уровня на линии GP0. К этой линии подключена RC цепочка на элементах R2 и C4, которая выполняют функцию таймера. При выходе из спящего режима на линии GP0 устанавливается низкий логический уровень, тем самым конденсатор C4 разряжается.

Перед уходом в “сон” линия настраивается на вход, конденсатор начинает заряжаться через резистор R4, при достижении порогового напряжения (около 1,2В) происходит прерывание и пробуждение микроконтроллера. При указанных на схеме номиналах R2, C4 период пробуждения составляет примерно 5 минут. Установив перемычку JP1, можно сократить период до 5,5 секунд.

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

Значение температуры по радиоканалу передается в виде пакета из 3-х байт, последний байт представляет собой контрольную сумму первых 2-х байт. Алгоритм передачи данных, который я использую, в принципе позволяет обходиться без контрольной суммы, вероятность приема неправильных данных низкая. Скорость передачи составляет 3,3 Кбит/сек.

Каждый раз после измерения температуры отсылается 3 пакета байтов, пауза между пакетами составляет 10 мс, такой вариант передачи я применил для увеличения надежности получения данных приемником. Это связано с тем, что приемная сторона прерывает прием сигнала на 4-5 мс, во время измерения температуры с внутреннего (домашнего) датчика.

В качестве питания используется батарея 6F22 на 9В (“Крона”), модуль радиопередатчика A1 питается напрямую от батареи.

Для питания микроконтроллера используется микромощный стабилизатор напряжения DA1 (MCP1702) на 5В, собственный ток потребления стабилизатора составляет всего 1-2 мкА, максимальный ток нагрузки до 250 мА. Стабилизатор MCP1702 можно заменить на LP2950, ток потребления которого выше и составляет 75 мкА.

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

Ток потребления устройства в спящем режиме меняется с течением времени по мере заряда конденсатора С4, первые 2,5 минуты потребление составляет 10 мкА, последующие 2,5 минуты ток плавно увеличивается, до момента выхода из спящего режима. Данное явление возникает из-за наличия токов переключения входного буфера микроконтроллера.

Хочу отметить, что при низких температурах емкость батареек уменьшается быстрее, не все типы батареек можно использовать в таких условиях. Лучшими показателями при отрицательных температурах обладают литиевые батарейки, далее следуют Ni-Mh аккумуляторы, щелочные батарейки занимают третью позицию, солевые элементы не пригодны для таких условий.

Ниже представлена схема термометра на микроконтроллере PIC16F628A.

Дисплей HG1, датчик BK1 и микроконтроллер питаются напряжением 3,3В от стабилизатора DA2.

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

Модуль приемника A1 питается от стабилизатора DA1, с выходным напряжением 5В. Резисторы R6, R7 установлены для согласования уровней напряжения.

Микроконтроллер DD1 считывает значение температуры с датчика BK1 каждые 2 секунды, параллельно принимает сигнал с приемника, при получении пакета байтов от передатчика вспыхивает светодиод HL1.

В верхней части дисплея отображается надпись “Дом”, под которой выводится значение температуры с внутреннего (домашнего) датчика, ниже отображается надпись “Улица” и температура, полученная от беспроводного датчика.

После приема данных по радиоканалу, микроконтроллер запускает таймер, который ведет отсчет времени для контроля получения данных. Если данные не были получены за период отсчета таймера, вместо показаний температуры, на дисплее высвечивается символы тире “- — — — -”.

Время отсчета можно задать в пределах 1-15 минут с шагом в одну минуту. Для этого, перед программированием микроконтроллера, необходимо записать число от 1 до 15 в ячейку EEPROM с адресом 0x00. По умолчанию устанавливается период в 7 минут.

При неисправности датчиков BK1, для обоих устройств, вместо значения соответствующей температуры, выводится надпись “ERROR”. Кнопка SB1 управляет подсветкой дисплея, по умолчанию подсветка включена. Кнопка SB2 предназначена для регулировки контрастности дисплея, так как у разных экземпляров она может отличаться.

Для питания устройства подойдет нестабилизированный источник питания с выходным напряжением 8-12В. Оба устройства размещены в пластиковых корпусах. Антенна для радиомодулей выполнена в виде отрезка одножильного провода длиной 17 см (четверть длины волны несущей частоты).

Последние записи:

Источник: http://radiolaba.ru/microcotrollers/termometr-s-besprovodnyim-datchikom.html

BM8037Цифровой термометр с возможностью подключения до 16 датчиков (красный дисплей)

BM8037 – Цифровой термометр с возможностью подключения до 16 датчиков (красный дисплей) купить в Мастер Кит. Драйвер, программы, схема, отзывы, инструкция, своими руками, DIY

BM8037 – Цифровой термометр с возможностью подключения до 16 датчиков (красный дисплей) купить в Мастер Кит. Драйвер, программы, схема, отзывы, инструкция, своими руками, DIY

У нас Вы можете купить Мастер Кит BM8037 – Цифровой термометр с возможностью подключения до 16 датчиков (красный дисплей): цена, фото, DIY, своими руками, технические характеристики и комплектация, отзывы, обзор, инструкция, драйвер, программы, схема

Мастер Кит, BM8037, Цифровой термометр с возможностью подключения до 16 датчиков (красный дисплей), цена, описание, фото, купить, DIY, своими руками, отзывы, обзор, инструкция, доставка, драйвер, программы, схема

https://masterkit.ru/shop/161898

Готовый модуль

1 540

о поступлении на склад

Диапазон напряжений питания (B) 7…12
Диапазон измерения температуры, град.С –55…125
Тип питания постоянный
Потребляемый ток, не более (мА) 150
Количество выходов (шт) 1
Рекомендованная температура эксплуатации (°С) -15…+60
Длина (мм) 87
Ширина (мм) 55
Высота (мм) 18
Вес, не более (г) 150
Количество линий 1-wire (шт) 1
Рекомендованные датчики температуры DS18B20
Количество датчиков на каждую линию 1wire (шт) 16
Вес 86

Инструкции

  • Устройство поставляется в корпусе {item:id=BOX-BM8037,link=y}
  • Цифры дисплея имеют красное свечение.

Центральная часть устройства – микроконтроллер AT89C4051, работающий на частоте 12 МГц и тактируется от керамического резонатора ZTT. Датчики подключаются через разъем XS2 параллельно друг другу. Напряжение питания подключается к разъему XS1.

При включении питания происходит инициализация датчиков и индикация на 1 секунду количества датчиков на шине. Максимально допустимое гарантированное количество датчиков – 16. Датчики могут быть MP18B20, DS18B20, DS18B20+. После инициализация датчиков система начинает показывать максимальные и минимальные температуры, которые регистрировал каждый датчик во время работы.

Эта информация хранится в энергонезависимой памяти и не стирается при выключении питания. После режима показаний минимума и максимума система переходит в основной (рабочий) режим: датчики поочередно, на несколько секунд выдают свою температуру, предварительно на 1 секунду показав свой номер.

После выдачи температуры последнего датчика все начинает повторяться сначала (происходит выход на показание температуры первого датчика).В устройстве имеется 2 кнопки. Первая (левая) кнопка отвечает за сброс статистики максимальных и минимальных значений: при нажатии на данную кнопку в рабочем режиме сбрасываются записанные значения минимума и максимума текущего датчика.

Вторая (правая) кнопка отвечает за быстрое переключение на следующий датчик: при кратковременном нажатии на данную кнопку произойдет переключение на следующий датчик.

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

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

Чтобы вернуться в рабочий режим следует кратковременно нажать вторую кнопку. Особенности:- нумерация датчиков происходит автоматически соответственно тому уникальному серийному номеру, который был присвоен на заводе каждому датчику.Специальные возможности:- датчики могут подключаться и отключаться «на горячую» – то есть во время рабочего режима. Однако нумерация датчиков может претерпеть существенные изменения. Готовый термометр не требует настройки.

Конструкция устройства

Конструктивно цифровой термометр выполнен на двусторонней печатной плате из фольгированного стеклотекстолита, установленный в корпус BOX-KC01. Для удобства подключения питающего напряжения и датчиков температуры, предусмотрены разъемы на плате XS1 и XS2.

Статьи

  • Термометр BM8037 для сауны

Комплект поставки

  • Цифровой термометр в сборе – 1 шт.
  • Штекер NP-107 (стерео) – 1 шт.
  • Штекер NP-117 – 1 шт.
  • Датчик температуры DS18B20 – 2 шт.

Что потребуется для сборки

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

Подготовка к эксплуатации

  • Проверка:
  • Подпаяйте к штекеру идущий в комплекте термодатчик, согласно инструкции.
  • Подключите штекер к блоку.
  • Подайте питание 12В на устройство. Соблюдая полярность.
  • Дождитесь показания температуры на дисплее.
  • Проверка завершена. Приятной эксплуатации.

Условия эксплуатации

  • Температура -30С до +50С.
  • Относительная влажность 20-80% без образования конденсата.

Меры предосторожности

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

Вопросы и ответы

  • Здравствуйте! Приобрел этот прибор в августе 14-го, а вот подключал только сейчас. Проблема – нет показаний индикатора. Питание 9,5 вольт от стабилизатора на КРЕН19-КТ815. Напряжение на DS18B20 4,97 вольт ( на выводе 3, – на выводе 1)

Copyright www.maxx-marketing.net

Источник: https://masterkit.ru/shop/161898

Термометр на PIC16F628A + DS18B20(DS18S20) + LED + коррекция

Термометр на PIC16F628A + DS18B20(DS18S20) + LED + коррекция – статья в которой подробно опишу несложный термометр с коррекцией на микроконтроллере.

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

Что может

Вот что может новый термометр на PIC16F628A:

  1. Измерять и отображать температуру в диапазоне: -55…-10 и +100…+125 с точностью 1 градус(ds18b20 и ds18s20) -в диапазоне -9,9…+99,9 с точностью 0,1 градус(ds18b20)

    -в диапазоне -9,5…+99,5 с точностью 0,5 градус(ds18s20);

  2. Определять какой датчик подключен на линию и, в зависимости от типа датчика, выполнять нужные преобразования;
  3. Проверять датчик на аварию и выводить соответствующие коды ошибок;
  4. Запоминать и выводить на индикатор максимальную и минимальную измеренные температуры;
  5. После включения, на некоторое время, засвечиваются все сегменты и все три разряда индикатора для зрительного определения неисправных сегментов;
  6. Используется щадящая процедура записи в энергонезависимую память. Таймер в 1 минуту. О работе таймера можно узнать по мерцающей точке;
  7. Появилась возможность ручной коррекции показаний термометра. Калибровочная константа сохраняется в EEPROM память;
  8. В архиве имеется дополнительная прошивка с увеличенным периодом опроса датчика. Подобное решение позволяет снизить саморазогрев датчика;
  9. Есть возможность легкой замены индикатора с общим катодом на индикатор с общим анодом.

О схеме

Основные изменения, которые притерепела первоначальная схема:

  1. Полностью изменена принципиальная схема(добавлен узел стабилизатора напряжения на L7805, добавлена вторая кнопка, добавлена цепочка сброса, появился разъем для внутрисхемного программирования. Удален из схемы выносной датчик и кнопка переключения датчиков);
  2. Полностью переделана печатная плата. Переходим на SMD;
  3. Изменена модель в протейсе(в соответствии с новой схемой).

Увидеть новую схему термометра на PIC16F628A с коррекцией можно на рисунке 1.

Рисунок 1 – Схема термометра на PIC16F628A+DS18B20(DS18S20)+LED+коррекция

Схема не сложная и заострять внимание на ней не буду. Единственное на что хотелось бы обратить ваше внимание это переключатель ХР2. Он необходим для возможности замены индикатора с общим катодом(ОК) на индикатор с общим анодом(ОА).

Если планируется использовать индикатор с ОК, то устанавливаем перемычку в нижнее по схеме положение(см. рисунок 1). При этом транзисторы остаются, как на схеме. Для индикатора с ОА устанавливаем перемычку в верхнее по схеме положение(показано пунктиром) и меняем транзисторы на BC846.

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

Таблица 1 – Перечень деталей необходимых для сборки термометра
Позиционное обозначение Наименование Аналог/замена
С1, С4 Конденсатор керамический – 0,1мкФх50В SMD типоразмер 0805
С2 Конденсатор электролитический – 470мкФх25В
С3 Конденсатор электролитический – 1000мкФх10В
DA1 Микросхема L7805 КРЕН 5
DD1 Микроконтроллер PIC16F628A PIC16F648A. Корпус SOIC
DD2 Датчик температуры DS18B20 или DS18S20
HG1 7-ми сегментный LED индикатор KEM-5631-ASR (OK) Любой другой маломощный для динамической индикации и подходящий по подключению.
R1 Резистор 0,125Вт 10 кОм SMD типоразмер 0805
R2 Резистор 0,125Вт 470 Ом
R3,R4 Резистор 0,125Вт 5,1 кОм
R5-R7, R9-R12, R15-R17 Резистор 0,125Вт 330 Ом
R8, R14 Резистор 0,125Вт 5,1 Ом
R13 Резистор 0,125Вт 4,7 кОм
R18-R20 Резистор 0,125Вт 8,2 кОм
SB1, SB2 Кнопка тактовая
VT1-VT3 Транзистор BC856B для индикатора с ОК/ транзистор BC846B для индикатора с ОА Корпус SOT23
XP1 Штекер платный 5 контактов
XP2 Штекер платный 3 контакта

Моделируем

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

Рисунок 2 – Модель термометра(упрощённая) в протеусе.

О печатной плате

Теперь несколько слов о печатной плате. Плата разрабатывалась в P-CAD 2006, совместно с принципиальной схемой. На всех уровнях контролировалось отсутствие ошибок встроенными средствами P-CAD. Конечный результат показан на рисунках 3,4,5. Плата получилась 65х45мм. Если есть желание разработать и прислать свой вариант платы – буду рад разместить.

Платы не в масштабе. Для изготовления плат необходимо использовать заготовки из архива.

Рисунок 3 – Плата печатная термометра на PIC16F628A(вид сверху).

Рисунок 4 – Плата печатная термометра на PIC16F628A(вид снизу).

Рисунок 5 – Плата печатная термометра на PIC16F628A(вид снизу детали).

О прошивке

Осталось немного рассказать о возможностях новой прошивки термометра на PIC16F628A. Так как в схеме используются датчики DS18B20(DS18S20), то диапазон измеряемых температур ограничен их конструктивными особенностями.

Вот почему термометр может измерять температуру от-55 до +125 градусов Цельсия, чего вполне достаточно для домашнего применения! В первоначальную версию прошивки была добавлена функция зрительной проверки сегментов LED индикатора.

Все довольно просто – на некоторое время засвечивается весь LED индикатор, что позволяет выявить нерабочие сегменты.

Кнопка SB1(одиночное нажатие) – проверяем максимальную/ минимальную измеренные температуры. Кнопка SB1(зажимаем) – сбрасываем значения температур, хранимых в памяти. Мерцающая точка – сигнализирует о работе таймера в 1 минуту, перед записью в память.

Напомню, что таймер в 1 минуту необходим для реализации процедуры щадящей записи в EEPROM память. Датчик DS18B20(DS18S20) опрашивается где-то раз в 0,8 секунд для обычной прошивки и раз в 10 сек для прошивки с 10 секундным интервалом. Нажатие на кнопку SB2 – выведет на индикацию текущее значение коррекции.

Теперь, используя кнопки SB1 и SB2, можно установить новое значение, которое может находиться в пределах от -5 до +5 градусов Цельсия. Через 10 секунд после последнего нажатия на любую из кнопок произойдет запись значения коррекции в энергонезависимую память.

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

Er1 – обрыв датчика, сигнальный провод датчика замкнул на «+» питания;

Er2 – сигнальный провод датчика замкнул на «минус» питания.

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

Всем кто пришлет фото собранного устройства на приведенной выше плате – в обратном письме высылаю прошивку без рекламы(фото сюда media собака pichobby.lg.ua. Фотографии должны быть хорошего качества. Лицевая, обратная стороны платы, устройство в работе, можно видео.

Желательно к фотографиям добавить свое ФИО и город. Не стоить пугаться! Ваши данные нужны лишь для добавления авторства к фотографиям).

Вот так работает термометр

Подведем небольшие итоги. В данной статье речь велась о термометре на микроконтроллере PIC16F628A, который умеет работать с датчиками DS18B20 или DS18S20. Термометр может запоминать максимальную и минимальную измеренные температуры.

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

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

Буду рад обсудить термометр в комментариях к статьи. Спасибо за внимание!

Файлы к статье:

Термометр на PIC16F628A+DS18B20(DS18S20)+LED+коррекция(статья)

Архив с проектом (обновлён 29.12.17г.)

Фотографии

Печатная плата в Layout от Валерия

Печатная плата в Layout от Владимира

Источник: https://pichobby.lg.ua/shemu/termometry/item/80-term-na-pic16f628a.html

Работа с датчиком температуры DS18b20. Делаем термометр

Источник: http://AVRproject.ru/publ/kak_podkljuchit/termometr_na_ds18b20_mega32/2-1-0-15

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

Датчик температуры в Arduino — один из самых распространенных видов датчиков. Разработчику проектов с термометрами на Arduino доступно множество разных вариантов, отличающихся по принципу действия, точности, конструктивному исполнению.

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

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

Описание датчика DS18B20 для Arduino

DS18B20 – это цифровой температурный датчик, обладающий множеством полезных функций.

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

Микросхема имеет три выхода, из которых для данных используется только один, два остальных — это земля и питание. Число проводов можно сократить до двух, если использовать схему с паразитным питанием и соединить Vdd с землей. К одному проводу с данными можно подключить сразу несколько датчиков DS18B20 и в плате Ардуино будет задействован всего один пин.

Виды корпусов DS18B20

Температурный датчик DS18B20 имеет разнообразные виды корпуса. Можно выбрать один из трех — 8-Pin SO (150 mils), 8-Pin µSOP, и 3-Pin TO-92.

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

Для корпуса TO-92 нужно смотреть на цвет проводов: черный — земля, красный — питание и белый/желтый/синий — сигнал. В интернет-магазинах можно купить готовый модуль DS18B20.

Основные доступные виды изображены на рисунке ниже.

Особенности цифрового датчика DS18B20

  • Погрешность измерения не больше 0,5 С (для температур от -10С до +85С), что позволяет точно определить значение температуры. Не требуется дополнительная калибровка.
  • Температурный диапазон измерений лежит в пределах от -55 С до +125 С.
  • Датчик питается напряжением от 3,3В до 5В.
  • Можно программно задать максимальную разрешающую способность до 0,0625С, наибольшее разрешение 12 бит.
  • Присутствует функция тревожного сигнала.
  • Каждое устройство обладает своим уникальным серийным кодом.
  • Не требуются дополнительные внешние элементы.
  • Можно подключить сразу до 127 датчиков к одной линии связи.
  • Информация передается по протоколу 1-Wire.
  • Для присоединения к микроконтроллеру нужны только 3 провода.
  • Существует так называемый режим паразитного питания – в нем происходит питание напрямую от линии связи. Для подключения в этом случае нужны только 2 провода. Важно, что в этом режиме не гарантируется корректная работа при температурах выше 100С. Режим паразитного питания удобно обычно применяется для приложений с удаленным температурным датчиком.

Память датчика состоит из двух видов: оперативной и энергонезависимой – SRAM и EEPROM.

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

Основной задачей DS18B20 является определение температуры и преобразование полученного результата в цифровой вид. Мы можем самостоятельно задать необходимое разрешение, установив количество бит точности —  9, 10, 11 и 12. В этих случаях разрешающие способности будут соответственно равны 0,5С, 0,25С, 0,125С и 0,0625С.

Во время включения питания датчик находится в состоянии покоя. Для начала измерения контроллер Ардуино выполняет команду «преобразование температуры». Полученный результат сохранится в 2 байтах регистра температуры, после чего датчик вернется в первоначальное состояние покоя.

Если схема подключена в режиме внешнего питания, микроконтроллер регулирует состояние конвертации. Во время выполнения команды линия находится в низком состоянии, после окончания программы линия переходит в высокое состояние.

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

Полученные температурные измерения сохраняются в SRAM датчика. 1 и 2 байты сохраняют полученное значение температуры, 3 и 4 сохраняют пределы измерения, 5 и 6 зарезервированы, 7 и 8 используются для высокоточного определения температуры, последний 9 байт хранит устойчивый к помехам CRC код.

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

DS18B20 является цифровым датчиком.

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

Коды могут быть самыми разными, ds18b20 работает по протоколу данных 1-Wire. Мы не будем вдаваться в подробности этого цифрового протокола, укажем лишь необходимый минимум для понимания принципов взаимодействия.

Обмен информацией в 1-Wire происходит благодаря следующим операциям:

  • Инициализация – определение последовательности сигналов, с которых начинается измерение и другие операции. Ведущее устройство подает импульс сброса, после этого датчик должен подать импульс присутствия, сообщающий о готовности к выполнению операции.
  • Запись данных – происходит передача байта данных в датчик.
  • Чтение данных – происходит прием байта из датчика.

Для работы с датчиком нам понадобится программное обеспечение:

  • Arduino IDE;
  • Библиотека OneWire, если используется несколько датчиков на шине, можно использовать библиотеку DallasTemperature. Она будет работать поверх OneWire.

Из оборудования понадобятся:

  • Один или несколько датчиков DS18B20;
  • Микроконтроллер Ардуино;
  • Коннекторы;
  • Резистор на 4,7 кОм (в случае подключения одного датчика пойдет резистор номиналом от 4 до 10K);
  • Монтажная плата;
  • USB-кабель для подключения к компьютеру.

К плате Ардуино UNO датчик подключается просто: GND с термодатчика присоединяется к GND Ардуино, Vdd подключается к 5V, Data – к любому цифровому пину.

Простейшая схема подключения цифрового датчика DS18B20 представлена на рисунке.

В режиме паразитного питания контакт Vdd с датчика подключается к GND на Ардуино – в этом случае пригодятся только два провода. Работу в паразитном режиме лучше не использовать без необходимости, так как могут ухудшиться быстродействие и стабильность.

Скетч для DS18B20

Алгоритм получения информации о температуре в скетче состоит из следующих этапов:

  • Определение адреса датчика, проверка его подключения.
  • На датчик подается команда с требованием прочитать температуру и выложить измеренное значение в регистр. Процедура происходит дольше остальных, на нее необходимо примерно 750 мс.
  • Подается команда на чтение информации из регистра и отправка полученного значения в «монитор порта»,
  • Если требуется, то производится конвертация в градусы Цельсия/Фаренгейта.

Пример простого скетча для DS18B20

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

#include
/*
* Описание взаимодействия с цифровым датчиком ds18b20 * Подключение ds18b20 к ардуино через пин 8 */
OneWire ds(8); // Создаем объект OneWire для шины 1-Wire, с помощью которого будет осуществляться работа с датчиком void setup(){ Serial.begin(9600);
} void loop(){ // Определяем температуру от датчика DS18b20 byte data[2]; // Место для значения температуры ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство ds.write(0x44); // Даем датчику DS18b20 команду измерить температуру. Само значение температуры мы еще не получаем – датчик его положит во внутреннюю память delay(1000); // Микросхема измеряет температуру, а мы ждем. ds.reset(); // Теперь готовимся получить значение измеренной температуры ds.write(0xCC); ds.write(0xBE); // Просим передать нам значение регистров со значением температуры // Получаем и считываем ответ data[0] = ds.read(); // Читаем младший байт значения температуры data[1] = ds.read(); // А теперь старший // Формируем итоговое значение: // – сперва “склеиваем” значение, // – затем умножаем его на коэффициент, соответсвующий разрешающей способности (для 12 бит по умолчанию – это 0,0625) float temperature = ((data[1] TEMP_UPDATE_TIME) { lastUpdateTime = millis(); ds.reset(); ds.write(0xCC); ds.write(0xBE); data[0] = ds.read(); data[1] = ds.read(); // Формируем значение temperature = (data[1] > 4; }
}

Библиотека DallasTemperature и DS18b20

В своих скетчах мы можем использовать библиотеку DallasTemperature, упрощающую некоторые аспекты работы с датчиком ds18b20 по 1-Wire. Пример скетча:

#include
#include // Номер пина Arduino с подключенным датчиком
#define PIN_DS18B20 8 // Создаем объект OneWire
OneWire oneWire(PIN_DS18B20); // Создаем объект DallasTemperature для работы с сенсорами, передавая ему ссылку на объект для работы с 1-Wire.
DallasTemperature dallasSensors(&oneWire); // Специальный объект для хранения адреса устройства
DeviceAddress sensorAddress; void setup(void){ Serial.begin(9600); Serial.println(“Пример работы с датчиком температуры ds18b20 с помощью библиотеки DallasTemperature”); // Выполняем поиск устрйоств на линии Serial.print(“Ищем устройства…”); dallasSensors.begin(); Serial.print(“Найдено “); Serial.print(dallasSensors.getDeviceCount(), DEC); Serial.println(” устройств.”); // Определяем режим питания (по отдельной линии или через паразитное питание по линии данных) Serial.print(“Режим паразитного питания: “); if (dallasSensors.isParasitePowerMode()) Serial.println(“ВКЛЮЧЕН”); else Serial.println(“ВЫКЛЮЧЕН”); // Раскомментируйте, если хотите задать адрес устройства вручную //sensorAddress = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 }; // Поиск устройства: // Ищем адрес устройства по порядку (индекс задается вторым параметром функции) if (!dallasSensors.getAddress(sensorAddress, 0)) Serial.println(“Не можем найти первое устройство”); // Второй вариант поиска с помощью библиотеки OnewWire. // Перезапускаем поиск //oneWire.reset_search(); // Находим первое устройство и запоминаем его адрес в sensorAddress //if (!oneWire.search(sensorAddress)) Serial.println(“Unable to find address for sensorAddress”); // Отображаем адрес ds18b20, который мы нашли Serial.print(“Адрес устройства: “); printAddress(sensorAddress); Serial.println(); // Устанавливаем разрешение датчика в 12 бит (мы могли бы установить другие значения, точность уменьшится, но скорость получения данных увеличится dallasSensors.setResolution(sensorAddress, 12); Serial.print(“Разрешение датчика: “); Serial.print(dallasSensors.getResolution(sensorAddress), DEC); Serial.println();
} void loop(void){ // Запрос на измерения датчиком температуры Serial.print(“Измеряем температуру…”); dallasSensors.requestTemperatures(); // Просим ds18b20 собрать данные Serial.println(“Выполнено”); // Запрос на получение сохраненного значения температуры printTemperature(sensorAddress); // Задержка для того, чтобы можно было что-то разобрать на экране delay(1000);
} // Вспомогательная функция печати значения температуры для устрйоства
void printTemperature(DeviceAddress deviceAddress){ float tempC = dallasSensors.getTempC(deviceAddress); Serial.print(“Temp C: “); Serial.println(tempC);
} // Вспомогательная функция для отображения адреса датчика ds18b20
void printAddress(DeviceAddress deviceAddress){ for (uint8_t i = 0; i < 8; i++) { if (deviceAddress[i] < 16) Serial.print("0"); Serial.print(deviceAddress[i], HEX); } }

Библиотека OneWire для работы с DS18B20

DS18B20 использует для обмена информацией с ардуино протокол 1-Wire, для которого уже написана отличная библиотека. Можно и нужно использовать ее, чтобы не реализовывать все функции вручную.

Скачать OneWire можно здесь. Для установки библиотеки скачайте архив, распакуйте в папку library вашего каталога Arduino.

Подключается библиотека с помощью команды #include<\p>

Основные команды библиотеки OneWire:

  • search(addressArray) – ищет температурный датчик, при нахождении в массив addressArray записывается его код, в ином случае – false.
  • reset_search() – производится поиск на первом приборе.
  • reset() – выполнение сброса шины перед тем, как связаться с устройством.
  • select(addressArray) – выбирается устройство после операции сброса, записывается его ROM код.
  • write(byte) – производится запись байта информации на устройство.
  • write(byte, 1) – аналогично write(byte), но в режиме паразитного питания.
  • read() – чтение байта информации с устройства.
  • crc8(dataArray, length) – вычисление CRC кода. dataArray – выбранный массив, length – длина кода.

Важно правильно настроить режим питания в скетче. Для паразитного питания в строке 65 нужно записать ds.write(0x44, 1);. Для внешнего питания в строке 65 должно быть записано ds.write(0x44).

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

  • 0x44 – измерить температуру, записать полученное значение в SRAM.
  • 0x4E – запись 3 байта в третий, четвертый и пятый байты SRAM.
  • 0xBE – последовательное считывание 9 байт SRAM.
  • 0х48 – копирование третьего и четвертого байтов SRAM в EEPROM.
  • 0xB8 – копирование информации из EEPROM в третий и четвертый байты SRAM.
  • 0xB4 – возвращает тип питания (0 – паразитное, 1 – внешнее).

Подключение нескольких датчиков температуры DS18B20 к Ардуино

Все датчики DS18B20 подключаются параллельно, для них всех достаточно одного резистора.  При помощи библиотеки OneWire можно одновременно считать все данные со всех датчиков. Если количество подключаемых датчиков более 10, нужно подобрать резистор с сопротивлением не более 1,6 кОм.

Также для более точного измерения температуры нужно поставить дополнительный резистор на 100…120 Ом между выходом data на плате Ардуино и data на каждом датчике.

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

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

В режиме паразитного питания схема выглядит иначе. Контакт Vdd практически не задействован, питание идет через выход data.

Выводы

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

За дополнительные возможности приходится платить относительной сложностью работы с датчиком. Для подключения нам обязательно понадобится резистор с номиналом около 5К.

Для работы с датчиком в скетчах ардуино нужно установить дополнительную библиотеку и получить определенные навыки для работы с ней — там все не совсем тривиально.

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

Источник: https://ArduinoMaster.ru/datchiki-arduino/arduino-ds18b20/

Термометр на микросхеме DS18B20 для компьютера

   
Простой термометр – приставку к компьютеру можно сделать, используя распространенный и очень удобный в применении цифровой датчик температуры 18B20. Такая приставка подключается к компьютеру через COM порт. COM порт (он же RS232) – это довольно старый интерфейс, но он до сих пор используется во многих промышленных устройствах.

Если на вашем компьютере нет такого разъема, то вы можете использовать дешевый переходник USB – RS232. Такой переходник создает в системе виртуальный COM порт с каким нибудь номером. Купить переходник можно в любом компьютерном магазине, но я советую заказывать его в Китае. Тогда он обойдется вам в разы дешевле, примерно 1 доллар.

 
   

Датчик температуры 18B20 представляет собой микросхему в корпусе TO-92. На первый взгляд его не отличить от обычного транзистора. У датчика всего три вывода. Вывод с номером 1 – это “земля”, питание подключается к выводу 3, а цифровой сигнал температуры снимается с ножки 2.

Микросхема соединяется с ведущим устройством (у нас это будет компьютер) посредством довольно простого протокола, который называется 1-Wire, что переводится с английского как “один провод”. Таким образом информация передается по одному сигнальному проводу.

Но конечно, нам необходимо 3 провода для того, чтобы подключить датчик.

   Весь протокол связи через порт компьютера реализован в маленькой управляющей программе, которую необходимо запустить на компьютере, после подключения к нему нашей приставки. Программу можно скачать по ссылке в конце статьи.    Если приставка собрана правильно, выбран нужный ком-порт и датчик 18B20 исправен, то программа покажет серийный номер датчика и его температуру. Кроме всего прочего, приставку можно использовать для проверки работоспособности датчиков 18B20 перед использованием из в ваших самоделках и для определения уникального кода датчика (его серийного номера). Это иногда бывает нужно, чтобы подключить к микроконтроллеру несколько таких датчиков по одной линии 1-Wire.Схема приставки – термометра для компьютера

Схема представляет собой устройство согласования шины 1-Wire датчика с портом RS232 компьютера. В схеме всего несколько деталей. Функции ключей выполняют два транзистора типа 2N7002. Это очень распространенные и исключительно дешевые MOSFET транзисторы в SMD корпусе.

Эти транзисторы в мире полевиков являются чем-то вроде народного КТ315 в мире советских биполярных транзисторов. Они используются в миллионах радиолюбительских конструкций и в огромном количестве различной промышленной радиоэлектронной техники.

Если вы захотите собрать эту схему на макетной плате из выводных компонентов, то транзисторы 2N7002 можно заменить аналогом в корпусе TO-92, не менее распространенным и легендарным 2N7000. Ссылки на детали я помещу в конце статьи.

Стабилитрон применен выводной, любого типа, на напряжение в районе 5 вольт.

     Печатная плата устройства рассчитана на установку SMD транзисторов и резисторов, и разъема DB9, предназначенного для установки на печатную плату. В качестве панельки для датчика 18B20 используется панелька для 6-выводных микросхем DIP6. Как я уже писал, вы можете использовать все компоненты выводного типа и собрать эту приставку на кусочке макетной платы, как это сделал я с моим первым устройством. Оно до сих пор работает, я применяю его для проверки датчиков 18B20.   Специально для данной статьи я развел печатную плату в программе DipTrace.

    
Скачать проект печатной платы + программу измерения температуры

Контактные данные автора программы находятся в меню самой программы. Я не являюсь автором этой программы, все вопросы по ее работе задавайте ему. Вопросы по печатной плате можете задавать мне в разделе “контакты”, так как плату  разводил я.   Купить датчики DS18B20 в Китае  Купить транзисторы 2N7002 в Китае  

Источник: https://musbench.com/e_digital/ds18b20.html

Термометр с помощью arduino и датчиков LM35 и DS18B20

Я писал недавно статью, где подключал к arduino 4-разрядный 7-сегментный индикатор hs420561k-32, тогда упоминал, что хочу сделать градусник с выводом температуры на этот индикатор, только проблема была в отсутствии датчиков.

И вот наконец-то приехала посылка с недостающими запчастями и можно продолжить проект. Температурных датчиков у меня три штуки – dht11, LM35 и DS18B20.

Но использовать буду только LM35 и DS18B20, поскольку dht11 очень неточный, в даташите написано, что отклонения от реальной температуры составляют плюс-минус два градуса, а так же он работает только с положительной температурой.

Температурный датчик LM35. Подключение к arduino

Первый датчик, который будем использовать – это LM35, использовать его очень просто, тут даже дополнительные библиотеки не требуются, достаточно подключить к нему питание и считать данные на выходе с помощью аналогового пина arduino. LM35 работает с температурами от -55 до 150 градусов Цельсия и если верить даташиту, то погрешность составляет всего плюс-минус 0,25 градуса.

Хоть датчик и обрабатывает до +150 градусов, но считать ардуиной сможем только до +110, хотя и это более чем достаточно для домашнего градусника. Поскольку этот датчик имеет высокую точность, но находится в корпусе TO92, без какой-либо дополнительной защиты, использовать его будем для измерения температуры в помещении.

Официальный мануал arduino рекомендует использовать для снятия показаний этого датчика опорное напряжение 1,1 В. Чтобы настроить arduino подобным образом достаточно использовать команду analogReference(INTERNAL) в функции setup. Далее достаточно просто, с нужным интервалом, считывать напряжение с выходной ножки(OUT) датчика.

LM35 формирует напряжение 10 милливольт на один градус, таким образом имея опорное напряжение в 1,1 В легко обработать, довольно точно, данные.

void setup() { // меняем опорное напряжение на 1.1 В, относительно которого происходят аналоговые измерения analogReference(INTERNAL); } void loop() { reading = analogRead(A0); // LM35 подключен к пину A0 temperature = (1.1 * reading * 100.0) / 1024; // получаем значение в градусах Цельсия }

Ниже на картинке показано, какая нога датчика LM35 за что отвечает.

Температурный датчик DS18B20. Подключение к arduino

Второй датчик, который будет использован – это цифровой DS18B20. Точность в этом случае не на много ниже — плюс-минус 0,5 градуса, а диапазон измерения температуры практически такой же: от -55 до +125 градусов Цельсия.

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

Еще из плюсов сюда можно добавить возможность подключение одновременно до 127 датчиков на один пин ардуино, только я даже предположить не могу, где это может пригодиться :).
Считывать данные с DS18B20 немного сложнее, чем с LM35, для удобства можно воспользоваться библиотекой OneWire.

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

На картинке ниже показано, как подключать датчик DS18B20. Основным моментом является то, что необходимо использовать резистор сопротивлением 4.7 кОм для соединения провода, передающего данные и плюсовым.

Проблема вывода температуры на индикаторе hs420561k-32

Пока я разбирался с каждым датчиком по отдельности, а также когда подключал к arduino 4-х разрядный 7-сегментнтый индикатор, проблем ни каких не было, все прекрасно работало. Но стоило мне собрать все в кучу, на одну макетную плату и собрать код воедино, как сразу появилась серьезная проблема.

Я писал в прошлой статье, что для одновременного вывода данных сразу на 4-х разрядах hs420561k-32 необходимо очень быстро по очереди выводить по одному разряду, тогда создается впечатление одновременного вывода четырех цифр, глаз не успевает уловить смену разрядов.

В связи с таким способом вывода возникла сложность с одновременной работой датчика DS18B20, для его опроса требуется чуть больше секунды времени – в двух участках кода используется delay, который заставляет микроконтроллер ждать, 250 и 1000 миллисекунд.

Сначала я сделал запрос к датчику раз в 30 секунд, но это не решило проблему – два раза в минуту датчик по секунде показывал непонятно что. Поэтому пришлось отказаться от delay и добавить другую аналогичную конструкцию в код, которая будет выполнять определенные куски кода с задержкой, а остальной код будет выполняться без задержек.

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

bool flag = false; // флаг unsigned long previousMillis = 0; // время последнего срабатывания const long interval = 1000; // интервал срабатывания кода, задержка. void setup() { // } void loop() { // получаем время в миллисекундах, которое прошло // с момента начала работы МК unsigned long currentMillis = millis(); // проверяем сколько прошло врмени if (currentMillis – previousMillis >= interval) { // если прошло нужное количество миллисекунд, // то записываем в переменную количество прошедшего времени previousMillis = currentMillis; // меняем положение флага, // это может быть вкл и выкл светодиода, например flag = !flag; } }

Что использовалось в проекте:

Скетч уличного и комнатного термометра на arduino

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

#include // библиотека для работы с датчиком DS18B20 OneWire ds(10); // подключаем уличный датчик к 10 пину //Пин подключен к SH_CP входу 74HC595 int clockPin = 6; //Пин подключен к ST_CP входу 74HC595 int latchPin = 7; //Пин подключен к DS входу 74HC595 int dataPin = 8; int tempHomePin = A0; // градусник в помещении // Пины разрядов цифер int pins_numbers[4] = {2, 3, 4, 5}; // Биты для отображения цифер от 0-9, минуса и символ градуса Цельсия byte numbers_array[22] = { B00111111, B00000110, B01011011, B01001111, // 0 1 2 3 B01100110, B01101101, B01111101, B00000111, // 4 5 6 7 B01111111, B01101111, B01000000, B01100011, // 8 9 – о // цифры с точкой внизу (+12 к индексу элемента) B10111111, B10000110, B11011011, B11001111, // 0 1 2 3 B11100110, B11101101, B11111101, B10000111, // 4 5 6 7 B11111111, B11101111 // 8 9 }; int cel_celsius = 0; // переменная для хранения градусов на улице float tempHome = 0; // переменная для хранения градусов в помещении const long tempInterval = 3000; // интервал запроса актуальной температуры unsigned long previousMillis = 0; // время предыдущего запроса unsigned long previousMillis_delay = 0; // хранения последней даты срабатывания, для второй задержки bool startQuery = false; // флаг, для обозначения начала запроса температуры bool firstQuery = true; // флаг первого запуска, при котором получаем температуру без задержек bool showhome = true; // флаг, который указывают какую температуру показывать – комнату или улицу int sec_show = 5000; // интервал смены отображения погоды unsigned long showhomeMillis_delay = 0; // хранения последней переключения градусников // функция для вывода чисел на индикаторе void showNumber(int numNumber, int number){ // зажигаем нужные сегменты digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, numbers_array[number]); digitalWrite(latchPin, HIGH); // включаем нужный разряд(одну из четырех цифр) int num_razryad = pins_numbers[numNumber-1]; for(int i; i= tempInterval) || startQuery || firstQuery) { previousMillis = currentMillis; // читаем данные от датчика на улицы if ( !ds.search(addr)) { ds.reset_search(); //delay(250); return; } // если ни чего не получили или получили не понятные данные if (OneWire::crc8(addr, 7) != addr[7]) { return; } // читаем первый байт и определяем тип датчика switch (addr[0]) { case 0x10: // DS18S20 type_s = 1; break; case 0x28: // DS18B20 type_s = 0; break; case 0x22: // DS1822 type_s = 0; break; default: return; } // делаем запрос на получение данных от датчика ds.reset(); ds.select(addr); ds.write(0x44); // ждем startQuery = true; // delay(1000); if ( currentMillis – previousMillis_delay >= 1000 ) { previousMillis_delay = currentMillis; }else{ return; } startQuery = false; // и получаем ответ present = ds.reset(); ds.select(addr); ds.write(0xBE); // берем только первые 9 байт for ( i = 0; i < 9; i++) { data[i] = ds.read(); } // данные приходят в битах, переводим их в десятичное число int16_t raw = (data[1]

Источник: https://vk-book.ru/termometr-s-pomoshhyu-arduino-datchikov-lm35-ds18b20/

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}
");let k=document.querySelector(".flat_pm_modal[data-id-modal=\""+a.ID+"\"]");if(-1===d.indexOf("go"+"oglesyndication")?flatPM_setHTML(k,d):jQuery(k).html(b+d),"px"==a.how.popup.px_s)e.bind(h,()=>{e.scrollTop()>a.how.popup.after&&(e.unbind(h),f.unbind(i),j())}),void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&f.bind(i,()=>{e.unbind(h),f.unbind(i),j()});else{let b=setTimeout(()=>{f.unbind(i),j()},1e3*a.how.popup.after);void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&f.bind(i,()=>{clearTimeout(b),f.unbind(i),j()})}f.on("click",".flat_pm_modal .flat_pm_crs",()=>{jQuery.arcticmodal("close")})}if(void 0!==a.how.outgoing){let b,c="0"==a.how.outgoing.indent?"":" style=\"bottom:"+a.how.outgoing.indent+"px\"",e="true"==a.how.outgoing.cross?"":"",f=jQuery(window),g="scroll.out"+a.ID,h=void 0===flatPM_getCookie("flat_out_"+a.ID+"_mb")||"false"!=flatPM_getCookie("flat_out_"+a.ID+"_mb"),i=document.createElement("div"),j=jQuery("body"),k=()=>{void 0!==a.how.outgoing.cookie&&"false"==a.how.outgoing.cookie&&h&&(jQuery(".flat_pm_out[data-id-out=\""+a.ID+"\"]").addClass("show"),j.on("click",".flat_pm_out[data-id-out=\""+a.ID+"\"] .flat_pm_crs",function(){flatPM_setCookie("flat_out_"+a.ID+"_mb",!1)})),(void 0===a.how.outgoing.cookie||"false"!=a.how.outgoing.cookie)&&jQuery(".flat_pm_out[data-id-out=\""+a.ID+"\"]").addClass("show")};switch(a.how.outgoing.whence){case"1":b="top";break;case"2":b="bottom";break;case"3":b="left";break;case"4":b="right";}jQuery("body > *").eq(0).before("
"+e+"
");let m=document.querySelector(".flat_pm_out[data-id-out=\""+a.ID+"\"]");-1===d.indexOf("go"+"oglesyndication")?flatPM_setHTML(m,d):jQuery(m).html(e+d),"px"==a.how.outgoing.px_s?f.bind(g,()=>{f.scrollTop()>a.how.outgoing.after&&(f.unbind(g),k())}):setTimeout(()=>{k()},1e3*a.how.outgoing.after),j.on("click",".flat_pm_out .flat_pm_crs",function(){jQuery(this).parent().removeClass("show").addClass("closed")})}countMode&&(flat_count["block_"+a.ID]={},flat_count["block_"+a.ID].count=1,flat_count["block_"+a.ID].click=0,flat_count["block_"+a.ID].id=a.ID)}catch(a){console.warn(a)}}function flatPM_start(){let a=flat_pm_arr.length;if(0==a)return flat_pm_arr=[],void jQuery(".flat_pm_start, .flat_pm_end").remove();flat_body=flat_body||jQuery("body"),!flat_counter&&countMode&&(flat_counter=!0,flat_body.on("click","[data-flat-id]",function(){let a=jQuery(this),b=a.attr("data-flat-id");flat_count["block_"+b].click++}),flat_body.on("mouseenter","[data-flat-id] iframe",function(){let a=jQuery(this),b=a.closest("[data-flat-id]").attr("data-flat-id");flat_iframe=b}).on("mouseleave","[data-flat-id] iframe",function(){flat_iframe=-1}),jQuery(window).on("beforeunload",()=>{jQuery.isEmptyObject(flat_count)||jQuery.ajax({async:!1,type:"POST",url:ajaxUrlFlatPM,dataType:"json",data:{action:"flat_pm_ajax",data_me:{method:"flat_pm_block_counter",arr:flat_count}}})}).on("blur",()=>{-1!=flat_iframe&&flat_count["block_"+flat_iframe].click++})),flat_userVars.init();for(let b=0;bflat_userVars.textlen||void 0!==a.chapter_sub&&a.chapter_subflat_userVars.titlelen||void 0!==a.title_sub&&a.title_subc&&cc&&c>d&&(b=flatPM_addDays(b,-1)),b>e||cd||c-1!=flat_userVars.referer.indexOf(a))||void 0!==a.referer.referer_disabled&&-1!=a.referer.referer_disabled.findIndex(a=>-1!=flat_userVars.referer.indexOf(a)))&&(c=!0),c||void 0===a.browser||(void 0===a.browser.browser_enabled||-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser))&&(void 0===a.browser.browser_disabled||-1==a.browser.browser_disabled.indexOf(flat_userVars.browser)))){if(c&&void 0!==a.browser&&void 0!==a.browser.browser_enabled&&-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser)&&(c=!1),!c&&(void 0!==a.geo||void 0!==a.role)&&(""==flat_userVars.ccode||""==flat_userVars.country||""==flat_userVars.city||""==flat_userVars.role)){flat_pm_then.push(a),flatPM_setWrap(a),flat_body.hasClass("flat_pm_block_geo_role")||(flat_body.addClass("flat_pm_block_geo_role"),flatPM_ajax("flat_pm_block_geo_role")),c=!0}c||(flatPM_setWrap(a),flatPM_next(a))}}}let b=jQuery(".flatPM_sticky");b.each(function(){let a=jQuery(this),b=a.data("height")||350,c=a.data("top");a.wrap("
");let d=a.parent()[0];flatPM_sticky(this,d,c)}),debugMode||countMode||jQuery("[data-flat-id]:not([data-id-out]):not([data-id-modal])").contents().unwrap(),flat_pm_arr=[],jQuery(".flat_pm_start, .flat_pm_end").remove()}

  Для измерения температуры в бытовых целях хорошо подходят цифровые датчики DS18B20. Эти датчики способны измерять температуру в пределах от -55 до 125 °C, с заявленной точностью от производителя в 0,5 °C.

Для большинства гражданских нужд такой диапазон и такая точность измерения вполне приемлема (какую-нибудь систему термоконтроля собрать или еще чего). Поэтому решил попрактиковаться с этим датчиком, обязательно пригодится.

 Работает датчик по однопроводному интерфейсу 1-Wire. Здесь я описывать этот протокол не буду, так как информации и так достаточно. Отличное описание работы интерфейса 1-wire и методика работы с датчиком ds18b20 можно почитать на http://samou4ka.net/

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

Если длина сигнального провода увеличивается, необходимо снижать сопротивление подтягивающего резистора.

Читал о том, что датчик соединяли с МК проводом длинной 90 метров, для исправной работы датчика сопротивление резистора составило 3к. 

  У себя для освоения работы с датчиком использовал микроконтроллер Atmega32 и выводил показания на двухстрочный алфавитно-цифровой ЖКИ. 

  Что касается программной части, в Bascom-AVR имеется библиотека работы с протоколом 1-Wire. Ее и задействуем. В программе полученные результаты с датчика немного корректируются, иначе при отрицательных температурах результат будет ложным на 1 градус, и нулевая температура выводится без знака.

$regfile = “m32def.dat”
$crystal = 1000000          ' 1 MHz

 '*** Конфигурируем ЖКИ

Config Lcd = 16 * 2
Config Lcdpin = Pin, Rs=Portc.5, E=Portc.4, Db4=Portc.0, Db5=Portc.1, Db6=Portc.2, Db7 = Portc.3

 ' ***Конфигурируем однопроводную шину

Config 1wire = Portb.7

 ' *** Заводим переменные

Dim Byte0 As Byte

Dim Byte1 As Byte
Dim Sign As String * 1
Dim T As Byte
Dim T1 As Byte
Dim T2 As Byte

Cls

Cursor Off  

 '***ОСНОВНАЯ ПРОГРАММА

Do                         ' начало цикла

1wreset

If Err = 1 Then            'если при опросе небыло ответа ставим флаг ошибки

Cls

Rem датчик

Rem не подключен
Lcd ” гaїАёє ”             ' выводим надпись об отсутствии датчика
Locate 2 , 1
Lcd ” Ѕe ѕoгє»ЖАeЅ”

Wait 1

Else                       ' иначе, если ошибки не было, продолжаем опрос датчика

1wwrite &HCC               ' Выдаем команду чтения ПЗУ

1wwrite &H44               ' Запуск измерения

Waitms 750                 ' Ждем окончания преобразования

1wreset

1wwrite &HCC
1wwrite &HBE               ' Команда чтения ОЗУ датчика

Byte0 = 1wread()           ' Читаем нулевой байт

Byte1 = 1wread()           ' Читаем первый байт

If Byte1 > 248 Then        ' Проверка на отрицательность температуры

Byte0 = &HFF – Byte0
Byte1 = &HFF – Byte1
Sign = “-“

Else

Sign = “+”
End If

T1 = Byte0 / 16           ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)

T2 = Byte1 * 16           ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)

T1 = T1 + T2              ' Формируем результат для вывода на дисплей

 ' *** Коррекция полученных значений

If Sign = “-” Then        ' для корректного вывода отрицательных температур

 T1 = T1 + 1
End If

If Sign = “+” And T1 = 0 Then     ' убираем знак “+” с нулевой температуры

 Sign = ” “
End If

Cls

' *** Выводим результат на дисплей

Rem Температура

Lcd ” Teјѕepaїypa”                ' тут пишем что измеряем

Locate 2 , 6

Lcd Sign ; T1 ;                   ' выводим знак и температуру на дисплей
Locate 2 , 9

Lcd Chr(223) ; “C”                ' Сhr(223) – символ “градус”

Cursor Off

End If

Wait 1                            ' ждем 1 секундy

Loop                              ' повторяем цикл

End

  Датчик не подключен, выводится соответствующее сообщение:

  А это с подключенным датчиком, при комнатной температуре:

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

Скачать