Filtration automatique de la piscine partie 2. (Projet fini et tester)

Description :

Deuxième partie : Projet fini et tester avec tous les composants nécessaire au fonctionnement.

Le projet a pour but de gérer automatiquement le temps de filtration de la piscine en fonction de la température de l’eau. Il permettra d’optimiser le temps de filtration afin de garder une bonne qualité d’eau et d’optimiser le temps de fonctionnement de la pompe afin de faire des économies d’énergie.

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 :

Version IDE :

Bibliothèque :

 

 

Vidéo de démonstration :

 

Schéma de câblage :

 

Code :

// DS1302///////////////////////////////////////
#include <DS1302.h>
// Init the DS1302
DS1302 rtc(8, 9, 10);
// Init a Time-data structure
Time t;
////////////////////////////////////////////

// DS18b20///////////////////////////////////////
#include <OneWire.h>
#include <DallasTemperature.h>
// Arduino pin connected to DS18B20 sensor's DQ pin
const int SENSOR_PIN = 11; 
// setup a oneWire instance
OneWire oneWire(SENSOR_PIN);  
// pass oneWire to DallasTemperature library       
DallasTemperature sensors(&oneWire); 
////////////////////////////////////////////

// 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;
// Déclare la broche sur laquelle est câblée le Relais de filtration
const int relaisFiltration = 7;

// 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[]={"10: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;
float TempEau;

void setup() {
  // Set the clock to run-mode, and disable the write protection
  rtc.halt(false);
  rtc.writeProtect(false);
  
  // initialize the sensor
  sensors.begin();   

  // The following lines can be commented out to use the values already stored in the DS1302
  rtc.setDOW(FRIDAY);        // Set Day-of-Week to FRIDAY
  rtc.setTime(10, 2, 30);     // Set the time to 12:00:00 (24hr format)
  rtc.setDate(6, 8, 2010);   // Set the date to August 6th, 2010
  
  // 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 en entrée sur laquelle est câblée le Bouton Auto/Manu
  pinMode(boutonAM, INPUT_PULLUP);
  // Déclare la broche en entrée sur laquelle est câblée le Bouton Marche/Arret
  pinMode(boutonMA, INPUT_PULLUP);  
  // Déclare la broche en sortie sur laquelle est la filtration
  pinMode(relaisFiltration, OUTPUT);
  digitalWrite(relaisFiltration, LOW);
}

void loop() {
  // Get data from the DS1302
  t = rtc.getTime();
  sensors.requestTemperatures();             
  TempEau = sensors.getTempCByIndex(0);  
  
  Serial.println(TempEau);

  // Convertion de l'heure actuel en seconde
  Heure = t.hour;
  Minute = t.min;
  Seconde = t.sec;

  Heureensec = (Heure*3600)+(Minute*60)+ Seconde;

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

  // Activation Marche/Arret relais Filtration
  if(EtatFiltration == 1){
    digitalWrite(relaisFiltration, HIGH);
  }
  else{
    digitalWrite(relaisFiltration, LOW);
  }
 
  // Affichage de l'heure
  myGLCD.setColor(VGA_LIME);
  myGLCD.setBackColor(VGA_BLACK);
  myGLCD.setFont(BigFont);
  myGLCD.printNumI(t.hour, 10, 10 , 2, '0');
  myGLCD.print(":", 40, 10);
  myGLCD.printNumI(t.min, 55, 10 , 2, '0');   
  myGLCD.print(":", 85, 10);
  myGLCD.printNumI(t.sec, 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(TempEau, 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);         
  } 
}

 


 

