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

Нужен компактный вольтметр, который реально показывает до сотых долей вольта, а не просто «примерно 5 В»? Обычный мультиметр не всегда под рукой, а вот самодельный на базе ADS1115 и маленьком OLED-экране — это как раз тот проект, который собирается за вечер, паяется без проблем и выдаёт точность, которой хватит для большинства задач с Arduino и другой электроникой.

ADS1115 — это 16-битный АЦП с интерфейсом I²C. Он снимает напряжение с четырёх каналов, причём с программируемым усилением, что позволяет мерить не только «от 0 до 5 В», но и милливольты, и даже отрицательные напряжения (по дифференциальной схеме). OLED-дисплей на SSD1306 — 0.96 дюйма, 128×64 пикселя, тоже на I²C. Два устройства на одной шине, никаких конфликтов при правильных адресах.

Ниже — пошагово: что купить, как соединить, как паять, как прошить и что делать, если что-то не работает.

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

Я не буду привязываться к конкретным магазинам — детали есть и на AliExpress, и в локальных магазинах электроники. Главное — совместимость.

Компонент Что искать На что обратить внимание
ADS1115 Модуль на плате (не чип голый) Адрес по умолчанию 0x48. На плате обычно есть подтяжки для выбора адреса
OLED-дисплей 0.96″, SSD1306, I²C Белый или синий — не принципиально. Убедитесь, что модуль именно I²C, не SPI (у I²C 4 пина: VCC, GND, SDA, SCL)
Arduino (для прошивки) Nano, Uno или любая совместимая Nano удобнее для последующей вставки в корпус
Провода и разъёмы Dupont-провода, провод для щупов, mini-USB или Type-C кабель Щупы можно взять от старого мультиметра или купить отдельно
Питание 5В от USB или аккумулятор 3.7В с повышающим модулем Если нужна портативность — литиевый аккумулятор с модулем зарядки TP4056 и повышающим преобразователем до 5В

Резисторы для делителя напряжения — 10 кОм и 10 кОм (если хотите расширить диапазон измерения выше 5 В). Без делителя ADS1115 в режиме ±6.144 В измеряет до примерно 5.5 В (с учётом напряжения питания).

Схема подключения

Всё просто — оба устройства вешаются на одну I²C-шину:

  • Arduino 5V → VCC на ADS1115 и VCC на OLED
  • Arduino GND → GND на оба модуля
  • Arduino A4 (SDA) → SDA на ADS1115 и SDA на OLED
  • Arduino A5 (SCL) → SCL на ADS1115 и SCL на OLED

Входное напряжение подаётся на канал A0 ADS1115. Если нужен делитель:

  • Измеряемое напряжение → резистор 10 кОм → A0
  • A0 → резистор 10 кОм → GND

Это делит входное напряжение пополам. То есть при входе 10 В на A0 будет 5 В, и в коде нужно умножать показание на 2.

Не подавайте на ADS1115 напряжение выше VCC + 0.3 В и не превышайте максимальный диапазон АЦП в выбранной настройке усиления. Иначе сгорит вход.

Пайка: пошагово

Если у вас модули уже с припаянными пинами — можно обойтись без пайки вообще, используя макетную плату и Dupont-провода. Но для портативного устройства лучше всё нормально пропаять.

  1. Припаяйте пины к модулям. Если их нет — вставьте штырьки в макетку, приложите модуль и пропаяйте. Следите, чтобы не было перемычек между соседними контактами.
  2. Соедините общие линии питания. Сделайте шину 5V и GND на макетной плате или на куске печатной платы. К ней подключите оба модуля и Arduino.
  3. Подключите SDA и SCL. Провод от Arduino A4 идёт на SDA обоих модулей (параллельно). То же самое с A5 → SCL. Длина проводов для I²C старайтесь держать в пределах 20–30 см, иначе будут ошибки обмена.
  4. Припаяйте делитель напряжения. Если используете — два резистора на отдельной маленькой платке или прямо на проводах щупа. Место соединения резисторов → провод к A0.
  5. Подключите щупы. Один щуп — к точке измерения, второй — к «земле» измеряемой цепи. Важно: общий провод щупа идёт на GND Arduino/модулей.

Если используете аккумулятор: подключите его через TP4056 к входу повышающего модуля, выход 5В — на VCC всей схемы. Не питайте Arduino одновременно от USB и от внешнего 5В без понимания схемы — лучше выбрать один источник.

Прошивка для Arduino

Вам понадобятся две библиотеки. Установите их через библиотечный менеджер Arduino IDE:

  • Adafruit ADS1X15 — для работы с ADS1115
  • Adafruit SSD1306 + Adafruit GFX Library — для дисплея

Вот рабочий скетч, который измеряет напряжение на канале A0 и выводит на OLED:

#include <Wire.h>
#include <Adafruit_ADS1X15.h>
#include <Adafruit_SSD1306.h>

Adafruit_ADS1115 ads;
Adafruit_SSD1306 display(128, 64, &Wire, -1);

void setup() {
  Serial.begin(115200);
  if (!ads.begin()) {
    Serial.println("ADS1115 not found");
    while (1);
  }
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println("SSD1306 not found");
    while (1);
  }
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.display();
  ads.setGain(GAIN_ONE); // ±4.096V
}

