Raspberry Pi Pico: датчик температуры DS18B20 (Arduino IDE) – один и несколько

В этом руководстве вы узнаете, как подключить Raspberry Pi Pico к датчику температуры DS18B20 и получить показания температуры с помощью Arduino IDE. DS18B20 – это адресуемый датчик температуры, что означает, что вы можете подключить несколько датчиков к одному и тому же GPIO. Мы также покажем, как получить температуру с нескольких датчиков DS18B20 одновременно.

Raspberry Pi Pico DS18B20 датчик температуры Arduino IDE один и несколько

У нас есть аналогичное руководство, но с использованием прошивки MicroPython: Raspberry Pi Pico: датчик температуры DS18B20 (MicroPython).

Необходимые условия

Вам необходимо установить платы Raspberry Pi Pico в Arduino IDE, и вы должны знать, как загружать код на плату. Ознакомьтесь со следующим руководством, если вы этого ещё не сделали:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Для выполнения этого руководства вам понадобятся следующие компоненты:

Необходимые компоненты для проекта DS18B20 с Raspberry Pi Pico
  • Raspberry Pi Pico

  • Датчик температуры DS18B20 (один или несколько) – водонепроницаемая версия

  • Резистор 4,7 кОм

  • Соединительные провода

  • Макетная плата

Подключение датчика температуры DS18B20 к Raspberry Pi Pico

Датчик температуры DS18B20 имеет три вывода: GND, данные и VCC. Датчик температуры DS18B20 может питаться через вывод VDD (нормальный режим) или получать питание от линии данных (паразитный режим). Вы можете выбрать любой режим. Мы предпочитаем использовать нормальный режим.

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

Если вы используете водонепроницаемую версию, вы можете определить каждый вывод по его цвету:

  • чёрный: GND

  • красный: VDD

  • жёлтый: линия данных

DS18B20

Raspberry Pi Pico

GND

GND

Data (DQ)

Любой цифровой GPIO (мы будем использовать GPIO22); также необходимо подключить резистор 4,7 кОм между линией данных и VCC

VDD

3V3(OUT)

Вы также можете посмотреть следующую схему подключения:

Схема подключения DS18B20 к Raspberry Pi Pico

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

Для считывания температуры с DS18B20 на Raspberry Pi Pico с помощью Arduino IDE мы будем использовать библиотеку microDS18B20. Выполните следующие шаги для установки библиотеки.

  1. Откройте Arduino IDE;

  2. Перейдите в Sketch > Include Library > Manage Libraries. Откроется менеджер библиотек.

  3. Найдите microDS18B20 и установите библиотеку.

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

После установки библиотеки перезапустите Arduino IDE.

Raspberry Pi Pico с DS18B20 – получение температуры (код Arduino)

Откройте Arduino IDE и скопируйте следующий код. Он просто получает температуру с датчика DS18B20 и выводит её в монитор последовательного порта (Serial Monitor). Этот код адаптирован из примеров библиотеки microDS18B20.

/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/raspberry-pi-pico-ds18b20-arduino/

  Example adapted from the microDS18B20 library examples folder - microSD18B20 library: https://github.com/GyverLibs/microDS18B20
*********/

#include <microDS18B20.h>

// We're using GPIO 22, change accordingly
MicroDS18B20<22> sensor;

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

void loop() {
  //request temperature from sensor
  sensor.requestTemp();

  delay(1000);

  //print the temperature
  Serial.print("Temperature (ºC): ");
  Serial.println(sensor.getTemp());

  //Temperature in Fahrenheit
  //Serial.print("Temperature (ºF): ");
  //Serial.println(sensor.getTemp()*(9.0/5.0) + 32.0);
}

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

Продолжайте чтение, чтобы узнать, как работает код, или перейдите к разделу Демонстрация.

Начните с подключения библиотеки microDS18B20, которая предоставляет необходимые функции для работы с датчиком температуры DS18B20.

#include <microDS18B20.h>

Следующая строка объявляет экземпляр класса MicroDS18B20 с именем sensor, который ссылается на датчик температуры, подключённый к GPIO 22. Если ваш датчик DS18B20 подключён к другому выводу, измените строку кода соответственно.

MicroDS18B20<22> sensor;

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

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

В функции loop() происходит получение температуры от датчика. Следующая строка sensor.requestTemp() вызывается для запроса считывания температуры с датчика DS18B20.

sensor.requestTemp();

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

delay(1000);

Показание температуры в градусах Цельсия получается путём вызова sensor.getTemp(). Затем значение температуры выводится в монитор последовательного порта.

Serial.println(sensor.getTemp());

