projet cabanis golf 2022

Dependencies:   mbed HX711 TextLCD

Files at this revision

API Documentation at this revision

Comitter:
mbedyp
Date:
Tue May 31 07:11:11 2022 +0000
Parent:
0:5f789b9ae213
Commit message:
Projet BTS Cabanis Capteurs force;

Changed in this revision

TextLCD.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextLCD.lib	Tue May 31 07:11:11 2022 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/simon/code/TextLCD/#e4cb7ddee0d3
--- a/main.cpp	Sat Nov 28 19:35:24 2015 +0000
+++ b/main.cpp	Tue May 31 07:11:11 2022 +0000
@@ -1,49 +1,396 @@
 #include "mbed.h"
 #include "HX711.h"
+#include "TextLCD.h"
+
+// LCD and Joystick Setting
+TextLCD lcd(p8, p10, p11, p5, p6, p7); // rs, e, d4-d7
+//rs   e    d4  d5   d6    d7          
+DigitalOut RW(p9);
 
 DigitalOut gpo(D0);
-DigitalOut led(LED_BLUE);
-HX711 scale(A0, A1);
+
+//LED MBED
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+DigitalOut led4(LED4);
+
+//LED BICOLORE
+DigitalOut ledB1(p29); // SI 1 LED ROUGE
+DigitalOut ledB2(p30); // SI 1 LED VERT
+
+//HX711
+HX711 scale1(p22, p21); //22 , 21
+HX711 scale2(p24, p23); //24 , 23
+
+// BOUTON
+DigitalIn Up(p12);
+DigitalIn Down(p13);
+DigitalIn Left(p14);
+DigitalIn Right(p15);
+DigitalIn Center(p16);
 
 AnalogIn scaleRaw(A3);
