Lave-Vaisselle controlé via arduino help(control temperature lors d'un cycle)

Bonjour,
il y a peu la carte de commande mon lave-vaisselle est tombé en panne je me suis donc dit pourquoi pas avec un arduino uno et des relais et en cherchent vite fait sur le net, je suis tombé sur un projet similaire qui avais déjà était fait par un anglais qu’un français a repris, je me suis donc dit pourquoi s’embêter je vais prendre son code et son schéma de câblage.

Après avoir corrigé quelques erreurs d’accolade manquante, je suis tombé sur une erreur en rapport avec la date (oui, quand le lave-vaisselle n’est pas en marche il affiche l’heure et la date) du coup je viens vers vous pour me guider pour trouver le problème.

EDIT: problème résolu, passer les commentaire pour voir mon dernier soucis qui est la regulation de temperature lors d’un cycle

Et éventuellement m’aider à avoir un code plus propre (s’il n’y est pas assez).

Merci d’avance

LAVE_VAISSELLE.ino (10.5 KB)

erreur.txt (3.9 KB)

Je ne suis pas un spécialiste en programmation donc les indications que je vais donner sont d’autant plus simples et évidentes.

Je suis tombé sur un projet similaire qui avais déjà était fait par un anglais qu’un français a repris, je me suis donc dit pourquoi s’embêter je vais prendre son code et son schéma de câblage.

Erreur.
Sur internet il y a du bon et du moins bon et tu es tombé sur du moins bon.
Il faut toujours être vigilant et ne pas aller à la facilité du couper/coller.

Les lignes d’erreurs suivantes sont très claires :

Plusieurs bibliothèque trouvées pour “Wire.h”
Utilisé : C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire
Non utilisé : C:\Users\Parrazite\Documents\Arduino\libraries\Wire

Plusieurs bibliothèque trouvées pour “LiquidCrystal.h”
Utilisé : C:\Program Files (x86)\Arduino\libraries\LiquidCrystal
Non utilisé : C:\Users\Parrazite\Documents\Arduino\libraries\LiquidCrystal-master

Cela me fait penser à deux programmes qui ont été réuni “à la hussarde” sans rien contrôler d’où des incohérences et doubles déclarations…
Il faut en priorité résoudre ces erreurs en vérifiant et en supprimant les lignes en doubles.

Warnings:
Ce ne sont pas des erreurs mais des “alertes” pour te dire que ce qui est écrit peu ou pas faire ce que tu souhaite.
Le terme “deprecated” signifiant que c’était possible avant mais que maintenant les règles du C/C++ ont évoluées et que cela ne doit plus se faire dans les nouveaux développements…

Il faut donc revenir à la base : que fait cette opération qui est “deprecated” et comment fait-on maintenant ?
Pour cela on peut trouver l’information dans des tutos :

PS ne met pas le code et les erreurs en PJ, ce n’est pas pratique pour lire.
Mets les entre balises code → Icone </> tout à gauche de la barre d’icône.
Avant de copier ton texte formate le dans l’IDE avec un ctrl T

Ce sera plus simple pour tout le monde.

D'accord merci, j'ai bien remarquer que reprendre un code il y a pas que du bon, mais je trouver que sa me donner une base pour comprendre.

A si la ou j’aurais éventuellement besoin d'aide c'est pour comprendre pourquoi mes bouton ne fonctionne pas, dans le sens ou goButton est pressé pas de soucis le programme ce lance, mais si le bouton stopButton est pressé il ne ce passe rien alors que la vidange devrait ce lancer :confused:

j'ai donc fait le ménage dans mes librairies est sa c'est tout bon maintenant (je faisait même pas attention a c'est erreur)

je comprend pas trop par contre pour la date comment cela fonctionne pour le moment, mais je vais chercher avec ce que vous m'avez donner je devrais finir par comprendre.

Merci en tout cas

RE, donc mon problème de date est résolu en suivant des tutoriel je me suis aperçu de l’erreur.

Cependant maintenant je bloque sur quelque chose, il faudrait que de temps en temps (30 seconde) le programme fassent une “pause” pour voir si la température n’est pas trop élevé si c’est le cas changer l’état de la pin pour que le relais qui contrôle la résistance de chauffage de l’eau passent a Low.

j’ai vue qu’il était possible de faire sa mais j’ai beau chercher je comprend pas comment dans mon code je pourrais ajouter sa :confused:

quelqu’un serait m’aider ? Merci

hello
je viens de regarder ton code

1/ attention le remplissage est fait selon une tempo et non controlé par une détection de hauteur d'eau
donc la tempo dépendra du débit de ton electrovanne.

2/pour les différentes températures pendant le cycle de lavage.
à chaque fois que ton prg mets en route la chauffe, il y a un while qui attends que la température soit arrivée au seuil demandé.
avec contrôle de la température toutes les secondes. cette fonction de contrôle retourne la moyenne 25 mesures.

la résistance chauffe tant qu'elle n'a pas atteint la température cible. dès qu'elle l'a atteinte, elle est mise hors service.

il ne peut pas y avoir de dépassement de température

si tu crains qu'il y ait chauffe alors que ce n'est pas demandé (relais de commande resté bloqué mécaniquement ou contacts collés).

il faudra faire appel à la routine qui effectue la moyenne des 25 échantillons tout au long du déroulement du prg

1: oui je sais qu’il va falloir que je calcul le temps pour avoir la bonne quantité

2: oui si j’ai bien compris "for (int i = 0; i < 25; i++) tempArray = 70;" 70 étant la température max ? mais il ne ce passe rien quand la température atteins 70°c.
(d’ailleurs le code a quelque peu changer par rapport a celui que j’ai donner (surtout correction pour la date et quelque petit truc)

oui si j’ai bien compris “for (int i = 0; i < 25; i++) tempArray = 70;” 70 étant la température max ? mais il ne ce passe rien quand la température atteins 70°c.

si il se passe quelque chose:

il faut reprendre le prg:

1/demande chauffe de l’eau
2/attendre que l’eau soit à 70° et en attendant, surveiller 1 fois par seconde la température de l’eau.
3/une fois que l’eau est à la température souhaitée, sortir du while d’attente, et arrêter la chauffe.

donc dès que l’eau est à 70°, on arrête le chauffage.

puis continuer le prg

à propos,
pour le lavage le prg actionne un “distributeur de liquide vaisselle” (soapDispensor)
pour le rinçage final, le prg actionne le même distributeur

j’aurais attendu un autre distributeur, mais d’un produit mouillant permettant un bon séchage de la vaisselle mais en tous cas pas une distribution de liquide vaisselle.

dfgh:
si il se passe quelque chose:

il faut reprendre le prg:

1/demande chauffe de l'eau
2/attendre que l'eau soit à 70° et en attendant, surveiller 1 fois par seconde la température de l'eau.
3/une fois que l'eau est à la température souhaitée, sortir du while d'attente, et arrêter la chauffe.

donc dès que l'eau est à 70°, on arrête le chauffage.

puis continuer le prg

à propos,
pour le lavage le prg actionne un "distributeur de liquide vaisselle" (soapDispensor)
pour le rinçage final, le prg actionne le même distributeur

j'aurais attendu un autre distributeur, mais d'un produit mouillant permettant un bon séchage de la vaisselle mais en tous cas pas une distribution de liquide vaisselle.

J'ai peut-être modifier quelque chose qui ne fallait pas dans mon code, je vais vérifié cela ce soir.

cependant sa me convient moyen, par exemple: sur une heure de cycle, on dit que l'eau mais 10mn a chauffé, puis le code stop la chauffe, mais les 50mn restante de lavage l'eau auras le temps de refroidir.

est-il possible de faire en sorte que ci la temperature de l'eau redescent en dessous de 60°c alors rallumé la chauffe mais que ci la temperature depasse alors 70 la coupé de nouveau ... ainsi de suite a fin d'avoir une tout le temps chaude ?

Pour ce qui est de la trappe de produit et de liquide de rinçage je vais modifier.

(j'ai l'avantage d'avoir fait un bac pro SEN(est d'avoir fait ma terminale en electrodomestique donc je connais les actions qui ce deroule lors d'un cycle c'est un petit avantage ^^)

non, ce n'est pas comme ca que fonctionne ton prg.
reprenons la fonction lavage:

1/pré-lavage:
___après avoir fait le plein d'eau
___il met le chauffage en route et il brasse l'eau==> on commence à pré-laver la vaisselle à l'eau froide.
___puis tout en pré-lavant la vaisselle, il attends que l'eau monte à 48°.

2/l'eau étant arrivée à 48°, pendant 30 secondes on ajoute de la lessive
___la chauffe et le brassage étant toujours en route, on lave la vaisselle jusqu'à ce que l'eau monte à 68°
___ l'eau étant arrivée à 68°, on stoppe la chauffe et la pompe de brassage

le lavage est terminé, on va pouvoir vidanger et entamer le pré-rinçage puis le rinçage et enfin le séchage

on à donc lavé la vaisselle avec de l'eau froide au départ et on termine avec de l'eau à 68°

dfgh:
non, ce n'est pas comme ca que fonctionne ton prg.
reprenons la fonction lavage:

1/pré-lavage:
___après avoir fait le plein d'eau
___il met le chauffage en route et il brasse l'eau==> on commence à pré-laver la vaisselle à l'eau froide.
___puis tout en pré-lavant la vaisselle, il attends que l'eau monte à 48°.

2/l'eau étant arrivée à 48°, pendant 30 secondes on ajoute de la lessive
___la chauffe et le brassage étant toujours en route, on lave la vaisselle jusqu'à ce que l'eau monte à 68°
___ l'eau étant arrivée à 68°, on stoppe la chauffe et la pompe de brassage

le lavage est terminé, on va pouvoir vidanger et entamer le pré-rinçage puis le rinçage et enfin le séchage

on à donc lavé la vaisselle avec de l'eau froide au départ et on termine avec de l'eau à 68°

je suis d'accord mon programme fonctionne comme cela mais pourrait t-il fonctionné de la façon dont je le souhaite ?

c'est a dire tout le long du cycle de lavage maintenir la température entre 60 et 70°c , sinon je comprend les action du code lors des cycle et je les connais aussi par coeur étant dans électroménager :wink:

pour moi, ce que tu demandes n'a pas de sens
tu veux :
remplir la cuve de lavage
mettre la résistance en service et attendre que la sonde te dise que l'eau est à 60°

sauf que à partir du moment ou tu chauffes l'eau, il faut mettre la pompe de brassage en marche, de façon à ce que tu chauffes toute l'eau. et à partir du moment ou tu as mis la pompe de brassage en marche, tu as commencé à laver ta vaisselle.

c'est ce que fais ton programme dans sa période de pré_lavage.

tu ne peux pas dissocier la chauffe et la pompe de brassage.

ton prg commence à laver avec de l'eau froide et la chauffe jusqu'à 68°
pendant sa montée de froid à 68°, il y a une pause de 30 secondes à 48° pour ajouter le liquide vaisselle.
une fois l'eau arrivée à 68°, c'est le signal pour considérer que la vaisselle est propre et l'eau est vidangée.

dfgh:
pour moi, ce que tu demandes n’a pas de sens
tu veux :
remplir la cuve de lavage
mettre la résistance en service et attendre que la sonde te dise que l’eau est à 60°

sauf que à partir du moment ou tu chauffes l’eau, il faut mettre la pompe de brassage en marche, de façon à ce que tu chauffes toute l’eau. et à partir du moment ou tu as mis la pompe de brassage en marche, tu as commencé à laver ta vaisselle.

c’est ce que fais ton programme dans sa période de pré_lavage.

tu ne peux pas dissocier la chauffe et la pompe de brassage.

ton prg commence à laver avec de l’eau froide et la chauffe jusqu’à 68°
pendant sa montée de froid à 68°, il y a une pause de 30 secondes à 48° pour ajouter le liquide vaisselle.
une fois l’eau arrivée à 68°, c’est le signal pour considérer que la vaisselle est propre et l’eau est vidangée.

ah mais si si la pompe de brassage elle tourne tout le long du cycle de lavage j’avait oublier de le specifié.

du coup oui juste allumer une resistance sans faire circulé de l’eau c’est stupide mais non non moi la pompe de brassage tourne et en plus je voudrait que le code gere pour que l’eau reste entre 60 et 70°c, je fait une sorte de programme intensif en fait, la le prg c’est limite un cycle eco.

sinon oui du coup apres verification le code fonctionne bien comme cela mais sa me convient pas vraiment vue que mon programme de l’avage doit etre intensif

ah mais si si la pompe de brassage elle tourne tout le long du cycle de lavage j'avait oublier de le specifié.

c'est bien ce que je te dis. et si la pompe tourne, ta vaisselle se lave
l'eau arrivée à 48° la vaisselle est prélavée
le prg rajout le liquide vaisselle
et l'eau continue à chauffer jusqu'à 68°
et pendant ce temps, la pompe à toujours tourné et la vaisselle est propre.

je suis désolé mais nous n'arriverons pas à nous comprendre

je vais en rester là.

dfgh:
c'est bien ce que je te dis. et si la pompe tourne, ta vaisselle se lave
l'eau arrivée à 48° la vaisselle est prélavée
le prg rajout le liquide vaisselle
et l'eau continue à chauffer jusqu'à 68°
et pendant ce temps, la pompe à toujours tourné et la vaisselle est propre.

je suis désolé mais nous n'arriverons pas à nous comprendre

je vais en rester là.

Un lave-vaisselle maintient a une température, sinon imaginé un programme eco 2h a laver a l'eau froide pour finir 10mn voir 5min a l'eau chaude sa sert a rien.

Cependant je suis venu sur le forum non pas pour débattre sur pourquoi je fait sa et si c'est logique ou pas, je vient parler Programmation pour s'avoir si oui ou non c'est possible de modifié cela et ci c'est possible alors m'aider ou m'indiquer des piste a suivre pour faire cela ensuite ce que fera mon lave-vaisselle ne regarde que moi :wink:

tu ajoutes cette fonction

void washTheDishesMaintien() {                    ////***************** lavage de la vaisselle 
  digitalWrite(heaterPin, LOW);           //mise en service de la résistance pour chauffer l'eau  
  digitalWrite(washMotor, LOW);           //mise en route de la pompe de brassage
  delay(1500);
  //lcd.begin(20, 4); // The display seems to wig out when the motor kicks in
  lcd.clear(); // so I added an extra delay and reinitialize it here. Untested.
  unsigned long maintien=millis();
  while (millis()-maintien)<=360000) {    // attente pendant 360secondes          
    updateRuntimeDisplay(3);              //appel de la routine d'affichage LCD avec le message "lavage"  
    waterTempMaintien(60);                //appel de la routine de controle de la chauffe avec une consigne de 60°
  }
  digitalWrite(heaterPin, HIGH);          //mise hors service de la résistance pour chauffer l'eau 
  delay(5000);
  digitalWrite(washMotor, HIGH);          //mise hors service de la pompe de brassage
  delay(100);
  //lcd.begin(20, 4);
  lcd.clear();
}

que tu appelle en fin de la fonction que tu veux prolonger

void washTheDishes() {                    ////***************** lavage de la vaisselle 
  digitalWrite(heaterPin, LOW);           //mise en service de la résistance pour chauffer l'eau  
  digitalWrite(washMotor, LOW);           //mise en route de la pompe de brassage
  delay(1500);
  //lcd.begin(20, 4); // The display seems to wig out when the motor kicks in
  lcd.clear(); // so I added an extra delay and reinitialize it here. Untested.
  while (waterTemp() < 48) {              //attente  et controle toutes les secondes que l'eau arrive à 48°minimum
    updateRuntimeDisplay(3);              //appel de la routine d'affichage LCD avec le message "lavage"  
    delay(1000);
  }
  unsigned long soapTime = millis();
  digitalWrite(soapDispensor, LOW);       //mise en route du systeme distributeur de liquide vaisselle
  while ((millis() - soapTime) < 30000) { //attente de 30seconde
    delay(500);
    updateRuntimeDisplay(3);              //appel de la routine d'affichage LCD avec le message "lavage"
  }
  digitalWrite(soapDispensor, HIGH);      //arret du systeme distributeur de liquide vaisselle
  while (waterTemp() < 68) {              //attente  et controle toutes les secondes que l'eau arrive à 68°minimum
    delay(1000);
    updateRuntimeDisplay(3);              //appel de la routine d'affichage LCD avec le message "lavage"
  }
  washTheDishesMaintien();
}

la premiere fonction appelle toutes les secondes cette fonction de surveillance/regul de température

double waterTempMaintien(float consigne) {            // cette fonction releve 25 fois la temperature et en fait la moyenne
  if (arrayIndex > 23) {
    arrayIndex = 0;                                      
  }
  else {
    arrayIndex++; // Increment array index counter
  }
  double Temp;                                           // The Thermistor2 "Simple Code"
  int RawADC = analogRead(tempSensor);
  Temp = log(((10240000 / RawADC) - 10000));             // I believe the - 10000 is because it's a 10k thermistor?
  Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp )) * Temp );
  Temp = Temp - 273.15; // Convert Kelvin to Celcius (modif 2 par rapport a neon squirt Affichage temps en °C)
  tempArray[arrayIndex] = Temp;                          // replace the reading at this index with the current reading
  Temp = 0;                                              // reset the temporary variable to 0
  for (int i = 0; i < 24; i++) {
    Temp += tempArray[i];          
  }
  if (Temp>=(consigne+2)){digitalWrite(heaterPin, HIGH);}//arret de la chauffe
   else{ if (Temp<=(consigne-2)){digitalWrite(heaterPin, LOW);}}//mise en marche de la chauffe
  return (Temp / 25);              // retourne la temperature moyenne sur les 25 relevées
  
}

