Первый вольтметр на Arduino я собрал не ради вольтметра: на самодельном блоке питания пропало доверие к стрелочному индикатору, а мультиметр в доме один, и вечно он занят не там, где нужен. Классическая схема из интернета обещала прибор на 0-30 В поверх LCD 16x2 — как раз дисплей, оставшийся от первого урока про I2C. Я собрал делитель, загрузил чужой скетч, подал двенадцать вольт от компьютерного блока — а экран показал 13.9. Мультиметр врал? Нет: резисторы из пакета с маркировкой «100 кОм» имели по факту 98.6 и 10.2 кОм, а опорные пять вольт были скорее 4.94. Прибор работал ровно так, как собран, — просто без калибровки.
В этом уроке — та же схема, но с честной арифметикой: делитель 100 кОм и 10 кОм, снижающий напряжение в одиннадцать раз перед пином A0; 10-битный АЦП с его шагом отсчёта; вывод формата «U = 12.34 V» без мерцания и пережитых хвостов. Отдельный разговор — калибровка: те самые проценты расхождения, что я поймал на двенадцати вольтах, лечатся одним коэффициентом, и его стоит уметь считать руками. Саму математику делителей я подробно расписывал в уроке про расчёт делителя, здесь — только то, что касается измерительного прибора.
Почему нельзя просто воткнуть измеряемую цепь в A0: вход ATmega328P переживает максимум около 5.5 В, а тридцать вольт убивают кристалл за секунду. Делитель здесь — предохранитель, а не удобство. Платим за него точностью и входным сопротивлением, и обе цены посчитаем по строкам.
Делитель: 100 кОм сверху, 10 кОм снизу
Схема — два резистора друг на друге. Верхнее плечо R1 = 100 кОм встречает измеряемое напряжение, нижнее R2 = 10 кОм уходит на землю, а точка их соединения сидит на A0. Коэффициент передачи K = (R1 + R2) / R2 = 110000 / 10000 = 11: на пин всегда приходит ровно одна одиннадцатая входа. Обратная формула, ради которой всё затевалось: U_вх = U_пин × 11. При 30 В на входе на пине будет 2.73 В — далеко от опасных 5.5, и это осознанный запас, а не расточительность.
Честный потолок этой пары резисторов — 55 В: выше пин получит свои законные пять вольт, АЦП упрётся в 1023, и прибор замрёт на максимуме. Писать на корпусе «0-30 В» я готов не потому, что выше не меряет, а потому, что выше рискованно: резисторы с допуском ±5 % перекашивают делитель, опорное напряжение платы гуляет на десятки милливольт. Полка вдвое ниже теоретического предела — нормальная инженерная страховка, а не маркетинг.
Побочный эффект делителя — он потребляет ток из измеряемой цепи: 30 В через 110 кОм — это 0.27 мА. Для лабораторного блока незаметно, для девятивольтовой кроны — существенный кусок её ресурса. И ещё одно условие: земля Arduino и земля измеряемой цепи должны быть общими, иначе делителю не с чем сравнивать — вход превратится в антенну.
| Диапазон | R1 / R2 | K | Шаг на входе |
|---|---|---|---|
| 0-10 В | 100 кОм / 100 кОм | 2 | 0.010 В |
| 0-15 В | 100 кОм / 50 кОм | 3 | 0.015 В |
| 0-25 В | 100 кОм / 25 кОм | 5 | 0.024 В |
| 0-55 В (рабочая полка 30) | 100 кОм / 10 кОм | 11 | 0.054 В |
АЦП: 10 бит и откуда берётся «0.03 В»
АЦП Uno — 10-битный: analogRead отдаёт число от 0 до 1023, где верх соответствует опорным пяти вольтам на пине. В вольты сырьё переводится по прямой: U_пин = raw × 5.0 / 1023.0. Один отсчёт — это 4.9 мВ на пине, а с учётом делителя K = 11 — 54 мВ на входе. Вот и всё разрешение прибора: ниже 0.05 В он не различит, что бы ни обещала витрина.
Чужие уроки про «0-30 В» любят писать «шаг 0.03 В» — и это арифметика диапазона, а не прибора: тридцать вольт, поделённые на 1024 отсчёта. Чтобы честно получить 0.03 В на отсчёт, нужен коэффициент шесть, то есть 100 кОм и 20 кОм — тогда полный масштаб ровно 30 В. Я сознательно оставил 10 кОм: та же плата берёт и 48-вольтовые шины, а последний разряд дисплея всё равно дрожит от шума. Хотите лаконичную развёртку 0-30 — меняйте нижнее плечо и пересчитайте K.
Замеры я усредняю: восемь чтений с паузой 2 мс дают среднее, на котором шум АЦП проседает заметно. Для тяжёлых случаев — реле в соседней макетке, длинные провода, дрожащий блок питания — есть целый урок про фильтр среднего, здесь беру лёгкую версию.
Опорные пять вольт — второй источник вранья, о котором редко пишут: АЦП Uno меряет относительно питания чипа, и если плата сидит на USB, реальная опора бывает 4.85-4.95 В вместо паспортных пяти. Три процента — это 0.9 В на тридцативольтовой шкале. В скетче это лечится тем же коэффициентом CAL, а дотошным — внешним источником опоры на пин AREF: прибор поднимется классом, но для стенда на LCD хватает калибровки.
#include <Wire.h>#include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); const float R1 = 100000.0; // верхнее плечо делителяconst float R2 = 10000.0; // нижнее плечоconst float CAL = 1.00; // поправка с мультиметра void setup() { lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); lcd.print("Voltometr 0-30V");} void loop() { long sum = 0; for (int i = 0; i < 8; i++) { // восемь чтений sum += analogRead(A0); delay(2); } float raw = sum / 8.0; float u = raw * 5.0 / 1023.0 * (R1 + R2) / R2 * CAL; lcd.setCursor(0, 1); lcd.print("U = "); lcd.print(u, 2); // два знака после точки lcd.print(" V "); // пробелы затирают старые хвосты delay(200);}Формулу я собрал из констант R1 и R2 нарочно: замените резисторы — и коэффициент пересчитается сам, без поиска магической цифры одиннадцать по коду. CAL стартует с единицы и ждёт калибровки. Порядок действий читается слева направо: сырой отсчёт в вольты пина, затем множитель делителя, затем поправка.
Формат вывода — два знака после точки через lcd.print(u, 2): меньше не нужно, шаг прибора 0.05 В, а больше — честнее, чем меряет железо. Хвост из трёх пробелов после «V» затирает цифры прошлого показания — без него 11.11, сменившись на 9.99, оставит на экране 9.991. Механику десятичных дробей на LCD я разбирал в уроке про числа и нули, а причины мерцания и точечное обновление — в разборе без lcd.clear().
Диапазон отображения — те самые 0-30 В рабочей полки: между 30 и 55 В прибор покажет честно, но с растущим риском для пина. Если планировали мерить автомобильную бортовую сеть, помните про выбросы: стартер и реле подбрасывают импульсы заметно выше номинальных двенадцати вольт, и стабилитрон на 5.1 В поперёк нижнего плеча прижимает их до безопасных значений.
Калибровка: мультиметр, крона и один коэффициент
Резисторы с допуском ±5 % — это K где-то между 10.6 и 11.5, плюс опорное напряжение, которое на USB-питании скорее 4.94, чем 5.00. Суммарно мой первый прибор врал на тринадцать процентов, и это типично. Лечится калибровкой: подаю заведомо известное напряжение, смотрю, что сказал прибор, делю правду на показание — получаю поправочный коэффициент. Крона на 9 В — сносный эталон в каждом доме, лабораторный блок с мультиметром — эталон лучше.
Процедура на пять минут. Источник держит 9.00 В по мультиметру, экран показал 10.20 — CAL = 9.00 / 10.20 = 0.882. Вписываю в константу, перезаливаю скетч, проверяю на второй точке, например на 12 В: расхождение теперь в пределах одного-двух младших разрядов. Калибруйтесь в середине рабочего диапазона — там делитель линейный, а вклад допусков резисторов усредняется.
Коэффициент в константе живёт до первой перепрошивки — для стенда этого хватает. Если прибор становится постоянным жителем корпуса, поправку переносят в энергонезависимую память: как хранить откалиброванное смещение и переживать перезагрузки, я расписал в уроке про калибровку в EEPROM.
- Делитель 100 кОм/10 кОм даёт K = 11: U_вх = raw × 5.0 / 1023.0 × 11, на пин приходит одна одиннадцатая входа
- Честный шаг прибора — 0.054 В; «0.03 В» из чужих уроков — арифметика диапазона 30/1024, настоящие 0.03 даёт нижнее плечо 20 кОм (K = 6)
- Потолок пары 100к/10к — 55 В, рабочую полку пишут 30 В: запас на допуск резисторов ±5 % и гуляние опорного напряжения
- Калибровка — один коэффициент CAL = U_эталона / U_экрана, калиброваться лучше в середине диапазона; постоянному прибору поправку несут в EEPROM
- Делитель тянет из измеряемой цепи 0.27 мА при 30 В и требует общей земли с Arduino
- 1. Во сколько раз делитель 100 кОм / 10 кОм снижает напряжение?
- 2. Откуда в чужих уроках берётся «шаг 0.03 В» у вольтметра 0-30 В?
- 3. Сколько вольт от измеряемых 30 В приходит на пин A0?
- 4. Как калибруют такой вольтметр по мультиметру?
- 5. Почему рабочая полка прибора 30 В, хотя делитель тянет 55?
Частые вопросы по теме урока
- Во сколько раз делитель 100 кОм / 10 кОм снижает напряжение?
- Снижение задаёт отношение суммы плеч к нижнему: (100000 + 10000) / 10000 = 11. Отношение R1/R2 = 10 забывает, что входное напряжение делится между обоими резисторами. в 11 раз: (R1 + R2) / R2
- Откуда в чужих уроках берётся «шаг 0.03 В» у вольтметра 0-30 В?
- 30 / 1024 ≈ 0.029 В — так считают от обещанного диапазона. При K = 11 честный шаг — 0.054 В; настоящие 0.03 В даёт коэффициент 6, то есть нижнее плечо 20 кОм. это 30 В, поделённые на 1024 отсчёта АЦП — арифметика диапазона
- Сколько вольт от измеряемых 30 В приходит на пин A0?
- Нижнее плечо получает одну одиннадцатую: 30 × 10 / (100 + 10) = 2.73 В. Полные 5 В на пине были бы при 55 В на входе — там АЦП упирается в 1023. 2.73 В — вход делится на K = 11
- Как калибруют такой вольтметр по мультиметру?
- Усреднение борется с шумом, но не с систематическим перекосом от допусков резисторов и опорного напряжения. Лечится умножением на коэффициент правды к показанию экрана. подают известное напряжение и вписывают CAL = U_эталона / U_экрана
- Почему рабочая полка прибора 30 В, хотя делитель тянет 55?
- При 55 В даже небольшой перекос номиналов выталкивает напряжение на пине за 5 В. Полка вдвое ниже теоретического предела — страховка, а не экономия. запас на допуск резисторов и нестабильность опорных 5 В