Вольтметр на Arduino: измерение напряжения через аналоговый вход

Плата Arduino Uno, соединённая цветными проводами с беспаечной макетной платой, на которой установлены несколько выводных резисторов

Аналоговые входы Arduino позволяют измерять напряжение, если предварительно привести его к диапазону, безопасному для конкретного контроллера. Поэтому простейший вольтметр состоит из резистивного делителя, источника опорного напряжения и программы, переводящей показания АЦП в вольты. Но готовый результат зависит от платы: Arduino Uno на ATmega328P, платы с напряжением логики 3,3 В и другие контроллеры имеют разные ограничения. Неправильная схема способна повредить вход даже при относительно невысоком внешнем напряжении. Ниже разберём принципы, расчёт и калибровку на низковольтном стенде; подключать такой прибор напрямую к сети 230 В нельзя.

ВОЛЬТМЕТР НА ARDUINO: ДЕЛИТЕЛЬ И АЦП

кОм

кОм

В

бит

В

Коэффициент деления—
Верх шкалы—
На выводе при Umax—
Шаг АЦП на входе—
Ток делителя—
Выходное сопротивление—

Только для низковольтных цепей с общей землёй, безопасных по конструкции. Разрешение АЦП – не точность: опору, допуски резисторов и смещение учитывают калибровкой по мультиметру. Сеть 230 В к делителю не подключают.

k = (R1 + R2) / R2 U = N · Vref / 2ⁿ · k

Как Arduino измеряет аналоговое напряжение

Аналого-цифровой преобразователь измеряет напряжение входного вывода относительно общей земли и опорного уровня. Для классической Arduino Uno с ATmega328P типовое разрешение составляет 10 бит, то есть результат кодируется числами от 0 до 1023. По документации ATmega328P код равен Uвх · 1024 / Vref, поэтому напряжение на выводе находят обратным пересчётом. Шаг квантования зависит от выбранного опорного напряжения. Использование условного значения 5,00 В без проверки источника опоры приводит к систематической ошибке. В других платах разрядность и особенности АЦП могут отличаться. Перед переносом программы сверяйте документацию конкретной модели, а не полагайтесь на универсальную формулу для всех Arduino.

Uвыв = N · Vref / 1024

Зачем нужен делитель напряжения

Если измеряемое напряжение превышает допустимый диапазон аналого-цифрового входа, используют резистивный делитель. Два резистора подключаются последовательно, а напряжение снимается с точки между ними относительно общей земли. Идеальное отношение равно R2/(R1+R2), если нижний резистор соединён с землёй. Исходное напряжение восстанавливают по формуле

Uвх = Uацп · (R1 + R2) / R2

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

Пример расчёта для диапазона до 20 В

Для иллюстрации возьмём R1 = 30 кОм и R2 = 10 кОм. Коэффициент деления равен четырём, то есть 20 В на входе создают около 5 В на среднем выводе в идеальной схеме. Такой вариант допустим только при условии, что выбранная плата и опорный уровень действительно позволяют безопасно работать с этим сигналом. На практике нужен запас до предела, проверка допусков резисторов и защита от переходных процессов. Для плат на 3,3 В этот делитель не подходит без пересчёта.

Схема делителя напряжения для вольтметра на Arduino UnoПлюс измеряемого напряжения через резистор R1 30 кОм приходит в среднюю точку делителя; от неё к минусу идёт резистор R2 10 кОм, параллельно R2 стоит конденсатор 0,1 мкФ. Из средней точки через резистор 1 кОм сигнал идёт на вход A0 платы Arduino Uno. Минус источника соединён с GND Arduino. Формула: входное напряжение равно напряжению АЦП, умноженному на (R1 + R2) / R2, то есть на 4; при опоре 5,00 В верх шкалы 20 В. Минус источника соединяют с GND только в безопасных низковольтных цепях.Делитель для вольтметра на Arduino Uno+UвхR1 30 кОм1 кОмR2 10 кОм0,1 мкФ−UвхArduino UnoA0GNDопора 5 ВUвх = Uацп · (R1 + R2) / R2 = Uацп · 4Верх шкалы при опоре 5,00 В – 20 В; рабочий предел берите с запасом.Минус источника соединяется с GND – только для безопасных низковольтных цепей.
Конденсатор сглаживает помехи и помогает АЦП зарядить внутреннюю ёмкость выборки; резистор 1 кОм ограничивает ток через защитные диоды вывода.

Как выбрать номиналы резисторов

Слишком маленькие сопротивления создают ненужную нагрузку на измеряемый источник и расходуют энергию. Слишком большие – повышают чувствительность к входным токам, помехам и особенностям схемы выборки-хранения АЦП. Поэтому соотношение выбирают одновременно с абсолютными номиналами. В высокоомных делителях может понадобиться буферный каскад или корректировка времени выборки. Для АЦП ATmega328P производитель рекомендует источник с выходным сопротивлением не более 10 кОм; у делителя оно равно R1 · R2 / (R1 + R2) – для 30 и 10 кОм это 7,5 кОм. Резисторы с меньшим допуском улучшают воспроизводимость коэффициента деления, но не устраняют ошибку опорного напряжения. После монтажа реальные сопротивления можно измерить и учесть в программе.