dfgh:
tu ajoutes cette fonction

void washTheDishesMaintien() {                    ////***************** lavage de la vaisselle 

digitalWrite(heaterPin, LOW);          //mise en service de la résistance pour chauffer l’eau 
  digitalWrite(washMotor, LOW);          //mise en route de la pompe de brassage
  delay(1500);
  //lcd.begin(20, 4); // The display seems to wig out when the motor kicks in
  lcd.clear(); // so I added an extra delay and reinitialize it here. Untested.
  unsigned long maintien=millis();
  while (millis()-maintien)<=360000) {    // attente pendant 360secondes         
    updateRuntimeDisplay(3);              //appel de la routine d’affichage LCD avec le message “lavage” 
    waterTempMaintien(60);                //appel de la routine de controle de la chauffe avec une consigne de 60°
  }
  digitalWrite(heaterPin, HIGH);          //mise hors service de la résistance pour chauffer l’eau
  delay(5000);
  digitalWrite(washMotor, HIGH);          //mise hors service de la pompe de brassage
  delay(100);
  //lcd.begin(20, 4);
  lcd.clear();
}





que tu appelle en fin de la fonction que tu veux prolonger


void washTheDishes() {                    ////***************** lavage de la vaisselle
  digitalWrite(heaterPin, LOW);          //mise en service de la résistance pour chauffer l’eau 
  digitalWrite(washMotor, LOW);          //mise en route de la pompe de brassage
  delay(1500);
  //lcd.begin(20, 4); // The display seems to wig out when the motor kicks in
  lcd.clear(); // so I added an extra delay and reinitialize it here. Untested.
  while (waterTemp() < 48) {              //attente  et controle toutes les secondes que l’eau arrive à 48°minimum
    updateRuntimeDisplay(3);              //appel de la routine d’affichage LCD avec le message “lavage” 
    delay(1000);
  }
  unsigned long soapTime = millis();
  digitalWrite(soapDispensor, LOW);      //mise en route du systeme distributeur de liquide vaisselle
  while ((millis() - soapTime) < 30000) { //attente de 30seconde
    delay(500);
    updateRuntimeDisplay(3);              //appel de la routine d’affichage LCD avec le message “lavage”
  }
  digitalWrite(soapDispensor, HIGH);      //arret du systeme distributeur de liquide vaisselle
  while (waterTemp() < 68) {              //attente  et controle toutes les secondes que l’eau arrive à 68°minimum
    delay(1000);
    updateRuntimeDisplay(3);              //appel de la routine d’affichage LCD avec le message “lavage”
  }
  washTheDishesMaintien();
}




