Рубрики
Проекты на ESP32

Подключение датчика DS18B20 к ESP32 с помощью ESP-IDF

В данной статье мы рассмотрим подключение датчика температуры DS18B20 к ESP32 с помощью библиотеки ESP-IDF. Будет кратко описано устройство датчика DS18B20, его распиновка, подключение к плате ESP32, а также будет показана настройка проекта в VS Code с расширением ESP-IDF для сбора данных с датчика и их отображения как на консоли, так и на OLED-дисплее SSD1306.

Также ранее на нашем сайте мы рассматривали подключение датчика температуры DS18B20 к другим микроконтроллерам и платам:

Датчик DS18B20

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

В таблице ниже приведены некоторые ключевые характеристики датчика.

Рабочее напряжение 3-5 В
Диапазон температур от -55°C до +125°C
Точность ±0,5°C
Разрешение выходного сигнала 9-12 бит

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

Нормальный датчик DS18B20

Водонепроницаемый датчик DS18B20

Модуль DS18B20

Обратите внимание, что все три варианта датчика имеют три вывода: два вывода питания (VCC и GND) и один вывод данных.

VCC Это вывод питания датчика. Напряжение питания 3,3-5 В.
Data Контакт Data соединен с контактом GPIO микроконтроллера, который затем будет выводить показания датчика.
Ground Общий провод (земля)

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

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

Для подключения платы ESP32 к датчику DS18B20 нам понадобятся следующие компоненты.

  1. Плата ESP32.
  2. Датчик DS18B20.
  3. Подтягивающий резистор 4,7 кОм.
  4. Соединительные провода.
  5. Макетная плата.

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

В таблице ниже показано подключение трех контактов датчика DS18B20 к плате ESP32.

DS18B20 ESP32
VCC 3.3V / Vin
Data GPIO4
GND GND

Подключите вывод VCC датчика к выводу 3,3 В или Vin платы ESP32 и соедините заземление обоих устройств. Кроме того, подключите вывод данных датчика к соответствующему выводу GPIO платы ESP32, который можно настроить как выходной вывод. Обратите внимание, что выводы GPIO34-39 являются только входными и не могут использоваться для управления однопроводной шиной. Мы используем GPIO4 для подключения к выводу данных через подтягивающий резистор 4,7 кОм. Один конец резистора будет подключен к выходу данных, а другой — к источнику питания.

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

Следуйте приведенной ниже принципиальной схеме, чтобы соединить два устройства.

Измерение показаний DS18B20 с помощью ESP32 и ESP-IDF

Мы создадим проект в VS Code с расширением ESP-IDF. Код будет считывать количество датчиков DS18B20, подключенных к шине OneWire, и выводить показания температуры каждую секунду.

Создание примера проекта

Скачайте код в виде ZIP-архива по следующей ссылке.

Нажмите Code > Download ZIP. Затем распакуйте все файлы. Теперь откройте VS Code, перейдите в меню File > Open Folder и выберите папку с распакованными файлами, чтобы открыть её в VS Code с расширением ESP-IDF. 

Это откроет проект во вкладке EXPLORER («Проводник»). Внутри папки нашего проекта находится несколько папок.

Для начала добавим необходимые заголовочные файлы для библиотек, требуемых для этого проекта. Откройте две папки, esp32-ds18b20 и esp32-owb , в папке components и добавьте необходимые файлы.

  1. В папку esp32-ds18b20 добавьте файлы, доступные по этой  ссылке. Это совместимая с ESP32 библиотека на языке C для цифрового термометра Maxim Integrated DS18B20 с программируемым разрешением и однопроводным подключением.
  2. В папку esp32-owb добавьте все файлы, доступные по этой ссылке. Это драйвер шины Maxim One Wire для ESP32.

Настройки MenuConfig в ESP-IDF для работы с DS18B20

