Montage de la maquette du château d’eau

Sketch arduino pour établir la caractéristique d’une régulation continue

Montage

Sortie série

L’affichage de la sortie série peut se faire de trois manières différentes :

Code à téléverser

/** * caracteristique_regulation.ino * Ce sketch allume plus ou moins la pompe afin que le niveau d'eau atteigne une consigne choisie * C'est une version ajustée de la régulation proportionnelle * Le sketch affiche la hauteur d'eau et la valeur de la commande PWM * * --> Caractéristique du régulateur : commande = f(hauteur atteinte) * Les caractéristiques procédé vs régulateur permettent de déterminer le point de fonctionnement */ // 1. Déclarations des constantes et variables globales // Capteur de pression const byte PRESSURE_SENSOR_PIN = A0; // Capteur Pin1 A0, Pin2 GND et Pin3 5 V. // La hauteur est obtenue grâce à une relation affine hauteur (mm) = a × tension (V) + b const float PENTE = 225.6; // Coefficient directeur a (mm/V) – Déterminé séparément const float OFFSET = -30.50; // Ordonnée à l’origine b (mm) – Déterminé séparément float hauteur = 0.0; // Variable globale car conception des sketches par blocs // Module de puissance const byte PWM_PIN = 11; // Module de puissance entre GND et PIN11 // Régulation const float CONSIGNE_DE_HAUTEUR = 110.0; // Consigne en mm const float COMMANDE_POMPE_MINIMALE = 80.0; // Valeur en dessous de laquelle la pompe ne s'amorce pas // Configuration const float Kp = 5.0; // 2. Setup − Exécuté une seule fois void setup() { // Fixe la vitesse de communication entre arduino et le PC Serial.begin(9600); // Configuration du module de puissance TCCR2B = (TCCR2B & 0b11111000) | 0x07; // Fréquence PWM = 30 Hz pinMode(PWM_PIN, OUTPUT); // Broche PWM_PIN parametrée en sortie } // 3. Loop − Variables recréées à chaque boucle void loop() { // Détermination de la hauteur int pressureSensorRawValue = averageAnalogRead(PRESSURE_SENSOR_PIN, 30); // Moyenne de 30 valeurs entre 0 et 1023 float pressureSensorVoltage = pressureSensorRawValue * 5.0 / 1023.0; // Valeur de la tension en volts hauteur = PENTE * pressureSensorVoltage + OFFSET; // Calcul de la hauteur d’eau dans le réservoir // Régulation float erreur = CONSIGNE_DE_HAUTEUR - hauteur; float termeProportionnel = Kp * erreur; int commande_pwm = termeProportionnel + COMMANDE_POMPE_MINIMALE; // Certaines consignes trop faibles ne peuvent pas être atteintes commande_pwm = constrain(commande_pwm, COMMANDE_POMPE_MINIMALE, 255); analogWrite(PWM_PIN, commande_pwm); // Afficahge des varaibles Serial.print(hauteur, 0); Serial.print('\t'); Serial.println(commande_pwm, DEC); // On attend une seconde delay(1000); } // 4. Fonctions − Variables locales /* Cette fonction effectue une moyenne sur les sampleCount valeurs renvoyées par analogRead(pin) */ int averageAnalogRead(byte pin, byte sampleCount) { long sum = 0; for(byte i = 0; i < sampleCount; i++){ sum = sum + analogRead(pin); } return sum / sampleCount; }