Как подключить датчик температуры к микроконтроллеру
Подключение датчика температуры DS18B20 к ESP8266
Для того чтобы в помещении было комфортно, а в теплице вырос хороший урожай, нужно правильно выбирать и поддерживать температуру воздуха. Датчик DS18B20 – хорошее решение для определения температуры окружающей среды.
Что такое температура воздуха?
Это одна из характеристик воздуха, изменяющаяся в зависимости от скорости движений молекул, из которых он состоит: температура растет по мере увеличения скорости и уменьшается при ее снижении.
Для измерения этого показателя существует порядка 12 видов шкал. Чаще всего применяют три из них:
- Градусы Кельвина (°К). Здесь нулю соответствует показатель абсолютного нуля, при котором движение молекул останавливается (-273,15 °С), поэтому все значения получаются со знаком «+». Этот метод применяется в метеорологии.
- Шкалу Цельсия (°С). Раньше в ней за ноль градусов был принят показатель, при котором тает лед, а ориентиром для значения в 100 °С считался момент закипания воды. Одна сотая разницы между ними соответствовала 1 °С. Сейчас эта шкала является производной от шкалы Кельвина и за ноль принимают 273,15 К, а 100 °С определяют как 373,15 К. Разница в 1 °С и 1 К одинакова, следовательно и значение градуса в этих системах эквивалентно.
- Градусы Фаренгейта (°F), где 1 °F приблизительно равен 1/180 разницы между температурой, при которой тает лед (+32 °F) и кипит вода (212 °F). Эта шкала применяется в США и еще в некоторых государствах.
Помимо этих шкал есть градусы Ремера, Ранкина, Делиля или Гука. Эти меры применяются редко, потому что у них специальное предназначение. Некоторые из них уже устарели.
Датчик DS18B20
DS18B20 — это популярный цифровой датчик по измерению температуры. Изготавливается в разных вариациях корпуса, особенно интересен во влагозащищённом корпусе, который значительно расширяет область применения датчика. Применяется в различных системах мониторинга температуры или узлах оборудования. Диапазон измерения температуры составляет от -55 до +125 градусов Цельсия. Погрешность датчика составляет 0.5 градуса. Датчик подключается по 1WIRE шине, поэтому возможно подключения нескольких датчиков на один пин.
Подключение датчика
Подключите датчики согласно схеме ниже. Для этого подсоединяем питание 5V и GND, подтягиваем питание к ПИН D3 через резистор 4.7 кОм и подключаем ногу DATA датчика. При подключении влагозащищенного датчика: красный – питание, черный – земля, а желтый/белый/синий – сигнал (DATA).
Подключение нескольких датчиков
Подключение библиотеки
Для работы с датчиком DS18B20 добавим в Arduino IDE библиотеку. Открываем менеджер библиотек и находим библиотеку DallasTemperature by Miles Burton, Tem Newsome, Guil Barros, Rob Tillaart.
Скетч
Монитор порта (консоль)
Загружаем скетч выше на плату и открываем «Монитор порта».
Digitrode
цифровая электроника вычислительная техника встраиваемые системы
-
Вычислительная техника
- Микроконтроллеры микропроцессоры
- ПЛИС
- Мини-ПК
- Силовая электроника
- Датчики
- Интерфейсы
-
Теория
- Программирование
- ТАУ и ЦОС
-
Перспективные технологии
- 3D печать
- Робототехника
- Искусственный интеллект
- Криптовалюты
Чтение RSS
ESP32 и датчик температуры и влажности DHT11
Микроконтроллер ESP32 со встроенными функциями беспроводной связи сегодня широко используется во многих радиолюбительских проектах благодаря своей универсальности и низкой цене.
Во многих проектах домашней автоматизации необходимо измерять температуру и влажность. Для этого хорошо подходят датчики вроде DHT11 и DHT22. Поэтому в данном примере мы рассмотрим, как подключить к ESP32 датчик DHT11 и запрограммировать микроконтроллер на работу с ним.
Нам понадобятся две библиотеки. Сначала установите их (если у вас их нет):
- https://github.com/adafruit/Adafruit_Sensor
- https://github.com/adafruit/DHT-sensor-library
Датчик DHT22 более современный, чувствительный к измеряемым параметрам, но более дорогой. DHT11 – это широко используемый недорогой модуль. Если вы недавно приобрели какой-либо датчик температуры и влажности DHT11, вам будет казаться, что у него много контактов, поскольку он покрыт внушительным корпусом. Если вы откроете его (не нужно для работы, но для дополнительного образования), вы найдете внутри печатную плату с датчиком влажности резистивного типа, термистором с отрицательным температурным коэффициентом для измерения температуры и 8-разрядным микроконтроллером. Слева направо контакты датчика:
- VCC – для соединения с 5 В микроконтроллера
- Data – соединить с цифровым входом микроконтроллера
- NC – не нужно ничего делать
- GND – соединить с GND микроконтроллера
По сути, у нас есть один вывод данных для нашей реальной потребности, очевидно, что вывод питания пойдет к линии 3V (датчик сможет работать с 3В), а другой – к GND. Второй вывод, который является выходом данных, нуждается в некотором рабочем напряжении. Добавление резистора 220 Ом к 3 В ESP32 и добавление его к выводу данных обеспечит нормальную работу. Схема подключения ESP32 и DHT11 показана далее. На ней мы подключили вывод данных к контакту 15 платы ESP32.
Далее приведен код программы взаимодействия ESP32 и датчика DHT11 в среде Arduino IDE.
AVR Урок 20. Подключаем датчик температуры DS18B20. Часть 1
Урок 20
Подключаем датчик температуры DS18B20
Продолжаем изучать датчики компании DALLAS.
И сегодняшним представителем будет DS18B20, который является датчиком температуры.
Измеряет температуру данный датчик в градусах по цельсию. Измерения могут быть как 9-битной дискретности, так и 12-битной.
Распределяются данные биты следующим образом.
Мы будем измерять температуру в 12-битном виде и самые младшие 4 бита будут хранить показания долей градуса, а остальные старшие 8 – сами градусы.
Подключается данный датчик по однопроводной технологии (1-wire).
Диапазон измерений – от -55 0 C до +125 0 C, но наивысшая точность показаний достигается в диапазоне от -10 0 C до +85 0 C/
Погрешность данного датчика – 0,5 градуса, поэтому нам нет смысла использовать все младшие биты и мы их будем просто отсекать.
Режим 1-wire у нас не организован аппаратно в контроллере, поэтому мы будем весь протокол программировать.
Чем удобен для нас данный датчик? Удобен он тем, что мы можем его в часовой модуль, использованный на прошлых занятиях просто впаять и использовать. Для этого на модуле выведен отдельный контакт. У датчика всего 3 ножки. 2 из них ножки питания и одна – ножка данных.
Данный датчик существует в двух видах корпуса – Dip и TO-92. Мы будем использовать второй тип.
Таких датчиков, как пишут, на 1 провод можно повесить несколько, но я не пробовал.
В связи с этим у каждого датчика есть уникальный 64-битный код, записанный в его ROM, записанного постредством лазерных технологий.
Но, так как мы будем использовать только один датчик, то мы будем к нему обращаться другим способом, не используя ROM.
Мы подаём на датчик команду 44h последовательным кодом, тем самым заставляя датчик конвертировать температуру.
Посмотрим регистры, в которых хранится значение температуры после преобразования
В четырех младших битах младшего регистра хранятся доли градусов, в четырех старших, а также в трех младших битах старшего регистра – целые значения градусов.
В остальных битах – знак. Если 0, то плюс, если 1 – то минус.
Также в технической документации написано, что нужно обязательно подтянуть резистор на информационную ножку датчика к питанию.
Также написан ряд временных и других характеристик, которые мы уже будем рассматривать по мере того, как будем писать код.
Проект был создан новый и назван My1820LCD, все файлы проекта прошлого занятия MyClock1307LCD были вставлены в проект, а код главного модуля также был скопирован в главный модуль нового проекта. Всё это сделано потому, что мы работаем с тем же модулем, просто мы также впаяли туда датчик температуры, а время мы считывать не перестанем, пусть часы также ходят.
Добавим ещё файлы DS18B20.c и DS18B20.h для созадния библиотеки работы именно с датчиком температуры и заголовочный файл также подключим в main.h по нашему обыкновению, ну и его же подключим в одноименный c-файл.
Сначала создадим функцию конвертирования температуры в файле DS18B20.c. Надобность данной функции обусловлена тем, что датчик нам передаёт показания в двух байтах в определённом виде, рассмотренном нами выше, который без преобразования будет непонятен
//функция преобразования показаний датчика в температуру
int dt_check ( void )
Создадим две переменных, которые нам пригодятся в дальнейшем в теле нашей функции
int dt_check ( void )
unsigned char bt ; //переменная для считывания байта
unsigned int tt =0;
Сразу сделаем прототип нашей функции в заголовочном файле
int dt_check ( void ); //функция преобразования показаний датчика в температуру
Чтобы нам дальше писать тело функции, нам будет нужна ещё функция. Напишем её выше, чтобы не создавать прототип. Данная функция будет узнавать, есть ли датчик на шине
//функция определения датчика на шине
char dt_testdevice ( void ) //dt – digital termomether | определим, есть ли устройство на шине
Теперь, прежде чем писать тело данной функции, самое время посмотреть схему подключения датчика к контроллера. Посмотрим опять же упрощённый вариант в протеусе (нажмите на картинку для увеличения изображения)
Мы видим, что датчик своим информационным портом подключен к ножке порта МК PD1, также мы видим подтягивающее сопротивление на 4,7 килоом с данного провода на шину питания.
И вот теперь на данной ножке мы должны как-то иммитировать определённые имплуьсы. То есть мы как-то должны инициализировать то ноль, то единицу. Делать мы это сможем благодаря тому, что у нас есть подтягивающий резистор. Мы будем её то отпускать от общей шины, то притягивать к ней. Соответственно, когда мы её отпустим, то через резистор на ней окажется высокий уровень, а когда подтянем к земле, то низкий.
Теперь вопрос, как это всё сделать. А сделать это можно вполне с помощью определённого бита регистра DDRB, который отвечает, как мы знаем, за направление работы определённых ножек порта. Но мы воспользуемся тем, что когда мы объявляем ножку на выход, она у нас притягивается к земле, понятно что при условии, что соответствующий бит регистра PORTD будет также нулём. А если мы уже в соответствующий бит регистра DDRB записываем значение, при котором соответствующая этому биту ножка объявится на вход, то, соответственно, от общей шины она. ясное дело отпустится, иначе как контроллер определит её состояние. Ну и, как и было написано выше, на этой ножке засчет подтягивающего резистора установится высокий логический уровень.
Также, начиная процесс обмена с датчиком, мы должны запретить прерывания, чтобы не получить искаженных данных. Также, прежде чем запретить прерывания, нам необходимо сохранить регистр статуса контроллера, или стек. Это регистр SREG. Поэтому в самом начале тела нашей функции проверки присутствии датчика на шине мы это и сделаем, сохранив его в определённую переменную, ну и затем уже запретим прерывания
char dt_testdevice ( void ) //dt – digital termomether | определим, есть ли устройство на шине
char stektemp =SREG; // сохраним значение стека
cli (); //запрещаем прерывания
Дальнейшую работу с датчиком мы продолжим в следующей части нашего занятия.
Программатор, датчик температуры DS18B20 на плате и дисплей можно приобрести здесь:
Смотреть ВИДЕОУРОК (нажмите на картинку)
Подключение нескольких разнородных датчиков к микроконтроллеру
Если пофантазировать, то с точки зрения разработчика электронной аппаратуры идеальным вариантом для системы сбора данных было бы применение одного, но универсального цифрового датчика. Подал на него команду — и получил в ответ значение освещённости, температуры, напряжения, тока, мощности и т.д.
На практике большинство современных датчиков однофункциональные. Они добросовестно выполняют только одну поставленную перед ними задачу. Если требуется провести комплексное исследование характеристик объекта или компенсировать температурный уход параметров, то применяют несколько разных датчиков (Рис. 3.79, а, б).
Рис. 3.79. Схемы подключения нескольких датчиков к МК:
а) совместное использование газового датчика А1 (фирма Figaro Engineering) и температурного датчика R3, которые подключаются к двум разным каналам АЦП. Термистор R3 находится вблизи датчика А1 или непосредственно крепится на его корпусе. Информация о температуре нужна для коррекции показаний газового датчика, чтобы повысить точность. В программе МК надо учитывать время 20. 60 с для начального самопрогрева датчика при протекании тока через выводы 1, 4, иначе показания будут неправильными. Аналогичная схемотехника используется для газовых датчиков TGS2611 (метан), TGS2610 (пропан), TGS822 (пары алкоголя);
б) фото и термодатчики RI, R4, а также трёхвыводной стабилитрон VD1 включаются в работу только при ВЫСОКОМ уровне на выходе МК (для экономии энергии). Питание обоих датчиков осуществляется стабильным напряжением +2.49 В, которое регулируется резистором R8 и одновременно служит опорным напряжением для АЦП МК.
Хорошо, если в МК имеются свободные линии портов и лишние незадейство-ванные каналы АЦП. Но если ресурсы в системе исчерпаны, то необходимо знать стандартные приёмы подключения к одному входу МК нескольких датчиков одновременно (Рис. 3.80, а. д).
Рис. 3.80. Схемы подключения нескольких датчиков к одному входу МК (начало):
а) комбинированный датчик DA1 (фирма Sensirion) одновременно измеряет температуру окружающей среды —40. + 120°С (точность 14 бит) и влажность О. ЮО% (точность 12 бит). Возможные замены DAI — SHT15 или SHT11 с другой цоколёвкой выводов;
Рис. 3.80. Схемы подключения нескольких датчиков к одному входу МК (окончание):
б) съём информации с датчика температуры R1 и с датчика освещённости R2 проводится стандартным методом через аналоговый компаратор МК (формирование «пилы» и подсчёт времени до пересечения порога срабатывания). Реле К1 по сигналу от МК переключает датчики. Контакты реле К 1.1 следует подключить так, чтобы при ВЫСОКОМ уровне на «верхнем» выходе МК активным был тот датчик, с которого чаще требуется снимать показания (экономится ток через реле при закрытом транзисторе VT1). Оба датчика можно отключить НИЗКИМ уровнем, выставляемым на «нижнем» выходе МК;
в) термодатчик R1 и фотодатчик R2 поочерёдно подключаются к АЦП сигналами ВЫСОКОГО уровня с выходов МК. Для устранения взаимовлияния датчиков противоположный выход синхронно переводится в режим входа с большим сопротивлением (высокоимпедансное Z-состояние);
г) универсальная схема генератора, позволяющая изменять частоту выходных импульсов путём подстройки сразу двух элементов: R1 и C1. Частота генератора определяется по приближённой формуле: /^[кГц] = 490000/(/?,[кОм]С,[пФ]), следовательно, МК может измерить частоту импульсов Fv и дальше определить сопротивление резистивного датчика R1 при известном C1 или определить ёмкость датчика C1 при известном Rl
д) в светлое время суток фотодиод BL1 имеет низкое сопротивление, из-за чего на выводе 1 триггера Шмитта DD1 устанавливается НИЗКИЙ, а на входе МК — ВЫСОКИЙ уровень. В такой ситуации геркон SF1 оказывается как бы отключённым от системы. В тёмное время суток сопротивление фотодиода BL1 становится большим, на выводе 1 микросхемы DD1 появляется ВЫСОКИЙ уровень, после чего МК может принимать сигналы замыкания/размыкания от геркона SF1.
Источник: Рюмик С.М. 1000 и одна микроконтроллерная схема.
Простая схема для подключения 1-Wire датчика температуры к микроконтроллеру
Устройства, индикацирующие температуру и устройства, использующие данные о температуре вызывают широкий интерес. Есть множество приложений для таких устройств с множеством возможных решений, каждое из которых имеет свои преимущества и недостатки.
В статье мы рассмотрим схему интерфейса для датчика температуры, которая обеспечивает высокую точность, занимая при этом малую плошадь на печатной плате. Кроме того, рассмотрим некоторые моменты в программном коде и предоставим примеры кода, которые могут быть адаптированы пользователями под свои нужды.
Простая схема, которую мы рассмотрим, позволяет подключать датчик температуры с интерфейсом 1-Wire DS18S20 к микроконтроллеру компании Cypress CY8C26443. Однако, по данной технологии, при минимальной модификации схемы и программного кода, можно подключить любое устройство 1-Wire. Микроконтроллер может быть любым, но автор выбрал программируемую систему-на-кристалле (PSoC), поскольку она обеспечивает гибкость в плане выбора и реализации аппаратных блоков на кристалле. Кроме того, система-на-кристалле предоставляет интерфейс программирования приложений (API), поэтому новички смогут легко освоить работу с ней.
Ассортимент 1-Wire устройств очень широк: датчики температуры, память, устройства идентификации, устройства смешанных сигналов. Обмен данными и питание устройств осуществляется по одному проводу. Они просты в подключении и используются там, где требуется минимальная сложность соединений.
В качестве температурного сенсора был выбран цифровой датчик температуры DS18S20 (DS18B20). Это оптимальный выбор, т.к. он дешев и обеспечивает точность измерений 0.5 °C, но проект в целом предоставляет точность 1 °C из-за погрешности измерения и аппаратных ограничений. Сенсор поддерживает режим паразитного питания, имеет программируемый порог температуры и работает в диапазоне от –55 °C до +125 °C. При некоторой доработке программного кода и аппаратной части интерфейса подключения датчик сможет работать на удалении нескольких метров от микроконтроллера.
При использовании датчика DS18B20 в корпусе TO-92, вывод 1 подключается к «земле», вывод 2 – вывод с открытым стоком интерфейса 1-Wire для ввода/вывода данных и питания, вывод 3 – питание или, в режиме паразитного питания, он подключается к «земле». Для датчика в корпусе SO-8 для поверхностного монтажа, соответствующие выводы это 5, 4 и 3, остальные выводы остаются не подключенными. На Рисунке 1 показана схема подключения датчика к микроконтроллеру CY8C26443. В данном случае не используется режим паразитного питания.
Рисунок 1. | Хотя на схеме изображено подключение 1-Wire датчика DS18S20 к микроконтроллеру CY8C26443, разработчики могут легко адаптировать ее для подключения любых 1-Wire устройств к любому микроконтроллеру. |
В этом варианте схемы датчик подключается непосредственно к микроконтроллеру, т.е. расположен на печатной плате так, как если бы датчик был частью микроконтроллера. Размер платы предполагает, что паразитные связи незначительны и не влияют на сигнал.
Используя программируемую систему-на-кристалле, пользователь может создать экземпляр 1-Wire модуля для обмена данными или же написать свой собственный протокол. Создание экземпляра модуля снижает программную нагрузку, однако автор решил написать свой протокол. Поскольку это привело к увеличению кода, автор старался избежать использования двухпортового вывода, который необходим для модуля PSoC при обмене данными между микроконтроллером с датчиком.
Схема очень простая. Диод CR2 защищает сенсор от скачков напряжения. Резистор R12 в обычном режиме работы не используется. В режиме паразитного питания резистор R12 используется, а резистор R11 и конденсатор С8 исключаются из схемы. Микросхема U2 MAX1232 является внешним сторожевым таймером для микроконтроллера. По линии STROBE микроконтроллер регулярной сбрасывает сторожевой таймер.
Блоки кода для схемы интерфейса доступны для скачивания в секции загрузок. Интегрированная среда разработки доступна для сайте компании Cypress.
Если необходимо использовать датчик температуры на удалении от микроконтроллера, то необходимо использовать схему интерфейса, изображенную на Рисунке 2. Дополнительные элементы схемы гарантируют обеспечение достаточного втекающего и вытекающего тока, поэтому характеристики тайм-слотов протокола 1-Wire сохраняются неизменными.
Рисунок 2. | За счет использования дополнительных компонентов, которые обеспечивают достаточный втекающий и вытекающий ток для поддержания тайм-слотов в требуемых пределах, датчик температуры можно использовать на расстоянии до нескольких метров от микроконтроллера. |
Датчик температуры преобразовывает и хранит цифровые данные в двух регистрах (Рисунок 3). По большому счету, разрешение выходных данных составляет 9 бит. Младший байт хранит данные о температуре, старший байт хранит знак измерений. В случае, если знак отрицательный (0xFF), данные в младшем бате дополняются до двух. Бит 0 в младшем байте представляет десятичное значение температуры: 0.5 °С для логической 1 и 0 °С для логического 0. В программном коде необходимо учитывать этот момент, чтобы избежать ошибочных измерений.
Рисунок 3. | Датчик хранит данные о температуре в двух регистрах. Младший байт хранит данные о температуре, старший байт хранит знак измерений. |
Также датчик имеет два байта энергонезависимой памяти (EEPROM) — регистры TH и TL, которые представляют собой температурные пороги, с которыми сравниваются старшие 8 бит каждого измеренного значения температуры. С помощью специальной команды можно организовать сигнализацию выхода температуры за установленные пределы (Рисунок 4). Разрешение регистров TH и TL 8 бит, в отличие от 9-битного регистра преобразования температуры.
Рисунок 4. | Если потребуется в приложении, можно использовать регистры EEPROM датчика температуры для хранения пороговых уровней температуры, что позволяет организовать сигнализацию о выходе температуры за заданные параметры. |
Общая карта памяти датчика DS18S20 — блокнотная память (ОЗУ) и энергонезависимая память (регистры TH и TL) — изображена на Рисунке 5. Если функция сигнализации не требуется в приложении, то регистры TH и TL могут служить областью энергонезависимой памяти общего назначения.
Рисунок 5. | Помимо энергонезависимой памяти (EEPROM) датчик температуры DS18S20 имеет блокнотную память (ОЗУ). |
Значение температуры с разрешением более 9 бит может быть вычислено с использованием данных из регистров ОЗУ датчика: регистры данных о температуре (9 битное разрешение), регистр COUNT REMAIN (значение, оставшееся в счетчике в конце измерения), регистр COUNT PER C (количество импульсов на один градус для данной температуры).
Данные подставляются в следующую формулу:
Загрузки
Схема на Рисунке 1 в PDF — скачать
Схема на Рисунке 2 в PDF — скачать
Исходный код программы микроконтроллера — скачать
Перевод: Vadim по заказу РадиоЛоцман