Raspberry Pi Pico: датчик температуры DS18B20 (Arduino IDE) – один и несколько
В этом руководстве вы узнаете, как подключить Raspberry Pi Pico к датчику температуры DS18B20 и получить показания температуры с помощью Arduino IDE. DS18B20 – это адресуемый датчик температуры, что означает, что вы можете подключить несколько датчиков к одному и тому же GPIO. Мы также покажем, как получить температуру с нескольких датчиков DS18B20 одновременно.
У нас есть аналогичное руководство, но с использованием прошивки MicroPython: Raspberry Pi Pico: датчик температуры DS18B20 (MicroPython).
Необходимые условия
Вам необходимо установить платы Raspberry Pi Pico в Arduino IDE, и вы должны знать, как загружать код на плату. Ознакомьтесь со следующим руководством, если вы этого ещё не сделали:
Знакомство с датчиком температуры DS18B20
Датчик температуры DS18B20 – это цифровой однопроводный (one-wire) датчик температуры. Это означает, что для связи с вашим Raspberry Pi Pico ему требуется всего одна линия данных (и GND).
Он может питаться от внешнего источника питания или получать питание от линии данных (так называемый «паразитный режим»), что устраняет необходимость во внешнем источнике питания.
Каждый датчик температуры DS18B20 имеет уникальный 64-битный серийный код. Это позволяет подключить несколько датчиков к одному проводу данных. Таким образом, вы можете получать температуру с нескольких датчиков, используя всего один GPIO.
Датчик температуры DS18B20 также доступен в водонепроницаемом исполнении.
Вот краткое описание наиболее важных характеристик датчика температуры DS18B20:
Связь по однопроводной шине (one-wire bus)
Диапазон напряжения питания: от 3,0 В до 5,5 В
Диапазон рабочих температур: от -55 °C до +125 °C
Точность ±0,5 °C (в диапазоне от -10 °C до 85 °C)
Для получения дополнительной информации обратитесь к даташиту DS18B20.
Необходимые компоненты
Для выполнения этого руководства вам понадобятся следующие компоненты:
Raspberry Pi Pico
Датчик температуры DS18B20 (один или несколько) – водонепроницаемая версия
Резистор 4,7 кОм
Соединительные провода
Макетная плата
Подключение датчика температуры DS18B20 к Raspberry Pi Pico
Датчик температуры DS18B20 имеет три вывода: GND, данные и VCC. Датчик температуры DS18B20 может питаться через вывод VDD (нормальный режим) или получать питание от линии данных (паразитный режим). Вы можете выбрать любой режим. Мы предпочитаем использовать нормальный режим.
Если вы используете водонепроницаемую версию, вы можете определить каждый вывод по его цвету:
чёрный: GND
красный: VDD
жёлтый: линия данных
DS18B20 |
Raspberry Pi Pico |
|---|---|
GND |
GND |
Data (DQ) |
Любой цифровой GPIO (мы будем использовать GPIO22); также необходимо подключить резистор 4,7 кОм между линией данных и VCC |
VDD |
3V3(OUT) |
Вы также можете посмотреть следующую схему подключения:
Установка библиотеки microDS18B20
Для считывания температуры с DS18B20 на Raspberry Pi Pico с помощью Arduino IDE мы будем использовать библиотеку microDS18B20. Выполните следующие шаги для установки библиотеки.
Откройте Arduino IDE;
Перейдите в Sketch > Include Library > Manage Libraries. Откроется менеджер библиотек.
Найдите microDS18B20 и установите библиотеку.
После установки библиотеки перезапустите 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.
Для последующих загрузок с помощью Arduino IDE плата должна автоматически переходить в режим загрузчика без необходимости нажимать кнопку BOOTSEL.
Теперь выберите ваш COM-порт в Tools > Port. Может случиться так, что COM-порт будет неактивен (серым цветом). Если это так, не беспокойтесь – он будет автоматически найден, когда вы нажмёте кнопку загрузки.
Загрузите код.
Вы должны получить сообщение об успешной загрузке.
Демонстрация
Откройте монитор последовательного порта (Serial Monitor) на скорости 115200 бод. Вы должны получать новые показания температуры каждую секунду.
Raspberry Pi Pico с несколькими датчиками температуры (Arduino IDE)
Датчик температуры DS18B20 обменивается данными по однопроводному протоколу (one-wire), и каждый датчик имеет уникальный 64-битный серийный код, поэтому вы можете считывать температуру с нескольких датчиков, используя всего один GPIO.
Получение адреса датчика 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, чтобы узнать его адрес. Адрес каждого датчика будет выведен в мониторе последовательного порта.
Подключение нескольких датчиков температуры к Raspberry Pi Pico
Для считывания температуры с нескольких датчиков на одной однопроводной шине вам нужно просто соединить все линии данных вместе, как показано на следующей схеме (в качестве примера мы используем четыре датчика, но вы можете использовать два, три или больше) – просто убедитесь, что у вас есть резистор 4,7 кОм на линии данных:
Получение температуры с нескольких датчиков 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 бод. Вы получите показания температуры от всех датчиков как в градусах Цельсия, так и в градусах Фаренгейта.
Заключение
В этом руководстве вы узнали, как подключить датчик температуры DS18B20 к Raspberry Pi Pico и как получить показания температуры с помощью Arduino IDE. DS18B20 – это адресуемый датчик температуры. Это означает, что вы можете подключить несколько датчиков к одному GPIO и получать показания температуры от всех датчиков одновременно. Мы также рассмотрели это в нашем руководстве.