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 ?
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
Maintenant je souhaite convertir mes tensions (floats) en octets mais ça me gratte un peu la tête . 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 !
@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
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.