Nev-terminal.ru

Строительный журнал
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Как подключить датчик температуры к микроконтроллеру

Датчик температуры 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Копирование в EEPROMTh, 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(), которая бы находила минимальную длительность (в условных единицах) одного бита-нуля в обрабатываемом пакете.

голоса
Рейтинг статьи
Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector