Construire un Voltmètre Intelligent avec Arduino et Smartphone – Projet DIY Facile
Composants et fournitures
| Arduino UNO | ×1 |
| Shield PHPoC WiFi pour Arduino | ×1 |
| Résistance 100 kΩ | ×1 |
| Résistance 1 MΩ | ×1 |
| Fils de connexion (jumper wires) | ×1 |
À propos de ce projet
Démonstration
Si vous débutez avec Arduino, vous pouvez commencer par les tutoriels Arduino pour débutants.
Fonctionnement
On peut utiliser une broche d'entrée analogique de l'Arduino pour mesurer une tension. Cependant, la tension maximale mesurable est de 5 V.
Pour augmenter la plage de mesure, il faut utiliser un diviseur de tension.
En théorie
La formule est la suivante :
V_mesure = (R1 + R2) / R2 × V_entrée
ratio = (R1 + R2) / R2
⇒ V_mesure = ratio × V_entrée
Si on choisit R1 = 10 × R2, on obtient :
V_mesure = 11 × V_entrée
Puisque V_entrée max = 5 V, la tension maximale mesurable est de 55 V.
Pour limiter le courant traversant la broche de l'Arduino (et éviter de l'endommager), il faut choisir des valeurs de résistance les plus élevées possibles.
J'ai choisi : R1 = 1 MΩ, R2 = 100 kΩ
En pratique
Deux problèmes surviennent en pratique :
- Les valeurs réelles de R1 et R2 ont des tolérances, ce qui entraîne une erreur sur V_mesure.
- L'alimentation de l'Arduino peut être instable, ce qui rend la tension de référence (V_REF) de l'entrée analogique instable. Cela cause une erreur dans le calcul de V_entrée et donc de V_mesure.
Ces problèmes sont résolus lors de l'étape d'étalonnage.
Étalonnage
1. Mesurer la valeur réelle de (R1 + R2) / R2
Cette opération ne doit être faite qu'une seule fois pour obtenir le ratio.
Câblage comme indiqué ci-dessous :
ratio = (R1 + R2) / R2 = V_mesure / V_entrée = Valeur_lue_A1 / Valeur_lue_A0
ratio = Valeur_lue_A1 / Valeur_lue_A0
Le code pour cet étalonnage se trouve dans ResistorCalibration.ino (voir section Code).
2. Instabilité de l'alimentation
L'instabilité de l'alimentation cause une instabilité de la tension de référence de la broche analogique, ce qui fausse le calcul de la tension.
Pour y remédier, il faut mesurer la tension de référence fréquemment.
Comment mesurer la tension de référence ?
Connecter 3,3 V à la broche A1 :
La tension de référence est mesurée indirectement via la valeur lue sur A1 :
V_référence = 1023 × 3,3 / Valeur_A1
Calcul de V_mesure :
V_entrée = mapFloat(Valeur_A0, 0, 1023, 0, V_référence); V_mesure = ratio × V_entrée;
Câblage principal :
Procédure
- Câbler selon le schéma « câblage étalonnage résistances »
- Téléverser
ResistorCalibration.ino - Ouvrir le Traceur Série (Serial Plotter)
- Copier la valeur du ratio
- Remplacer cette valeur à la ligne 5 de
Voltmeter.ino - Recâbler selon le « câblage principal »
- Téléverser
Voltmeter.ino - Téléverser l'interface Web (voltmeter.php et voltmeter_body.jpg) sur le Shield PHPoC
- Accéder à la page Web
https://adresse_ip_shield_phpoc/voltmeter.phppour voir la tension.
Vous pouvez visualiser la tension sur smartphone :
Conseils de câblage
Le meilleur kit de démarrage Arduino pour débutant
Voir Le meilleur kit Arduino pour débutants
Code
ResistorCalibration.inoVoltmeter.inovoltmeter.php
ResistorCalibration.ino Arduino
Câblage comme décrit dans la partie Étalonnage
Exécuter ce code une fois
Ouvrir le Traceur Série
Copier la valeur du ratio
Remplacer cette valeur à la ligne 5 de Voltmeter.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 Arduino
Code principal. Avant de le téléverser :
- Téléverser ResistorCalibration.ino
- Ouvrir le Moniteur Série
- Copier la valeur du ratio et la remplacer à la ligne 5 de ce code
double V_measure, V_in, V_reference;
double ratio = 11.59; // À remplacer par votre valeur calibrée
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 connecté à 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 PHP
Interface Web utilisateur. À téléverser sur le Shield PHPoC avec l'image de fond 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>
var COLOR_LCD_TEXT = "#000000";
var COLOR_LCD_BGR = "#00FFFF";
var IMG_WIDTH = 583;
var IMG_HEIGHT = 1235;
var METER_WIDTH, METER_HEIGHT;
var ws, canvas, ctx, buffer = "", voltage = 0;
function init() {
canvas = document.getElementById("graph");
ctx = canvas.getContext("2d");
canvas_resize();
update_view(voltage);
var ws_host_addr = "";
if((navigator.platform.indexOf("Win") != -1) && (ws_host_addr.charAt(0) == "[")) {
ws_host_addr = ws_host_addr.replace(/[\[\]]/g, '');
ws_host_addr = ws_host_addr.replace(/:/g, "-");
ws_host_addr += ".ipv6-literal.net";
}
ws = new WebSocket("ws://" + ws_host_addr + "/serial_monitor", "uint8.phpoc");
ws.onopen = ws_onopen;
ws.onclose = ws_onclose;
ws.onmessage = ws_onmessage;
ws.binaryType = "arraybuffer";
}
// ... (fonctions ws_onopen, ws_onclose, ws_onmessage, update_view, canvas_resize)
window.onload = init;
</script>
</head>
<body onresize="canvas_resize()">
<div class="container" id="container">
<canvas id="graph"></canvas>
</div>
</body>
</html>
Schémas
À téléverser sur le Shield PHPoC
Processus de fabrication
- Construire une console de contrôle Photoshop DIY avec Arduino Nano RP2040
- Système de pointage RFID fiable avec Arduino et Python (base de données phpMyAdmin)
- Construire une télécommande Android universelle avec Arduino, 1Sheeld et contrôle IR
- Construire un Capteur de Rythme Cardiaque Infrarouge Fiable avec Arduino : Guide Étape par Étape
- Mesure Précise de Fréquence et Rapport Cyclique avec Arduino UNO
- Construire un voltmètre DIY avec Arduino et écran Nokia 5110
- Mesure de distance en temps réel par sonar Arduino et visualisation Processing
- MobBob : Construisez votre propre robot Arduino, contrôlé via smartphone Android
- Contrôle fluide de la luminosité LED avec Bolt IoT et Arduino UNO