Modification d’un sèche linge arduino

Obsolescence programmėe ou pas ???ou autre dans tous les cas la panne, l’électronique du sèche linge a rendu l’âme après 7 ans de bon et loyaux services.

Je me suis mis en quête de réstauration ou de remplacement de la dite carte mais rien de dispo 🙁

Après quelques recherche Google j’ai trouver que pour faire tourner un moteur et gérer une résistance de chauffe 180 euro d’électronique c’est trop.

j’ai donc décider d’utiliser un arduino, quelques relais, résistance et autres composants pour faire tourner mon sèche linge.

Mon sèche linge est composer de :

  • Un moteur qui a plusieurs rôles :
    • Faire tourner le tambour
    • Ventiler le linge
    • Ventiler le radiateur à condensation
  • Deux résistance de chauffe
  • Un fusible de température à réarmement automatique au niveau des résistance de chauffe
  • Un fusible de température sans réarmement au niveau des résistance de chauffe
  • Une thermistance pour mesurer la température de l’air au niveau des résistance de chauffe
  • Une thermistance pour mesurer la température de l’air à la sortie du linge (proche de la porte de remplissage)
  • Une pompe pour remonter l’eau condensée dans le bac
  • Un contact de trop plein
  • Un contacteur de porte
  • J’ai récupérer sur la face avant un bouton pour lancer le cycle
  • J’ai aussi recablė une led

Voici donc le Chema de câblage que j’ai utiliser.
SchemaSecheLinge

Dans mes recherche j’ai lu qu’en fonction de la température des thermistance il est possible de savoir si le linge est sec, mais je n’ai pas utiliser cette fonction, je me suis basé sur le temps de séchage.

Voici le code arduino.CodeSecheLinge

// Sensor
int SensorTempArPin = A0; // Pin de reception temperature Ar
int SensorTempAvPin = A1; // Pin de reception temperature Av

//Relay
int PinMoteurSens = 2; // Pin de rotation du moteur SAM
int PinMoteurON = 3; // Pin de rotation du moteur SIAM
int PinResistance1 = 4; // Pin du corp de chauffe de base
int PinResistance2 = 5; // Pin du corp de chauffe de regulation de t°
int PinMoteurPompe = 6; // Pin du Moteur de pompe
int PinCapteurRelaiPorte = 7; // Pin du du capteur de relai de la porte

// Capteur
int PinCapteurPorte = 8; // pin du capteur de porte
int PinContactTropPlein = 9; // Pin du contact de trop plein

// LED
int PinLedcapteurTropPlein = 13; // pin du capteur de porte
int PinLedON = 12; // pin du capteur de porte

//Accessoire
int PinBeep = 10; //Pin du beep

// Bouton
int PinLancementCycle = 11; //Pin du bouton de lancement de cycle

// Variable de capteur
int SensorTempAr = 0; // Variable de valeur lue Ar
int SensorTempAv = 0; // Variable de valeur lue Av
int capteurPorteEtat = 0; //Variable de l’etat du capteur de porte
int capteurTropPleinEtat = 0; //Variable de l’etat du capteur de trop plein
long heureDeDebut = 0; // Heure en MilliSeconde du lancement du cycle

// Variable de memoire
int valeurMoteurPrecedente = 0; // Valeur de moteur precedente
int valeurResistancePrecedente = 0; // Valeur de la resistance precedente

// Variable modifiable
long tempsEntre2Inversion = 600000; // Temps entre 2 inversion en MilliSeconde ( 10 min * 60 sec * 1000ms)
long tempsDInversion = 15000; // Temps de l’inversion en MilliSeconde ( 15 sec * 1000ms) avec temps d’inversion du moteur de 4 seconde il tourne donc 11 sec

long tempsMaxiDUnCycle = 3000000; // Temps maximum d’un cycle en MilliSeconde (50min*60*60)

int limiteSensorTempArResitance2 = 400;//Limite de temperature de la segonde resistance
int limiteSensorTempArTotale = 500;//Limite de temperature pour arret des resistance

int debug = 1; // Mode debug pour afficher ce qu’il fait

int RetourCycle = -1;

