=====🤖⚡ un Ohm-Mètre =====
{{tag> "arduino" }}
Pour connaître vite la valeur d'une des 1000 résistances qui traînent en vrac au fond de ce carton / cette trousse / cette boîte...
2019
**
//Série #VIDE-ARMOIRE//, un Ohm-metre Arduino**
Avec une UNO, un LCD LCM1602c + potard 10Ko + R 1Ko et un pont diviseur simple : R connue de 1Ko
==== ingrédients utiles ====
==== Câblage OK pour Nano ou Uno ====
Objectif : un montage pour tester les Résistances qui traînent en vrac dans mes sacs, mes trousses, mes boîtes...
{{ :arduino:projets:ohmmetre_0a.jpg?nolink&600 |}}
{{ :arduino:projets:ohmmetre0_bb.jpg?nolink |}}
==== Code avec 1 seule Résistance connue ====
=== Calcul de Résistance ===
mesure de la tension sur une broche analogique, U = R*i...
**Pont diviseur**: montage de 2 résistances qui permettent de calculer l'une des 2 sans utiliser l'intensité.
Ici une Résistance de 1Ko compare l'autre R placée avec la série de résistances E12 : valeurs standards, avec 5% d'erreurs (bague dorée)
Télécharger le code en cliquant sur son titre en bleu :
/*
Serie #VIDE-ARMOIRE-2019, un Ohm-metre Arduino
Avec une Nano ou UNO, un LCD LCM1602c + potard 10Ko + R 1Ko
et un pont diviseur simple : R connue de 1Ko
* *************** ECRAN LCD LCM1602C *************** *
* ************** Calcul de Résistance *************** *
*/
#include
LiquidCrystal EcranLCD(12, 11, 5, 4, 3, 2);
// syntaxe : LiquidCrystal(rs, enable, d4, d5, d6, d7)
/* VARIABLES CALCUL RESISTANCE */
float Vin = 4.7; // tension alim
float Vout = 0; // tension à determiner sur A0
float R1 = 1000.0; // resistance connue 1ko sur A0;
float R2 = 0; // resistance à trouver
int a0Data = 0; // stockage AnalogRead
/* VARIABLES COMPARATIF R COMMERCE */
const int Re12[11] = {10, 12, 15, 18, 22, 33, 39, 47, 56, 68, 82};
// ces valeurs se multiplient 5 fois par 10 pour couvrir la gamme e12
unsigned long Reference = 0; // le stock de la valeur en cours de test
int Tolerance = 5; //
unsigned long Multiplicateur = 1; // multiplier les ref
long Compar = 0; // stocker la difference entre valeur lue et valeur ref
unsigned long Rcommerce = 0; // stock le retour du comparateur
void setup() {
EcranLCD.begin(16, 2); // utilisation d'un écran 16 colonnes et 2 lignes
// EcranLCD.write("Hello"); // petit test pour vérifier que l'écran marche
}
void loop() {
a0Data = analogRead(A0);
if (a0Data && a0Data != 1023) {
Vout = (a0Data * Vin) / 1024;
R2 = Vout * R1 / (Vin - Vout);
Rcommerce = Compare(R2); // fonction comparaison valeur lue avec Re12
LCDAffiche(); // fonction affichage
} else { // si A0 prend le max de tension : aucune R posée
LCDInvite(); // affiche "placez une resistance"
}
delay(2500);
EcranLCD.clear();
}
/* Fonction pour comparer la mesure avec les valeurs vendues, de ¹⁰ en ¹⁰ */
unsigned long Compare(float Rmesuree) {
Tolerance = 5;
Multiplicateur = 1;
for (int g = 1; g <= 5; g++) { // on change 5* la gamme des valeurs (*10)
for (int i = 0; i < 11; i++) {
Reference = Re12[i] * Multiplicateur;
Compar = Rmesuree - Reference;
if (abs(Compar) < Tolerance ) {
return Reference;
}
}
Tolerance = Tolerance * 10;
Multiplicateur = Multiplicateur * 10;
}
}
/* fin fonction compare */
/* fonction pour gerer l'affichage sur LCD 16,2 */
void LCDAffiche() {
// 1° ligne : la resistance mesuree
EcranLCD.print(R2);
EcranLCD.print(" ");
EcranLCD.write((char)244); // le symble ohm
EcranLCD.print(" lues");
//2° ligne : la resistance vendue
EcranLCD.setCursor(7, 2);
EcranLCD.print(Rcommerce);
EcranLCD.print(" ");
EcranLCD.write((char)244);
}
void LCDInvite() {
EcranLCD.print(" Placez"); // je met les espaces là car il n'affiche rien si je setCursor ???
EcranLCD.setCursor(2, 2);
EcranLCD.print("1 resistance");
}
* le 08/08/2019 optimisation v1 -> v2 en imbriquant 2 boucles for, merci Laurent.
* le 23/08/2019 : modification du type de variables pour échapper au dépassement de calcul, merci Thierry.
*
Petit bug d'affichage LCD si je tente de setCursor sur la 1° ligne dans mes fonctions... ? ? ?
==== Notes ====
=== ECRAN LCD LCM1602C ===
connecté comme dans l'[[https://www.arduino.cc/en/Reference/LiquidCrystalConstructor|exemple de la bibliothèque LiquidCrystal]]
Prise en main LCD en français grâce à [[https://eskimon.fr/tuto-arduino-702-votre-premier-texte-sur-le-lcd|Eskimon]]
Mais si tu préfères les [[https://www.youtube.com/watch?v=Athue7Wkjog|vidéos il y a ça]]
Les caractères spéciaux de base sont là : [[http://www.electronic-engineering.ch/microchip/datasheets/lcd/charset.gif| charset.gif]], il faut traduire leur place dans le tableau binaire en décimal pour les afficher sur LCD. [[http://sebastienguillon.com/test/javascript/convertisseur.html|ex convertisseur]]. Le **signe ohm** est en char 244.
=== Améliorations ===
En testant avec 1 seul étalon de 1Ko on perd la ref à partir de 47Ko (et plus), à améliorer avec 3 résistances connues sur 3 ponts ?
Ce serait chouette si l'affichage donnait les valeurs de référence en lettres : 1K, 1M... etc.
==== Défi: 1 objet pérenne dans une boîte de sardines ====