PROBLEME DE TEMPORISATION ET D'INTERRUPTION

Bonjour a tous

je viens juste d'acheter mon premier kit Arduino (donc débutant).

Mon projet est le suivant:
Je voudrais sécuriser une fontaine à eau car j'ai déjà eu un dégât des eaux avec cette dernière.
le but étant d'installer un contact sur le flotteur de la cuve d'eau et une electrovanne au départ de l'arrivée d'eau .
Dans le fonctionnement dès que la cuve a besoin d'eau le flotteur descend et donc liberent le contact qui lui-même enclenche l'électrovanne pour alimenter la fontaine en eau, une fois que la cuve est pleine le flotteur revient appuyer sur le contact et l'électrovanne se ferme.
jusque-là pas de problème j'arrive à faire cette programmation mais je voudrais la sécurisé un peu plus en rajoutant une temporisation dès le déclenchement de l'électrovanne pendant les X minutes que la cuve a besoin pour se remplir et éteindre l'électrovanne même si le bouton était défaillant et ne fonctionnait plus.
Le problème est que je n'arrive pas à insérer cette temporisation avec l'interruption programmer apparemment ça ne fonctionne pas j'ai essayé avec un delay et avec un millis mais rien n'y fait
Si quelqu'un peut il peut m'aider à faire cette programmation, je le remercie par avance
FABYUCO

mon programme(je  récupère des bouts de programme sur le net je ne sais pas si c'est compréhensible)

[code:]
const int relais=9;//relais pour simuler l’électrovanne
const int bouton=2;//contact sur la cuve a eau 
int valeurbouton=0;
int etatBouton; 



// État d'activation de la tempo
int tempoActive = 0;

// Temps à l'activation de la tempo
unsigned long tempoDepart = 0;


void setup() {

 initialisation_mon_serie();

 initialisation_relais();
  
 initialisation_bouton();

 initialisation_interruption();



}
 void allumee(){
  digitalWrite(relais,HIGH); 

} 


 void eteinte(){
  digitalWrite(relais,LOW); 

}
void initialisation_interruption()
{
 attachInterrupt(digitalPinToInterrupt(bouton), basculer, LOW); //activer l'interruption sur la broche bouton
 //detachInterrupt(digitalPinToInterrupt(bouton)); //desactiver l'interruption sur la broche inter

}

  void initialisation_mon_serie(){
 Serial.begin(9600);

 }
 void initialisation_relais(){

    pinMode(relais,OUTPUT); 

}   
 void initialisation_bouton(){

  pinMode(bouton,INPUT_PULLUP); //entree avec resistance de tirage activee

}



void basculer(){



if(basculer==false){


}}
void loop() {

 valeurbouton=digitalRead(bouton);
 if (valeurbouton==HIGH){
   
    allumee();

}
 else{
     eteinte();
     


 }}

if you could some how translate your question to English, i think that would really open up your question to many more experienced programmers :D

Hello Toka519

Very good idea thank you

Hello everyone

I just bought my first kit Arduino (so beginner).

My project is as follows: I would like to secure a water fountain because I already had a water damage with this water. The purpose being to install a contact on the float of the water tank and an electrovalve at the start of the water supply. In operation as soon as the tank needs water the float goes down and thus releases the contact which in turn activates the solenoid valve to supply the water fountain with water, once the tank is full the float returns to press the contact and The solenoid valve closes. Until now no problem I manage to do this programming but I would like to secure it a little more by adding a timer as soon as the solenoid valve trips during the X minutes that the tank needs to fill and turn off the same solenoid valve If the button was faulty and no longer functioning. The problem is that I can not insert this timer with the interrupt program apparently it does not work I tried with a delay and with a millis but nothing does If anyone can he can help me do this programming, I thank him in advance FABYUCO

My program (I retrieve program tips on the net I do not know if this is understandable)

Votre post a déplacé dans le forum en français par le modérateur donc moins de chance qu'il soit lu maintenant même s'il est toujours visible sur l'autre forum.

corrigez votre post ci dessus et rajoutez les code tags autour du code: [code][color=blue]// votre code ici[/color][/code].

ça doit ressembler à cela:// votre code ici (faites aussi ctrl-T (PC) or cmd-T (Mac) dans l'IDE avant de copier le code pour qu'il soit indenté correctement)

Pouvez vous poster une photo du montage et description de vos composants et connexions?

Pour gérer cela Le mieux reste une machine d'état - 2 états OFF (ARRÊT défaut) ou ON (MARCHE)

|500x183

transition de A -> M si flotteur bas avec action électrovanne ON, active tempo transition De M -> A si flotteur Haut avec action électrovanne et tempo OFF transition De M -> A si tempo > x secondes avec action électrovanne et tempo OFF et marquage erreur pour ne pas redéclencher ou un état suplémentaire à désactiver par l'utilisateur)

Hello

I put a simplified link, the button = float contact, the led = the coil of the water supply solenoid valve.
The problem is that after 5 seconds the LED goes off but I would like the cycle to start again if the button is switched on again and the security delay also restarts from scratch?
Thank you for your help

Bonjour

je met un lien simplifié ,le bouton=contact flotteur,la led = la bobine de l’électrovanne d’arrivée d’eau.
le problème est que au bout de 5 secondes la led s’éteint mais je voudrais que le cycle recommence si on enclenche de nouveau le bouton et que le temporisation de sécurités redémarre aussi a partir de zéro?
merci pour votre aide

hello

le problème est que au bout de 5 secondes la led s'éteint mais je voudrais que le cycle recommence si on enclenche de nouveau le bouton et que le temporisation de sécurités redémarre aussi a partir de zéro?

au début tu veux que : si ton BP(flotteur) n'as pas fermé l'électrovanne au bout de 3 secondes, ce soit la tempoqui le fasse au bout de 5 secondes

jusque là, c'est cohérent, tu évites les dégâts des eaux en cas de blocage du flotteur.

mais ensuite tu demandes le contraire: si tu redemandes un cycle par appui sur ton BP( ton flotteur est en bas ou coincé) et c'est repartit pour 5 secondes, et comme ton flotteur est bloqué, ça recommence, etc...

prière de prévoir une bonne responsabilité civile........................

comment tu fais en programmation? merci

avec une machine à états, comme suggéré plus haut, c'est idéal.

moi par contre je rajouterai un état "erreur" pour le cas où justement c'est la tempo qui a fermé l'électrovanne, avec par exemple affichage du défaut avec une led rouge clignotante.

vous pouvez me donner des exemples ? merci

Merci de suivre la reco du post #3 pour poster votre code dans le premier post

Avez vous lu des articles sur les machines à état ? Fait un essai de code ? Montrez nous votre travail...

une fois que ce sera fait on verra comment on peut vous aider

ok je poste déjà mon code et je vais regarder le machines a etats
je vous remercie

const int relais =9 ;
const int bouton =2;
 ;
long tempo=0;
int val=0;
int oldval=0; 
int state=0;


void setup() {
  Serial.begin(9600);
        pinMode(relais,OUTPUT);
        pinMode(bouton,INPUT_PULLUP); 
     
}

void loop() {
 /*if(millis()-tempo>=1000){
     digitalWrite(relais,HIGH);
   
  
}
 if(millis()-tempo>=2000){
   
     digitalWrite(relais,LOW);
     tempo=millis();}*/




      val=digitalRead(bouton);//lit etat du bouton & sauve dans val,test si changement d'etat                    
     if ((val==HIGH)&&(oldval==LOW)){
         state=1-state;
         delay(10);
         } 
         oldval=val;    //sauve ancienne valeur de val
       
     if (state==1){
      if(millis()-tempo>=1000){
         digitalWrite(relais,HIGH); //electrovanne  allumer(passante)
         
         }}
         
     if(millis()-tempo>=7000){
          digitalWrite(relais,LOW);
     
         }}

J-M-L pouvez vous me donner des liens pour débutant sur l’état des machines? merci encore fabyuco

dans ton code rien ne change la valeur de tempo. peut-être que c'est pour ça que ça ne fonctionne que la première fois ?

Bonjour

A mon avis il faudrait déjà commencer par poser un peu plus le mode de fonctionnement attendu.

Un contacteur à flotteur a en général une faible marge de débattement. Concrètement, cela veut dire que dès qu'il manque un poil d'eau il va déclencher l'électrovanne qui va s'arrêter presque tout de suite car le niveau sera refait. Cela va donc faire de micro-ajouts fréquents, ce qui n'est pas forcément souhaitable (ni nécessaire au bon fonctionnement de la fontaine).

Pour contourner ce problème, il y a pas mal d'options, chacune avec ses avantages et ses inconvénients. Par exemples :

a) utiliser deux contacteurs à flotteur : un pour le niveau bas de mise en route de l'EV, un pour le niveau haut d'arrêt de l'EV.