la premiere fonction appelle toutes les secondes cette fonction de surveillance/regul de température


double waterTempMaintien(float consigne) {            // cette fonction releve 25 fois la temperature et en fait la moyenne
  if (arrayIndex > 23) {
    arrayIndex = 0;                                     
  }
  else {
    arrayIndex++; // Increment array index counter
  }
  double Temp;                                          // The Thermistor2 “Simple Code”
  int RawADC = analogRead(tempSensor);
  Temp = log(((10240000 / RawADC) - 10000));            // I believe the - 10000 is because it’s a 10k thermistor?
  Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp )) * Temp );
  Temp = Temp - 273.15; // Convert Kelvin to Celcius (modif 2 par rapport a neon squirt Affichage temps en °C)
  tempArray[arrayIndex] = Temp;                          // replace the reading at this index with the current reading
  Temp = 0;                                              // reset the temporary variable to 0
  for (int i = 0; i < 24; i++) {
    Temp += tempArray[i];         
  }
  if (Temp>=(consigne+2)){digitalWrite(heaterPin, HIGH);}//arret de la chauffe
  else{ if (Temp<=(consigne-2)){digitalWrite(heaterPin, LOW);}}//mise en marche de la chauffe
  return (Temp / 25);              // retourne la temperature moyenne sur les 25 relevées
 
}

