Go Down

Topic: Temps de fonctionnement d'un relais (Read 914 times) previous topic - next topic

yarno

Bonjour, moi c'est Arnaud, je m'intéresse a l'arduino depuis quelques mois. Pour le moment, je mets en pratique les premiers sketch de base en suivant un livre récemment acheté.

Mais voila qu'un premier projet m'arrive en tête. C'est a dire, suivre la conso de fioul de ma chaudière.
Dans un premier Temps je souhaiterais contrôler le temps de fonctionnement du bruleur via le contact d'un relais.

J'ai fais quelques essaie de code mais cela se complique déjà.

J'ai essayé dans un premier temps la fonction pulsein, mais je me suis vite aperçu qu'elle n'était pas adapté.
J'ai essayé la fonction millis() en voulant mémoriser une valeur  a l'état 1  puis une valeur a zéro puis de faire une soustraction. Mais ça ne fonctionne pas du tout.

Merci de votre aide

kamill

#1
Feb 07, 2017, 02:14 pm Last Edit: Feb 07, 2017, 02:17 pm by kamill
Bonjour,

Ton problème est relativement simple:
Quand ton relais se ferme (pour tester cela il faut que l'état du relais soit différent de l'état précédent et que le relais soit fermé) tu mémorise les millis
Quand ton relais s'ouvre tu mémorise la fin, tu calcules la durée et totalise le temps de fonctionnement.

Pour détecter les changements d'état du relais tu peux utiliser les interruptions (attention aux rebonds), mais comme je suppose que le temps d'actionnement du bruleur est de plusieurs secondes, tu peux très bien le faire dans la loop().

Il ne faut pas oublier le pullup (ou pulldown) sur l'entrée. Le pullup peut être interne.

yarno

Le problème avec la mémorisation en état HIGH est que lorsque je la visualise sur le moniteur, elle continue d'évoluer avec millis(), la même chose lorsque l'entrée passe a LOW.

Je vais me documenter sur les interruptions.

Pour info, le brûleur fonctionne quelques minutes.

kamill

C'est inutile d'utiliser des interruptions.

Il ne faut pas que tu traites des états, mais des changements d'état.
Tu compares l'état du relais à son état au cycle précédent (que tu auras pris soin de mémoriser), s'il a changé alors là tu fais ton traitement.

jpdsfr

Quote
Dans un premier Temps je souhaiterais contrôler le temps de fonctionnement du bruleur via le contact d'un relais.
Je suppose que ton relais est activé quand le bruleur est en fonctionnement.

Le temps de réaction d'un contact de relais standard est de l'ordre de quelques ms ........ je ne pense pas que tu mesure le temps de fonctionnement de ton bruleur avec cette précision, la seconde sera largement suffisant.

Le plus simple est par ex de travailler a une frequence d'interogation de 0.1s, dans ta boucle principale tu met un delay(100);  tout le code sera executé une seule fois 10 fois par seconde. Tu regarde la valeur de ton relais, si il est enclenché tu incremente un compteur.

Tu peux aussi faire un comptage du nombre de mise en route avec une variable enclenchée une fois a la mise en route du bruleur
Code: [Select]
void loop() {
 
  bool Relay;
  bool Memo;
  uint32_t Duree;
  uint16_t CptE;
 
  Relay=digitalRead(TonEntrée);

  if (Relay == HIGH) {
    Duree ++;
    if (Memo==LOW) {
      CptE++;
      Memo=HIGH;
    }
  }
  else {
    Memo = LOW;
  }

  delay(100);
}

yarno

Bonjour avec la dernière solution donnée, je suis arrivé a ceci.
Je vais quand même essayé d'arriver au même résultat avec millis() si possible, juste pour mon apprentissage.

Je pense me câbler sur l' EV plutôt que sur la marche brûleur. car l'EV démarre environ 12 secondes plus tard.

A moins que je modifie le code.

Pour la suite de mon apprentissage, je vais faire un affichage sur un ecran 16X2.
Et pourquoi pas intégrer une horloge et module bluetooth pour exporter un tableau avec une conso en mois.


Code: [Select]
int relais = 2;         // relais de la vanne en broche 2
int compteur = 0;       // un compteur
int etatRelais;         // L'état du relais
float heureFonct = 0;   //compteur en heure de fonctionnement



void setup() {
 
  Serial.begin(9600);
 
  // le relay en entrée
  pinMode(relais, INPUT);
}

 
void loop()
{
    // lecture de l'état du relay
    etatRelais = digitalRead(relais);
 
     // Si le relay a un état  "haut"
    if (etatRelais == HIGH) {
        // on incrémente le compteur
        compteur ++;
       
        //Délais d'une seconde
    delay(100);
     
        //on inscrit le compteur sur le moniteur serie
      Serial.print ("compteur seconde    ");
      Serial.println (compteur);
       
    }

      //si le compteur est egal a 3600 secondes on incremente 2.5 litres de fioul a heure de fonctionnment
     if  (compteur == 36){
           heureFonct = heureFonct + 2.5;
      //on inscrit le nombre d'heure de fonctionnement sur le moniteur serie
      Serial.print ("nombre d'heure de fonctionnement  ");
      Serial.println (heureFonct);
      compteur = 0;    //on met le compteur a zéro apres que le compteur ai atteint 3600 secondes
   
     }
}

Go Up