Filtration automatique de la piscine partie 1. (Démonstration du programme) *

Description :

Première partie : Démonstration du programme avec un simulateur.

Le but du projet est de pouvoir gérer le temps de la filtration de votre piscine en fonction de la température de l’eau automatiquement.

2 modes sont disponibles :

  • Mode Auto. La filtration s’allumera à l’heure que vous avez programmé et fonctionnera plus ou moins longtemps en fonction de la température de l’eau (voir tableau ci-dessous).

  • Mode Manu. Vous pouvez piloter l’allumage et l’extinction de votre pompe grace à un bouton poussoir.

 

 

    Prérequis :

Matériel :

  • 1 x Carte Arduino Mega 2560
  • 2 x Boutons
  • 4 x Potentiomètres 10 KΩ
  • 1 x TFT Module 3.5 pouces d’écran d’affichage couleur 320 X 480 Support Mega2560
  • Fils de connexion
  • 1 x Breadboard

Version IDE :

Bibliothèque :

 

 

Vidéo de démonstration :

 

Schéma de câblage :

 

Code :

// Initialise la variable qui va recueillir la valeur du potentiomètre
int Potheure; 
int Potminute;
int Potseconde; 
int Pottemp;

// Déclare la broche sur laquelle est câblée le Bouton Auto/Manu
const int boutonAM = 12; 
// Déclare la broche sur laquelle est câblée le Bouton Marche/Arrêt
const int boutonMA = 13;

// UTFT///////////////////////////////////////
#include <UTFT.h>
// Déclarer les polices que nous utiliserons
extern uint8_t BigFont[];
// N'oubliez pas de modifier le paramètre du modèle en fonction de votre module d'affichage !
UTFT myGLCD(ILI9486,38,39,40,41);
////////////////////////////////////////////

//Heure de démarrage de la filtartion
const char HeurefiltrationON[]={"22:03"};

// Valeur de la température Seuil 1
int SeuilTemp1 = 10;
// Temps de filtration si Température eau < Seuil 1
long TpsFiltrationS1 = 2;
// Valeur de la température Seuil 2
int SeuilTemp2 = 12;
// Temps de filtration si Température eau > Seuil 1 et < Seuil 2
long TpsFiltrationS1S2 = 3;
// Valeur de la température Seuil 3
int SeuilTemp3 = 14;
// Temps de filtration si Température eau > Seuil 2 et < Seuil 3
long TpsFiltrationS2S3 = 4;
// Valeur de la température Seuil 4
int SeuilTemp4 = 16;
// Temps de filtration si Température eau > Seuil 3 et < Seuil 4
long TpsFiltrationS3S4 = 5;
// Valeur de la température Seuil 5
int SeuilTemp5 = 20;
// Temps de filtration si Température eau > Seuil 4 et < Seuil 5
long TpsFiltrationS4S5 = 6;
// Valeur de la température Seuil 6
int SeuilTemp6 = 24;
// Temps de filtration si Température eau > Seuil 5 et < Seuil 6
long TpsFiltrationS5S6 = 8;
// Valeur de la température Seuil 8
int SeuilTemp7 = 27;
// Temps de filtration si Température eau > Seuil 6 et < Seuil 7
long TpsFiltrationS6S7 = 10;
// Valeur de la température Seuil 8
int SeuilTemp8 = 30;
// Temps de filtration si Température eau > Seuil 7 et < Seuil 8
long TpsFiltrationS7S8 = 12;
// Temps de filtration si Température eau > Seuil 8
long TpsFiltrationS8 = 14;

// Variables utilisées pour le programme
unsigned long Heure;
unsigned int  Minute;
unsigned int  Seconde;
unsigned long Heureensec;
unsigned long HeureFiltrationOn;
char *heureFiltrationOn = NULL;
unsigned int  MinuteFiltrationOn;
char *minuteFiltrationOn = NULL;
unsigned long HeureFiltrationOnensec;
unsigned long HeureFiltrationOffensec;
unsigned int HeureFiltrationOff;
int EtatFiltration = 0;
boolean filtrationmode = 0;
boolean detectboutonAM = 0;
boolean detectboutonMA = 0;

