Как собрать цифровой термометр на DS18B20 и OLED-дисплее

Если вы хотите видеть точную температуру на экране — не в окне браузера, а на реальном физическом дисплее — проще всего собрать термометр на базе датчика DS18B20 и небольшого OLED-экрана. Это не учебный пример ради примера, а рабочий прибор, который можно использовать дома, на даче, в гараже или в теплице. Ниже — пошаговая инструкция, без лишней теории, с конкретными схемами, кодом и решениями типичных проблем.

Что понадобится

Минимальный набор деталей:

  • Arduino (Uno, Nano или Pro Mini — любая модель с аппаратным I²C или возможностью его эмуляции);
  • DS18B20 — цифровой датчик температуры в корпусе TO-92 (обычный «транзистор») или в герметичном исполнении с кабелем;
  • OLED-дисплей на контроллере SSD1306, 0.96 дюйма, 128×64 пикселя, интерфейс I²C;
  • Резистор 4,7 кОм (подтяжка к питанию для линии данных DS18B20);
  • Соединительные провода, макетная плата или паяльник — в зависимости от того, делаете ли вы временный вариант или стационарный.

Если у вас нет паяльника и вы хотите собрать всё за 15 минут на макетке — это тоже рабочий вариант. Просто учтите, что контакты на макетке со временем могут ослабнуть, и показания начнут «пропадать».

Как подключить

Схема подключения простая: оба устройства — и датчик, и дисплей — подключаются по I²C или по однопроводной шине (для DS18B20) и I²C (для OLED). Вот распиновка для Arduino Uno/Nano:

DS18B20 OLED SSD1306 Arduino
GND (левая ножка) GND GND
VDD (правая ножка) VCC 5V
DQ (средняя ножка) D2
SDA A4
SCL A5

Между DQ и VDD датчика ставится резистор 4,7 кОм — это обязательная подтяжка линии данных. Без неё датчик может не определиться или выдавать ошибку -127°C.

Если у вас DS18B20 в герметичном исполнении (в металлической гильзе с проводом), цвета проводов обычно такие: красный — VDD, чёрный — GND, жёлтый или белый — DQ. Но производители иногда меняют распиновку, поэтому сверяйтесь с документацией на конкретный экземпляр.

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

В Arduino IDE нужно установить три библиотеки:

  1. OneWire — для работы с протоколом 1-Wire, по которому общается DS18B20.
  2. DallasTemperature — надстройка над OneWire, которая превращает сырые данные в градусы.
  3. Adafruit SSD1306 + Adafruit GFX — для вывода текста и графики на OLED.

Установка: Скетч → Подключить библиотеку → Управление библиотеками → поиск по названию. Установите все три. Если при установке Adafruit SSD1306 IDE попросит поставить зависимости — соглашайтесь.

Код термометра

Ниже — минимальный рабочий скетч. Он опрашивает датчик каждые 1000 мс и выводит температуру на дисплей.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  sensors.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
}

void loop() {
  sensors.requestTemperatures();
  float tempC = sensors.getTempCByIndex(0);

  display.clearDisplay();
  display.setCursor(10, 10);
  display.print("Temp:");
  display.setCursor(10, 35);
  display.print(tempC, 1);
  display.print(" C");
  display.display();

  delay(1000);
}

Адрес дисплея 0x3C — самый распространённый. Если экран не загорается, попробуйте 0x3D. Точный адрес можно узнать, загрузив скетч I²C Scanner из примеров Arduino IDE.

Что делать, если датчик не находится

Типичные причины, по которым скетч выдаёт -127°C или 85°C:

  • Забыли подтягивающий резистор 4,7 кОм между DQ и VDD — добавьте.
  • Перепутали ножки датчика — проверьте распиновку мультиметром или по даташиту.
  • Слишком длинный провод от датчика до Arduino (более 2–3 метров без экранирования) — уменьшите длину или используйте витую пару.
  • Неисправный датчик — замените, они стоят копейки.

85°C — это значение по умолчанию в регистре датчика до начала реального преобразования. Если вы видите ровно 85°C, значит, датчик не успевает завершить измерение до чтения. Увеличьте задержку между requestTemperatures() и getTempCByIndex() до 750 мс для разрешения 12 бит.

Как улучшить отображение

