// etalonnage_niveau // Etalonnage du capteur de pression MPX5010DP pour la carte V2 a relais TOR. // Objectif : determiner les coefficients a et b de la relation // niveau_en_mm = a * analogRead(A0) + b // Branchement du capteur de pression MPX5010DP : // borne 1 (avec encoche) -> A0 // borne 2 -> GND // borne 3 -> 5V // Branchement du bouton : // SIG -> D2 // VCC -> 5V // GND -> GND // Sur la carte V2 testee : bouton relache = LOW, bouton appuye = HIGH. // Branchement de la commande de pompe par relais : // S / signal relais -> D9 // Sur la carte V2 testee : D9 LOW = pompe arretee, D9 HIGH = pompe active. const int PIN_CAPTEUR = A0; const int PIN_BOUTON = 2; const int PIN_RELAIS = 9; const int RELAIS_ON = HIGH; const int RELAIS_OFF = LOW; const int NB_MESURES = 50; const int DELAI_MESURES_MS = 20; const float ECART_MINIMAL_A0 = 2.0; float h1; float s1; float h2; float s2; float a; float b; void setup() { Serial.begin(9600); pinMode(PIN_CAPTEUR, INPUT); pinMode(PIN_BOUTON, INPUT); digitalWrite(PIN_RELAIS, RELAIS_OFF); pinMode(PIN_RELAIS, OUTPUT); afficherIntroduction(); attendreAppuiBouton(); mesurerPoint( "POINT 1 : niveau haut, environ 140 mm", "Fermer le robinet. Maintenir le bouton appuye pour faire monter le niveau.", h1, s1 ); mesurerPoint( "POINT 2 : niveau bas, environ 60 mm", "Ouvrir le robinet ou vider la cuve jusqu'au niveau bas. La pompe peut rester arretee.", h2, s2 ); calculerEtAfficherCoefficients(); arreterPompe(); Serial.println(); Serial.println("Fin de l'etalonnage. Pour recommencer, appuyer sur RESET puis relancer le moniteur serie."); } void loop() { arreterPompe(); } void afficherIntroduction() { Serial.println(); Serial.println("=== ETALONNAGE DU CAPTEUR DE NIVEAU ==="); Serial.println(); Serial.println("Ce programme permet de determiner a et b dans la relation :"); Serial.println("niveau_en_mm = a * analogRead(A0) + b"); Serial.println(); Serial.println("Pendant la saisie d'un niveau, le bouton commande manuellement la pompe :"); Serial.println("- bouton relache : pompe arretee"); Serial.println("- bouton appuye : pompe active"); Serial.println(); Serial.println("Regler le moniteur serie sur 9600 bauds avec une fin de ligne."); Serial.println("Appuyer sur le bouton pour commencer."); } void attendreAppuiBouton() { while (digitalRead(PIN_BOUTON) == LOW) { delay(10); } delay(250); while (digitalRead(PIN_BOUTON) == HIGH) { delay(10); } delay(250); } void mesurerPoint(const char* titre, const char* consigne, float& niveau_mm, float& lecture_A0) { Serial.println(); Serial.println("----------------------------------------"); Serial.println(titre); Serial.println(consigne); Serial.println(); Serial.println("Quand le niveau est stable, mesurer la hauteur d'eau avec la regle."); Serial.println("Puis saisir cette hauteur en mm dans le moniteur serie et appuyer sur Entree."); Serial.println("Exemple : 138.5 ou 138,5"); Serial.println(); niveau_mm = lireHauteurDepuisSerieAvecCommandePompe(); arreterPompe(); delay(800); Serial.println(); Serial.println("Mesure de la valeur analogique du capteur..."); lecture_A0 = lireCapteurMoyenne(); Serial.print("Hauteur saisie h = "); Serial.print(niveau_mm, 2); Serial.println(" mm"); Serial.print("Valeur moyenne lue sur A0 = "); Serial.println(lecture_A0, 2); } float lireHauteurDepuisSerieAvecCommandePompe() { char buffer[24]; int index = 0; viderBufferSerie(); while (true) { commanderPompeAvecBouton(); while (Serial.available() > 0) { char c = Serial.read(); if (c == '\n' || c == '\r') { if (index > 0) { buffer[index] = '\0'; float valeur = atof(buffer); if (valeur > 0.0 && valeur < 400.0) { arreterPompe(); return valeur; } Serial.println("Valeur non valide. Saisir une hauteur en mm, par exemple 138.5"); index = 0; } } else { if (c == ',') { c = '.'; } if (index < 23) { buffer[index] = c; index = index + 1; } } } } } void commanderPompeAvecBouton() { if (digitalRead(PIN_BOUTON) == HIGH) { digitalWrite(PIN_RELAIS, RELAIS_ON); } else { digitalWrite(PIN_RELAIS, RELAIS_OFF); } } void arreterPompe() { digitalWrite(PIN_RELAIS, RELAIS_OFF); } float lireCapteurMoyenne() { long somme = 0; for (int i = 0; i < NB_MESURES; i = i + 1) { somme = somme + analogRead(PIN_CAPTEUR); delay(DELAI_MESURES_MS); } return ((float)somme) / NB_MESURES; } void calculerEtAfficherCoefficients() { float deltaA0 = s1 - s2; float deltaA0Abs = deltaA0; if (deltaA0Abs < 0) { deltaA0Abs = -deltaA0Abs; } Serial.println(); Serial.println("========================================"); Serial.println("RESULTATS DE L'ETALONNAGE"); Serial.println("========================================"); Serial.print("Point 1 : h1 = "); Serial.print(h1, 2); Serial.print(" mm ; A0_1 = "); Serial.println(s1, 2); Serial.print("Point 2 : h2 = "); Serial.print(h2, 2); Serial.print(" mm ; A0_2 = "); Serial.println(s2, 2); if (deltaA0Abs < ECART_MINIMAL_A0) { Serial.println(); Serial.println("ERREUR : les deux valeurs lues sur A0 sont trop proches."); Serial.println("Verifier le tuyau du capteur, le branchement du MPX5010DP et les hauteurs d'eau."); return; } a = (h1 - h2) / (s1 - s2); b = h1 - a * s1; Serial.println(); Serial.println("Relation d'etalonnage obtenue :"); Serial.print("niveau_en_mm = "); Serial.print(a, 6); Serial.print(" * analogRead(A0) + "); Serial.println(b, 6); Serial.println(); Serial.println("Valeurs a recopier pour la regulation :"); Serial.print("a = "); Serial.println(a, 6); Serial.print("b = "); Serial.println(b, 6); Serial.println(); Serial.println("Ligne CSV pour tableur :"); Serial.println("h1_mm,A0_1,h2_mm,A0_2,a,b"); Serial.print(h1, 2); Serial.print(","); Serial.print(s1, 2); Serial.print(","); Serial.print(h2, 2); Serial.print(","); Serial.print(s2, 2); Serial.print(","); Serial.print(a, 6); Serial.print(","); Serial.println(b, 6); } void viderBufferSerie() { while (Serial.available() > 0) { Serial.read(); } }