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…

vide-armoire arduino 3D en cours en cours warning danger

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

Objectif : un montage pour tester les Résistances qui traînent en vrac dans mes sacs, mes trousses, mes boîtes…

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)

Montrer / Cacher mon code complet Cliquez pour dérouler le code

Télécharger le code en cliquant sur son titre en bleu :
OhmMetre_LCD.ino
  1. /*
  2.   Serie #VIDE-ARMOIRE-2019, un Ohm-metre Arduino
  3.   Avec une Nano ou UNO, un LCD LCM1602c + potard 10Ko + R 1Ko
  4.   et un pont diviseur simple : R connue de 1Ko
  5.  
  6.  * *************** ECRAN LCD LCM1602C *************** *
  7.  
  8.  * ************** Calcul de Résistance *************** *
  9.  
  10. */
  11.  
  12. #include <LiquidCrystal.h>
  13.  
  14. LiquidCrystal EcranLCD(12, 11, 5, 4, 3, 2);
  15. // syntaxe : LiquidCrystal(rs, enable, d4, d5, d6, d7)
  16.  
  17. /* VARIABLES CALCUL RESISTANCE */
  18. float Vin = 4.7; // tension alim
  19. float Vout = 0; // tension à determiner sur A0
  20. float R1 = 1000.0; // resistance connue 1ko sur A0;
  21. float R2 = 0; // resistance à trouver
  22.  
  23. int a0Data = 0; // stockage AnalogRead
  24.  
  25. /* VARIABLES COMPARATIF R COMMERCE */
  26.  
  27. const int Re12[11] = {10, 12, 15, 18, 22, 33, 39, 47, 56, 68, 82};
  28. // ces valeurs se multiplient 5 fois par 10 pour couvrir la gamme e12
  29.  
  30. unsigned long Reference = 0; // le stock de la valeur en cours de test
  31. int Tolerance = 5; //
  32. unsigned long Multiplicateur = 1; // multiplier les ref
  33. long Compar = 0; // stocker la difference entre valeur lue et valeur ref
  34.  
  35. unsigned long Rcommerce = 0; // stock le retour du comparateur
  36.  
  37.  
  38. void setup() {
  39. EcranLCD.begin(16, 2); // utilisation d'un écran 16 colonnes et 2 lignes
  40. // EcranLCD.write("Hello"); // petit test pour vérifier que l'écran marche
  41. }
  42.  
  43. void loop() {
  44.  
  45. a0Data = analogRead(A0);
  46.  
  47. if (a0Data && a0Data != 1023) {
  48. Vout = (a0Data * Vin) / 1024;
  49. R2 = Vout * R1 / (Vin - Vout);
  50.  
  51. Rcommerce = Compare(R2); // fonction comparaison valeur lue avec Re12
  52.  
  53. LCDAffiche(); // fonction affichage
  54. } else { // si A0 prend le max de tension : aucune R posée
  55. LCDInvite(); // affiche "placez une resistance"
  56. }
  57. delay(2500);
  58. EcranLCD.clear();
  59. }
  60.  
  61. /* Fonction pour comparer la mesure avec les valeurs vendues, de ¹⁰ en ¹⁰ */
  62. unsigned long Compare(float Rmesuree) {
  63. Tolerance = 5;
  64. Multiplicateur = 1;
  65.  
  66. for (int g = 1; g <= 5; g++) { // on change 5* la gamme des valeurs (*10)
  67. for (int i = 0; i < 11; i++) {
  68. Reference = Re12[i] * Multiplicateur;
  69. Compar = Rmesuree - Reference;
  70. if (abs(Compar) < Tolerance ) {
  71. return Reference;
  72. }
  73. }
  74. Tolerance = Tolerance * 10;
  75. Multiplicateur = Multiplicateur * 10;
  76. }
  77. }
  78. /* fin fonction compare */
  79.  
  80. /* fonction pour gerer l'affichage sur LCD 16,2 */
  81.  
  82. void LCDAffiche() {
  83. // 1° ligne : la resistance mesuree
  84. EcranLCD.print(R2);
  85. EcranLCD.print(" ");
  86. EcranLCD.write((char)244); // le symble ohm
  87. EcranLCD.print(" lues");
  88.  
  89. //2° ligne : la resistance vendue
  90. EcranLCD.setCursor(7, 2);
  91. EcranLCD.print(Rcommerce);
  92. EcranLCD.print(" ");
  93. EcranLCD.write((char)244);
  94. }
  95.  
  96. void LCDInvite() {
  97. EcranLCD.print(" Placez"); // je met les espaces là car il n'affiche rien si je setCursor ???
  98. EcranLCD.setCursor(2, 2);
  99. EcranLCD.print("1 resistance");
  100. }
  • 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… ? ? ?

ECRAN LCD LCM1602C

connecté comme dans l'exemple de la bibliothèque LiquidCrystal

Prise en main LCD en français grâce à Eskimon Mais si tu préfères les vidéos il y a ça

Les caractères spéciaux de base sont là : charset.gif, il faut traduire leur place dans le tableau binaire en décimal pour les afficher sur LCD. 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.

  • projets/ohmmetre.txt
  • Dernière modification : il y a 20 mois
  • de laure