Введение
В данном проекте рассматривается подключение водонепроницаемого 1-проводного датчика температуры DS18B20 к микроконтроллеру ESP32 с использованием среды Arduino IDE. Для визуализации данных будет использовать 0,96-дюймовый OLED-дисплей с интерфейсом I2C. DS18B20 обеспечивает точные измерения в диапазоне от -55 °C до 125 °C. Перед началом работы необходимо интегрировать ESP32 в Arduino IDE, как это сделать, рассказывал в этой статье.

Необходимые детали
| № | Компонент | Количество | Купить |
|---|---|---|---|
| 1 | Отладочная плата ESP32 | 1 шт | Авито | AliExpress | RobotChip |
| 3 | Датчик DS18B20 в металлической гильзе | 1 шт | Авито | AliExpress | RobotChip |
| 4 | Провод DuPont | 4 шт | Авито | AliExpress | RobotChip |
| 6 | OLED-дисплей | 1 шт | Авито | AliExpress | RobotChip |
| 6 | Резистор 4.7 кОм | 1 шт | Авито | AliExpress | RobotChip |
Описание
Водонепроницаемый датчик DS18B20 представляет собой герметичную версию одноименного цифрового датчика DS18B20, предназначенную для измерений во влажной среде. Устройство функционирует в диапазоне от -55 до 125 °C. Благодаря цифровому протоколу 1-Wire данные не подвержены искажениям на больших дистанциях. Датчик обеспечивает точность до ±0,5 °C (используя встроенный 12-битный АЦП) и совместим с любыми микроконтроллерами, требуя для подключения всего один цифровой пин. Кабель датчика заключен в оболочку из ПВХ. Подробные спецификации приведены в техническом описании компонента. В прошлых статья уже рассказывал о данном датчике, подробнее можете почитать в этой статье.

Модуль OLED-дисплея на базе контроллеров SSD1306 или SSD1315 доступен в диагоналях 0,96 и 1,3 дюйма с разрешением 128×64 пикселей и синим или белым цветом. Устройство совместимо с любыми микроконтроллерами благодаря поддержке интерфейсов I2C. В базовый комплект поставки входят дисплейная плата, сам экран и 4-контактный штыревой разъем, который уже установлен (припаян) на плате.

Подключение
Датчик температуры DS18B20 подключается к микроконтроллеру ESP32 по протоколу 1-Wire. Его сигнальный контакт (DATA) соединяется с портом GPIO23. Для стабильной работы шины между линией DATA и питанием VCC необходимо установить подтягивающий резистор номиналом 4,7 кОм. Одновременно с этим 0,96-дюймовый OLED-дисплей подключаем вывод SDA к порту GPIO22, а линия SCL к порту GPIO21. Оба модуля необходимо подключить к питанияю VCC и земли GND.

Установка библиотек
Для работы, будем использовать библиотеку «DallasTemperature», «Adafruit_SSD1306» и «OneWireNg» скачать можно используя интегрированную среду разработки Arduino IDE», для этого откройте «Скетч → Подключение библиотеки → Менеджер библиотек…», так же выложу библиотеки в конце статьи.
В строке поиска введите «DallasTemperature» и нажмите «Установить »

Далее, установим следующую библиотеку, в строке поиска введите «Adafruit_SSD1306», найдите библиотеку «Adafruit SSD1306 от Adafruit » и нажмите «Установить»

Для работы библиотеки необходимо установить зависимые библиотеки, нажимаем «Установить все»