un grand merci pour ton aide :slight_smile: j’ai juste une petite erreur:

 error: 'waterTempMaintien' was not declared in this scope

     waterTempMaintien(60);                //appel de la routine de controle de la chauffe avec une consigne de 60°

                         ^

exit status 1
'waterTempMaintien' was not declared in this scope

1ere partie

#include <math.h> 
#include <LiquidCrystal.h>
#include <Wire.h> 
#include <RTClib.h> 

RTC_DS1307 RTC; 

LiquidCrystal lcd(8, 9, 4, 5, 6, 7); 

char* dayOfWeek[] = {
  "Lundi ", "Mardi", "Mercredi", "Jeudi", "Vendredi ", "Samedi ", "Dimanche"
};

char* currentMonth[] = {
  "Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre"
};
boolean pm = false; 
unsigned long cycleStart; 
double tempArray[25]; 
byte arrayIndex = 0;

#define ventPin 7
#define soapDispensor 6
#define waterInlet 5
#define drainPin 4
#define washMotor 3
#define heaterPin 2
#define goButton A1
#define tempSensor A2
#define goLight 0
#define stopLight 1
#define stopButton A3
#define tiltSensor A0

boolean prog_long=false;

double waterTempMaintien(float consigne) {
  if (arrayIndex > 23) {
    arrayIndex = 0;                                      
  }
  else {
    arrayIndex++;
  }
  double Temp;                                           
  int RawADC = analogRead(tempSensor);
  Temp = log(((10240000 / RawADC) - 10000));             
  Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp )) * Temp );
  Temp = Temp - 273.15; 
  tempArray[arrayIndex] = Temp;                         
  Temp = 0;                                              
  for (int i = 0; i < 24; i++) {
    Temp += tempArray[i];          
  }
  if (Temp>=(consigne+2)){digitalWrite(heaterPin, HIGH);}                  
   else{if (Temp<=(consigne-2)){digitalWrite(heaterPin, LOW);}}             
  return (Temp / 25);                                                       
  
}

