Fonction de vérification de valeurs sur arduino

Bonjour à tous !

J'ai mon code arduino qui calcule plusieurs valeurs de tension et fait une moyenne puis affiche le résultat sur le moniteur. Jusque là tout va bien :). Maintenant je voudrais fixer un intervalle de valeurs à respecter. Par exemple je fixe valeur min = 3.5V et valeur max = 3.7V
Je voudrais faire une fonction qui fait la chose suivante: si la valeur moyenne est comprise entre 3.5 et 3.7V il affiche OK sur le moniteur série sinon il affiche ERROR.
Quelqu'un pourrait m'aider un peu s'il plaît ?

Je vous remercie d'avance :slight_smile:

hello
il nous faut au moins ton code
regarde ici

Mon code est très long et est confidentiel c'est pourquoi je voudrais juste avoir quelques lignes de démonstration pour me débloquer.

D'avance merci :slight_smile:

:cold_face:Confidentiel ? :hot_face:

il ne faut pas venir sur un forum :wink:

en tout cas, sans ton code........................

Bonjour Victorelec

Serial.print ("ERROR");
ou
Serial.println ("ERROR");

Cordialement,
bidouilleelec

const float VMIN = 3.5;
const float VMAX = 3.7;

bool fonction_de_test ( float v )
{
  bool ok = true;
  if ( v < VMIN ) ok = false;
  if ( v > VMAX ) ok = false;
  Serial.println (  ok ? "OK": "ERREUR" );
  return ok;
}

Voilà la partie concernée du code.

D'avance merci :slight_smile:

for (int i = 0; i < N; i++) { // boucle for pour réaliser 1000 mesures
    int16_t valA0_A3 = ADS.readADC_Differential_0_3(); // valeur numérique de la tension
    int16_t valA1_A3 = ADS.readADC_Differential_1_3();
    int16_t valA2_A3 = ADS.readADC_Differential_2_3();
    float voltage03 = ADS.toVoltage(valA0_A3);// tension en volt
    float voltage13 = ADS.toVoltage(valA1_A3);
    float voltage23 = ADS.toVoltage(valA2_A3) ;

    //    Pour la tension A0_A3
    Buffer03[i] = voltage03; // acquisition d'une nouvelle valeur
    somme03 += Buffer03[i]; // On fait la somme des valeurs dans le tableau
    Vmin03 = min(voltage03, Vmin03); // Calcul de Vmin
    Vmax03 = max(voltage03, Vmax03); // Calcul de Vmax
    pic2pic03     = Vmax03 - Vmin03; // Calcul de l'amplitude pic to pic

    //    Pour la tension A1_A3
    Buffer13[i] = voltage13; // acquisition d'une nouvelle valeur
    somme13 += Buffer13[i]; // faire la somme des valeurs dans le tableau
    

    //    Pour la tension A2_A3
    Buffer23[i] = voltage23; // acquisition d'une nouvelle valeur
    somme23 += Buffer23[i]; // faire la somme des valeurs dans le tableau
    
  }
  moyenne03 = somme03 / N;  // Faire la moyenne (tension 0_3)
  moyenne13 = somme13 / N;  // Faire la moyenne (tension 1_3)
  moyenne23 = somme23 / N;  // Faire la moyenne (tension 2_3)

}

  SerialUSB.print("la valeur moyenne03 est : ");
  SerialUSB.print(moyenne03, 6); // Valeu moyenne
  SerialUSB.print("\t"); // Mettre un espace
  SerialUSB.print("la valeur moyenne13 est : ");
  SerialUSB.print(moyenne13, 6); // Valeu moyenne
  SerialUSB.print("\t"); // Mettre un espace
  SerialUSB.print("la valeur moyenne23 est : ");
  SerialUSB.print(moyenne23, 6); // Valeu moyenne

Merci @biggil , je vais essayer cela :slight_smile:

ou en plus condensé mais même idée

const float VMIN = 3.5;
const float VMAX = 3.7;

bool fonction_de_test ( float v ) {
  bool outOfRange = (v < VMIN) || (v > VMAX);
  Serial.println ( outOfRange ? F("ERREUR") : F("OK"));
  return outOfRange;
}

un peu tard
mon test :laughing:

float N = 100;
float Buffer03 [100];
float Buffer13 [100];
float Buffer23 [100];

