Arduinoとスマホで作るスマート電圧計 – 簡単DIYプロジェクト
必要なパーツと用品
| Arduino UNO | ×1 |
| PHPoC WiFi Shield for Arduino | ×1 |
| 抵抗 100kΩ | ×1 |
| 抵抗 1MΩ | ×1 |
| ジャンパーワイヤー | ×1 |
プロジェクト概要
Arduinoのアナログ入力ピンを使って電圧を測定します。ただし、Arduinoのアナログ入力で測定可能な最大電圧は5Vです。より高い電圧を測定するには、分圧回路(抵抗分圧器)を使用します。
動作原理
理論

分圧比は以下の式で求められます:
V_measure = (R1 + R2) / R2 × V_in
ratio = (R1 + R2) / R2
⇒ V_measure = ratio × V_in
R1 = 10 × R2 とすると、ratio = 11 となり、測定可能な最大電圧は 5V × 11 = 55V になります。Arduinoのピンに流れる電流を制限し、破損を防ぐため、抵抗値はできるだけ大きく選びます。ここでは R1 = 1MΩ、R2 = 100kΩ を使用します。
実践における課題と解決
実際には以下の問題が発生します:
- 抵抗値に誤差があり、測定電圧に誤差が生じる
- Arduinoの電源電圧が不安定で、アナログ入力の基準電圧(V_REF)が変動し、計算誤差の原因になる
これらの問題は「キャリブレーション(校正)」の手順で解決します。
キャリブレーション(校正)
1. 実際の分圧比 (R1+R2)/R2 を測定する
この作業は一度だけ行えばOKです。以下のように配線し、抵抗キャリブレーション用スケッチを実行します。

ratio = (R1 + R2) / R2 = V_measure / V_in = A1_read_value / A0_read_value
ratio = A1_read_value / A0_read_value
シリアルプロッタで出力される ratio 値をコピーし、メインスケッチ(Voltmeter.ino)の5行目に書き込みます。
2. 電源電圧の不安定さへの対策
電源電圧の変動はアナログ基準電圧の変動を招き、測定誤差の原因になります。これを解決するため、3.3Vピンを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 をアップロード
- シリアルプロッタを開き、ratio 値をコピー
- Voltmeter.ino の5行目の ratio 値を書き換え
- 「メイン配線」で再配線
- Voltmeter.ino をアップロード
- Webユーザーインターフェース(voltmeter.php と voltmeter_body.jpg)をPHPoC Shieldにアップロード
- ブラウザで
https://phpoc_shield_ip_address/voltmeter.phpにアクセスし、電圧を確認
スマートフォンからも同様にアクセス可能です。

配線のコツ



ソースコード
ResistorCalibration.ino(Arduino)
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(Arduino)
double V_measure, V_in, 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); // A1は3.3Vに接続
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 UI / PHP)
PHPoC ShieldにアップロードするWebインターフェースです。背景画像 voltmeter_body.jpg も一緒にアップロードしてください。
<!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>
// ...(WebSocket通信とキャンバス描画のJavaScriptコード)...
</script>
</head>
<body onresize="canvas_resize()">
<div class="container" id="container">
<canvas id="graph"></canvas>
</div>
</body>
</html>
回路図

製造プロセス
- Arduino Nano RP2040で作るDIY Photoshopコントロールコンソール
- Python連携で信頼性向上: Arduino RFID勤怠管理システム
- Arduinoと1Sheeldで作る万能Androidリモコン──IR制御で家電を一括操作
- Arduinoで作る赤外線心拍センサー:低コスト・リアルタイム波形表示のステップバイステップガイド
- Arduino UNOで周波数とデューティサイクルを高精度測定
- ArduinoとNokia 5110ディスプレイで自作電圧計:ステップバイステップガイド
- Arduino超音波センサーとProcessingで作るリアルタイム距離測定ソナー
- MobBob:Arduino製ロボットをAndroidスマホでシームレスに制御
- Bolt IoTとArduino UNOでLED輝度をシームレス制御
- スマートなArduino制御ロボットアームの製作:簡単DIYチュートリアル
- Arduino NanoとRDA5807Mで作るコンパクトFMラジオ