Если вы хотите выводить температуру в градусах Фаренгейта, раскомментируйте следующие строки (удалите // в начале этих строк):

//Temperature in Fahrenheit
//Serial.print("Temperature (ºF): ");
//Serial.println(sensor.getTemp()*(9.0/5.0) + 32.0);

Загрузка кода на Raspberry Pi Pico

Чтобы вы могли загрузить код на Raspberry Pi Pico, он должен находиться в режиме загрузчика (bootloader mode).

Если на Raspberry Pi Pico в данный момент работает прошивка MicroPython, вам нужно вручную перевести его в режим загрузчика. Для этого подключите Raspberry Pi Pico к компьютеру, одновременно удерживая кнопку BOOTSEL.

Режим загрузчика Raspberry Pi Pico

Для последующих загрузок с помощью Arduino IDE плата должна автоматически переходить в режим загрузчика без необходимости нажимать кнопку BOOTSEL.

Теперь выберите ваш COM-порт в Tools > Port. Может случиться так, что COM-порт будет неактивен (серым цветом). Если это так, не беспокойтесь – он будет автоматически найден, когда вы нажмёте кнопку загрузки.

Raspberry Pi Pico - COM-порт не найден в Arduino IDE

Загрузите код.

Вы должны получить сообщение об успешной загрузке.

Успешная загрузка кода на Raspberry Pi Pico в Arduino IDE

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

Откройте монитор последовательного порта (Serial Monitor) на скорости 115200 бод. Вы должны получать новые показания температуры каждую секунду.

Raspberry Pi Pico Arduino IDE - получение температуры с датчика DS18B20

Raspberry Pi Pico с несколькими датчиками температуры (Arduino IDE)

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

Raspberry Pi Pico с несколькими датчиками температуры Arduino IDE

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

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

/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/raspberry-pi-pico-ds18b20-arduino/

  Example from the library microSD18B20.h: https://github.com/GyverLibs/microDS18B20/tree/main/examples
  Get the address of DS18B20 sensor (one sensor connected at a time)
*********/

#include <microDS18B20.h>

// We're using GPIO 22, change accordingly
MicroDS18B20 <22> sensor;

// Array to store the sensor address
uint8_t address[8];

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

void loop() {
  if (sensor.readAddress(address)) {
    Serial.print('{');
    for (uint8_t i = 0; i < 8; i++) {
      Serial.print("0x");
      Serial.print(address[i], HEX);
      if (i < 7) Serial.print(", ");
    }
    Serial.println('}');

  } else Serial.println("Not connected");
  delay(1000);
}

Подключайте к Raspberry Pi Pico по одному датчику за раз на GPIO22, чтобы узнать его адрес. Адрес каждого датчика будет выведен в мониторе последовательного порта.

DS18B20 получение адреса датчика в Arduino IDE Raspberry Pi Pico

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

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

Схема подключения нескольких датчиков DS18B20 к Raspberry Pi Pico

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

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

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

/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/raspberry-pi-pico-ds18b20-arduino/
*********/

#include <microDS18B20.h>

#define SENS_AMOUNT 4

// Add the address of each sensor
const uint8_t addr[][8] PROGMEM = {
  {0x28, 0xFF, 0xA0, 0x11, 0x33, 0x17, 0x3, 0x96},
  {0x28, 0xFF, 0xB4, 0x6, 0x33, 0x17, 0x3, 0x4B},
  {0x28, 0xAE, 0x26, 0x45, 0x92, 0x1, 0x2, 0x4B},
  {0x28, 0xFF, 0x11, 0x15, 0x33, 0x17, 0x3, 0x1A}
};

// All sensors are connected to GPIO22, adjust accordingly
MicroDS18B20<22, DS_ADDR_MODE, SENS_AMOUNT, DS_PROGMEM> sensors;

float sensor1TempC, sensor2TempC, sensor3TempC, sensor4TempC;
float sensor1TempF, sensor2TempF, sensor3TempF, sensor4TempF;

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

  // set the addresses
  sensors.setAddress((uint8_t*)addr);
}

void loop() {
  delay (1000);

  // Get temperature from each sensor
  sensor1TempC =  sensors.getTemp(0);
  sensor2TempC =  sensors.getTemp(1);
  sensor3TempC =  sensors.getTemp(2);
  sensor4TempC =  sensors.getTemp(3);

  //Convert temperatures to Fahrenheit
  sensor1TempF = sensor1TempC *(9.0/5.0) + 32.0;
  sensor2TempF = sensor2TempC *(9.0/5.0) + 32.0;
  sensor3TempF = sensor3TempC *(9.0/5.0) + 32.0;
  sensor4TempF = sensor4TempC *(9.0/5.0) + 32.0;

  Serial.print("Sensor 1 (temp ºC): ");
  Serial.print(sensor1TempC);
  Serial.print(" Sensor 1 (temp ºF): ");
  Serial.println(sensor1TempF);

  Serial.print("Sensor 2 (temp ºC): ");
  Serial.print(sensor2TempC);
  Serial.print(" Sensor 2 (temp ºF): ");
  Serial.println(sensor2TempF);

  Serial.print("Sensor 3 (temp ºC): ");
  Serial.print(sensor3TempC);
  Serial.print(" Sensor 3 (temp ºF): ");
  Serial.println(sensor3TempF);

  Serial.print("Sensor 4 (temp ºC): ");
  Serial.print(sensor4TempC);
  Serial.print(" Sensor 4 (temp ºF): ");
  Serial.println(sensor4TempF);

  Serial.print("");
  Serial.println("-----------------------------------");

  // request new temperature from all sensors
  sensors.requestTempAll();
}