Программа
Ниже приведён исходный код передатчика, загрузите скетч в плату ESP32.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#include <SPI.h> // Подключаем библиотеку SPI #include <OneWireNg.h> // Подключаем библиотеку OneWire #include <DallasTemperature.h> // Подключаем библиотеку DallasTemperature #include <Adafruit_SSD1306.h> // Подключаем библиотеку для работы с OLED-дисплеем #define ONE_WIRE_BUS 23 // Указываем которому выходу подключен датчика DS18B20 OneWire oneWire(ONE_WIRE_BUS); // Создаем объект OneWire DallasTemperature sensors(&oneWire); // Передаем управление шиной в библиотеку DallasTemperature #define SCREEN_WIDTH 128 // Ширина экрана в пикселях #define SCREEN_HEIGHT 64 // Высота экрана в пикселях Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT); // Инициализация объекта дисплея на шине I2C (&Wire) void setup() { Serial.begin(115200); // Инициализируем последовательную связь sensors.begin(); // Инициализация датчиков температуры. display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Инициализация дисплея display.clearDisplay(); // Очистка дисплея display.setTextColor(WHITE); // Установка цвета текста } void loop() { sensors.requestTemperatures(); // Отправляем команду получения температуры float temperatureC = sensors.getTempCByIndex(0); // Чтение первого найденного датчика (индекс 0) int tempInt = (int)(temperatureC * 100); // Конвертируем показания в целое число Serial.print("Temperature received: "); // Печать префикса в монитор порта Serial.print(temperatureC); Serial.println(" °C"); display.clearDisplay(); // Очистка локального буфера перед новой отрисовкой display.setTextSize(1); // Размер шрифта x1 (стандартный 5x8 пикселей на символ) display.setCursor(25, 10); // Позиция курсора: X=25px, Y=10px display.print("Temperature:"); // Текстовая подпись display.setTextSize(2); // Увеличенный размер шрифта x2 для цифр display.setCursor(25, 30); // Новая позиция курсора под цифры display.print(temperatureC); // Вывод значения температуры display.print("C"); // Единицы измерения display.display(); // Передача всего накопленного буфера по I2C на физический экран (только эта команда обновляет матрицу) } |
Если все правильно сделали при открытия мониторинга порта увидим данные температуры

Описание программы передатчика
В начале программы подключаем библиотеки и объявление объектов
1 2 3 4 |
#include <SPI.h> #include <OneWireNg.h> #include <DallasTemperature.h> #include <Adafruit_SSD1306.h> |
Далее настраиваем датчик DS18B20, указываем вывод GPIO23, создаем объект управления шиной OneWire и передает его библиотеке DallasTemperature.
1 2 3 |
#define ONE_WIRE_BUS 23 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); |
Указываем разрешение экрана и создает объект.
1 2 3 |
#define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT); |
В функции setup() запускается последовательный порт на скорости 115200 бод, после чего производится инициализация датчиков OneWire. Инициализирует дисплей по адресу 0x3C, очищает видеобуфер микроконтроллера и устанавливает белый цвет текста.
1 2 3 4 5 6 7 8 |
void setup() { Serial.begin(115200); sensors.begin(); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.setTextColor(WHITE); } |
В функции loop() запускается преобразование температуры на всех датчиках OneWire, считывается значение первого устройства (индекс 0) в градусах Цельсия (float)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
void loop() { sensors.requestTemperatures(); float temperatureC = sensors.getTempCByIndex(0); Serial.print("Temperature received: "); Serial.print(temperatureC); Serial.println(" °C"); display.clearDisplay(); display.setTextSize(1); display.setCursor(25, 10); display.print("Temperature:"); display.setTextSize(2); display.setCursor(25, 30); display.print(temperatureC); display.print("C"); display.display(); } |
Полезные ссылки
| № | Описание | Скачать |
|---|---|---|
| 1 | Библиотека DallasTemperature | DallasTemperature v.1.1.15.zip |
| 3 | Библиотека Adafruit_SSD1306 | Adafruit_SSD1306 v.2.5.17.zip |
| 4 | Библиотека OneWireNg | OneWireNg v.0.14.1 |
| 5 | Библиотека Adafruit GFX Library | Adafruit GFX Library v.1.12.6 |
| 6 | Библиотека Adafruit BusIO | Adafruit BusIO v.1.14.7 |