ESP32 с несколькими датчиками температуры DS18B20

В этом руководстве показано, как считывать температуру с нескольких датчиков температуры DS18B20 с помощью ESP32, используя Arduino IDE. Мы покажем вам, как подключить датчики на одну шину данных к ESP32, установить необходимые библиотеки и предоставим пример скетча, который вы можете использовать в своих проектах. Это руководство также совместимо с ESP8266 и платами Arduino.

ESP32 с несколькими датчиками температуры DS18B20

Если вы хотите создать веб-сервер, отображающий показания с нескольких датчиков, следуйте следующему руководству: ESP32 Plot Sensor Readings in Charts (Multiple DS18B20 Sensors)

Вам также могут быть полезны другие руководства по DS18B20:

Знакомство с датчиком температуры DS18B20

Датчик температуры DS18B20 — это цифровой датчик температуры с интерфейсом 1-Wire. Каждый датчик имеет уникальный 64-битный серийный номер, что означает, что вы можете использовать множество датчиков на одной шине данных (то есть множество датчиков, подключённых к одному GPIO). Это особенно полезно для проектов регистрации данных и контроля температуры. DS18B20 — отличный датчик, потому что он дешёвый, точный и очень простой в использовании.

На следующем рисунке показан датчик температуры DS18B20.

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

Примечание: также существует водонепроницаемая версия датчика температуры DS18B20.

Вот основные характеристики датчика температуры DS18B20:

  • Связь по шине 1-Wire

  • Диапазон рабочих температур: от -55°C до 125°C

  • Точность +/-0,5°C (в диапазоне от -10°C до 85°C)

Слева направо: первый вывод — GND, второй — данные (data), а крайний правый вывод — VCC.

Где купить датчик температуры DS18B20?

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

Подключение нескольких датчиков DS18B20

Вот список компонентов, необходимых для данного примера:

Необходимые компоненты

Вы можете использовать приведённые выше ссылки или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все необходимые компоненты для ваших проектов по лучшей цене!

При подключении датчика температуры DS18B20 необходимо добавить резистор 4,7 кОм между VCC и линией данных. На следующей схеме показан пример подключения трёх датчиков (при необходимости вы можете добавить больше датчиков).

Схема подключения нескольких DS18B20 к ESP32

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

Подготовка Arduino IDE

Существует дополнение для Arduino IDE, которое позволяет программировать ESP32 с помощью Arduino IDE и его языка программирования. Следуйте одному из следующих руководств, чтобы подготовить вашу Arduino IDE для работы с ESP32, если вы ещё этого не сделали.

Установка библиотек

Перед загрузкой кода вам необходимо установить две библиотеки в Arduino IDE. Библиотеку OneWire от Paul Stoffregen и библиотеку Dallas Temperature. Следуйте инструкциям ниже для установки этих библиотек.

Библиотека OneWire

  1. Нажмите здесь, чтобы скачать библиотеку OneWire. У вас должен появиться .zip файл в папке загрузок.

  2. Распакуйте .zip файл, и вы должны получить папку OneWire-master.

  3. Переименуйте папку из OneWire-master в OneWire.

  4. Переместите папку OneWire в папку libraries вашей установки Arduino IDE.

  5. Перезапустите Arduino IDE.

Библиотека Dallas Temperature

  1. Нажмите здесь, чтобы скачать библиотеку DallasTemperature. У вас должен появиться .zip файл в папке загрузок.

  2. Распакуйте .zip файл, и вы должны получить папку Arduino-Temperature-Control-Library-master.

  3. Переименуйте папку из Arduino-Temperature-Control-Library-master в DallasTemperature.

  4. Переместите папку DallasTemperature в папку libraries вашей установки Arduino IDE.

  5. Перезапустите Arduino IDE.

Получение адреса датчика DS18B20

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

Загрузите следующий код на ESP32. Убедитесь, что вы выбрали правильную плату и COM-порт.

/*
 * Rui Santos
 * Complete Project Details https://randomnerdtutorials.com
 */

#include <OneWire.h>

// Based on the OneWire library example

OneWire ds(4);  //data wire connected to GPIO 4

void setup(void) {
  Serial.begin(115200);
}