void setup() {

// Declare la pin du lancement de cycle en entree
pinMode(PinLancementCycle, INPUT);

// Declare la pin du beep en sortie
pinMode(PinBeep, OUTPUT);

//Execute un beep au lancement de l’arduino
beep(1,200);

// Declare la pin du capteur de porte en entree et du relai de porte en sortie
pinMode(PinCapteurPorte, INPUT);
pinMode(PinCapteurRelaiPorte, OUTPUT);

// Declare les pins de moteur en sortie
pinMode(PinMoteurSens, OUTPUT);
pinMode(PinMoteurON, OUTPUT);

// Declare les pins de resitance en sortie
pinMode(PinResistance1, OUTPUT);
pinMode(PinResistance2, OUTPUT);

// Declare la pin du moteur de pompe en sortie
pinMode(PinMoteurPompe, OUTPUT);

// Declare la pin du contact de trop plein
pinMode(PinContactTropPlein, INPUT);

// Active la communication seriel
Serial.begin(9600);
Serial.println(« Version logiciel 0.91.2 »);
}

void loop() {

// Controle de l’ouverture de la porte
capteurPorteEtat = capteurPorte();

switch (capteurPorteEtat){
case 1: // Porte fermee
// Controle de l’etat du capteur de trop plein
capteurTropPleinEtat = capteurTropPlein();
ledCapteurTropPlein(capteurTropPleinEtat);
switch (capteurTropPleinEtat){
case 0: // capteur de trop plein eteint on continue
if (lancementCycle() == 1){
// Lance le cycle
RetourCycle = cycle();
if (debug = 1){
Serial.println(« RetourCycle » + String(RetourCycle)); // Debug
}
}
else{
RetourCycle = -1;
}
switch (RetourCycle){
case -1:
// Attente de lancement de cycle
break;
case 0:
beep(10,100);
RetourCycle = -1; // Attente de depart du prochain cycle
break;
case 1:
beep(2,500);
RetourCycle = -1; // Attente de depart du prochain cycle
break;
case 2:
beep(100,100);
RetourCycle = -1; // Attente de depart du prochain cycle
break;
default:
if (debug = 1){
Serial.println(« Erreur de code beep »);
}
break;
}
break;
case 1: // capteur de trop plein allume
if (debug = 1){
Serial.println(« Vider le bac d’eau »);
}
break;
default:
if (debug = 1){
Serial.println(« Erreur de code Capteur Trop Plein »);
}
break;
}
break;
case 0: // Porte ouverte
// Arrete le moteur
moteur(0);
//Arrete la chauffe
resistance(0);
// Arrete le moteur de pompe
MoteurPompe(0);
// Message de fermeture de porte
if (debug = 1){
Serial.println(« Fermer la porte »);
}
break;
default:
if (debug = 1){
Serial.println(« Erreur de code capteur de porte »);
}
}

// Controle le capteur de trop plein
capteurTropPleinEtat = capteurTropPlein();
ledCapteurTropPlein(capteurTropPleinEtat);

//Attente reboucle
delay(100);

}

