Probleme sur un Poste de lavage automatique de traite

Bonjour,
Je me suis lancé dans un projet, il y a peu, d'automatiser le lavage d'une salle de traite.
Pour cela, il faut démarrer une pompe en triphasé qui fait le vide dans les tuyeaux, ouvrir l'eau froide, puis la fermer, mettre l'eau chaude, fermer ensuite, faire un circuit avec l'évacuation pour laisser tourner l'eau avec l'eau chaude et la lessive, remettre de l'eau froide et tout évacuer à l'égout, et a la fin pour purger les tuyaux aprés avoir éteint la pompe, ouvrir une vanne de compresseur .
pour cela, j'ai tout mis en place: deux électrovannes pour eau , une Normalement ouverte pour l'évacuation et une autre Normalement fermé pour faire le circuit de lessive à mi-lavage. Ainsi qu'une électrovanne de compresseur pour la fin du lavage, le tout en 12vcc.
pour tout contrôler j'ai pris des relais d'un coté pour contrôler le 12vcc et de l'autre (oui ça fait un peuu usine à gaz mais ça fonctionne) un relais pour contrôler un contacteur magnétique pour triphasé.
Tout à l'air ok, j'ai mis des diodes à la fin de chaques sorties d'électrovanne pour plus de sécurités.
le probleme est que dés que je branche la carte arduino uno, les contacteurs se mettent tous en route en même temps et ne suivent plus du tout ce que j'avais prévus sur le code, ma question est donc y a il une erreur sur mon code ?

const int boutonDem = 8;
int etatBouton = 0;
const byte led []= {12 , 11 , 10 , 9 }; //mise en tablau des leds 1 -- 2 -- 3 -- 4 -- 5   la premiere valeur prend le nom de 0 puis 1 ect

const int relais = 13;//machine a traire
const int EV1 = 1;//eau chaude + lessive
const int EV2 = 2;//eau froide
const int EVevier = 3;//evacuation dans évier
const int EVcaniveau = 4;//évacuation dans le caniveau
const int EVair = 0;//air compresseur

