DS18B20 – очень популярный, надёжный и высокоточный цифровой датчик температуры - не подвержен помехам, в отличие от термистора и других аналоговых датчиков, не зависит от нелинейности АЦП и имеет постоянную точность на всём рабочем диапазоне температур. Выпускается в разных корпусах.
![]() |
В наборе GyverKIT | START | IOT | EXTRA |
---|---|---|---|---|
DS18b20 | ✔ |
Характеристики:
- Диапазон: -55.. 125 °C
- Точность: 0.5 °C
- Разрешение: 9.. 12 бит (0.48.. 0.06 °C)
- Питание: 3-5.5V
- Скорость измерения:
- 750 мс при точности 12 бит
- 94 мс при точности 9 бит
- Интерфейс связи: 1-Wire (OneWire)
- Возможность подключать несколько датчиков на один пин
Подключение к Arduino #
Датчик имеет следующие назначения пинов:
Подключается к питанию и любому цифровому пину Arduino - пин должен быть подтянут к питанию резистором 4.7 кОм. На один пин можно подключить несколько датчиков DS18B20:
В рамках набора GyverKIT резистор на 4.7 кОм можно заменить двумя резисторами на 10 кОм (есть в комплекте), подключенными параллельно:
Библиотеки #
Для DS18B20 есть несколько библиотек:
- DallasTemperature.h - самая известная, для работы также понадобится OneWire.h
- GyverDS18 - моя библиотека, очень лёгкая и простая в использовании
В примерах на этом сайте будем использовать GyverDS18, её можно установить/обновить из встроенного менеджера библиотек Arduino по названию GyverDS18. Краткая документация находится по ссылке выше, базовые примеры есть в самой библиотеке.
GyverDS18 #
Один датчик
// асинхронный опрос одного датчика на пине
#include <GyverDS18.h>
GyverDS18Single ds(2); // пин 2
void setup() {
Serial.begin(115200);
ds.requestTemp(); // первый запрос на измерение
}
void loop() {
if (ds.ready()) { // измерения готовы по таймеру
if (ds.readTemp()) { // если чтение успешно
Serial.print("temp: ");
Serial.println(ds.getTemp());
} else {
Serial.println("read error");
}
ds.requestTemp(); // запрос следующего измерения
}
}
Чтение адреса датчика
// на пин должен быть подключен ОДИН датчик
#include <GyverDS18.h>
GyverDS18Single ds(2); // пин 2
void setup() {
Serial.begin(115200);
uint64_t addr = ds.readAddress();
if (addr) {
Serial.print("address: ");
gds::printAddress(addr, Serial);
// пример вывода: 0xCF0417505B78FF28
} else {
Serial.println("read error");
}
}
void loop() {
}
Несколько датчиков на пине
#include <GyverDS18Array.h>
// нужно получить адреса как в предыдущем примере,
// подключив по одному датчику на пин
uint64_t addr[] = {
0xD20417515A42FF28,
0x4D0417508099FF28,
0xFE04175159CDFF28,
0xCF0417505B78FF28,
};
GyverDS18Array ds(2, addr, 4); // пин, массив, длина
void setup() {
Serial.begin(115200);
// Запрос ВСЕМ датчикам на линии
ds.requestTemp();
}
void loop() {
if (ds.ready()) { // измерения готовы по таймеру
// проходим по массиву
for (int i = 0; i < ds.amount(); i++) {
Serial.print("#");
Serial.print(i);
Serial.print(": ");
// читаем по индексу
if (ds.readTemp(i)) Serial.print(ds.getTemp());
else Serial.print("read error");
Serial.print(", ");
}
Serial.println();
ds.requestTemp(); // запрос следующего измерения ДЛЯ ВСЕХ
}
}
Полезные страницы #
- Набор GyverKIT – наш большой стартовый набор Arduino, продаётся в России
- Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с AliExpress
- Обратная связь – сообщить об ошибке в уроке или предложить дополнение по тексту ([email protected])
- Поддержать автора за работу над уроками