• Post category:Domotiser sa piscine
  • Commentaires de la publication :0 commentaire
  • Dernière modification de la publication :septembre 10, 2022
  • Temps de lecture :13 min de lecture

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