int cycle(){
// Execute un cycle
// cycle = 0 si fini normallement
// = 1 si ouverture de porte
// = 2 si erreur de code
// Troune jusqu’a la fin de cycle
int finDeCycle = 0;
// Lance le moteur de pompe
MoteurPompe(1);

// Prend l’heure qu’il est pour le debut du cycle
heureDeDebut = HeureDepart();

if (debug = 1){
Serial.println(« Debut de cycle »);
}

while (finDeCycle == 0){
// Controle de l’ouverture de la porte
capteurPorteEtat = capteurPorte();

switch (capteurPorteEtat){
case 1: // Porte fermee
// Controle de l’etat du capteur de trop plein
capteurTropPleinEtat = capteurTropPlein();
ledCapteurTropPlein(capteurTropPleinEtat);
switch (capteurTropPleinEtat){
case 0: // capteur eteint on continue

// Mesure de la temperature AR
SensorTempAr = MesureTemperature(SensorTempArPin);

// Mesure de la temperature AV
SensorTempAv = MesureTemperature(SensorTempAvPin);

if ((TempsEcouler(heureDeDebut) % tempsEntre2Inversion) < tempsDInversion){
//Arrete la chauffe
resistance(0);
// Lance le moteur en SIAM
moteur(-1);
}
else{
// Lance le moteur en SAM
moteur(1);

// Controle si l’on peux chauffer
if (SensorTempAr >= limiteSensorTempArTotale){ // on est en limite on arrete les 2 resitances
if (debug = 1){
Serial.println(« Pas de chauffe »);
}
resistance(0);
}
else{//Lance la chauffe en fonction de la temperature actuel de la sonde arriere
if (SensorTempAr >= limiteSensorTempArResitance2){
if (debug = 1){
Serial.println(« Chauffe 1 »);
}
resistance(1);
}
else{
if (valeurResistancePrecedente ==1){
if (SensorTempAr >= (limiteSensorTempArResitance2 – 10)){
// On ne fait rien pour eviter d’alumer et eteindre le relai tout le temps
if (debug = 1){
Serial.println(« Limite bass pas atteinte on continue a chauffer en 1 »);
}
}else {
if (debug = 1){
Serial.println(« Chauffe 2 »);
}
resistance(2);
}
}else{
if (debug = 1){
Serial.println(« Chauffe 2 »);
}
resistance(2);
}
}
}
}

// test de fin de cycle si les 2 sondes ont la meme valeur
/*
if (SensorTempAr == SensorTempAv){
finDeCycle = 1;
// Arrete le moteur
moteur(0);
//Arrete la chauffe
resistance(0);
return 0;
}
else{
finDeCycle = 0;
}
*/

// Test de fin de cylce si duree maxi atteinte
if (TempsEcouler(heureDeDebut) > tempsMaxiDUnCycle){
if (debug = 1){
Serial.println(« tempsMaxiDUnCycle » + String(tempsMaxiDUnCycle)); // Debug
}
finDeCycle = 1;
//Arrete la chauffe
resistance(0);
// Arrete le moteur
moteur(0);
// Arrete le moteur de pompe
MoteurPompe(0);
return 0;
}
else{
finDeCycle = 0;
}
break;
case 1: // capteur de trop plein allume
if (debug = 1){
Serial.println(« Vider le bac d’eau »);
}
//Arrete la chauffe
resistance(0);
// Arrete le moteur
moteur(0);
// Arrete le moteur de pompe
MoteurPompe(0);
// Retourne l’information que le cycle n’est pas fini
finDeCycle = 2;
if (debug = 1){
Serial.println(« finDeCycle » + String(finDeCycle)); // Debug
}
return 1;
break;
default:
if (debug = 1){
Serial.println(« Erreur de code Capteur Trop Plein »);
}
finDeCycle = 3;
if (debug = 1){
Serial.println(« finDeCycle » + String(finDeCycle)); // Debug
}
return 2;
break;
}
break;
case 0: // Porte ouverte
//Arrete la chauffe
resistance(0);
// Arrete le moteur
moteur(0);
// Arrete le moteur de pompe
MoteurPompe(0);
// Retourne l’information que le cycle n’est pas fini
finDeCycle = 4;
if (debug = 1){
Serial.println(« finDeCycle » + String(finDeCycle)); // Debug
}
return 1;
break;
default:
if (debug = 1){
Serial.println(« Erreur de code capteur de porte »);
}
finDeCycle = 5;
if (debug = 1){
Serial.println(« finDeCycle » + String(finDeCycle)); // Debug
}
return 2;
break;
}
}

}

long HeureDepart(){
//Retourne l’heure de depart en MilliSeconde
if (debug = 1){
Serial.println(« Heure depart :  » + String(millis())); // Debug
}
return millis();
}

long TempsEcouler(long heureDeDebut){
long TempsEcouler = 0;
// Retourne le temps ecouler depuis l’heureDeDebut
TempsEcouler = (millis()) – heureDeDebut;
if (debug = 1){
Serial.println(« heureDeDebut » + String(heureDeDebut)); // Debug
}
if (debug = 1){
Serial.println(« millis() :  » + String((millis()))); // Debug
}
if (debug = 1){
Serial.println(« TempsEcouler » + String(TempsEcouler)); // Debug
}
return TempsEcouler;
}

int MesureTemperature(int SensorTempArPin){
// Temperature ambiant 77 / 1024
// Temperature chauffe au briquet 100 / 1024
int SensorTemp = 0;
SensorTemp = analogRead(SensorTempArPin);
if (debug = 1){
Serial.println(« SensorTemp » + String(SensorTemp)); // Debug
}
return SensorTemp;
}

int capteurPorte(){
// lit et retourne l’etat du capteur de porte 1 = Fermer / 0 = Ouvert
int capteurPorteVal = digitalRead(PinCapteurPorte);
if (debug = 1){
Serial.println(« capteurPorte » + String(capteurPorteVal)); // Debug
}
RelaiCapteurPorte(capteurPorteVal);
return capteurPorteVal;
}

int RelaiCapteurPorte(int Etat){
// Alumme out eteind le relai du capteur de porte
if (debug = 1){
Serial.println(« RelaiCapteurPorte » + String(Etat)); // Debug
}
switch (Etat){
case 0:
digitalWrite(PinCapteurRelaiPorte,Etat);
break;
case 1:
digitalWrite(PinCapteurRelaiPorte,Etat);
break;
default:
if (debug = 1){
Serial.println(« Erreur de code dans l’etat du RelaiCapteurPorte » + String(Etat));
}
break;
}
}

int capteurTropPlein(){
// lit et retourne l’etat du capteur de trop plein
if (debug = 1){
Serial.println(« capteurTropPlein » + String(digitalRead(PinContactTropPlein))); // Debug
}
return digitalRead(PinContactTropPlein);
}

int ledCapteurTropPlein(int Etat){
// Alumme out eteind la les de trop plein
if (debug = 1){
Serial.println(« ledCapteurTropPlein » + String(Etat)); // Debug
}
switch (Etat){
case 0:
digitalWrite(PinLedcapteurTropPlein,Etat);
break;
case 1:
digitalWrite(PinLedcapteurTropPlein,Etat);
break;
default:
if (debug = 1){
Serial.println(« Erreur de code dans l’etat de ledCapteurTropPlein » + String(Etat));
}
break;
}
}

int MoteurPompe(int Etat){
// lit et retourne l’etat du capteur de trop plein
if (debug = 1){
Serial.println(« MoteurPompe » + String(Etat)); // Debug
}
digitalWrite(PinMoteurPompe,Etat);
}

int moteur(int SensMoteur){
if (debug = 1){
Serial.println(« valeurMoteurPrecedente » + String(valeurMoteurPrecedente)); // Debug
}
if (debug = 1){
Serial.println(« SensMoteur » + String(SensMoteur)); // Debug
}
if (SensMoteur != valeurMoteurPrecedente){ // Changement de valeur
// Lance le moteur en fonction su sens desire
switch (SensMoteur) {
case 0:
digitalWrite(PinMoteurSens, LOW);
digitalWrite(PinMoteurON, LOW);
valeurMoteurPrecedente = 0;
break;
case 1:
// Arrete le moteur 3 secondes pour temps d’arret si il tourne
digitalWrite(PinMoteurSens, LOW);
digitalWrite(PinMoteurON, LOW);
delay(3000);
digitalWrite(PinMoteurSens, HIGH);
delay(1000); // Temps de basculement du relai
digitalWrite(PinMoteurON, HIGH);
valeurMoteurPrecedente = 1;
break;
case -1:
// Arrete le moteur 3 secondes pour temps d’arret si il tourne
digitalWrite(PinMoteurSens, LOW);
digitalWrite(PinMoteurON, LOW);
delay(3000);
digitalWrite(PinMoteurSens, LOW);
delay(1000); // Temps de basculement du relai
digitalWrite(PinMoteurON, HIGH);
valeurMoteurPrecedente = -1;
break;
default:
if (debug = 1){
Serial.println(« Erreur de code sens moteur »);
}
}
}
else{// Pas de changement de valeur on ne fait rien
// ne rien faire
}
}

int resistance(int niveau){
// Alume les resistance en fonction du niveau de chauffe
// 0 = Arret
// 1 = Resitance de base
// 2 = Resitance de base & resistancede regulation
if (debug = 1){
Serial.println(« resistance » + String(niveau)); // Debug
}
if (niveau != valeurResistancePrecedente){ // Changement de valeur
switch(niveau){
case 0:
digitalWrite(PinResistance1, LOW);
digitalWrite(PinResistance2, LOW);
valeurResistancePrecedente = 0;
break;
case 1:
digitalWrite(PinResistance1, HIGH);
digitalWrite(PinResistance2, LOW);
valeurResistancePrecedente = 1;
break;
case 2:
digitalWrite(PinResistance1, HIGH);
digitalWrite(PinResistance2, HIGH);
valeurResistancePrecedente = 2;
break;
default:
if (debug = 1){
Serial.println(« Erreur de code lancement de resitance »);
}
return -1;
}
}
else{ // Pas de changement de valeur on ne fait rien
// ne rien faire
}
}

int beep(int nombre,int duree){
if (debug = 1){
Serial.println(« Beep » + String(duree)); // Debug
}
for (int i = 0 ;i < nombre; i++){
digitalWrite(PinBeep, HIGH);
delay(duree / 2);
digitalWrite(PinBeep, LOW);
delay(duree / 2);
}
}

int lancementCycle(){
if (debug = 1){
Serial.println(« lancementCycle » + String(digitalRead(PinLancementCycle))); // Debug
}
return digitalRead(PinLancementCycle);
}

Une photo de la carte originale dans son emplacement.

2015-07-27 11.10.01

Une photo du montage de substitution. J’ai imprimer en 3D un boîtier pour fixer les nouveaux composants.
2015-08-14 11.30.22

Une petite vidéo de démonstration.

3 réflexions sur « Modification d’un sèche linge arduino »

  1. Bonjour et bravo pour la réalisation.

    Comment gérez vous le moteur?
    En direct via un relais ou avez vous récupéré la commande d’origine ?

    Cordialement

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.