void loop() {
  int16_t raw = ads.readADC_SingleEnded(0);
  float voltage = ads.computeVolts(raw);
  // Если используете делитель 1:1, умножьте на 2:
  // voltage *= 2.0;

  display.clearDisplay();
  display.setCursor(0, 0);
  display.setTextSize(2);
  display.print(voltage, 3);
  display.println(" V");
  display.setTextSize(1);
  display.print("Channel: A0");
  display.display();

  delay(500);
}

Что здесь важно:

  • setGain(GAIN_ONE) — это диапазон ±4.096 В. Если измеряете напряжения до 5 В с делителем — подходит. Для малых напряжений (до ±0.256 В) используйте GAIN_SIXTEEN — это даст разрешение 0.0078 мВ.
  • Адрес дисплея — 0x3C. У некоторых модулей он 0x3D. Если экран не загорается, попробуйте другой адрес или запустите I²C-сканер.
  • Если используете делитель — раскомментируйте строку с умножением на 2.

Калибровка и точность

ADS1115 — 16-битный, но реальная точность зависит от нескольких факторов:

  • Внутренний опорный источник стабилен, но имеет погрешность около 0.05%.
  • Резисторы делителя имеют допуск. Если взять 1% — итоговая погрешность будет около 1–2%.
  • Шум на входе можно уменьшить, усредняя несколько измерений в коде.

Для калибровки: подключите известное напряжение (например, 3.3 В с пина Arduino или батарейку) и сравните с показаниями. Если есть систематическая ошибка — введите поправочный коэффициент в код:

float calibratedVoltage = voltage * 1.002; // пример поправки

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

  • Ничего не отображается на дисплее. Проверьте адрес I²C. Запустите скетч I²C Scanner — он покажет, какие устройства найдены на шине. Если адрес 0x3C не находится, попробуйте 0x3D.
  • ADS1115 не определяется. Проверьте подключение SDA/SCL. Убедитесь, что на модуле ADS1115 есть подтяжки к VCC (обычно стоят по умолчанию). Если нет — добавьте 4.7 кОм от SDA к VCC и от SCL к VCC.
  • Показания скачут или неверные. Убедитесь, что общий провод (GND) щупа подключён к GND схемы. Без общей земли измерение бессмысленно.
  • Напряжение показывается с противоположным знаком. Перепутали полярность щупов при дифференциальном измерении. При одностороннем (SingleEnded) такого быть не должно.
  • Дисплей мерцает или гаснет. Недостаточное питание. OLED потребляет до 20–30 мА, ADS1115 — около 0.5 мА. Если повышающий преобразователь не тянет — будет просадка.

Как лучше сделать корпус и разъёмы

Для портативного использования удобно использовать небольшой пластиковый корпус (например, от распределительной коробки или напечатанный на 3D-принтере). В нём делаются отверстия для дисплея и для разъёма щупов.

Вместо обычных Dupont-разъёмов лучше использовать разъёмы «банан» — как на мультиметрах. Это удобнее и надёжнее. Если не найдёте — подойдут и просто припаянные провода с зажимами на конце.

Для включения/выключения — маленький тумблер между аккумулятором и повышающим модулем. Не забывайте, что Arduino и модули потребляют ток и в простое — если хотите долго работать от батареи, добавьте схему полного отключения питания.

Что выбрать в зависимости от задачи

Нужно просто измерять напряжение 0–5 В с точностью до 0.01 В: используйте GAIN_ONE, без делителя. Этого хватит для проверки питания Arduino, датчиков, светодиодов.

Нужно измерять до 20–30 В (например, аккумуляторы, блоки питания): поставьте делитель 1:1 или 1:3 (подберите резисторы так, чтобы на вход АЦП не приходило больше 4 В при максимальном измеряемом напряжении).

Нужна высокая точность на малых напряжениях (милливольты, термопары, тензодатчики): используйте GAIN_SIXTEEN (±0.256 В) — разрешение будет 0.0078 мВ. Но помните, что и погрешность на малых уровнях из-за шума будет заметнее.

Нужна автономность: используйте аккумулятор 18650 (или плоский Li-Po) с модулем зарядки и повышающим преобразователем. Потребление всей схемы — около 50–80 мА, так что аккумулятора 2000 мАч хватит на 20+ часов непрерывной работы.

Хотите измерять ток: ADS1115 измеряет только напряжение. Для тока нужно добавить шунт (резистор малого сопротивления) и измерять падение напряжения на нём, либо использовать специализированный чип вроде INA219.

Итог

Портативный вольтметр на ADS1115 и OLED — это реальный, полезный инструмент, который собирается из доступных модулей за пару часов. Точность у него выше, чем у большинства дешёвых мультиметров, а компактность позволяет носить с собой.

Ключевые моменты, которые стоит запомнить:

  • ADS1115 и OLED работают по I²C — проверьте адреса перед загрузкой прошивки.
  • Не забывайте про общую землю между измеряемой цепью и схемой.
  • Делитель напряжения расширяет диапазон, но вносит погрешность из-за допуска резисторов.
  • Для автономной работы — аккумулятор с повышающим модулем и тумблером питания.

Если что-то не работает — начните с проверки питания и I²C-адресов. 90% проблем решаются на этом этапе.

radio-blog.ru — электроника и технологии