void setup() { 
  // on définit les sorties et entrées de lignes
for (int i = 0; i < 5; i++){
pinMode(led[i],OUTPUT);}
pinMode(boutonDem,INPUT);
pinMode(relais,OUTPUT);
pinMode(EV1,OUTPUT);
pinMode(EV2,OUTPUT);
pinMode(EVevier,OUTPUT);
pinMode(EVcaniveau, OUTPUT);
pinMode(EVair,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
etatBouton = digitalRead(boutonDem);
delay(1000);
if(etatBouton == HIGH){{
  delay (1000);
  digitalWrite(led[0],HIGH);//rinçage 1
  digitalWrite(EV2,HIGH);//ouverture eau froide
  delay(20000);
  digitalWrite(relais,HIGH);//allumage machine à traire
  delay(150000);
  digitalWrite(EV2,LOW);//fermeture eau froide
  delay(150000);
  digitalWrite(EVair,HIGH);//vidange du tuyeau
  delay(30000);
  digitalWrite(EVair,LOW); //fin vidange tuyeau
  digitalWrite(led[0],LOW);//fin du rinçage
  
  
  digitalWrite(led[1],HIGH);//début du segond cycle lavage
  digitalWrite(EVcaniveau,HIGH);//fermeture vanne caniveau
  digitalWrite(EVevier,HIGH);//ouverture de l'evacuation à l'evier
  digitalWrite(EV1,HIGH);//ouverture de l'eau chaude + lessive
  delay(130000);
  digitalWrite(EV1,LOW);//fermeture de l'eau chaude + lessive
  delay(400000);
  digitalWrite(EVair,HIGH);//vidange du tuyeau
  delay(30000);
  digitalWrite(EVair,LOW);//fin vidange tuyeau
  digitalWrite(led[1],LOW);//fin du lessivage
 

  digitalWrite(led[2],HIGH);//début du rinçage 2
  digitalWrite(EV2,HIGH); //ouverture de la vanne d'eau froide
  digitalWrite(EVcaniveau,LOW);//ouverture de l'evacuation d'eau vers caniveau
  digitalWrite(EVevier,LOW);//fermeture de l'évacuation d'eau dans l'évier
  delay(100000);
  digitalWrite(EV2,LOW);//fermeture de la vanne d'eau froide 
  delay(30000);
  digitalWrite(relais,LOW);//extinction de la machine à traire
  digitalWrite(EVair,HIGH);//vidange tuyeau
  delay(30000);
  digitalWrite(EVair,LOW);//fin vidange tuyeau
  digitalWrite(led[2],LOW); 
}}

else{
  digitalWrite(led[3],HIGH);
  delay(1000);
  digitalWrite(led[3],LOW);
}
}

merci d'avance pour votre réponse
cordialement

Bonjour,3 remarques:

  • ce serait bien de nous mettre un schéma du câblage pour aider à la compréhension
  • Dans le setup(), tu définis les sorties mais tu ne fixes pas leur état par défaut.
  • Dans le setup(), tu définis les entrées mais tu ne mets pas INPUT_PULLUP faut-il en déduire que tu as placé des résistances de tirage à l'extérieur ou est-ce un oubli?

Ton code serait plus clair si tu donnais des noms explicites au signaux.
Au lieu de nommer tes électro-vannes EV1, EV2 tu ferais mieux de les nommer EV_eau_chaude, EV_eau_froide par exemple.
Même chose pour la manipulation des LEDs. Au lieu d'utiliser 0, 1, 2, 3 pour adresser les LEDs dans le tableau tu peux faire

// Définition de la fonction des LEDs
enum liste_led {led_cycle1, led_cycle2, led_rincage, led3};

Ensuite dans ton code tu écris

digitalWrite(led_cycle1, HIGH);
digitalWrite(led_rincage, LOW);

ce qui est quand même plus facile à comprendre.

Tu testes l'appui du bouton sur un niveau HIGH, il doit donc être en pull down :


Si tu n'as pas mis la résistance, en effet dès l'allumage il lit un HIGH et lance ton code. La led 0 doit s'allumer au bout de 2 secondes puis le relais de la machine à traire au bout de 20 secondes, etc. Si tout se lance en même temps, c'est comme dit fdufnews que tu n'initialise pas tes sorties aux niveaux de départ.

Exchange:
pinMode (buttonDem, INPUT); ->
pinMode (buttonDem, INPUT_PULLUP);

if (buttonState == HIGH) {{->

if (buttonState == LOW) {{

Bonjour,
Pardon pour la réponse tardive, j'ai bien branché le bouton poussoir comme il fallait mais le résultat reste le même: mes relais s'allume dans une séquence que je n'ai pas définit
Voici le shémas de montage :


Merci d'avance pour vos réponses

Dans ton plan de câblage, le bouton n'est pas correctement câblé.
Dans une ambiance "industrielle" (avec de la commutation de puissance). La solution avec INPUT_PULLUP n'est pas sûre. Le pullup interne est d'une valeur trop élevée et il risque d'y avoir des perturbations.
Il vaut mieux utiliser la solution proposée par @lesept au #3.
Et ne pas oublier d'initialiser toutes les sorties dans le setup(). Définir l'état avant de définir la broche en sortie ainsi les sorties seront dans le bon état dès qu'elles seront activées et tous les relais seront au repos au lancement du programme.

digitalWrite(relais, LOW);
pinMode(relais,OUTPUT);
digitalWrite(EV1, LOW);
pinMode(EV1,OUTPUT);
digitalWrite(EV2, LOW);
pinMode(EV2,OUTPUT);
digitalWrite(EVevier, LOW);
pinMode(EVevier,OUTPUT);
digitalWrite(EVcaniveau, LOW);
pinMode(EVcaniveau, OUTPUT);
digitalWrite(EVair, LOW);
pinMode(EVair,OUTPUT);

Merci beaucoup pour ces précieux conseils,
j'ai essayé comme tu m'as dit, le problème reste le même:
j'ai l'impression qu'il y a un soucis au démarrage car le relais de commande de la machine à traire se met en contact par 3 fois en 1 seconde puis il s'éteint et c'est les autres relais sauf l'eau froide qui se mettent en route
au bout d'un certain temps une sorte de paterne apparaît:
la LED qui est sensé clignoter quand le lavage n'est pas en route se met à s'allumer pendant 1 sec,
puis tous les relais sauf celui d'eau froide (EV2) se mette en route pendant 2-3sec
puis la LED ''tension'' se rallume et ça recommence

je re-poste le code et le dessin schéma de montage pour éviter de toujours scroller

const int boutonDem = 8;
int etatBouton = 0;
const byte led []= {12 , 11 , 10 , 9 }; //mise en tablau des leds 1 -- 2 -- 3 -- 4 -- 5   la premiere valeur prend le nom de 0 puis 1 ect

const int relais = 13;//machine a traire
const int EV1 = 1;//eau chaude + lessive
const int EV2 = 2;//eau froide
const int EVevier = 3;//evacuation dans évier
const int EVcaniveau = 4;//évacuation dans le caniveau
const int EVair = 0;//air compresseur

void setup() { 
  // on définit les sorties et entrées de lignes + l'etat des sorties avant le lancement de la boucle
for (int i = 0; i < 5; i++){
pinMode(led[i],OUTPUT);}
pinMode(boutonDem,INPUT_PULLUP);
digitalWrite(relais, LOW);
pinMode(relais,OUTPUT);
digitalWrite(EV1, LOW);
pinMode(EV1,OUTPUT);
digitalWrite(EV2, LOW);
pinMode(EV2,OUTPUT);
digitalWrite(EVevier, LOW);
pinMode(EVevier,OUTPUT);
digitalWrite(EVcaniveau, LOW);
pinMode(EVcaniveau, OUTPUT);
digitalWrite(EVair, LOW);
pinMode(EVair,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
etatBouton = digitalRead(boutonDem);
delay(1000);
if(etatBouton == HIGH){{
  delay (1000);
  digitalWrite(led[0],HIGH);//rinçage 1
  digitalWrite(EV2,HIGH);//ouverture eau froide
  delay(20000);
  digitalWrite(relais,HIGH);//allumage machine à traire
  delay(150000);
  digitalWrite(EV2,LOW);//fermeture eau froide
  delay(150000);
  digitalWrite(EVair,HIGH);//vidange du tuyeau
  delay(30000);
  digitalWrite(EVair,LOW); //fin vidange tuyeau
  digitalWrite(led[0],LOW);//fin du rinçage
  
  
  digitalWrite(led[1],HIGH);//début du segond cycle lavage
  digitalWrite(EVcaniveau,HIGH);//fermeture vanne caniveau
  digitalWrite(EVevier,HIGH);//ouverture de l'evacuation à l'evier
  digitalWrite(EV1,HIGH);//ouverture de l'eau chaude + lessive
  delay(130000);
  digitalWrite(EV1,LOW);//fermeture de l'eau chaude + lessive
  delay(400000);
  digitalWrite(EVair,HIGH);//vidange du tuyeau
  delay(30000);
  digitalWrite(EVair,LOW);//fin vidange tuyeau
  digitalWrite(led[1],LOW);//fin du lessivage
 

  digitalWrite(led[2],HIGH);//début du rinçage 2
  digitalWrite(EV2,HIGH); //ouverture de la vanne d'eau froide
  digitalWrite(EVcaniveau,LOW);//ouverture de l'evacuation d'eau vers caniveau
  digitalWrite(EVevier,LOW);//fermeture de l'évacuation d'eau dans l'évier
  delay(100000);
  digitalWrite(EV2,LOW);//fermeture de la vanne d'eau froide 
  delay(30000);
  digitalWrite(relais,LOW);//extinction de la machine à traire
  digitalWrite(EVair,HIGH);//vidange tuyeau
  delay(30000);
  digitalWrite(EVair,LOW);//fin vidange tuyeau
  digitalWrite(led[2],LOW); 
}}

else{
  digitalWrite(led[3],HIGH);
  delay(1000);
  digitalWrite(led[3],LOW);
}
}



le bouton n'est plus branché pareil, il est comme tu m'as dit @fdufnews
merci d'avance, encore, pour votre aide
cordialement

Il faut d'abord avoir un câblage correct. Avec le bouton branché comme il faut. Pour les sorties, les diodes ne servent à rien. Ce ne sont pas des diodes de roues libres (chercher un tuto dessus), mais des diodes en série.
Il manque des infos sur la carte à relais. Les relais sont alimentés directement par l'arduino en 12V? c'est ça que je vois sur le schéma. Comme l'Arduino ne peut délivrer que 5V, il y aurait 7V pour les relais qui sont alors susceptibles de coller.
Avant de regarder le programme, il faut voir si l'Arduino peut ou pas commander les relais.

hello, desolé pour le post ci dessus, j'avais inversé le raisonnement pour le BP
un lien sur ta platine relais serai le bienvenu
a noter pour ton code
il y a des choses comme celle ci

digitalWrite(EVcaniveau,HIGH);//fermeture vanne caniveau
  digitalWrite(EVevier,HIGH);   //ouverture de l'evacuation de l'evier

HIGH sur tes EV, ouvre ou ferme ?

_ tu utilises D0 et D1 alors que tu as D5, D6, D7 qui sont libres
D et D1 sont les dernieres à utiliser, ce qui permet de les garder pour la liaison serie et ainsi profiter du moniteur pour le debugage

_ ton schema pour le BP est faux
la resistance doit etre entre GND et le BP
l'autre patte du BP va sur D8.

ton code avec une modif pour la reactivité de la lecture du BP

const int EVair      = 0;//air compresseur
const int EV1        = 1;//eau chaude + lessive
const int EV2        = 2;//eau froide
const int EVevier    = 3;//evacuation de l'evier
const int EVcaniveau = 4;//evacuation dans le caniveau
//5
//6
//7
const int boutonDem  = 8;
const byte led []    = {12 , 11 , 10 , 9 }; //mise en tablau des leds 1 -- 2 -- 3 -- 4 -- 5   la premiere valeur prend le nom de 0 puis 1 ect
const int relais     = 13;//machine a traire

int etatBouton              =        0;
unsigned long periode_led   =     1000;
unsigned long deb_tempo_led = millis();
void setup() { 

digitalWrite(relais, LOW);    pinMode(relais,OUTPUT);     //13
digitalWrite(EVair, LOW);     pinMode(EVair,OUTPUT);      // 0
digitalWrite(EV1, LOW);       pinMode(EV1,OUTPUT);        // 1
digitalWrite(EV2, LOW);       pinMode(EV2,OUTPUT);        // 2
digitalWrite(EVevier, LOW);   pinMode(EVevier,OUTPUT);    // 3
digitalWrite(EVcaniveau, LOW);pinMode(EVcaniveau,OUTPUT); // 4
                                                          // 5
                                                          // 6
                                                          // 7
for (int i = 0; i < 5; i++){pinMode(led[i],OUTPUT);}
pinMode(boutonDem,INPUT);                          // 8  **pas de pullup**
}

void loop() {
etatBouton = digitalRead(boutonDem);
if(etatBouton == HIGH)         //si BP enfonce puisque montage du BP en push down
{
  delay (1000);
  digitalWrite(led[0],HIGH);    //rincage 1
  digitalWrite(EV2,HIGH);       //ouverture eau froide pour 20 secondes
  delay(20000);
  digitalWrite(relais,HIGH);    //allumage machine a traire pour 150 secondes
  delay(150000);
  digitalWrite(EV2,LOW);        //fermeture eau froide pour 150 secondes
  delay(150000);
  digitalWrite(EVair,HIGH);     //ouverture vanne air pour vidange du tuyau pendant 30 secondes
  delay(30000);
  digitalWrite(EVair,LOW);      //fin vidange tuyau
  digitalWrite(led[0],LOW);     //fin du rincage
  digitalWrite(led[1],HIGH);    //debut du second cycle lavage
  digitalWrite(EVcaniveau,HIGH);//fermeture vanne caniveau
  digitalWrite(EVevier,HIGH);   //ouverture de l'evacuation de l'evier
  digitalWrite(EV1,HIGH);       //ouverture de l'eau chaude + lessive pour 130 secondes
  delay(130000);
  digitalWrite(EV1,LOW);        //fermeture de l'eau chaude + lessive pour 400 secondes
  delay(400000);
  digitalWrite(EVair,HIGH);     //vidange du tuyau pour 30 secondes
  delay(30000);
  digitalWrite(EVair,LOW);      //fin vidange tuyau
  digitalWrite(led[1],LOW);     //fin du lessivage
 

  digitalWrite(led[2],HIGH);    //rincage 2
  digitalWrite(EV2,HIGH);       //ouverture de la vanne d'eau froide
  digitalWrite(EVcaniveau,LOW); //ouverture de l'evacuation d'eau vers caniveau
  digitalWrite(EVevier,LOW);    //fermeture de l'evacuation d'eau dans l'evier pour 100 seondes
  delay(100000);
  digitalWrite(EV2,LOW);        //fermeture de la vanne d'eau froide pour 30 secondes
  delay(30000);
  digitalWrite(relais,LOW);     //extinction de la machine a  traire
  digitalWrite(EVair,HIGH);     //vidange tuyau pour 30 secondes
  delay(30000);
  digitalWrite(EVair,LOW);      //fin vidange tuyau
  digitalWrite(led[2],LOW); 
  }
else
 {
  if((millis()-deb_tempo_led)>periode_led)//10000-9900=100
  {
    deb_tempo_led=millis();                    //rearme la tempo de 1 seconde
    digitalWrite(led[3],!digitalRead(led[3]));   //inverse la led 3
  }
 }
}

 coller le code ici

edit : modif pour supprimer la declaration de BP sans pullup

  1. clarifier le mode d'alimentation de la carte relais.
  2. tu peux mettre un while(1) à la fin du setup() pour voir si la séquence d'initialisation se termine correctement. En principe, les relais et les voyants devraient tous être dans l'état par défaut. Si c'est le cas le problème est dans la suite du code.

Le problème pourrait aussi être créé par une alimentation un peu légère qui ne supporterait pas tout ce qui est branché dessus.

Merci beaucoup, je vais tester ça,
tous les relais sont alimenté en 5Vcc puisé dans la sortie 5v arduino
voici le lien de la platine relais: https://www.amazon.fr/gp/product/B07D8RF6MK/ref=ppx_yo_dt_b_asin_title_o07_s02?ie=UTF8&psc=1

et voici celui de la machine à traire : https://www.amazon.fr/gp/product/B07BVXT1ZK/ref=ppx_yo_dt_b_asin_title_o07_s00?ie=UTF8&psc=1

@dfgh Pardon, j'avais oublié de préciser : les électrovannes évier, eau chaude, eau froide et air sont normalement Fermé et l'électrovanne caniveau est normalement ouverte.
(normalment étant la position de repos) du coup sur EV caniveau , HIGH, ferme et EV evier, High ouvre.

@vileroi le 12V est pour alimenter les électrovannes, désolé, il est vrais que mon schéma n'est pas très clair.

attention dans le code que je t'ai posté, le BP ne doit pas etre déclaré en pullup, si tu as bien cabl" comme indique parlesept

j'ai fais la modif plus haut #10

nous sommes d'accord, les sorties arduino commandent les leds des optocoupleurs de la platine relais.
tes bobines de relais etant en 5V, ou le prends tu?
sur ta platine, tu as probablement un cavalier à virer, ce qui te permettra de mettre du 5Volts issu d'une alim .

Ce qui ramène le 12V sur les broches de l'arduino.

Pour moi, la source du problème est là! C'est pour cela qu'il est important de dire ce que tu utilises et ce qui est réellement fait. Le schéma est complètement faux, les diodes ne sont pas au bon endroit et soit les sorties de l'Arduino sont alimentées en 12V, soit il manque un fil de masse.
Tant que l'on ne sait pas quelle carte relais est utilisée et quel branchement est fait, on ne peut rien dire de concret.
C'est une dame qui téléphone à un docteur: "Quel traitement dois-je donner à mon mari, il a été empoisonné, mais je ne vous dirai pas avec quoi. Vous êtes docteur, débrouillez vous!"

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.