double waterTemp() {           
  if (arrayIndex > 23) {
    arrayIndex = 0;                                      
  }
  else {
    arrayIndex++; 
  }
  double Temp;                                           
  int RawADC = analogRead(tempSensor);
  Temp = log(((10240000 / RawADC) - 10000));             
  Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp )) * Temp );
  Temp = Temp - 273.15;
  tempArray[arrayIndex] = Temp;                         
  Temp = 0;                                              
  for (int i = 0; i < 24; i++) {
    Temp += tempArray[i];          
  }
  return (Temp / 25);             
  
}

void setup () {
  for (int i = 0; i < 25; i++) tempArray[i] = 70; 
  Wire.begin();
  RTC.begin(); 
  lcd.begin(20, 4); 
  
  pinMode(tempSensor,   INPUT);
  pinMode(ventPin,      OUTPUT);digitalWrite (ventPin, HIGH);       //7
  pinMode(soapDispensor,OUTPUT);digitalWrite (soapDispensor, HIGH); //6
  pinMode(waterInlet,   OUTPUT);digitalWrite (waterInlet, HIGH);    //5
  pinMode(drainPin,     OUTPUT);digitalWrite (drainPin, HIGH);      //4
  pinMode(washMotor,    OUTPUT);digitalWrite (washMotor, HIGH);     //3
  pinMode(heaterPin,    OUTPUT);digitalWrite (heaterPin, HIGH);     //2
  pinMode(goButton,     INPUT_PULLUP);                              //A1
  pinMode(stopButton,   INPUT_PULLUP);                              //A3
  pinMode(tiltSensor,   INPUT_PULLUP);                              //A0
  
  pinMode(0, OUTPUT);                                               //0 led lavage en cours
  pinMode(1, OUTPUT);                                               //1 led vaisselle propre
}

