// Etalonnage de la regulation de niveau // Version simplifiee et lisible du programme Arduino. // Connexions : // - MPX5010DP borne 1, cote encoche : A0 // - MPX5010DP borne 2 : GND // - MPX5010DP borne 3 : 5V // - Controleur de puissance PWM / signal / S : D9 // - Controleur de puissance GND / 0V / G / - : GND // - Bouton tactile SIG : D2 // - Bouton tactile VCC : 5V // - Bouton tactile GND : GND const byte BROCHE_POMPE_PWM = 9; const byte BROCHE_BOUTON = 2; const byte BROCHE_CAPTEUR_PRESSION = A0; const int POMPE_ARRET = 0; const int POMPE_MAX = 255; const int NOMBRE_ITERATIONS_SEUIL = 8; // Change le diviseur d'horloge du timer utilise par une broche PWM. // Sur Arduino Nano / Uno, D9 utilise le Timer1. void setPwmFrequency(int pin, int divisor) { byte mode; if (pin == 5 || pin == 6 || pin == 9 || pin == 10) { switch (divisor) { case 1: mode = 0x01; break; case 8: mode = 0x02; break; case 64: mode = 0x03; break; case 256: mode = 0x04; break; case 1024: mode = 0x05; break; default: return; } if (pin == 5 || pin == 6) { TCCR0B = (TCCR0B & 0b11111000) | mode; } else { TCCR1B = (TCCR1B & 0b11111000) | mode; } } else if (pin == 3 || pin == 11) { switch (divisor) { case 1: mode = 0x01; break; case 8: mode = 0x02; break; case 32: mode = 0x03; break; case 64: mode = 0x04; break; case 128: mode = 0x05; break; case 256: mode = 0x06; break; case 1024: mode = 0x07; break; default: return; } TCCR2B = (TCCR2B & 0b11111000) | mode; } } void commanderPompe(int valeurPwm) { analogWrite(BROCHE_POMPE_PWM, valeurPwm); } void arreterPompe() { commanderPompe(POMPE_ARRET); } void allumerPompeAFond() { commanderPompe(POMPE_MAX); } void attendreAppuiBouton() { while (digitalRead(BROCHE_BOUTON) == LOW) { // Attente active : le programme continue quand le bouton est appuye. } } void pauseAntiRebond(unsigned long dureeMs) { Serial.println("Attendez..."); delay(dureeMs); Serial.println("."); } String lireLigneSerie() { while (Serial.available() == 0) { // Attente de la reponse dans le moniteur serie. } String ligne = Serial.readStringUntil('\n'); ligne.trim(); return ligne; } char lirePremiereLettre() { String ligne = lireLigneSerie(); if (ligne.length() == 0) { return '\0'; } return ligne.charAt(0); } bool reponseOui(char reponse) { return reponse == 'O' || reponse == 'o'; } bool reponseNon(char reponse) { return reponse == 'N' || reponse == 'n'; } void verifierFonctionnementPompe() { bool pompeFonctionne = false; while (!pompeFonctionne) { allumerPompeAFond(); Serial.println("Verification du fonctionnement de la pompe..."); Serial.println("Apres quelques secondes, l'eau de la pompe coule-t-elle ? (taper O pour oui et N pour non)"); char reponse = lirePremiereLettre(); if (reponseOui(reponse)) { pompeFonctionne = true; } else if (reponseNon(reponse)) { Serial.println("."); Serial.println("La pompe ne semble pas fonctionner."); Serial.println("Verifier l'alimentation electrique, les branchements et la presence d'eau."); } else { Serial.println("."); Serial.println("Saisie erronee (taper O ou N)."); } } } int determinerSeuilDemarragePompe() { int bas = 0; int haut = 255; for (int essai = 0; essai < NOMBRE_ITERATIONS_SEUIL; essai++) { arreterPompe(); delay(1000); // Laisse l'eau retomber dans le tuyau. int milieu = bas + (haut - bas) / 2; commanderPompe(milieu); Serial.println("."); Serial.print("Valeur testee = "); Serial.println(milieu); Serial.println("Apres quelques secondes, l'eau de la pompe coule-t-elle ? (taper O pour oui et N pour non)"); char reponse = lirePremiereLettre(); if (reponseOui(reponse)) { haut = milieu; } else if (reponseNon(reponse)) { bas = milieu; } else { Serial.println("."); Serial.println("Saisie erronee (taper O ou N)."); essai--; // On recommence le meme essai. } } arreterPompe(); return bas; } float demanderNiveauEnMillimetres() { String ligne = lireLigneSerie(); return ligne.toFloat(); } void etalonnerCapteur() { Serial.println("On souhaite un niveau d'eau d'environ 140 mm pour etalonner le capteur."); Serial.println("Fermer le robinet puis appuyer brievement sur le bouton pour allumer la pompe."); attendreAppuiBouton(); allumerPompeAFond(); pauseAntiRebond(1500); Serial.println("Quand le niveau de l'eau est d'environ 140 mm,"); Serial.println("appuyer sur le bouton pour arreter la pompe."); attendreAppuiBouton(); arreterPompe(); pauseAntiRebond(1000); Serial.println("Quel est le niveau precis de l'eau (en mm) ?"); float niveau1 = demanderNiveauEnMillimetres(); float signal1 = analogRead(BROCHE_CAPTEUR_PRESSION); Serial.println("."); Serial.println("On souhaite maintenant un niveau d'eau d'environ 60 mm pour etalonner le capteur."); Serial.println("Vider le reservoir jusqu'a environ 60 mm puis appuyer sur le bouton."); attendreAppuiBouton(); pauseAntiRebond(500); Serial.println("Quel est alors le niveau precis de l'eau (en mm) ?"); float niveau2 = demanderNiveauEnMillimetres(); float signal2 = analogRead(BROCHE_CAPTEUR_PRESSION); float coefficientDirecteur = (niveau1 - niveau2) / (signal1 - signal2); float ordonneeOrigine = niveau1 - coefficientDirecteur * signal1; Serial.println("."); Serial.print("Le coefficient directeur pour le capteur est a = "); Serial.println(coefficientDirecteur); Serial.print("L'ordonnee a l'origine pour le capteur est b = "); Serial.println(ordonneeOrigine); Serial.println("Vous pouvez PRENDRE NOTE de ces 2 valeurs."); Serial.println("Fin de l'etalonnage."); } void setup() { Serial.begin(9600); pinMode(BROCHE_POMPE_PWM, OUTPUT); pinMode(BROCHE_BOUTON, INPUT); pinMode(BROCHE_CAPTEUR_PRESSION, INPUT); setPwmFrequency(BROCHE_POMPE_PWM, 1024); // PWM de D9 autour de 30 Hz. arreterPompe(); Serial.println("."); Serial.println("Appuyer sur le bouton pour commencer."); attendreAppuiBouton(); pauseAntiRebond(500); verifierFonctionnementPompe(); int seuilDemarrage = determinerSeuilDemarragePompe(); Serial.println("."); Serial.print("La valeur seuil a partir de laquelle la pompe fonctionne est n0 = "); Serial.println(seuilDemarrage); Serial.println("Vous pouvez PRENDRE NOTE de cette valeur."); Serial.println("Appuyer sur le bouton pour continuer."); attendreAppuiBouton(); pauseAntiRebond(1000); etalonnerCapteur(); } void loop() { // Tout l'etalonnage se fait une seule fois dans setup(). }