float val_03 = 0.00;
float val_13 = 500.00;
float val_23 = 1000.00;
float moyenne03, moyenne13, moyenne23;
float somme03, somme13, somme23;
float Vmin03, Vmin13, Vmin23;
float Vmax03, Vmax13, Vmax23;
float pic2pic03;
void setup()
{
  Serial.begin(115200);
}
void loop()
{
  for (int i = 0; i < N; i++)
  { // boucle for pour réaliser N  mesures
    int16_t valA0_A3 = val_03 + i + 50; //50 pour gonfler la moyenne
    int16_t valA1_A3 = val_13 + i;
    int16_t valA2_A3 = val_23 + i;

    float voltage03 = (valA0_A3);// tension en volt
    float voltage13 = (valA1_A3);
    float voltage23 = (valA2_A3) ;

    //    Pour la tension A0_A3
    Buffer03[i] = voltage03; // acquisition d'une nouvelle valeur
    somme03 += Buffer03[i]; // On fait la somme des valeurs dans le tableau
    Vmin03 = min(voltage03, Vmin03); // Calcul de Vmin
    Vmax03 = max(voltage03, Vmax03); // Calcul de Vmax
    pic2pic03     = Vmax03 - Vmin03; // Calcul de l'amplitude pic to pic

    //    Pour la tension A1_A3
    Buffer13[i] = voltage13;// acquisition d'une nouvelle valeur
    somme13 += Buffer13[i]; // faire la somme des valeurs dans le tableau


    //    Pour la tension A2_A3
    Buffer23[i] = voltage23; // acquisition d'une nouvelle valeur
    somme23 += Buffer23[i]; // faire la somme des valeurs dans le tableau

  }
  Serial.println("fin de for");
  moyenne03 = somme03 / N;  // Faire la moyenne (tension 0_3)
  moyenne13 = somme13 / N;  // Faire la moyenne (tension 1_3)
  moyenne23 = somme23 / N;  // Faire la moyenne (tension 2_3)

  for (int f = 0; f < 100; f++)
  {
    Serial.print(Buffer03[f]); Serial.print("\t");
    Serial.print(Buffer13[f]); Serial.print("\t");
    Serial.println(Buffer23[f]);
  }


  Serial.print("la valeur moyenne03 est : ");
  Serial.print(moyenne03, 6); Serial.print("\t");// Valeu moyenne
  if ((moyenne03 < 35) || (moyenne03 > 70)) {
    Serial.println("erreur");
  } else {
    Serial.println("ok");
  }
  Serial.print("la valeur moyenne13 est : ");
  Serial.print(moyenne13, 6); Serial.print("\t");// Valeu moyenne
  if ((moyenne13 < 535) || (moyenne13 > 570)) {
    Serial.println("erreur");
  } else {
    Serial.println("ok");
  }
  Serial.print("la valeur moyenne23 est : ");
  Serial.print(moyenne23, 6); Serial.print("\t"); // Valeu moyenne
  if ((moyenne23 < 1035) || (moyenne23 > 1070)) {
    Serial.println("erreur");
  } else {
    Serial.println("ok");
  }

  while (1);
}


@biggil , @J-M-L , @dfgh merci beaucoup à vous ! je vais essayer de voir de mon côté.
Le forum est top ! :slight_smile:

Bonjour à tout le monde,

Maintenant je souhaite convertir mes tensions (floats) en octets mais ça me gratte un peu la tête :slight_smile: . J'ai fait des recherches sur internet et j'ai trouvé ce bout de code mais je ne le comprends pas donc ne sais pas comment l'appliquer dans mon cas.
Quelqu'un peut me dire comment cette conversion fonctionne s'il vous plaît ?
Je vous remercie d'avance !

bytefloat.d_value = tmp_temp;
        send_buffer[0] = bytefloat.bytes[0];
        send_buffer[1] = bytefloat.bytes[1];
        send_buffer[2] = bytefloat.bytes[2];
        send_buffer[3] = bytefloat.bytes[3];

Votre float est déjà dans 4 octets… il suffit de prendre l’adresse de votre variable pour obtenir un pointeur sur ces octets

Si vous voulez en savoir plus, j’ai un tuto intitulé: Introduction à la mémoire et aux pointeurs sur Arduino

@J-M-L j'ai fait un tour sur votre article. Je trouve que c'est bien construit, bravo !
Cependant j'ai pas pu trouver d'exemple concret adapté à ma situation donc je me perds un peu...
Pouvez-vous me donner un exemple dans mon cas s'il vous plaît ?
D'avance merci

jetez un oeil à ce code:

float f = 123.456;

void setup() {
  Serial.begin(115200);
  Serial.print(F("Float = ")); Serial.println(f);
  Serial.print(F("Float en Hexa = ")); Serial.println(*((uint32_t*) &f), HEX); // on "triche", on convertit l'adresse de f en pointeur sur 4 octets et on affiche

  // lecture des octets à la main:
  uint8_t* ptr = (uint8_t *) &f; // on prend un pointeur vers le premier octet de f
  Serial.print(F("Rangés en mémoire sous forme little endian : "));
  Serial.print(ptr[0], HEX); Serial.write(' ');
  Serial.print(ptr[1], HEX); Serial.write(' ');
  Serial.print(ptr[2], HEX); Serial.write(' ');
  Serial.println(ptr[3], HEX);
}

void loop() {}

le moniteur série (à 115200 bauds) affichera

Float = 123.46
Float en Hexa = 42F6E979
Rangés en mémoire sous forme little endian : 79 E9 F6 42

PS/ notez qu'en C++ faire (*((uint32_t*) &f)n'est pas conforme à la norme (mais ça fonctionne dans notre cas). la bonne façon de faire c'est le pointeur sur octet.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.