void setup() {
  
  // Initialise la communication entre le PC et Arduino
  Serial.begin(9600); 
  
  // UTFT///////////////////////////////////
  myGLCD.InitLCD(PORTRAIT);
  myGLCD.clrScr();
  /////////////////////////////////////////
  
  // Affichage bandeau bleu
  myGLCD.setColor(VGA_BLUE);
  myGLCD.fillRect(0, 40, 320, 110);

  // Affichage commentaires
  myGLCD.setColor(VGA_WHITE);
  myGLCD.setBackColor(VGA_BLUE);
  myGLCD.setFont(BigFont);
  myGLCD.print("Temp. de l'eau", CENTER, 50);
  myGLCD.setBackColor(VGA_BLACK);
  myGLCD.setFont(BigFont);
  myGLCD.print("FILTRATION", 10, 130);
  myGLCD.drawLine(10 , 148, 170, 148);
  myGLCD.print("Etat :", 10, 160);
    
  // Convertion de l'heure de démarrage filtration en seconde
  heureFiltrationOn = strtok(HeurefiltrationON, ":");
  minuteFiltrationOn = strtok(NULL, ":"); 
  HeureFiltrationOn = atoi(heureFiltrationOn);
  MinuteFiltrationOn = atoi(minuteFiltrationOn);
  HeureFiltrationOnensec = (HeureFiltrationOn*3600)+(MinuteFiltrationOn*60);

  // Déclare la broche sur laquelle est câblée le Bouton Auto/Manu
  pinMode(boutonAM, INPUT_PULLUP);
  // Déclare la broche sur laquelle est câblée le Bouton Marche/Arret
  pinMode(boutonMA, INPUT_PULLUP);  
}