Cet article a 10 commentaires

  1. neptun8000

    Bonjour,
    Tout d’abord félicitations pour ce projet génial ! Fini les ajustements avec un temps de retard systématique des durées de filtration 🙂
    J’ai tout monté, câblé et testé sur ma table de travail. Cela marche très bien.
    Une fois monté dans le local piscine, je suis maintenant confronté à un problème : lors de l’activation du relais qui ferme le contacteur du coffret piscine, le système perd l’heure et redémarre à 00:00:00.
    Normalement le seul moment d’acquisition du temps se fait au début de la boucle principale via « t = rtc.getTime() ». J’ai cru au début à une pile trop faible dans le DS1302, mais in fine il n’en est rien. J’en déduis que la fermeture du relais, qui doit voir transiter un courant de quelques centaines de mA pour alimenter le vrai gros relais de pompe du coffret, créé une perturbation électrique qui active une sorte de reset du DS1302. L’arduino est alimenté avec un chargeur classique 9V.
    Auriez vous été confronté à ce problème ?
    Merci de votre aide !

    1. steven

      Bonjour,
      J’ai rencontré actuellement le problème avec mon installation, car je sollicitais trop le 5 v que peut fournir la carte Arduino.
      Il faut regarder dans un premier temps votre chargeur 9v combien d’ampère, il peut fournir.
      Généralement, j’utilise des chargeurs 9 v 1 A pour alimenter l’Arduino.
      Après, il faut regarder combien de mA vous consommer sur le 5v de l’Arduino et ne pas dépasser ce qui est préconiser au risque d’avoir des coupures lors de l’activation d’un relais.
      Il est aussi possible d’ajouter un condensateur aux bornes du 5v de l’Arduino pour compenser l’apelle du courant lors de l’activation du relais.
      Cordialement,

  2. neptun8000

    Bonjour,
    Merci pour votre réponse.
    Mon chargeur est un 9V/2A. Je ne pense pas que cela vienne de là. Je vais mettre un condensateur aux bornes de l’alimentation du DS 1302 pour essayer de filtrer d’éventuels parasites hautes fréquences (c’est au moment de l’ouverture du relais que cela se passe, donc quand on crée éventuellement un arc). 100nF me semble être la valeur habituellement pratiquée.
    Je ferais cela le WE prochain et donnerait un post de suite.
    Cordialement

  3. Blanchart

    Bonjour
    Felicitation pour votre travail.
    Je veux faire ce montage et quand je fais la verification sur Arduino il me souligne en rouge #include et me dit Aucun fichier ou répertoire de ce nom ! Et la je ne sais pas quoi faire (je suis débutant sur Arduino)
    Je voudrais aussi modifier le temps de filtration en fonction de la temperature ( par ex. si temp.> 30° mettre 24 h mais la aussi je ne sais pas comment.
    Merci pour votre réponse

    1. steven

      Bonjour,
      Merci pour votre commentaire
      Pour vos questions :
      « Il me souligne en rouge #include et me dit Aucun fichier ou répertoire de ce nom ! »

      Avez-vous installé les bibliothèques dans votre IDE Arduino ?
      DS1302.h
      OneWire.h
      DallasTemperature.h
      UTFT.h

      Je voudrais aussi modifier le temps de filtration en fonction de la température ( Par ex. si temp.> 30° mettre 24 h, mais là aussi, je ne sais pas comment.

      Cela est tout à fait possible, mais le programme actuel n’est pas prévu pour.
      Mais avec un peu d’apprentissage la modification est facilement réalisable en ajoutant une condition à la suite des autres.

      Cordialement,

  4. Blanchart

    Merci pour votre réponse je vais installer les bibliothèques et je vous tiens informé
    Cordialement
    Pierre

  5. Blanchart

    Bon j’ai installé les bibliothèques et toujours meme message d’erreur Avez vous une idée ?
    Merci
    Cordialement
    Pierre

  6. Blanchart

    Bonjour
    Plus personne ?

    1. steven

      Bonjour
      Pouvez vous m’ajouter sur Messenger (Facebook : Steven Robdomo) ou me contacter par email (steven@robdomo.com)afin qu’on regarde ca ensemble.
      Cordialement

  7. BLANCHART

    Bonsoir Steven
    Je vous ai envoyé un mail l’avez vous lu .
    J’ai fait des recherche sur le net et ne trouve pas de solution, j’ai meme changé d’ordinateur et meme problème
    La je suis perdu
    Merci pour votre aide
    Pierre

Laisser un commentaire