DS18B20 это датчик температуры с цифровым последовательным интерфейсом 1-Wire.
Основные характеристики датчика:
- Погрешность измерения не больше 0,5 °С (для температур от -10 °С до +85 °С)
- Температурный диапазон измерений от -55 С до +125 °С
- Датчик питается напряжением от 3,3 В до 5 В.
- Разрешающая способность от 9 до 12 бит
- Каждый датчик обладает своим уникальным серийным кодом (адрес)
- Не требуются дополнительные внешние элементы.
- Можно подключить сразу до 127 датчиков к одной линии связи.
- Информация передается по протоколу 1-Wire.
Схема подключения
При использовании модуля устанавливать подтягивающий резистор не нужно, он уже установлен на плате модуля.
Использование стандартной библиотеки DallasTemperature позволяет достаточно просто взаимодействовать с датчиками температуры DS18B20, но время измерения при использовании этой библиотеки достаточно большое. Ниже представлен скетч в котором используется только библиотека OneWire для управления шиной 1-Wire, при этом время измерения датчика заметно меньше при разрешении датчика 12 бит.
#include <OneWire.h> // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip #include <LiquidCrystal_I2C.h> // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1 LiquidCrystal_I2C lcd(0x27, 16, 2); OneWire ds(A0); // Вход датчика void setup() { lcd.init(); lcd.backlight(); } void loop() { lcd.setCursor(0, 0); lcd.print(dsRead(0), 2); // Опрос датчика 1 // lcd.setCursor(0,1);lcd.print(dsRead(1),2);// Опрос датчика 2 } float dsRead(byte x) { byte data[2], addr[8][8], kol = 0; while (ds.search(addr[kol])) { // поиск датчиков, определение адреса и кол-ва датчиков kol++; } ds.reset_search(); // Сброс поиска датчика ds.reset(); // Инициализация, выполняется сброс шины ds.select(addr[x]); // Обращение к датчику по адресу ds.write(0x44, 0); // Измерение температуры с переносом данных в память ds.reset(); // Инициализация, выполняется сброс шины ds.select(addr[x]); // Обращение к датчику по адресу ds.write(0xBE); // Обращение памяти data[0] = ds.read();// Чтение памяти byte low data[1] = ds.read();// Чтение памяти byte high float value = ((data[1] << 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод }
Скетч может поддерживать до 8 датчиков подключенных к одному входу. Для вывода температуры используется функция dsRead(0) в которой необходимо указать номер датчика. Для примера показания датчика выводятся на LCD1602 (I2C).
Вывод серийного номера датчика (адреса) и температуры в монитор порта:
#include <OneWire.h> OneWire ds(A0); void setup() { Serial.begin(9600); } void loop() { Serial.println(dsRead(0), 2); // Опрос датчика 1 delay(1000); } float dsRead(byte x) { byte data[2], addr[8][8], kol = 0; while (ds.search(addr[kol])) { // поиск датчиков, определение адреса и кол-ва датчиков for( int i = 0; i < 8; i++) { Serial.print(' '); Serial.print(addr[kol][i], HEX); } Serial.print(" "); kol++; } ds.reset_search(); // Сброс поиска датчика ds.reset(); // Инициализация, выполняется сброс шины ds.select(addr[x]); // Обращение к датчику по адресу ds.write(0x44, 0); // Измерение температуры с переносом данных в память ds.reset(); // Инициализация, выполняется сброс шины ds.select(addr[x]); // Обращение к датчику по адресу ds.write(0xBE); // Обращение памяти data[0] = ds.read();// Чтение памяти byte low data[1] = ds.read();// Чтение памяти byte high float value = ((data[1] << 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод }
Для удобства использования я упаковал выше показанный код в библиотеку — http://forum.rcl-radio.ru/misc.php?action=pan_download&item=735&download=1
Пример использования №1:
#include <DS18B20_RCL.h> void setup() { Serial.begin(9600); } void loop() { Serial.println(dsRead(A0,0), 2); // вход датчика, номер датчика delay(5000); }
Пример использования №2 (вывод температуры на TM1637):
#include <DS18B20_RCL.h> #include <STM32_TM1637.h> // http://rcl-radio.ru/wp-content/uploads/2020/02/STM32_TM1637_V1_3.zip STM32_TM1637 tm(2,3);// CLK, DIO void setup() { tm.brig(7); // ЯРКОСТЬ 0...7 } void loop() { tm.print_float(dsRead(A0,0),1, 0,0,0,0); delay(1000); }