📟 Миниатюрное устройство для измерения напряжения с графическим выводом данных
📌 Описание проекта
В этом проекте мы соберем простой цифровой вольтметр на базе Arduino Nano и OLED-дисплея (128×32 пикселя) и (128×64 пикселя) с интерфейсом I2C. Устройство умеет измерять напряжение в диапазоне до 5 напрямую и до 25 вольт с делителем на резисторах. И красиво отображать результат на дисплее с помощью текста и графики. Изменив резисторы диапазон измерений можно увеличить
Также приглашаю всех на одноимённый Telegram канал и чат:
🧰 Что потребуется
Компоненты:
- Arduino Nano или Uno
- OLED-дисплей 0.91″ 128×32 I2C (SSD1306)
- Резисторы для делителя (если нужно измерять больше 5В)
- Макетная плата и провода
- Источник измеряемого напряжения (батарейка, БП и т.д.)
⚙️ Схема подключения
OLED контакт------Подключить к Arduino
VCC ------------------ 5V
GND------------------GND
SDA------------------A4
SCL------------------ A5
⚠️ Если используете другой микроконтроллер, уточните его I2C-выводы!
💡 Принцип работы
Arduino считывает напряжение с аналогового входа A0, преобразует его в цифровое значение (от 0 до 1023) и пересчитывает в вольты. Полученное значение отображается на OLED-дисплее.
🖥 Код программы
Программа написана с использованием библиотек Adafruit_SSD1306 и Adafruit_GFX, которые можно установить через библиотечный менеджер Arduino IDE.
#include <Wire.h> // Библиотека для работы с I2C
#include <Adafruit_GFX.h> // Графическая библиотека от Adafruit
#include <Adafruit_SSD1306.h> // Драйвер дисплея SSD1306
#define SCREEN_WIDTH 128 // Ширина дисплея
#define SCREEN_HEIGHT 64 // Высота дисплея
#define OLED_RESET -1 // Не используем аппаратный RESET
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define ANALOG_PIN A0 // Пин, к которому подключен делитель напряжения
// Значения сопротивлений делителя (в омах)
const float R1 = 100000.0; // Верхний резистор (100 кОм)
const float R2 = 10000.0; // Нижний резистор (10 кОм)
const float VREF = 5.0; // Опорное напряжение Arduino (можно уточнить)
float voltage = 0.0; // Измеренное напряжение
float maxVoltage = 0.0; // Максимально зафиксированное напряжение
void setup() {
Serial.begin(9600); // Инициализация порта для отладки
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Инициализация дисплея по адресу 0x3C
display.clearDisplay(); // Очистка экрана
splashScreen(); // Показ приветственного экрана
}
void loop() {
int analogValue = analogRead(ANALOG_PIN); // Считывание аналогового значения (0-1023)
// Перевод в напряжение с учётом делителя:
voltage = (analogValue * VREF / 1023.0) * ((R1 + R2) / R2);
// Обновляем максимальное значение
if (voltage > maxVoltage) {
maxVoltage = voltage;
}
display.clearDisplay(); // Очистка дисплея перед новым выводом
drawVoltage(voltage, maxVoltage); // Отображение данных
display.display(); // Отрисовка содержимого
delay(500); // Пауза между обновлениями
}
// Показываем заставку при включении
void splashScreen() {
display.clearDisplay();
display.setTextSize(2); // Крупный шрифт
display.setTextColor(SSD1306_WHITE); // Белый цвет
display.setCursor(10, 10); // Смещение курсора
display.print("V-Meter"); // Надпись
display.display();
delay(2000); // Показываем заставку 2 секунды
}
// Функция для отображения напряжения и шкалы
void drawVoltage(float v, float vmax) {
display.setTextSize(3);
display.setCursor(0, 0);
display.print("V:");
display.print(v, 2); // Текущее напряжение с 2 знаками
display.setTextSize(2);
display.setCursor(0, 45);
display.print("Max: ");
display.print(vmax, 1); // Максимальное напряжение с 1 знаком
// Преобразуем напряжение в длину полосы от 0 до 128 пикселей
int barLength = map(v * 10, 0, 250, 0, 128); // (0...25.0В *10 = 250)
display.fillRect(0, 30, barLength, 10, SSD1306_WHITE); // Рисуем шкалу
}
🛠 Возможные улучшения
- 🔋 Добавить делитель напряжения из резисторов, чтобы измерять до 12В, 24В и выше.
- 📊 Реализовать график изменения напряжения во времени.
- 💾 Добавить сохранение данных в EEPROM или на SD-карту.
- ⚠️ Отображать предупреждение при превышении порога (например, мигающий дисплей).
📈 Как расширить проект
С этим вольтметром можно делать многое:
- Собрать электронную нагрузку с мониторингом.
- Добавить датчик тока, превратив его в амперметр.
- Объединить с RTC и вести лог напряжения по времени.
- Использовать BLE или Wi-Fi модуль и передавать данные на смартфон.
Волтметр-Амперметр-Ватметр DC730
🧪 Тестирование
Проект отлично работает в онлайн-симуляторе Wokwi. Ты можешь протестировать свою версию схемы и кода без пайки — быстро и просто!
📝 Заключение
Такой проект — отличный способ:
- начать знакомство с Arduino,
- научиться работать с дисплеями,
- освоить преобразование аналоговых сигналов в цифровую форму.
Он прост в сборке, понятен и отлично подходит как первая «полезная» самоделка.