void loop() {
  
  Potheure = map(analogRead(A0), 0, 1023, 0, 23);
  Potminute = map(analogRead(A1), 0, 1023, 0, 59);
  Potseconde = map(analogRead(A2), 0, 1023, 0, 59);
  Pottemp = map(analogRead(A3), 0, 1023, 9, 35);

  // Convertion de l'heure actuel en seconde
  Heure = Potheure;
  Minute = Potminute;
  Seconde = Potseconde;
  Heureensec = (Heure*3600)+(Minute*60)+ Seconde;

  // Calcule de l'heure arret filtration
  if(Pottemp < SeuilTemp1){
    HeureFiltrationOff = HeureFiltrationOn + TpsFiltrationS1;
    if (HeureFiltrationOff > 23){
    HeureFiltrationOff = HeureFiltrationOff - 23;  
    HeureFiltrationOffensec =  (HeureFiltrationOnensec + (TpsFiltrationS1*3600))-82800;  
    }
    else{
      HeureFiltrationOffensec =  HeureFiltrationOnensec + (TpsFiltrationS1*3600);    
    }
  }
  else if(Pottemp >= SeuilTemp1 && Pottemp < SeuilTemp2){
    HeureFiltrationOff = HeureFiltrationOn + TpsFiltrationS1S2;
    if (HeureFiltrationOff > 23){
    HeureFiltrationOff = HeureFiltrationOff - 23;  
    HeureFiltrationOffensec =  (HeureFiltrationOnensec + (TpsFiltrationS1S2*3600))-82800;  
    }
    else{
      HeureFiltrationOffensec =  HeureFiltrationOnensec + (TpsFiltrationS1S2*3600);    
    }
  }
  else if(Pottemp >= SeuilTemp2 && Pottemp < SeuilTemp3){
    HeureFiltrationOff = HeureFiltrationOn + TpsFiltrationS2S3;
    if (HeureFiltrationOff > 23){
    HeureFiltrationOff = HeureFiltrationOff - 23;  
    HeureFiltrationOffensec =  (HeureFiltrationOnensec + (TpsFiltrationS2S3*3600))-82800;  
    }
    else{
      HeureFiltrationOffensec =  HeureFiltrationOnensec + (TpsFiltrationS2S3*3600);    
    }
  } 
  else if(Pottemp >= SeuilTemp3 && Pottemp < SeuilTemp4){
    HeureFiltrationOff = HeureFiltrationOn + TpsFiltrationS3S4;
    if (HeureFiltrationOff > 23){
    HeureFiltrationOff = HeureFiltrationOff - 23;  
    HeureFiltrationOffensec =  (HeureFiltrationOnensec + (TpsFiltrationS3S4*3600))-82800;  
    }
    else{
      HeureFiltrationOffensec =  HeureFiltrationOnensec + (TpsFiltrationS3S4*3600);    
    }
  } 
  else if(Pottemp >= SeuilTemp4 && Pottemp < SeuilTemp5){
    HeureFiltrationOff = HeureFiltrationOn + TpsFiltrationS4S5;
    if (HeureFiltrationOff > 23){
    HeureFiltrationOff = HeureFiltrationOff - 23;  
    HeureFiltrationOffensec =  (HeureFiltrationOnensec + (TpsFiltrationS4S5*3600))-82800;  
    }
    else{
      HeureFiltrationOffensec =  HeureFiltrationOnensec + (TpsFiltrationS4S5*3600);    
    }
  }
  else if(Pottemp >= SeuilTemp5 && Pottemp < SeuilTemp6){
    HeureFiltrationOff = HeureFiltrationOn + TpsFiltrationS5S6;
    if (HeureFiltrationOff > 23){
    HeureFiltrationOff = HeureFiltrationOff - 23;  
    HeureFiltrationOffensec =  (HeureFiltrationOnensec + (TpsFiltrationS5S6*3600))-82800;  
    }
    else{
      HeureFiltrationOffensec =  HeureFiltrationOnensec + (TpsFiltrationS5S6*3600);    
    }
  }  
  else if(Pottemp >= SeuilTemp6 && Pottemp < SeuilTemp7){
    HeureFiltrationOff = HeureFiltrationOn + TpsFiltrationS6S7;
    if (HeureFiltrationOff > 23){
    HeureFiltrationOff = HeureFiltrationOff - 23;  
    HeureFiltrationOffensec =  (HeureFiltrationOnensec + (TpsFiltrationS6S7*3600))-82800;  
    }
    else{
      HeureFiltrationOffensec =  HeureFiltrationOnensec + (TpsFiltrationS6S7*3600);    
    }
  } 
  else if(Pottemp >= SeuilTemp7 && Pottemp < SeuilTemp8){
    HeureFiltrationOff = HeureFiltrationOn + TpsFiltrationS7S8;
    if (HeureFiltrationOff > 23){
    HeureFiltrationOff = HeureFiltrationOff - 23;  
    HeureFiltrationOffensec =  (HeureFiltrationOnensec + (TpsFiltrationS7S8*3600))-82800;  
    }
    else{
      HeureFiltrationOffensec =  HeureFiltrationOnensec + (TpsFiltrationS7S8*3600);    
    }
  } 
  else if(Pottemp >= SeuilTemp8){
    HeureFiltrationOff = HeureFiltrationOn + TpsFiltrationS8;
    if (HeureFiltrationOff > 23){
    HeureFiltrationOff = HeureFiltrationOff - 23;  
    HeureFiltrationOffensec =  (HeureFiltrationOnensec + (TpsFiltrationS8*3600))-82800;  
    }
    else{
      HeureFiltrationOffensec =  HeureFiltrationOnensec + (TpsFiltrationS8*3600);    
    }
  } 

  // Gestion du changement de mode de marche de la filtration
  int etatDuBoutonAM = digitalRead(boutonAM);
  if (etatDuBoutonAM == LOW && detectboutonAM == 0){
    detectboutonAM = 1;
    filtrationmode = !filtrationmode;
  }
  if (etatDuBoutonAM == HIGH){
    detectboutonAM = 0; 
  }

  // Gestion de l'allumage automatique de la filtation en mode auto
  if(filtrationmode == 0 && Heureensec >= HeureFiltrationOnensec && Heureensec <= (HeureFiltrationOnensec + 15)){
    EtatFiltration = 1;  
  }
  // Gestion de l'allumage de la filtation en mode manu
  else if (filtrationmode == 1){
    int etatDuBoutonMA = digitalRead(boutonMA);
    if (etatDuBoutonMA == LOW && detectboutonMA == 0){
      detectboutonMA = 1;
      EtatFiltration = !EtatFiltration;
    }
    if (etatDuBoutonMA == HIGH){
      detectboutonMA = 0; 
    }   
  }
  // Gestion de l'arret automatique de la filtation en mode auto
  else if(filtrationmode == 0 && EtatFiltration == 1 && HeureFiltrationOnensec > HeureFiltrationOffensec && (Heureensec > HeureFiltrationOnensec || Heureensec < HeureFiltrationOffensec)){
    EtatFiltration = 1;
    }
  else if(filtrationmode == 0 && EtatFiltration == 1 && HeureFiltrationOnensec < HeureFiltrationOffensec && (Heureensec > HeureFiltrationOnensec && Heureensec < HeureFiltrationOffensec)){
    EtatFiltration = 1;
    }
  else{
    EtatFiltration = 0;
   }  
 
  // Affichage de l'heure
  myGLCD.setColor(VGA_LIME);
  myGLCD.setBackColor(VGA_BLACK);
  myGLCD.setFont(BigFont);
  myGLCD.printNumI(Potheure, 10, 10 , 2, '0');
  myGLCD.print(":", 40, 10);
  myGLCD.printNumI(Potminute, 55, 10 , 2, '0');   
  myGLCD.print(":", 85, 10);
  myGLCD.printNumI(Potseconde, 100, 10 , 2, '0'); 
      
  // Affichage de la température de l'eau
  myGLCD.setColor(VGA_WHITE);
  myGLCD.setBackColor(VGA_BLUE);
  myGLCD.setFont(BigFont);
  myGLCD.printNumF(Pottemp, 1, 120, 82);
  myGLCD.fillCircle(192, 85, 3);
  myGLCD.print("C", 200, 82);
  
  // Affichage du mode de marche de la filtration
  if(filtrationmode == 1){
    myGLCD.setColor(VGA_LIME);
    myGLCD.setBackColor(VGA_BLACK);
    myGLCD.print("MANUEL", 210, 130);  
  }
  else{
    myGLCD.setColor(VGA_LIME);
    myGLCD.setBackColor(VGA_BLACK);
    myGLCD.print("  AUTO", 210, 130); 
  }  
  
  // Affichage de l'etat de la filtration
  if(EtatFiltration == 1){
    myGLCD.setColor(VGA_LIME);
    myGLCD.setBackColor(VGA_BLACK);
    myGLCD.setFont(BigFont);
    myGLCD.print("  ACTIVE", 180, 160); 
  }
  else{
    myGLCD.setColor(VGA_RED);
    myGLCD.setBackColor(VGA_BLACK);
    myGLCD.setFont(BigFont);
    myGLCD.print("INACTIVE", 180, 160); 
  }

  // Affichage de l'heure Marche/arret
  if(filtrationmode == 0){
    myGLCD.setColor(VGA_WHITE);
    myGLCD.setBackColor(VGA_BLACK);
    myGLCD.print("Heure debut :", 10, 190);
    myGLCD.print(heureFiltrationOn, 230, 190);
    myGLCD.print(":",  260, 190);
    myGLCD.print(minuteFiltrationOn, 275, 190);  
    myGLCD.print("Heure fin :", 10, 220);
    myGLCD.setFont(BigFont);
    myGLCD.printNumI(HeureFiltrationOff, 230, 220 , 2, '0');
    myGLCD.print(":", 260, 220);  
    myGLCD.print(minuteFiltrationOn, 275, 220);     
  }
  else{
    myGLCD.print("                    ", 10, 190); 
    myGLCD.print("                    ", 10, 220);         
  } 
}

 


 

Laisser un commentaire