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

Это руководство показывает, как использовать датчик температуры DS18B20 с платой Arduino. Вы узнаете, как подключить датчик, установить необходимые библиотеки и получить температуру с одного или нескольких датчиков DS18B20.

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

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

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

Датчик температуры DS18B20 — это цифровой датчик температуры с интерфейсом one-wire (однопроводной). Это означает, что для связи с Arduino ему требуется только одна линия данных (и GND).

Он может питаться от внешнего источника питания, или может получать питание от линии данных (так называемый «паразитный режим»), что устраняет необходимость во внешнем источнике питания.

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

В следующей таблице показано, как подключить датчик DS18B20 к плате Arduino:

DS18B20

Arduino

GND

GND

DQ

Любой цифровой пин (с подтягивающим резистором 4,7 кОм)

VDD

5V (нормальный режим) или GND (паразитный режим)

Каждый датчик температуры DS18B20 имеет уникальный 64-битный серийный код. Это позволяет подключить несколько датчиков к одной линии данных. Таким образом, вы можете получать температуру с нескольких датчиков, используя всего один цифровой пин Arduino.

Датчик температуры DS18B20 также доступен в водонепроницаемой версии.

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

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

  • Связь по однопроводной шине (one-wire bus communication)

  • Диапазон напряжения питания: от 3,0 В до 5,5 В

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

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

Для получения дополнительной информации ознакомьтесь с даташитом DS18B20.

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

Чтобы показать вам, как работает датчик, мы соберём простой пример, который считывает температуру с датчика DS18B20 с помощью Arduino и отображает значения в мониторе порта Arduino.

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

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

Схема подключения

Датчик может работать в двух режимах:

  • Нормальный режим: требуется 3-проводное подключение. Вы подаёте питание на вывод VDD. Вот схема, которой нужно следовать:

Схема подключения датчика температуры DS18B20 в нормальном режиме
  • Паразитный режим: вам нужны только данные и GND. Датчик получает питание от линии данных. В этом случае используйте следующую схему:

Схема подключения датчика температуры DS18B20 в паразитном режиме

Вы можете считывать температуру с нескольких датчиков одновременно, используя всего один цифровой пин Arduino. Для этого вам нужно просто соединить все линии данных датчиков с одним цифровым пином Arduino.

Загрузка кода — одиночный DS18B20

Для взаимодействия с датчиком температуры DS18B20 вам необходимо установить библиотеку OneWire от Paul Stoffregen и библиотеку Dallas Temperature. Следуйте инструкциям ниже для установки этих библиотек.

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

  1. Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries. Должен открыться менеджер библиотек.

  2. Введите «OneWire» в поле поиска и установите библиотеку OneWire от Paul Stoffregen.

Установка библиотеки OneWire в Arduino IDE
  1. Затем введите «Dallas» и установите библиотеку Dallas Temperature от Miles Burton.

Установка библиотеки Dallas Temperature DS18B20 в Arduino IDE

После установки необходимых библиотек загрузите следующий код на вашу плату Arduino. Этот скетч основан на примере из библиотеки Dallas Temperature.

/*********
  Rui Santos
  Complete project details at https://randomnerdtutorials.com
  Based on the Dallas Temperature Library example
*********/

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

// Data wire is conntec to the Arduino digital pin 4
#define ONE_WIRE_BUS 4

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature sensors(&oneWire);

void setup(void)
{
  // Start serial communication for debugging purposes
  Serial.begin(9600);
  // Start up the library
  sensors.begin();
}

void loop(void){
  // Call sensors.requestTemperatures() to issue a global temperature and Requests to all devices on the bus
  sensors.requestTemperatures();

  Serial.print("Celsius temperature: ");
  // Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire
  Serial.print(sensors.getTempCByIndex(0));
  Serial.print(" - Fahrenheit temperature: ");
  Serial.println(sensors.getTempFByIndex(0));
  delay(1000);
}

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

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

Arduino с датчиком температуры DS18B20

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

Начните с подключения библиотек OneWire и DallasTemperature.

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

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

// Data wire is conntec to the Arduino digital pin 4
const int oneWireBus = 4;
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(oneWireBus);
// Pass our oneWire reference to Dallas Temperature sensor
DallasTemperature sensors(&oneWire);

В функции setup() инициализируйте монитор порта на скорости 9600 бод.

Serial.begin(9600);

Инициализируйте датчик температуры DS18B20:

sensors.begin();

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

sensors.requestTemperatures();

Затем получите и выведите температуру в градусах Цельсия. Для получения температуры в Цельсиях используйте метод getTempCByIndex():

Serial.print(sensors.getTempCByIndex(0));

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

Serial.println(sensors.getTempFByIndex(0));