void loop(void) {
  byte i;
  byte addr[8];

  if (!ds.search(addr)) {
    Serial.println(" No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
  Serial.print(" ROM =");
  for (i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }
}

Посмотреть исходный код

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

Адреса датчиков DS18B20 в мониторе последовательного порта

Снимите галочку с опции «Autoscroll», чтобы вы могли скопировать адреса. В нашем случае мы получили следующие адреса:

  • Датчик 1: 28 FF 77 62 40 17 4 31

  • Датчик 2: 28 FF B4 6 33 17 3 4B

  • Датчик 3: 28 FF A0 11 33 17 3 96

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

Получение температуры с нескольких датчиков на одной общей шине данных очень просто.

Собранная схема с несколькими DS18B20 и ESP32

Приведённый ниже пример кода считывает температуру в градусах Цельсия и Фаренгейта с каждого датчика и выводит результаты в монитор последовательного порта.

/*
 * Rui Santos
 * Complete Project Details https://randomnerdtutorials.com
 */

// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is connected to GPIO15
#define ONE_WIRE_BUS 15
// Setup a oneWire instance to communicate with a OneWire device
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature sensors(&oneWire);

DeviceAddress sensor1 = { 0x28, 0xFF, 0x77, 0x62, 0x40, 0x17, 0x4, 0x31 };
DeviceAddress sensor2 = { 0x28, 0xFF, 0xB4, 0x6, 0x33, 0x17, 0x3, 0x4B };
DeviceAddress sensor3= { 0x28, 0xFF, 0xA0, 0x11, 0x33, 0x17, 0x3, 0x96 };

void setup(void){
  Serial.begin(115200);
  sensors.begin();
}

void loop(void){
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");

  Serial.print("Sensor 1(*C): ");
  Serial.print(sensors.getTempC(sensor1));
  Serial.print(" Sensor 1(*F): ");
  Serial.println(sensors.getTempF(sensor1));

  Serial.print("Sensor 2(*C): ");
  Serial.print(sensors.getTempC(sensor2));
  Serial.print(" Sensor 2(*F): ");
  Serial.println(sensors.getTempF(sensor2));

  Serial.print("Sensor 3(*C): ");
  Serial.print(sensors.getTempC(sensor3));
  Serial.print(" Sensor 3(*F): ");
  Serial.println(sensors.getTempF(sensor3));

  delay(2000);
}

Посмотреть исходный код

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

Показания температуры с нескольких DS18B20 в мониторе последовательного порта

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

Сначала подключаем необходимые библиотеки:

#include <OneWire.h>
#include <DallasTemperature.h>

Создаём экземпляры, необходимые для датчика температуры. Датчик температуры подключён к GPIO 15.

// Data wire is connected to ESP32 GPIO15
#define ONE_WIRE_BUS 15
// Setup a oneWire instance to communicate with a OneWire device
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature sensors(&oneWire);

Запускаем библиотеку Dallas Temperature для датчика DS18B20.

sensors.begin();

Затем вводим адреса, которые вы нашли ранее, для каждого датчика температуры. В нашем случае у нас следующие адреса:

DeviceAddress sensor1 = { 0x28, 0xFF, 0x77, 0x62, 0x40, 0x17, 0x4, 0x31 };
DeviceAddress sensor2 = { 0x28, 0xFF, 0xB4, 0x6, 0x33, 0x17, 0x3, 0x4B };
DeviceAddress sensor3= { 0x28, 0xFF, 0xA0, 0x11, 0x33, 0x17, 0x3, 0x96 };

В функции setup() инициализируем последовательную связь и запускаем библиотеку Dallas Temperature для датчика DS18B20.

void setup(void){
  Serial.begin(115200);
  sensors.begin();
}

В функции loop() запрашиваем температуру в градусах Цельсия и Фаренгейта и выводим результаты в монитор последовательного порта.

Сначала вам нужно запросить температуру, используя следующую строку кода:

sensors.requestTemperatures(); // Send the command to get temperatures

Затем вы можете запросить температуру, используя адрес датчика:

  • sensors.getTempC(SENSOR_ADDRESS) – запрашивает температуру в градусах Цельсия

  • sensors.getTempF(SENSOR_ADDRESS) – запрашивает температуру в градусах Фаренгейта

Например, чтобы запросить температуру в градусах Цельсия для датчика 1, используйте:

sensors.getTempC(sensor1)

Где sensor1 — это переменная, которая содержит адрес первого датчика.

Это простой пример скетча, который показывает, как получать температуру с нескольких датчиков DS18B20, используя ESP32. Этот код также совместим с ESP8266 и платами Arduino.

Дальнейшее развитие

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

Вы также можете публиковать показания через MQTT в Node-RED и отображать данные на графиках. У нас есть руководство на эту тему по следующей ссылке:

Мы надеемся, что это руководство было вам полезно. Если вам нравится ESP32 и вы хотите узнать больше, мы рекомендуем записаться на курс Learn ESP32 with Arduino IDE.

Спасибо за чтение.


Источник: ESP32 with Multiple DS18B20 Temperature Sensors