float impossible dans RPC donc weight1 et 2 en float > f0 et f1 en int pour sa: f0 = (int) weight1;....

Dependencies:   mbed HTTPServer EthernetNetIf HX711 TextLCD RPCInterface

HTTPServerExample.cpp

Committer:
mbedyp
Date:
23 months ago
Revision:
6:2aba0ce3dedd
Parent:
5:3754211a1b5b

File content as of revision 6:2aba0ce3dedd:

#include "mbed.h"
#include "EthernetNetIf.h"
#include "HTTPServer.h"
#include "SerialRPCInterface.h"
#include "HX711.h"
#include "TextLCD.h"

#define BLINKING_RATE  0.5
#define temps_on 0.5

// LR 2/2/17
// sur ce fichier j'ai rajouté une variable RPC count que je peux lire à distance
// adresse/rpc/count/read/

// 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);

//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

//AnalogIn Pot1(p19, "pot1");
//AnalogIn Pot2(p20, "pot2");


// BOUTON
DigitalIn Up(p12);
DigitalIn Down(p13);
DigitalIn Left(p14);
DigitalIn Right(p15);
DigitalIn Center(p16);

//HX711
HX711 scale1(p22, p21); //22 , 21
HX711 scale2(p24, p23); //24 , 23


int count = 0 ;
//int F1 = 0 ;
//int F2 = 0 ;


//int pot1 ; a renplacer
//int pot2; a remplacer 

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 menu = 0;

float m = 0; //MASSE en g
float lg = 0; //LG en cm
float MOI = 0; // MOI en kg*cm2
float massMoy = 0; //Moyenne de la masse a chaque points

float weight1 = 0; // F0
float weight2 = 0; // F1

int f0 = 0;
int f1 = 0;

//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

RPCVariable<int> rpc_f0(&f0, "f0");
RPCVariable<int> rpc_f1(&f1, "f1");


RPCVariable<int> rpc_count(&count, "count");
LocalFileSystem fs("webfs");

EthernetNetIf eth;  
HTTPServer svr;

int main() {

  //Mettre la LED bicolore en ROUGE pendant la tare
  ledB1 = 1;
  ledB2 = 0;
  RW = 0;
  
   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

  Base::add_rpc_class<DigitalOut>();

  printf("Setting up...\n");
  
  // modif LR config IP manuelle sinon dhcp 
  /*
  EthernetNetIf eth( IpAddr(10,119,24,230), // IP
                     IpAddr(255,255,252,0), // Subnet mask
                     IpAddr(10,119,24,245),   // Gateway
                     IpAddr(10,119,24,245) ); // DNS
                     
    */                 
  EthernetErr ethErr = eth.setup();
  if(ethErr)
  {
    printf("Error %d in setup.\n", ethErr);
    return -1;
  }
  printf("Setup OK\n");
  // on définit où seront stockés les fichiers !
  FSHandler::mount("/webfs", "/files"); //Mount /webfs path on /files web path
  FSHandler::mount("/webfs", "/"); //Mount /webfs path on web root path
  
  svr.addHandler<SimpleHandler>("/hello"); // http://a.b.c.d/hello : hello world !
  svr.addHandler<RPCHandler>("/rpc");
  svr.addHandler<FSHandler>("/files");
  svr.addHandler<FSHandler>("/"); //Default handler
  //Example : Access to mbed.htm : http://a.b.c.d/mbed.htm or http://a.b.c.d/files/mbed.htm
  
  svr.bind(80);
  
  printf("Listening...\n");

  Timer tm;
  tm.start();
  //Listen indefinitely
  
  
  // 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
    
    //------------------------------ MESURE PRINCIPAL PIERRE ------------------------------
    if (moyenneClick == 0) {
      weight1 = scale1.getGram();
      weight2 = scale2.getGram();
      
      f0 = (int) weight1;
      f1 = (int) 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
    //------------------------------ MESURE PRINCIPAL PIERRE ------------------------------
    
    //F1 = 1000*Pot1.read();
    //F2 =  1000*Pot2.read();
    
    //pot2 = 926;
    //pot1 = 351;
     
     printf("w1 = %f g : w2 = %f g \n", weight1 , weight2);
     printf("f0 = %d g : f1 = %d g \n", f0 , f1);
     Net::poll();
    
    
    if(tm.read()>.5)
    {
      led1=!led1; //Show that we are alive
      count ++ ;
      tm.start();
    }
    
    
     /*
     
          m = f1 - f0 ;
        lg = (l1*f1)/(f1-f0);
        MOI = m*lg*lg/1000 ;*/

switch (menu) {
    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) {
        menu = 1;
        //CODE: LED_BOUTON_A
        ledB1 = 1;
        ledB2 = 0;

        wait(0.5); // Attendre 0.5 sec
      } else if (!Up) {
        menu = 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);

      lg = 45 * (weight1 / m);
      lcd.locate(0, 1); //Ecrire sur la 2ème ligne
      lcd.printf("lg = %.2fcm\n", lg);

      if (!Down) {
        menu = 2;
        //CODE: LED_BOUTON_A
        ledB1 = 1;
        ledB2 = 0;
        wait(0.5); // Attendre 0.5 sec
      } else if (!Up) {
        menu = 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) {
        menu = 3;
        //CODE: LED_BOUTON_A
        ledB1 = 1;
        ledB2 = 0;

        wait(0.5); // Attendre 0.5 sec
      } else if (!Up) {
        menu = 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) {
        menu = 4;
        //CODE: LED_BOUTON_A
        ledB1 = 1;
        ledB2 = 0;

        wait(0.5); // Attendre 0.5 sec
      } else if (!Up) {
        menu = 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) {
        menu = 0;
        //CODE: LED_BOUTON_A
        ledB1 = 1;
        ledB2 = 0;

        wait(0.5); // Attendre 0.5 sec
      } else if (!Up) {
        menu = 3;
        //CODE: LED_BOUTON_A
        ledB1 = 1;
        ledB2 = 0;

        wait(0.5); // Attendre 0.5 sec
      }
    }
    break;
           // http://192.168.1.102/rpc/pot1/read dans le navigateur permet de lire l'état du potard !
  } //FIN SWITCH
  
} //FIN WHILE
} //FIN MAIN