void updateRuntimeDisplay(byte currentMode) { 
  unsigned long elapsedSeconds = ((millis() - cycleStart) / 1000); 
  unsigned long elapsedMinutes = (elapsedSeconds / 60);
  unsigned long elapsedHours = (elapsedMinutes / 60);
  lcd.setCursor(0, 0);
  lcd.print(F("Duree cycle: "));
  if (elapsedHours > 0) { 
    lcd.print(elapsedHours);
    lcd.print(':');
    if (elapsedHours == 1) elapsedMinutes -= 60;
    if (elapsedHours == 2) elapsedMinutes -= 120;
  }
  if (elapsedMinutes < 10) { 
    lcd.print('0');
  }
  lcd.print(elapsedMinutes);
  lcd.setCursor(0, 1);
  lcd.print(F("Temp eau: "));
  lcd.print(int(waterTemp()));
  lcd.print('C');
  lcd.setCursor(0, 3);

  switch (currentMode) {
    case 1:
      lcd.print(F("Remplissage "));
      break;
    case 2:
      lcd.print(F("Vidange "));
      break;
    case 3:
      lcd.print(F("Lavage "));
      break;
    case 4:
      lcd.print(F("Pre rincage "));
      break;
    case 5:
      lcd.print(F("Rincage final "));
      break;
    case 6:
      lcd.print(F("sechage vaisselle "));
      break;
  }
}