-Serial pc(USBTX, USBRX);    // USB Serial Terminal
-float calibration_factor = 1000; //-7050 worked for my 440lb max scale setup
-int averageSamples = 100;
+Serial pc(USBTX, USBRX); // USB Serial Terminal
+float calibration_factor1 = 2325; //2325 // -7050 worked for my 440lb max scale setup
+float calibration_factor2 = 2178; //2178
+int averageSamples = 5; //NOMBRE DE MESURE
+
+int moyenneClick = 0;
+int boucleExecute = 0;
+
+int i = 0; //count
+int ii = 0; //count
+
+float m = 0; //MASSE
+float lg = 0; //LG
+float MOI = 0; // MOI
+float massMoy = 0; //Moyenne de la masse a chaque points
+
+float weight1 = 0; // F1
+float weight2 = 0; // F0
+
+//SWINGWEIGHT
+float convertionInches = 2.54; // 1 inches = 2,54 centimètre
+float calculInches = 0; // Variable pour effectuer des calculs
+float SW = 0; // Variable résultat SWINGWEIGHT
+
+int main(void) {
+  //Mettre la LED bicolore en ROUGE pendant la tare
+  ledB1 = 1;
+  ledB2 = 0;
+  RW = 0;
+
+  pc.printf("Starting Scale\n");
+  pc.printf("HX711 calibration sketch\n");
+  pc.printf("Retirer tout les poids des capteurs\n");
+  pc.printf("Une fois que la LED bicolore passe de rouge a verte placer le club\n");
+  pc.printf("[capteur1] Press 1 or a pour augmenter le facteur etalonnage de 25\n");
+  pc.printf("[capteur1] Press 3 or z pour diminuer le facteur etalonnage de 25\n");
+  pc.printf("[capteur2] Press 4 or a pour augmenter le facteur etalonnage de 25\n");
+  pc.printf("[capteur2] Press 6 or z pour diminuer le facteur etalonnage de 25\n");
+
+  scale1.setScale(0);
+  scale1.tare(); //Reset the scale to 0
+
+  scale2.setScale(0);
+  scale2.tare(); //Reset the scale to 0
+
+  long zero_factor1 = scale1.averageValue(averageSamples); //Get a baseline reading / Obtenez une lecture de base CAPTEUR 1
+  long zero_factor2 = scale2.averageValue(averageSamples); //Get a baseline reading / Obtenez une lecture de base CAPTEUR 2
+  pc.printf("Zero factor Capteur1: %.4f\n", zero_factor1); //This can be used to remove the need to tare the scale. Useful in permanent scale projects. / Cela peut être utilisé pour supprimer le besoin de tarer la balance. Utile dans les projets à échelle permanente. CAPTEUR 1 
+  pc.printf("Zero factor Capteur2: %.4f\n", zero_factor2); //This can be used to remove the need to tare the scale. Useful in permanent scale projects. / Cela peut être utilisé pour supprimer le besoin de tarer la balance. Utile dans les projets à échelle permanente. CAPTEUR 2
+
+  // Mettre la LED en VERT pour indiquer la fin de la tare
+  ledB1 = 0;
+  ledB2 = 1;
+
+  while (true) {
+    scale1.setScale(calibration_factor1); //Adjust to this calibration factor / Ajuster à ce facteur d'étalonnage
+    scale2.setScale(calibration_factor2); //Adjust to this calibration factor / Ajuster à ce facteur d'étalonnage
+
+    if (moyenneClick == 0) {
+      weight1 = scale1.getGram();
+      weight2 = scale2.getGram();
+    }
+
+    //float raw = scaleRaw.read();
+    pc.printf("Reading Capteur1 g : %.2f\n", weight1);
+    //pc.printf("Raw Value: %.7f\n", raw);
+    pc.printf("Reading Capteur2 g : %.2f\n", weight2);
+
+    m = weight1 - weight2; // Calcul masse du club
+    lg = 45 * (weight1 / m); //Longueur jusqu'aux points d'équilibre
+
+    MOI = m * (lg * lg); // Calcul masse du MOI (masse inertielle)
+
+    calculInches = lg / convertionInches; //Convertion en inches
+    SW = (calculInches - 14) * m; //Calcul SWINGWEIGHT
+
+    switch (i) {
+    case 0: {
+      //LED_BOUTON_B
+      ledB1 = 0;
+      ledB2 = 1;
+
+      lcd.cls(); //CLEAR LCD
+      lcd.locate(0, 0); //Ecrire sur la 1er ligne
+      lcd.printf("F1: %.2fg\n", weight1); // Afficher le poids en grammes du capteur 1
+
+      lcd.locate(0, 1); //Ecrire sur la 2ème ligne
+      lcd.printf("F0: %.2fg\n", weight2); // Afficher le poids en grammes du capteur 2
+
+      if (!Center) {
+        //CODE: LED_BOUTON_A
+        ledB1 = 1;
+        ledB2 = 0;
+
+        weight1 = 0;
+        weight2 = 0;
+
+        wait(1.5); // Attendre 1.5 sec
+
+        while (moyenneClick == 0) {
+
+          boucleExecute++;
+
+          weight1 = weight1 + scale1.getGram();
+          weight2 = weight2 + scale2.getGram();
+
+          m = weight1 - weight2; // Calcul masse du club
+
+          massMoy = massMoy + m;
+
+          wait(0.1); // Attendre 0.1 sec
+
+          massMoy = massMoy / boucleExecute;
+
+          lcd.cls(); //CLEAR LCD
+          lcd.locate(0, 0); //Ecrire sur la 1er ligne
+          lcd.printf("Nombre de points\n"); // Afficher le nombre de points
+
+          lcd.locate(0, 1); //Ecrire sur la 1er ligne
+          lcd.printf("%d   m: %.2fg\n", boucleExecute, massMoy); // Afficher le nombre de points
+
+          //LED VERT
+          ledB1 = 0;
+          ledB2 = 1;
+
+          //LED ROUGE
+          ledB1 = 1;
+          ledB2 = 0;
+
+          massMoy = 0;
+
+          if (!Center) {
+            //LED ROUGE
+            ledB1 = 0;
+            ledB2 = 1;
+            moyenneClick = 1; //Mettre moyenneClick a 1
+            wait(1); // Attendre 1 sec
+          }
+
+        }
+
+        weight1 = weight1 / boucleExecute;
+        weight2 = weight2 / boucleExecute;
+
+        wait(0.5); // Attendre 0.5 sec
+      } else if (!Down) {
+        i = 1;
+        //CODE: LED_BOUTON_A
+        ledB1 = 1;
+        ledB2 = 0;
+
+        wait(0.5); // Attendre 0.5 sec
+      } else if (!Up) {
+        i = 3;
+        //CODE: LED_BOUTON_A
+        ledB1 = 1;
+        ledB2 = 0;
+
+        wait(0.5); // Attendre 0.5 sec
+      }
+    }
+    break;
+
+    case 1: {
+      //LED_BOUTON_B
+      ledB1 = 0;
+      ledB2 = 1;
+
+      lcd.cls(); //CLEAR LCD
+      lcd.locate(0, 0); //Ecrire sur la 1er ligne
+      lcd.printf("m = %.2fg\n", m);
 
-int main(void)
-{
-    pc.printf("Starting Scale");
-    pc.printf("HX711 calibration sketch");
-    pc.printf("Remove all weight from scale");
-    pc.printf("After readings begin, place known weight on scale");
-    pc.printf("Press + or a to increase calibration factor");
-    pc.printf("Press - or z to decrease calibration factor");
-    
-      
-    scale.setScale(0);
-    scale.tare(); //Reset the scale to 0
-    
-    long zero_factor = scale.averageValue(averageSamples); //Get a baseline reading
-    pc.printf("Zero factor: %.4f\n" , zero_factor); //This can be used to remove the need to tare the scale. Useful in permanent scale projects.
+      lg = 45 * (weight1 / m);
+      lcd.locate(0, 1); //Ecrire sur la 2ème ligne
+      lcd.printf("lg = %.2fcm\n", lg);
+
+      if (!Down) {
+        i = 2;
+        //CODE: LED_BOUTON_A
+        ledB1 = 1;
+        ledB2 = 0;
+        wait(0.5); // Attendre 0.5 sec
+      } else if (!Up) {
+        i = 0;
+        //CODE: LED_BOUTON_A
+        ledB1 = 1;
+        ledB2 = 0;
+
+        wait(0.5); // Attendre 0.5 sec
+      }
+
+    }
+    break;
+
+    case 2: {
+      //LED_BOUTON_B
+      ledB1 = 0;
+      ledB2 = 1;
+
+      lcd.cls(); //CLEAR LCD
+      lcd.locate(0, 0); //Ecrire sur la 1er ligne
+      lcd.printf("MOI:\n");
+      lcd.locate(0, 1); //Ecrire sur la 2ème ligne
+      lcd.printf("%.2f kg.cm2\n", MOI / 1000);
+
+      if (!Down) {
+        i = 3;
+        //CODE: LED_BOUTON_A
+        ledB1 = 1;
+        ledB2 = 0;
+
+        wait(0.5); // Attendre 0.5 sec
+      } else if (!Up) {
+        i = 1;
+        //CODE: LED_BOUTON_A
+        ledB1 = 1;
+        ledB2 = 0;
+
+        wait(0.5); // Attendre 0.5 sec
+      }
+    }
+    break;
+
+    case 3: {
+      //LED_BOUTON_B
+      ledB1 = 0;
+      ledB2 = 1;
+
+      lcd.cls(); //CLEAR LCD
+      lcd.locate(0, 0); //Ecrire sur la 1er ligne
+
+      lcd.printf("SW = %.2f\n", SW);
+
+      lcd.locate(0, 1); //Ecrire sur la 2ème ligne
+
+      // Résultat de SW (SWINGWEIGHT / inertie) place le club dans une catégorie
+      if (SW < 5250) {
+        lcd.printf("SWINGWEIGHT NULL\n", SW);
+      } else if (SW > 5250 && SW < 5300) {
+        lcd.printf("SWINGWEIGHT = B4\n");
+      } else if (SW > 5300 && SW < 5350) {
+        lcd.printf("SWINGWEIGHT = B5\n");
+      } else if (SW > 5350 && SW < 5400) {
+        lcd.printf("SWINGWEIGHT = B6\n");
+      } else if (SW > 5400 && SW < 5450) {
+        lcd.printf("SWINGWEIGHT = B7\n");
+      } else if (SW > 5450 && SW < 5500) {
+        lcd.printf("SWINGWEIGHT = B8\n");
+      } else if (SW > 5500 && SW < 5550) {
+        lcd.printf("SWINGWEIGHT = B9\n");
+      } else if (SW > 5550 && SW < 5600) {
+        lcd.printf("SWINGWEIGHT = C0\n");
+      } else if (SW > 5600 && SW < 5650) {
+        lcd.printf("SWINGWEIGHT = C1\n");
+      } else if (SW > 5650 && SW < 5700) {
+        lcd.printf("SWINGWEIGHT = C2\n");
+      } else if (SW > 5700 && SW < 5750) {
+        lcd.printf("SWINGWEIGHT = C3\n");
+      } else if (SW > 5750 && SW < 5800) {
+        lcd.printf("SWINGWEIGHT = C4\n");
+      } else if (SW > 5800 && SW < 5850) {
+        lcd.printf("SWINGWEIGHT = C5\n");
+      } else if (SW > 5850 && SW < 5900) {
+        lcd.printf("SWINGWEIGHT = C6\n");
+      } else if (SW > 5900 && SW < 5950) {
+        lcd.printf("SWINGWEIGHT = C7\n");
+      } else if (SW > 5950 && SW < 6000) {
+        lcd.printf("SWINGWEIGHT = C8\n");
+      } else if (SW > 6000 && SW < 6050) {
+        lcd.printf("SWINGWEIGHT = C9\n");
+      } else if (SW > 6050 && SW < 6100) {
+        lcd.printf("SWINGWEIGHT = D0\n");
+      } else if (SW > 6100 && SW < 6150) {
+        lcd.printf("SWINGWEIGHT = D1\n");
+      } else if (SW > 6150 && SW < 6200) {
+        lcd.printf("SWINGWEIGHT = D2\n");
+      } else if (SW > 6200 && SW < 6250) {
+        lcd.printf("SWINGWEIGHT = D3\n");
+      } else if (SW > 6250 && SW < 6300) {
+        lcd.printf("SWINGWEIGHT = D4\n");
+      } else if (SW > 6300 && SW < 6350) {
+        lcd.printf("SWINGWEIGHT = D5\n");
+      } else if (SW > 6350 && SW < 6400) {
+        lcd.printf("SWINGWEIGHT = D6\n");
+      } else if (SW > 6400 && SW < 6450) {
+        lcd.printf("SWINGWEIGHT = D7\n");
+      } else if (SW > 6450 && SW < 6500) {
+        lcd.printf("SWINGWEIGHT = D8\n");
+      } else if (SW > 6500) {
+        lcd.printf("SWINGWEIGHT = D9\n");
+      }
+
+      if (!Down) {
+        i = 4;
+        //CODE: LED_BOUTON_A
+        ledB1 = 1;
+        ledB2 = 0;
+
+        wait(0.5); // Attendre 0.5 sec
+      } else if (!Up) {
+        i = 2;
+        //CODE: LED_BOUTON_A
+        ledB1 = 1;
+        ledB2 = 0;
+
+        wait(0.5); // Attendre 0.5 sec
+      }
+    }
+    break;
+
+    case 4: {
+      //LED_BOUTON_B
+      ledB1 = 0;
+      ledB2 = 1;
+
+      lcd.cls(); //CLEAR LCD
+      lcd.locate(0, 0); //Ecrire sur la 1er ligne
+
+      lcd.printf("N points moyenne");
+
+      lcd.locate(0, 1); //Ecrire sur la 2eme ligne
+      lcd.printf("%d\n", boucleExecute);
+
+      if (!Down) {
+        i = 0;
+        //CODE: LED_BOUTON_A
+        ledB1 = 1;
+        ledB2 = 0;
+
+        wait(0.5); // Attendre 0.5 sec
+      } else if (!Up) {
+        i = 3;
+        //CODE: LED_BOUTON_A
+        ledB1 = 1;
+        ledB2 = 0;
+
+        wait(0.5); // Attendre 0.5 sec
+      }
+    }
+    break;
+    }
+    /*
+    CODE INFORMATION:
+    LED_BOUTON_A: Mettre la LED bicolore en ROUGE pour que l'utilisateur sache que son action a était pris en compte
+    LED_BOUTON_B: Mettre la LED bicolore en VERT à la fin de l'action utilisateur
     
-    while (true) {
-        scale.setScale(calibration_factor); //Adjust to this calibration factor
-        float weight = scale.getGram();
-        //float raw = scaleRaw.read();
-        pc.printf("Reading: %.2f\n", weight);
-        //pc.printf("Raw Value: %.7f\n", raw);
-        pc.printf(" calibration_factor: %.2f\n", calibration_factor);
-
+    */
 
-       if(pc.readable()) {
-            char temp = pc.getc();
-            if(temp == '+' || temp == 'a')
-               calibration_factor += 10;
-            else if(temp == '-' || temp == 'z')
-                calibration_factor -= 10;
-            }
-        gpo = !gpo; // toggle pin
-        led = !led; // toggle led
-        wait(0.2f);
+    if (pc.readable()) {
+      char temp = pc.getc();
+      if (temp == '1' || temp == 'a')
+        calibration_factor1 -= 25;
+      else if (temp == '3' || temp == 'z')
+        calibration_factor1 += 25;
+      else if (temp == '4' || temp == 'q')
+        calibration_factor2 -= 25;
+      else if (temp == '6' || temp == 's')
+        calibration_factor2 += 25;
     }
+    gpo = !gpo; // toggle pin
+    wait(0.2); // Attendre 0.2 sec
+  }
 }
\ No newline at end of file