Как подключить датчик температуры к микроконтроллеру
Датчик температуры DS18B20: подключение, программирование
Подключение датчика DS18B20 к микроконтроллеру
Программирование работы микроконтроллера с датчиком DS18B20
В двух предыдущих статьях мы рассмотрели устройство датчика температуры DS18B20 и систему команд датчика. В этой статье мы рассмотрим схему подключения одного или нескольких датчиков к микроконтроллеру и программирование работы МК с датчиком (датчиками) по шине 1-Wire с внешним питанием
Общее описания датчика DS18B20
DS18B20 – это датчик температуры, который обладает разрешением преобразования от 9 до 12 разрядов. Тревожный сигнал – функция, которая позволяет качественно контролировать температуру жидкости. Большинство параметров контроля задаются самостоятельно, пользователем. Они сохраняются в памяти и могут быть перенастроены в будущем. Датчик ds18b20 использует протокол интерфейса 1-Wire для обмена данными.
Линия данных может стать непосредственным передатчиком энергии для ds18b20. В таком случае можно не пользоваться внешними источниками. Так называемое – паразитное питание. Каждая выпущенная модель изготовляется со своим уникальным кодом. Он имеет длину в 64 разряда, поэтому сразу несколько датчиков могут работать одновременно, на одной линии связи. Один порт может выступать обменщиком данных сразу для двух датчиков.
Датчик может измерять температуру в достаточно широком диапазоне, от -55 до +125 градусов по Цельсию. Погрешность минимальна и зачастую составляет максимум полградуса. Вышеописанные характеристики делают датчки популярным для использования в экологическом контроле, мониторинге температурных перемен в зданиях, а также в узлах оборудования.
Подключение датчика давления
Часто в деле предсказания погоды или определения высоты подъёма над уровнем моря требуется решить задачу измерения давления. Здесь на помощь приходят электронные барометры на технологии МЭМС: тензорометрический или пьезорезизстивный метод, связанный с переменностью сопротивления прибора при приложении деформирующих материал сил.
Наиболее популярен датчик BMP085; помимо барометрического давления он регистрирует и температуру. Ему на смену выпустили BMP180, он обладает теми же характеристиками:
- Чувствительность в диапазоне: 300-1100 гПа (если в метрах — 9000 — 500 м над уровнем моря );
- Разрешение : 0,03 гПа или 0,25 м;
- Рабочая температура датчика -40 +85°C, точность измерения в указанном диапазоне — ±2°C;
- Подключение по стандарту i2c;
- V1 использует 3.3 В для питания и логики;
- V2 использует 3.3-5 В для питания и логики.
Подключение датчиков к Ардуино в этом случае стандартно. Понадобится Unified Sensor Driver — его обновлённая версия обеспечивает более высокую точность показаний; кроме того, позволяет работать с несколькими разными подключёнными датчиками давления одновременно. Необходимо также установить Adafrut_Sensor library.
Скетч для DS18B20
Алгоритм получения информации о температуре в скетче состоит из следующих этапов:
- Определение адреса датчика, проверка его подключения.
- На датчик подается команда с требованием прочитать температуру и выложить измеренное значение в регистр. Процедура происходит дольше остальных, на нее необходимо примерно 750 мс.
- Подается команда на чтение информации из регистра и отправка полученного значения в «монитор порта»,
- Если требуется, то производится конвертация в градусы Цельсия/Фаренгейта.
Пример простого скетча для DS18B20
Самый простой скетч для работы с цифровым датчиком выглядит следующим образом. (в скетче мы используем библиотеку OneWire, о которой поговорим подробнее чуть позже).
Скетч для работы с датчиком ds18b20 без delay
Можно немного усложнить программу для ds18b20, чтобы избавиться от функции delay(), тормозящей выполнение скетча.
Библиотека DallasTemperature и DS18b20
В своих скетчах мы можем использовать библиотеку DallasTemperature, упрощающую некоторые аспекты работы с датчиком ds18b20 по 1-Wire. Пример скетча:
Функциональные команды
Все это хорошо, но теперь нужно разобраться с самими функциональными командами сенсора.
Функциональная команда [hex] | Название | Действие |
---|---|---|
BE | Читать память датчика | После получения команды, сенсор выгружает на шину передачи данных 9 байт состояния своей памяти |
4E | Записать параметры и регистры | Контролер, отправивший эту команду следом должен отослать 3 байта – Th, Tl и значение регистра конфигурации |
48 | Копирование в EEPROM | Th, Tl и конфигурация помещаются из оперативной памяти в энергонезависимую, откуда они будут восстановлены после перезагрузки |
B8 | Сброс | |
B4 | Опрос питания |
Функциональная команда [hex]НазваниеДействиеBEЧитать память датчикаПосле получения команды, сенсор выгружает на шину передачи данных 9 байт состояния своей памяти4EЗаписать параметры и регистрыКонтролер, отправивший эту команду следом должен отослать 3 байта – Th, Tl и значение регистра конфигурации48Копирование в EEPROMTh, Tl и конфигурация помещаются из оперативной памяти в энергонезависимую, откуда они будут восстановлены после перезагрузкиB8Сброс
B4Опрос питания
Оперирование термометром DS18B20
Так как Ардуино с сенсором нагрева работает по цифровой шине передачи информации 1-Wire, нужно включить в текст скетча библиотеку обслуживающую настоящий протокол. Скачать ее последнюю версию можно на GitHub по адресу:
Скетч, использующий только настоящую библиотеку:
Все приведенное можно упростить, вызывая функции библиотеки DallasTemperature, которая находится аналогично первой на GitHub. Ее адрес:
Перед тем, как писать скетч, использующий возможности OneWire в связке с DallasTemperature, требуется определить адреса всех конечных устройств единой шины. Для этого в составе библиотечного кода есть пример Multipe, который при своем выполнении выводит уникальные идентификационные коды всех сенсоров температуры DS18 расположенных на шине. Используя полученные данные, и подключив настоящую библиотеку, не трудно получать их показания уже для своего кода:
5 Работа с датчиком DHT11 без библиотеки
Теперь мы знаем достаточно для того чтобы написать собственную программу для работы с сенсором температуры и влажности DHT11 без использования сторонних библиотек. Напишем скетч, который будет опрашивать раз в секунду датчик и выводить в последовательный порт компьютера принятый пакет и данные о температуре, влажности, а также проверочный байт. На 13-ую ножку Arduino выведем контрольный сигнал и, подключившись в ней логическим анализатором, проверим, что мы верно считываем информацию от датчика.
Скетч для работы с DHT11 и Arduino без сторонних библиотек (разворачивается)
Небольшая таблица даст дополнительные разъяснения к предлагаемому решению.
Функция | Назначение | Комментарий |
---|---|---|
initLink() | Посылает импульс инициализации обмена с DHT11. | В режиме INPUT цифровые выводы Arduino находятся в состоянии «1». Мы переводим их в режим OUTPUT и на 15 мс опускаем в «0», что служит сигналом начала обмена для датчика DHT11. |
readSerialDHT11() | Читает данные датчика DHT11 и записывает в массив. | Постоянно опрашиваем состояние линии DATA, записываем принятые данные в массив (до верхней границы массива), выводим для проверки на 13-ый пин Arduino принятые данные (это нужно было мне для отладки, в «чистовом» коде этот кусок можно убрать). |
processDht11Data() | Обрабатывает массив данных, принятых за один цикл (один пакет). | По передним фронтам принятых импульсов фиксируем факт пришедшего нового бита и считаем в условных единицах его длительность. По длительности оцениваем – это бит-единица или бит-ноль (в некоторых заданных пределах). Составляем пакет из 41 бита. |
getHumidTemperatureParity() | Получает данные о влажности, температуре из пакета. | Выделяем из 41 бита пакета данные о влажности, температуре и контрольную сумму. |
resetVals() | Сбрасывает переменные в исходное состояние. | При расширении программы здесь могут появиться ещё переменные, требующие сброса. |
Вот так будет выглядеть временная диаграмма. Здесь A – это сигнал в шине DATA датчика DHT11, B – считываемый сигнал.
Временная диаграмма информационного обмена DHT11 с Arduino (A) и считанные контрольные значения на выводе 13 (B)
Видно, что мы считываем данные с небольшой задержкой. Кроме того, мы начинаем читать данные с ответного сигнала и пропускаем запросный сигнал. В программе этот первый импульс мы не учитываем, т.к. он не относится непосредственно к данным. В выводе монитора COM-порта мы можем наблюдать аналогичную картину: длинная строка единиц и нулей – это наши пакеты, и видно, что все они начинаются с единичного бита, т.к. мы считываем пакеты, начиная с ответного бита.
Принятые и расшифрованные данные сенсора DHT11 в мониторе COM-порта
Что мы не учли в этой программе, так это то, что минимальная длительность импульса бита-нуля может изменяться в некоторых пределах, а мы жёстко задали её значение в коде. По хорошему нужно ещё написать функцию getMinimalBitLen(), которая бы находила минимальную длительность (в условных единицах) одного бита-нуля в обрабатываемом пакете.