Intelligentes Voltmeter mit Arduino & Smartphone bauen – Einfaches DIY-Projekt
Komponenten und Materialien
| Arduino UNO | × | 1 |
| PHPoC WiFi Shield für Arduino | × | 1 |
| Widerstand 100 kΩ | × | 1 |
| Widerstand 1 MΩ | × | 1 |
| Steckbrücken (Jumper Wires) | × | 1 |
Projektbeschreibung
Mit diesem Projekt baust du ein intelligentes Voltmeter, das Spannungen bis zu 55 V misst und die Werte über ein Webinterface auf deinem Smartphone anzeigt. Der Arduino UNO erfasst die Spannung über einen analogen Eingang, wobei ein Spannungsteiler den Messbereich erweitert. Das PHPoC WiFi Shield stellt die drahtlose Verbindung zum Webserver her.
Funktionsweise
Theoretische Grundlagen
Der Arduino kann an seinen analogen Eingängen maximal 5 V messen. Um höhere Spannungen zu erfassen, wird ein Spannungsteiler aus zwei Widerständen (R1, R2) verwendet.

Die Formel lautet:
V_mess = (R1 + R2) / R2 × V_in
Wählt man R1 = 10 × R2, ergibt sich ein Teilungsverhältnis von 11. Bei maximal 5 V am analogen Eingang können somit bis zu 55 V gemessen werden.
Um den Strom durch den Arduino-Pin gering zu halten und Beschädigungen zu vermeiden, sollten die Widerstandswerte so hoch wie möglich gewählt werden. Hier kommen R1 = 1 MΩ und R2 = 100 kΩ zum Einsatz.
Praxisnahe Betrachtung & Kalibrierung
In der Praxis gibt es zwei Hauptfehlerquellen:
- Toleranzen der Widerstände verfälschen das Teilungsverhältnis.
- Eine instabile Arduino-Versorgungsspannung führt zu einer schwankenden Referenzspannung (V_REF) des ADC, was Messfehler verursacht.
Beide Probleme werden durch eine zweistufige Kalibrierung gelöst:
1. Ermittlung des echten Teilungsverhältnisses
Diese Kalibrierung muss nur einmal durchgeführt werden. Die Schaltung wird wie folgt aufgebaut:

Das Verhältnis berechnet sich aus den ADC-Werten:
ratio = A1_Wert / A0_Wert
Der zugehörige Code (ResistorCalibration.ino) gibt den Wert über den Serial Plotter aus.
2. Kompensation der Versorgungsinstabilität
Die Referenzspannung wird indirekt über den 3,3 V-Pin des Arduino (an A1) gemessen:
V_Referenz = 1023 × 3,3 / A1_Wert
Die Eingangsspannung und die gemessene Spannung werden dann berechnet:
V_in = mapFloat(A0_Wert, 0, 1023, 0, V_Referenz);
V_mess = ratio * V_in;
Die finale Hauptverdrahtung sieht so aus:

Schritt-für-Schritt-Anleitung
- Verdrahtung gemäß „Widerstands-Kalibrierung“ aufbauen.
ResistorCalibration.inohochladen.- Serial Plotter öffnen und den
ratio-Wert notieren. - Diesen Wert in Zeile 5 von
Voltmeter.inoeintragen. - Umverdrahten gemäß „Hauptverdrahtung“.
Voltmeter.inohochladen.- Web-Interface (
voltmeter.phpundvoltmeter_body.jpg) auf den PHPoC Shield laden. - Im Browser die Webseite
https://phpoc_shield_ip_address/voltmeter.phpaufrufen – die Spannung wird angezeigt.
Das Webinterface passt sich responsiv an Smartphone-Bildschirme an.

Verdrahtungstipps:



Code
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 = analogReadAverage(A0, 20);
double 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 (Hauptprogramm)
double V_measure;
double V_in;
double V_reference;
double ratio = 11.59; // Hier den kalibrierten Wert eintragen!
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); // A1 an 3,3 V
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 (Web-Interface)
<!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-Code für WebSocket-Verbindung und Canvas-Darstellung)
</script>
</head>
<body onresize="canvas_resize()">
<div class="container" id="container">
<canvas id="graph"></canvas>
</div>
</body>
</html>
Schaltplan
Das Hintergrundbild voltmeter_body.jpg muss zusammen mit der PHP-Datei auf den PHPoC Shield hochgeladen werden.

Herstellungsprozess
- DIY Photoshop-Steuerkonsole mit Arduino Nano RP2040 bauen
- RFID-Anwesenheitssystem mit Arduino & Python – Daten direkt in phpMyAdmin (XAMPP) speichern
- Universelle Android-Fernbedienung mit Arduino, 1Sheeld & IR-Steuerung
- DIY Infrarot-Herzschlag-Sensor mit Arduino: Schritt-für-Schritt-Anleitung
- Frequenz & Tastverhältnis präzise messen mit Arduino UNO
- DIY-Voltmeter mit Arduino und Nokia 5110 Display – Schritt-für-Schritt-Anleitung
- Echtzeit-Entfernungsmessung mit Arduino Sonar & Processing-Visualisierung
- MobBob: Eigenen Arduino-Roboter bauen, per Android-Smartphone steuern
- Stufenlose LED-Helligkeitssteuerung mit Bolt IoT und Arduino UNO
- Intelligenter Arduino-Roboterarm bauen: Einfaches DIY-Tutorial