Умный вольтметр на Arduino и смартфоне — простое DIY-проект
Компоненты и материалы
| Arduino UNO | 1 шт. |
| PHPoC WiFi Shield для Arduino | 1 шт. |
| Резистор 100 кОм | 1 шт. |
| Резистор 1 МОм | 1 шт. |
| Перемычки (набор) | 1 шт. |
О проекте
Демонстрация
Если вы новичок в Arduino, начните с базовых уроков по Arduino.
Принцип работы
Аналоговый вход Arduino может измерять напряжение до 5 В. Для расширения диапазона используется делитель напряжения.
Теория
Формула измеряемого напряжения:
V_measure = (R1 + R2) / R2 * V_in
Коэффициент деления: ratio = (R1 + R2) / R2
При выборе R1 = 10 × R2 получаем V_measure = 11 * V_in. Так как максимальное V_in = 5 В, максимальное измеряемое напряжение составляет 55 В.
Для ограничения тока через вывод Arduino и предотвращения повреждений резисторы выбирают максимально большими. Используются: R1 = 1 МОм, R2 = 100 кОм.
На практике
Встречаются две основные проблемы:
- Фактические номиналы резисторов имеют погрешность, что вносит ошибку в V_measure.
- Питание Arduino может быть нестабильным, что приводит к нестабильности опорного напряжения АЦП и ошибке расчёта V_in и, следовательно, V_measure.
Эти проблемы решаются на этапе калибровки.
Калибровка
1. Измерение реального коэффициента деления
Выполняется один раз для получения точного значения ratio.
Сборка по схеме:
ratio = (R1 + R2) / R2 = V_measure / V_in = A1_read_value / A0_read_value
Код для калибровки см. ResisterCalibration.ino в разделе «Код».
2. Нестабильность питания
Нестабильность питания вызывает дрейф опорного напряжения аналогового входа. Для устранения необходимо периодически измерять опорное напряжение.
Подключите 3,3 В к выводу A1:
Опорное напряжение вычисляется косвенно по значению на A1:
V_reference = 1023 * 3.3 / A1_value
Расчёт измеряемого напряжения:
V_in = mapFloat(A0_value, 0, 1023, 0, V_reference); V_measure = ratio * V_in;
Основная схема подключения:
Пошаговая инструкция
- Соберите схему «калибровка резисторов».
- Загрузите скетч
ResistorCalibration.ino. - Откройте Serial Plotter.
- Скопируйте значение
ratio. - Замените это значение в строке 5 скетча
Voltmeter.ino. - Пересоберите схему по «основной схеме».
- Загрузите
Voltmeter.ino. - Загрузите веб-интерфейс (
voltmeter.phpиvoltmeter_body.jpg) на PHPoC Shield. - Откройте в браузере
https://phpoc_shield_ip_address/voltmeter.phpдля просмотра напряжения на смартфоне.
Советы по монтажу
Код
ResistorCalibration.ino
double ratio;
int analogReadAverage(int pin, int read_time) {
unsigned long read_value = 0;
for(int i = 0; i < read_time; i++) {
read_value += analogRead(pin);
delay(2);
}
read_value /= read_time;
return read_value;
}
double resistorCalibration() {
double _ratio;
double A0_read_value;
double A1_read_value;
A0_read_value = analogReadAverage(A0, 20);
A1_read_value = analogReadAverage(A1, 20);
_ratio = A1_read_value / A0_read_value;
return _ratio;
}
void setup() {
Serial.begin(9600);
}
void loop() {
ratio = resistorCalibration();
Serial.print("ratio:");
Serial.println(ratio);
delay(200);
}
Voltmeter.ino
double V_measure;
double V_in;
double V_reference;
double ratio = 11.59; // замените на откалиброванное значение
double mapFloat(double x, double in_min, double in_max, double out_min, double out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
int analogReadAverage(int pin, int read_time) {
unsigned long read_value = 0;
for(int i = 0; i < read_time; i++) {
read_value += analogRead(pin);
delay(2);
}
read_value /= read_time;
return read_value;
}
double getVoltageReference() {
double A1_value = analogReadAverage(A1, 20);
double V_REF = 1023 * 3.3 / A1_value;
return V_REF;
}
void setup() {
Serial.begin(9600);
}
void loop() {
V_reference = getVoltageReference();
double A0_value = analogReadAverage(A0, 20);
V_in = mapFloat(A0_value, 0, 1023, 0, V_reference);
V_measure = ratio * V_in;
Serial.println(V_measure);
delay(200);
}
voltmeter.php (веб-интерфейс)
<!DOCTYPE html>
<html>
<head>
<title>PHPoC Shield - VOLTMETER</title>
<meta name="viewport" content="width=device-width, initial-scale=0.7">
<link rel="stylesheet" media="screen" href="https://fontlibrary.org/face/segment7" type="text/css"/>
<style>
html {height: 100%;}
body {width: 100%; height: 100%; text-align: center;}
.container {width: 100%; min-height: 99%; max-height: 100%;}
canvas { background: url(voltmeter_body.jpg); background-size:contain; font-family: 'Segment7Standard'; font-weight: bold; font-style: italic; }
</style>
<script>
// ... JavaScript код для WebSocket и отрисовки вольтметра на canvas ...
</script>
</head>
<body onresize="canvas_resize()">
<div class="container" id="container">
<canvas id="graph"></canvas>
</div>
</body>
</html>
Схемы
Производственный процесс
- DIY-консоль управления Photoshop на Arduino Nano RP2040 Connect
- Надежная система учета рабочего времени на Arduino с RFID и Python
- Универсальный Android-пульт на Arduino, 1Sheeld и ИК-управлении
- Надежный ИК-датчик пульса на Arduino: пошаговое руководство
- Точное измерение частоты и коэффициента заполнения на Arduino UNO
- Сборка вольтметра на Arduino с дисплеем Nokia 5110 — Пошаговое руководство
- Измерение расстояния в реальном времени: Ардуино-сонар с визуализацией в Processing
- MobBob: Самостоятельная сборка Arduino-робота под управлением Android-смартфона
- Бесшовное управление яркостью светодиодов с помощью Bolt IoT и Arduino UNO
- Умная робо-рука на Arduino: простое DIY-руководство