Методы getTempCByIndex() и getTempFByIndex() принимают индекс датчика температуры в качестве аргумента. Поскольку мы используем только один датчик, его индекс равен 0. Если у вас несколько датчиков, используйте индекс 0 для первого датчика, индекс 1 для второго датчика и так далее.

Новые показания температуры запрашиваются каждую секунду.

delay(5000);

Демонстрация

После загрузки кода откройте монитор порта Arduino IDE на скорости 9600 бод. Вы должны увидеть температуру, отображаемую как в градусах Цельсия, так и в градусах Фаренгейта:

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

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

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

Датчик температуры DS18B20 взаимодействует по протоколу one-wire, и каждый датчик имеет уникальный 64-битный серийный код, поэтому вы можете считывать температуру с нескольких датчиков, используя всего один цифровой пин Arduino.

Схема подключения

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

Схема подключения нескольких датчиков температуры DS18B20 к Arduino

Загрузка кода — несколько DS18B20

Затем загрузите следующий код. Он сканирует все устройства на пине 4 и выводит температуру для каждого из них. Этот скетч основан на примере из библиотеки DallasTemperature.

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

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

// Data wire is plugged into port 4 on the Arduino
#define ONE_WIRE_BUS 4
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

int numberOfDevices; // Number of temperature devices found

DeviceAddress tempDeviceAddress; // We'll use this variable to store a found device address

void setup(void) {
  // start serial port
  Serial.begin(9600);

  // Start up the library
  sensors.begin();

  // Grab a count of devices on the wire
  numberOfDevices = sensors.getDeviceCount();

  // locate devices on the bus
  Serial.print("Locating devices...");
  Serial.print("Found ");
  Serial.print(numberOfDevices, DEC);
  Serial.println(" devices.");

  // Loop through each device, print out address
  for(int i=0;i<numberOfDevices; i++) {
    // Search the wire for address
    if(sensors.getAddress(tempDeviceAddress, i)) {
      Serial.print("Found device ");
      Serial.print(i, DEC);
      Serial.print(" with address: ");
      printAddress(tempDeviceAddress);
      Serial.println();
    } else {
      Serial.print("Found ghost device at ");
      Serial.print(i, DEC);
      Serial.print(" but could not detect address. Check power and cabling");
    }
  }
}

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

  // Loop through each device, print out temperature data
  for(int i=0;i<numberOfDevices; i++) {
    // Search the wire for address
    if(sensors.getAddress(tempDeviceAddress, i)){

      // Output the device ID
      Serial.print("Temperature for device: ");
      Serial.println(i,DEC);

      // Print the data
      float tempC = sensors.getTempC(tempDeviceAddress);
      Serial.print("Temp C: ");
      Serial.print(tempC);
      Serial.print(" Temp F: ");
      Serial.println(DallasTemperature::toFahrenheit(tempC)); // Converts tempC to Fahrenheit
    }
  }
  delay(5000);
}

// function to print a device address
void printAddress(DeviceAddress deviceAddress) {
  for (uint8_t i = 0; i < 8; i++) {
    if (deviceAddress[i] < 16) Serial.print("0");
      Serial.print(deviceAddress[i], HEX);
  }
}

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

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

Код использует несколько полезных методов для работы с несколькими датчиками DS18B20.

Используйте метод getDeviceCount() для получения количества датчиков DS18B20 на линии данных.

numberOfDevices = sensors.getDeviceCount();

Метод getAddress() находит адреса датчиков:

if(sensors.getAddress(tempDeviceAddress, i)){

Адрес уникален для каждого датчика. Таким образом, каждый датчик может быть идентифицирован по своему адресу.

Затем используйте метод getTempC(), который принимает адрес устройства в качестве аргумента. С помощью этого метода вы можете получить температуру с конкретного датчика:

float tempC = sensors.getTempC(tempDeviceAddress);

Для получения температуры в градусах Фаренгейта можно использовать метод getTemF(). Альтернативно, вы можете конвертировать температуру из Цельсия в Фаренгейт следующим образом:

DallasTemperature::toFahrenheit(tempC)

Подведение итогов

Датчик температуры DS18B20 — это цифровой однопроводной датчик. Для использования этого датчика с Arduino вам нужны библиотеки OneWire и DallasTemperature. Вы можете использовать один датчик или несколько датчиков на одной линии данных, так как каждый датчик можно идентифицировать по его уникальному адресу.

Теперь вы можете развить этот проект дальше и отобразить показания датчика на OLED-дисплее, например.

У нас есть больше руководств по другим датчикам, совместимым с Arduino, которые могут быть вам полезны:

Надеемся, что это руководство было для вас полезным.

Если вы хотите узнать больше об Arduino, ознакомьтесь с нашими ресурсами:

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