b) mettre en route l'EV pour une durée fixe, qui va placer le niveau d'eau nettement au-dessus du capteur, avec une durée de fonctionnement calculée pour ne pas risquer le débordement.

c) brancher l'alim sur un programmateur journalier pour ne déclencher le système qu'une fois de temps en temps. Le niveau descend alors gentiment nettement sous le contacteur, qui refait le niveau une fois par jour par exemple. Au bien gérer une tempo dans le programme, du style "pas de déclenchement de l'EV à moins de 4 heures d'intervalle".

Autre point dont tu ne parles pas : coupure de la pompe de la fontaine lorsqu'il n'y a plus assez d'eau dans la réserve (qui pourrait aussi être associée à une gestion des horaires de fonctionnement de la fontaine, pour éviter les glouglous la nuit par exemple)

Dans tous les cas, réfléchir aussi aux sécurités anti-débordement.

Sur ce point, perso j'applique une règle absolue : pas de système d'alimentation automatique en eau depuis le réseau de distribution, sans un trop plein relié à une évacuation.

Si la mise en place de l'évacuation n'est pas possible, alors je préfère alimenter depuis une réserve plus grande mais de contenu fixe. Par exemple pour une petite fontaine, un bidon de 10 litres planqué à proximité. Comme ça au moins le risque d'innondation est limité à 10 litres.

Après tu fais comme tu veux...

Ok avec bricolo sur les recommendations

Pour un exemple de machine à état, vous pouvez lire cette file ou je pointe sur un bout de code que j'avais écrit en guise de demo

un autre exemple ici, qui comprends tout ce qui peut être nécessaire pour ce projet : des temporisations, etc exemple assez complet

cet exemple est basé sur la librairie yasm (yet another state machine library)

Quand on apprend les bases de l'algorithmique, vaut mieux faire ça d'abord à la main à mon avis - (même si votre librairie est bien pensée)