Для начала перейдем к  menuconfig. Откройте редактор конфигурации ESP-IDF SDK. Прокрутите вниз и откройте  конфигурацию esp32-ds18b20-example. Здесь мы можем задать номер однопроводного GPIO, который будет использоваться для подключения к выводу данных датчика. По умолчанию он установлен как GPIO4, что нас вполне устраивает. Также есть возможность включить сильную подтяжку через GPIO. Если вы хотите внести какие-либо изменения в конфигурацию, вы можете сделать это и затем нажать кнопку «Сохранить», расположенную вверху. Мы оставим настройки по умолчанию.

Код ESP32 для отображения показаний DS18B20

Теперь перейдите к файлу app_main.c. В папке main находится исходный код, то есть файл main.c будет расположен именно там. Перейдите в папку  main > app_main.c  и откройте его. Откроется следующий код.

Как работает код?

Для начала мы подключим необходимые для этого проекта библиотеки. Сюда входят библиотека логирования ESP, библиотека DS18B20, драйвер шины OneWire и библиотеки FreeRTOS.

Следующие переменные определяют некоторые параметры, включая количество однопроводных GPIO, максимальное количество устройств, разрешение датчика и период времени между измерениями. Используются все значения по умолчанию.

Внутри функции app_main() мы сначала создадим однопроводную шину через драйвер временного слота RMT. Здесь OneWireBus — это структура, которая хранит параметры однопроводной шины для одного экземпляра. owb_rmt_driver_info содержит информацию о драйвере RMT. Затем мы инициализируем драйвер RMT, вызывая функцию owb_rmt_initialize(). Эта функция принимает четыре параметра: указатель на структуру owb_rmt_driver_info, номер однопроводного GPIO, канал RMT для передачи и канал RMT для приема. Наконец, мы включаем проверку CRC для кода ПЗУ, используя функцию owb_use_crc() и указывая в качестве первого параметра результат функции owb_rmt_initialize(), а в качестве второго параметра — значение ‘true’.

Следующий шаг — найти все подключенные устройства к однопроводной шине и вывести их номера вместе с кодом ПЗУ на консоль. В нашем случае к однопроводной шине подключен только один датчик, поэтому количество устройств на экране будет равно 1.

Далее следует условие if-else для проверки количества устройств: одно устройство или несколько. Если присутствует только одно устройство, оно будет выведено на консоль вместе с его ПЗУ-кодом.

Однако, если присутствует несколько устройств, вы можете выполнить поиск конкретного устройства по его ПЗУ, чтобы проверить, присутствует оно или нет.

После определения количества устройств мы создадим устройства DS18B20 на однопроводной шине в соответствии с этим количеством. В случае подключения одного устройства будет включена оптимизация для одного устройства, и датчик будет инициализирован с помощью функции ds18b20_init_solo(). В противном случае, если подключено несколько устройств, будет вызвана функция ds18b20_init() для инициализации датчиков в соответствии с кодами ПЗУ устройств. Кроме того, будет включена проверка CRC для всех операций чтения, а также будет установлено разрешение.

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

После этого показания температуры считываются с датчика после одновременного выполнения преобразований на всех устройствах. Функция ds18b20_read_temp() используется для считывания последнего показания температуры с датчика. Эта функция принимает два параметра: первый — указатель на экземпляр информации об устройстве, а второй — указатель на измеренное значение в градусах Цельсия, возвращаемое устройством. Она возвращает DS18B20_OK, если все прошло успешно, в противном случае генерируется ошибка. Эта функция вызывается внутри цикла for, который будет выполняться для всего количества присутствующих устройств. После считывания всех показаний температуры значения выводятся на консоль в градусах Цельсия вместе с количеством ошибок, если таковые имеются. Показания будут получаться каждую секунду. Если датчик DS18B20 не найден, на консоль будет выведено соответствующее сообщение.

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

Компиляция скетча

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

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

Отображение показаний с датчика DS18B20 на OLED-дисплее

Теперь давайте создадим ещё один проект, в котором мы запрограммируем нашу плату ESP32 для сбора показаний датчика DS18B20 и отображения их на 0,96-дюймовом OLED-дисплее SSD1306.

Создание проекта

 

 

 

статья в разработке

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *