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

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

Представляем датчик температуры DS18B20

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

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

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

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

  • Связь по 1-проводной шине.
  • Диапазон рабочих температур: от -55ºC до 125ºC,
  • Точность +/- 0,5 ºC (в диапазоне от -10ºC до 85ºC).

Слева направо: первый вывод - GND, второй - данные, а самый правый - VCC.

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

  • Плата ESP32
  • Датчик температуры DS18B20 (в данном примере мы используем 3 датчика).
  • Резистор 4,7 кОм
  • Провода.

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

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

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

Существует дополнение для Arduino IDE, которое позволяет программировать ESP32 с использованием Arduino IDE и его языка программирования.

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

Перед загрузкой кода вам необходимо установить две библиотеки в среде Arduino. Библиотека OneWire и библиотека для работы с температурой. Выполните следующие шаги, чтобы установить эти библиотеки.


 

Библиотека OneWire

  1. Нажмите здесь, чтобы загрузить библиотеку OneWire.
  2. Разархивируйте папку .zip. 
  3. Переименуйте папку из OneWire-master в OneWire.
  4. Переместите папку OneWire в папку с библиотеками установки 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(15);  //data wire connected to GPIO15

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

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);
  }
}

 

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

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

  • Датчик 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

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

 

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

/*
 * 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);
}

Откройте Serial Monitor со скоростью 115200 бод, и вы должны получить что-то подобное.

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

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

#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);

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

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

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

 

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

Restricted HTML

  • Допустимые HTML-теги: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Строки и абзацы переносятся автоматически.
  • Адреса веб-страниц и email-адреса преобразовываются в ссылки автоматически.
CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.