Общая земля и электрическая изоляция

Классический делитель без гальванической развязки требует общей точки отсчёта между измеряемым источником и Arduino. Это допустимо только для низковольтных совместимых цепей, безопасных по конструкции. Нельзя подключать землю Arduino к произвольной точке сетевого блока питания, первичной стороне преобразователя или неразвязанной цепи. Подключение USB-кабеля компьютера дополнительно создаёт связи с его землёй и корпусом. Для измерения опасного напряжения нужны специальный измерительный прибор и соответствующая развязка, а не простой делитель из двух резисторов.

Пример программы чтения АЦП

В минимальном скетче Arduino Uno вызывают analogRead(A0), сохраняют код АЦП и умножают его на измеренный опорный уровень, делённый на 1024 (так формулу записывает документация ATmega328P; деление на 1023 даёт разницу меньше одного шага АЦП), затем применяют коэффициент делителя. Важно, чтобы в программе стояли измеренные, а не номинальные значения опоры и резисторов. Для уменьшения дрожания показаний можно усреднять несколько чтений, но это не увеличивает автоматически абсолютную точность. Дисплей или Serial Monitor выводит рассчитанные вольты с разумным количеством знаков, обычно меньшим, чем позволяют символы после запятой.

// Подставьте измеренные значения:
// опора – напряжение на выводе 5V
// (или AREF), R1 и R2 – в омах.
const byte PIN = A0;
const float VREF = 5.00;
const float R1 = 30000.0;
const float R2 = 10000.0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  // холостое чтение после выбора канала
  analogRead(PIN);
  long sum = 0;
  for (byte i = 0; i < 16; i++) {
    sum += analogRead(PIN);
  }
  // усреднённый код 0…1023
  float n = sum / 16.0;
  // напряжение на выводе A0
  float uPin = n * VREF / 1024.0;
  // напряжение на входе делителя
  float uIn = uPin * (R1 + R2) / R2;
  Serial.print(uIn, 2);
  Serial.println(" V");
  delay(500);
}

Калибровка по мультиметру

Сначала проверьте фактическое напряжение опоры, затем подайте на измерительный вход два или три безопасных известных уровня. Сравните показания программы с поверенным или достаточно точным мультиметром. Если расхождение имеет постоянный процент, уточните коэффициент делителя или опорное напряжение; если меняется нелинейно, проверьте нагрузку входа, шум, соединения и диапазон АЦП. Калибровку выполняют при одинаковой температуре и стабильном питании, записывая условия. Одно совпадение на 5 В не подтверждает точность на всём диапазоне.

Защита входного вывода

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

Отображение на LCD или OLED

Программа может выводить результат в монитор последовательного порта, на LCD 1602 или OLED-дисплей SSD1306. При использовании внешнего дисплея важно не перегружать линии питания Arduino и согласовывать логические уровни интерфейса. Плавное отображение достигается фильтрацией и заданной частотой обновления, а не просто увеличением количества десятичных знаков. На экране полезно показывать признак выхода измерения за диапазон и напоминать о его номинале. Поддержка нескольких каналов требует учёта перекрёстного влияния, коммутации аналоговых входов и времени установления сигнала.

Какая точность реально достижима

Разрешение АЦП и точность вольтметра – разные характеристики. На итог влияют стабильность опорного уровня, допуски резисторов, шум питания, смещение входа и температура. Если используемое опорное напряжение колеблется, измеряемое значение тоже будет изменяться даже при постоянном сигнале. Повышение разрядности в программной настройке не исправляет нестабильный источник. На Uno АЦП можно переключить на внутреннюю опору 1,1 В командой analogReference(INTERNAL): она не зависит от колебаний питания 5 В, но имеет разброс от экземпляра к экземпляру, поэтому её значение тоже измеряют, а делитель пересчитывают под шкалу 1,1 В. Для более точных измерений применяют внешний АЦП или отдельную прецизионную опору, но и в этом случае нужна калибровка всей измерительной цепи.

Работа с плавающим источником

Плавающий низковольтный источник может не иметь общей земли с Arduino. Прежде чем соединять отрицательный контакт с землёй платы, необходимо понять, как источник связан с другими приборами и компьютером. Через USB-разъём могут возникать неожиданные электрические цепи. Если условия измерения неизвестны, использовать простой неразвязанный делитель нельзя. В таком случае подходят специальные изолированные измерительные модули или готовые приборы, разработанные для соответствующей категории измерений.

Как проверить делитель калькулятором

Калькулятор в начале статьи принимает R1, R2, опорное напряжение, разрядность АЦП и наибольшее входное напряжение. Он вычисляет коэффициент деления, верх шкалы, напряжение на выводе, шаг АЦП, ток через резисторы и выходное сопротивление делителя. Если расчётный уровень на выводе превышает опору, выводится предупреждение, а не «готовая схема». Для окончательного проектирования нужно дополнительно учесть допуски компонентов, импульсные перегрузки и входные характеристики микроконтроллера.