Базовый скетч выводит просто число. Но на 128×64 пикселя можно сделать больше:

  • Крупный шрифт для температуры — display.setTextSize(3) или даже 4.
  • Отображение минимальной и максимальной температуры за сутки — сохраняйте значения в переменные min/max в loop().
  • График изменения температуры — храните массив последних 64 значений и рисуйте линию через display.drawLine().
  • Иконку градусника или символ °C — нарисуйте в Image2LCD, преобразуйте в массив и выводите через display.drawBitmap().

Пример вывода крупной температуры с двумя знаками после запятой:

display.setTextSize(3);
display.setCursor(0, 20);
display.print(tempC, 2);
display.setTextSize(1);
display.println(" °C");

Пара слов о питании

Если термометр будет работать автономно от аккумулятора или батареи, учтите:

  • Arduino Uno с регулятором напряжения потребляет 30–40 мА в холостом режиме — батарея сядет быстро.
  • Arduino Pro Mini версии 3,3 В / 8 МГц потребляет в 5–10 раз меньше, особенно если отключить светодиоды и регулятор через перемычку.
  • OLED-дисплей потребляет 10–20 мА в зависимости от яркости и количества засвеченных пикселей.
  • DS18B20 — около 1 мА во время преобразования и менее 5 мкА в режиме ожидания.

Для длительной автономной работы используйте Pro Mini, уберите светодиоды, добавьте режим сна через библиотеку LowPower и выводите температуру не каждую секунду, а раз в 30–60 секунд.

Частые ошибки и как их избежать

Ошибка 1. Неправильный адрес I²C дисплея. Если экран не работает, запустите скетч I²C Scanner и посмотрите, какие адреса нашлись на шине. Исправьте адрес в display.begin().

Ошибка 2. Забыли резистор подтяжки. Без него датчик нестабилен или не определяется вообще. Это не опция — это обязательный элемент схемы.

Ошибка 3. Длинный провод без подтяжки. Если датчик стоит на расстоянии более метра от Arduino, сопротивление провода может мешать обмену. Используйте экранированный кабель или уменьшите сопротивление подтяжки до 2,2 кОм.

Ошибка 4. Несколько датчиков на одной шине без указания адреса. Если вы подключили два DS18B20, getTempCByIndex(0) вернёт температуру первого, getTempCByIndex(1) — второго. Но если нужен конкретный датчик, лучше обращаться по уникальному адресу, который можно узнать через пример oneWireSearch.

Ошибка 5. Попытка использовать дисплей по SPI вместо I²C без перепрошивки. Некоторые модули OLED по умолчанию работают по SPI. Если у вашего модуля 7 ног, а не 4 — это SPI, и подключение будет другим.

Что выбрать под вашу задачу

Нужен термометр для комнаты или квартиры. Берите Arduino Nano, DS18B20 в корпусе TO-92 и OLED 0.96″. Соберите на макетке, подключите по USB от зарядки телефона — готово. Этого хватит с запасом.

Нужен выносной датчик на улицу или в теплицу. Используйте DS18B20 в герметичном исполнении с кабелем 1–3 метра. Сам Arduino и дисплей оставьте в помещении. Кабель лучше уплотнить на входе, чтобы не тянуло влагу.

Нужна автономная работа от батареи. Берите Arduino Pro Mini 3,3 В, отпаяйте светодиоды и регулятор напряжения, добавьте режим сна. Питать можно от двух пальчиковых батареек через пин RAW (если версия 5 В) или напрямую к VCC (если версия 3,3 В).

Нужно несколько точек измерения. Подключайте несколько DS18B20 параллельно к одному пину Arduino. Каждый датчик имеет уникальный 64-битный адрес. Библиотека DallasTemperature позволяет опрашивать их по очереди и выводить все значения на один дисплей.

Итог

Цифровой термометр на DS18B20 и OLED — это один из самых простых и полезных проектов на Arduino. Всего четыре детали, три библиотеки и 20 строк кода — и у вас есть рабочий прибор с точностью ±0,5 °C. Если что-то не заработало с первого раза, проверьте подтягивающий резистор и адрес дисплея — в 90% случаев проблема именно в этом.

Соберите базовый вариант, убедитесь, что всё работает, а потом добавляйте графики, логирование на SD-карту или передачу данных по Wi-Fi через ESP8266. Но начните с простого — и он уже будет приносить пользу в тот же день.

Radio-Blog.ru