Давайте кратко рассмотрим, как работает этот код.

Начните с подключения библиотеки microDS18B20, чтобы иметь возможность считывать данные с датчиков температуры DS18B20.

#include <microDS18B20.h>

Код определяет константу SENS_AMOUNT со значением 4, указывающую количество подключённых датчиков. Если вы используете другое количество датчиков, измените значение соответственно.

#define SENS_AMOUNT 4

Массив addr содержит адрес каждого датчика. Адреса указаны в шестнадцатеричном формате. Измените код, указав адреса, полученные на предыдущем шаге.

// Add the address of each sensor
const uint8_t addr[][8] PROGMEM = {
  {0x28, 0xFF, 0xA0, 0x11, 0x33, 0x17, 0x3, 0x96},
  {0x28, 0xFF, 0xB4, 0x6, 0x33, 0x17, 0x3, 0x4B},
  {0x28, 0xAE, 0x26, 0x45, 0x92, 0x1, 0x2, 0x4B},
  {0x28, 0xFF, 0x11, 0x15, 0x33, 0x17, 0x3, 0x1A}
};

Создайте экземпляр класса MicroDS18B20 с именем sensors, указав GPIO, к которому подключены все датчики, режим адресации, количество датчиков и тип памяти для хранения адресов. Мы подключаем датчики к GPIO22, если вы используете другой GPIO, измените код соответственно.

// All sensors are connected to GPIO22, adjust accordingly
MicroDS18B20<22, DS_ADDR_MODE, SENS_AMOUNT, DS_PROGMEM> sensors;

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

float sensor1TempC, sensor2TempC, sensor3TempC, sensor4TempC;
float sensor1TempF, sensor2TempF, sensor3TempF, sensor4TempF;

В функции setup() устанавливаются адреса датчиков с помощью метода setAddress() объекта sensors.

sensors.setAddress((uint8_t*)addr);

В функции loop() мы получаем показания температуры от каждого датчика. Значения температуры получаются от каждого датчика с помощью метода getTemp() объекта sensors. Аргумент ссылается на адрес датчика (0 соответствует первому адресу массива, 1 – второму адресу и так далее).

// Get temperature from each sensor
sensor1TempC = sensors.getTemp(0);
sensor2TempC = sensors.getTemp(1);
sensor3TempC = sensors.getTemp(2);
sensor4TempC = sensors.getTemp(3);

Мы также конвертируем температуру в градусы Фаренгейта.

sensor1TempF = sensor1TempC *(9.0/5.0) + 32.0;
sensor2TempF = sensor2TempC *(9.0/5.0) + 32.0;
sensor3TempF = sensor3TempC *(9.0/5.0) + 32.0;
sensor4TempF = sensor4TempC *(9.0/5.0) + 32.0;

Наконец, все показания выводятся в монитор последовательного порта.

Serial.print("Sensor 1 (temp ºC): ");
Serial.print(sensor1TempC);
Serial.print(" Sensor 1 (temp ºF): ");
Serial.println(sensor1TempF);

Serial.print("Sensor 2 (temp ºC): ");
Serial.print(sensor2TempC);
Serial.print(" Sensor 2 (temp ºF): ");
Serial.println(sensor2TempF);

Serial.print("Sensor 3 (temp ºC): ");
Serial.print(sensor3TempC);
Serial.print(" Sensor 3 (temp ºF): ");
Serial.println(sensor3TempF);

Serial.print("Sensor 4 (temp ºC): ");
Serial.print(sensor4TempC);
Serial.print(" Sensor 4 (temp ºF): ");
Serial.println(sensor4TempF);

В конце не забудьте вызвать метод requestTempAll() для запроса новых показаний температуры от всех датчиков.

sensors.requestTempAll();

Код повторяет этот процесс бесконечно в функции loop(), непрерывно считывая температуры с датчиков и выводя значения в монитор последовательного порта каждую секунду.

Демонстрация (несколько датчиков)

После загрузки кода на Raspberry Pi Pico откройте монитор последовательного порта (Serial Monitor) на скорости 115200 бод. Вы получите показания температуры от всех датчиков как в градусах Цельсия, так и в градусах Фаренгейта.

Raspberry Pi Pico с несколькими датчиками температуры DS18B20 - монитор последовательного порта Arduino IDE

Заключение

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