2eme partie

void fillItUp() {                           
  unsigned long fillTime = millis();
  digitalWrite(waterInlet, LOW);           
  while ((millis() - fillTime) < 105000) {
    delay(100);                             
    updateRuntimeDisplay(1);
  }
  digitalWrite(waterInlet, HIGH);
  delay(100);
  //lcd.begin(20, 4);
  lcd.clear();
}

void drainItOut() {
  unsigned long drainTime = millis();
  digitalWrite(drainPin, LOW);
  delay(500);
  lcd.begin(20, 4);
 // lcd.clear();
  while ((millis() - drainTime) < 105000) {
    delay(100);
    updateRuntimeDisplay(2);
  }
  digitalWrite(drainPin, HIGH);
  delay(100);
  //lcd.begin(20, 4);
  lcd.clear();
}

void tiltRoutine() {
  long doorOpened = millis();
  while (digitalRead(tiltSensor)) {
    if ((millis() - doorOpened) > 120000) {
      lcd.setCursor(0, 3);
      lcd.print(" Porte ouverte ");
    }
  }
}
void ventDry() {
  digitalWrite(ventPin, LOW);
  while (waterTemp() > 115) {
    delay(1000);
    updateRuntimeDisplay(6);
  }
  digitalWrite(ventPin, HIGH);
}


void preRinse() {
  unsigned long rinseTime = millis();
  digitalWrite(washMotor, LOW);
  delay(500);
  //lcd.begin(20, 4);
  lcd.clear();
  while ((millis() - rinseTime) < 600000) {
    updateRuntimeDisplay(4);
    delay(1000);
  }
  digitalWrite(washMotor, HIGH);
  delay(100);
  lcd.begin(20, 4);
  lcd.clear();
}

void finalRinse() {
  unsigned long rinseTime = millis();
  digitalWrite(heaterPin, LOW);
  digitalWrite(washMotor, LOW);
  digitalWrite(soapDispensor, LOW);
  delay(500);
  //lcd.begin(20, 4);
  lcd.clear(); 
  while ((millis() - rinseTime) < 30000) {
    updateRuntimeDisplay(5);
    delay(500);
  }
  digitalWrite(soapDispensor, HIGH);
  while (waterTemp() < 60) {
    delay(1000);
    updateRuntimeDisplay(5);
  }
  digitalWrite(heaterPin, HIGH);
  delay(5000);
  digitalWrite(washMotor, HIGH);
  delay(100);
  //lcd.begin(20, 4);
  lcd.clear();
}