Шум от USB и дисплея

Показания иногда меняются при подключении ноутбука или включении OLED-экрана. Причина может заключаться в изменении напряжения питания и опоры, помехах на общей земле либо активности цифровых интерфейсов. Для диагностики сравните результаты при стабильном лабораторном питании и выключенном дисплее. Затем проверьте разводку проводов и конденсаторы развязки. Не стоит компенсировать шум случайным программным коэффициентом – сначала выясните, меняется ли реальный входной сигнал или только результат АЦП.

Линейная коррекция по двум точкам

Если измерительная цепь показывает систематическую ошибку масштаба и смещения, можно использовать линейную модель U = k × N + b, определив коэффициенты по двум точным контрольным напряжениям. Однако эта модель корректна лишь в пределах рабочего диапазона и при достаточно линейном АЦП. Для некоторых контроллеров, особенно с выраженной нелинейностью входа, требуется более сложная калибровка или внешний преобразователь. Важно оценить погрешность по всему диапазону, а не ждать лабораторной точности от двух измерений.

k = (U2 − U1) / (N2 − N1); b = U1 − k · N1

Линейная калибровка вольтметра на Arduino по двум точкамГрафик: по горизонтали код АЦП от 0 до 1023, по вертикали напряжение. Синяя прямая из нуля – расчёт по номиналам резисторов и опоре. Красная пунктирная прямая – реальный прибор со смещением и другим наклоном. На красной прямой отмечены точка 1 и точка 2. Ниже: модель U = k · N + b, коэффициенты считают по двум точкам, измеренным эталонным мультиметром, и проверяют третьей точкой посередине. Рисунок иллюстрирует метод, а не результаты измерений.Калибровка вольтметра по двум точкамкод АЦП NU, В01023расчёт по номиналамреальный приборточка 1точка 2U = k · N + bk и b считают по двум точкам, измеренным эталонным мультиметром,затем проверяют третьей точкой посередине. Рисунок – иллюстрация метода.
Две точки задают наклон и смещение; третья, посередине диапазона, показывает, хватает ли линейной модели.

Как документировать погрешность

Для каждой контрольной точки записывают показание эталонного прибора, показание Arduino, абсолютную и относительную ошибку. Затем сравнивают результаты по всему диапазону, не выбирая только точку, где калибровка случайно совпала. При изменении источника питания и температуры тест повторяют. Если нужна оценка для пользователя, укажите реальный диапазон проверки и условия, а не просто разрешение «10 бит». Это поможет отличить учебный индикатор напряжения от измерительного прибора.

Практические примеры

Arduino Uno и блок питания 9 В

Для демонстрации низковольтного измерения можно подключить делитель к безопасному лабораторному источнику и сравнить показания с мультиметром. Перед соединением убедитесь, что минус источника допустимо связывать с землёй Arduino. Рассчитайте коэффициент деления, проверьте допустимый максимум для аналогового вывода и только затем выполняйте опыт. Если плата одновременно подключена к USB, дополнительно учтите общую землю компьютера.

Переход на плату с логикой 3,3 В

Код, работающий на Arduino Uno, нельзя без проверки переносить на контроллер с допустимым напряжением 3,3 В. При том же делителе 20-вольтовый сигнал создаст около 5 В на входе и может повредить микроконтроллер. Нужно пересчитать делитель и уточнить разрешение, опорное напряжение и характеристики встроенного АЦП. После изменений заново проводят калибровку и проверку защиты.

Дрожание последнего знака

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

Ограничения примера скетча

Скетч выше явно объявляет аналоговый вывод, номиналы обоих резисторов делителя, измеренное опорное напряжение и формулу пересчёта. Он рассчитан на платы с 10-битным АЦП ATmega328P – классическую Arduino Uno или Nano. Перенос на контроллер с логикой 3,3 В требует пересчёта делителя и повторной проверки допустимых входных уровней. Проверяя прибор, запишите несколько контрольных измерений: известное напряжение, код АЦП и результат вольтметра. При сравнении с мультиметром отдельно вычисляют абсолютную и относительную ошибку. Нельзя заявлять точность измерения до сотых вольта только потому, что дисплей умеет отображать две цифры после запятой. Сетевое напряжение и неизвестные неразвязанные цепи к обычному делителю не подключают.

Частые вопросы

Можно ли измерять 12 В напрямую входом Arduino?

Нет, для типового аналогового входа требуется соответствующее масштабирование и защита.

Нужно ли соединять земли?

Для обычного неразвязанного делителя нужна общая точка отсчёта, но только в безопасных совместимых низковольтных цепях.

Почему АЦП показывает не ровно 5 В?

Причиной могут быть допуск и нестабильность опоры, резисторы и шум.

Подойдёт ли скетч для ESP32?

Не без адаптации: у ESP32 другие характеристики АЦП и уровни входного сигнала.

Можно ли измерять 220 В через два резистора?

Нет. Для сети нужен специализированный измерительный прибор с соответствующей безопасностью и развязкой.

Материалы по теме