void washTheDishes() {
  digitalWrite(heaterPin, LOW); 
  digitalWrite(washMotor, LOW);
  delay(1500);
  //lcd.begin(20, 4);
  lcd.clear();
  while (waterTemp() < 48) {
    updateRuntimeDisplay(3);
    delay(1000);
  }
  unsigned long soapTime = millis();
  digitalWrite(soapDispensor, LOW);
  while ((millis() - soapTime) < 30000) {
    delay(500);
    updateRuntimeDisplay(3);
  }
  digitalWrite(soapDispensor, HIGH);
  while (waterTemp() < 68) {
    delay(1000);
    updateRuntimeDisplay(3);
  }
  if (prog_long==true){washTheDishesMaintien(360000,68);}
}

void washTheDishesMaintien(long temps,int temperatur) {
  digitalWrite(heaterPin, LOW);
  digitalWrite(washMotor, LOW);
  delay(1500);
  //lcd.begin(20, 4);
  lcd.clear();
  unsigned long maintien=millis();
  while ((millis()-maintien)<=temps) {     
    updateRuntimeDisplay(3);
    waterTempMaintien(temperatur);
  }
  digitalWrite(heaterPin, HIGH);
  delay(5000);
  digitalWrite(washMotor, HIGH);
  delay(100);
  //lcd.begin(20, 4);
  lcd.clear();
}

void loop() {
  // drainItOut();
  lcd.setCursor(0, 0);
  lcd.print(F("Date: "));
  digitalWrite(0, LOW);
  digitalWrite(1, LOW);
  while ((digitalRead(goButton))) {
    if (!digitalRead(stopButton)) drainItOut();
    if (digitalRead(tiltSensor)) {
      tiltRoutine();
    }
  
    DateTime now = RTC.now();
    lcd.setCursor(10, 0);
    //lcd.print(dayOfWeek[now.dayOfWeek()]);
    lcd.setCursor(0, 1);
    lcd.print(currentMonth[(now.month() - 1)]);
    lcd.print(' ');
    lcd.print(now.day(), DEC);
    lcd.print(", ");
    lcd.print(now.year(), DEC);
    lcd.setCursor(0, 2);
    if (now.hour() > 12) {
      pm = true;
    }
    else {
      pm = false;
    }
    if (pm) {
      lcd.print((now.hour() - 12), DEC);
    }
    else {
      lcd.print(now.hour(), DEC);
    }
    lcd.print(':');
    if (now.minute() < 10) {
      lcd.print('0');
    }
    lcd.print(now.minute(), DEC);
    lcd.print(':');
    if (now.second() < 10) {
      lcd.print('0');
    }
    lcd.print(now.second(), DEC);
    if (pm) {
      lcd.print(F(" PM "));
    }
    else {
      lcd.print(F(" AM "));
    }

   
    digitalWrite(goLight, HIGH);
    digitalWrite(stopLight, LOW);
    lcd.clear();
    cycleStart = millis();
    drainItOut();    //on vidange l'eau 
    delay(1000);
    fillItUp();      //remplissage d'eau
    delay(1000);
    washTheDishes(); //on fait la vaisselle
    delay(1000);
    drainItOut();   //on vidange l'eau
    delay(1000);
    fillItUp();     //remplissage d'eau
    delay(1000);
    preRinse();     //on fait le pré rincage
    delay(1000);
    drainItOut();   //on vidange l'eau
    delay(1000);
    fillItUp();     //remplissage d'eau
    delay(1000);
    finalRinse();   //on fait le rincage final
    delay(1000);
    drainItOut();   //on vidange l'eau
    delay(1000);
    ventDry();      //on seche à l'air chaud
    lcd.clear();
    lcd.setCursor(0, 3);
    lcd.print(F("Vaisselle propre!"));
    digitalWrite(goLight, HIGH);             //extinction de la led "lavage en cours"
    digitalWrite(stopLight, LOW);            //allumage de la led " vaisselle propre"
  }
 }