Partage
  • Partager sur Facebook
  • Partager sur Twitter

aide pour projet arduino, gestion delais

    19 juin 2020 à 14:41:23

    Bonjour,

    Je viens vers vous afin de solliciter votre aide. Je suis très très débutant en programmation Arduino. J'ai commencé il y a 2 mois. Il y a 2 ans j'avais fait un arrosage automatique  sur une base de 555 et 4017 qui commandaient 6 électrovannes, une pompe et un transformateur (25V pour allimenter les EV) par le biais de relais. Chaque sequence durait 30 min, 20 min, et 10 min, que je commandais par un interrupteur à glissière 3 positions. Ce systeme fonctionnait pas trop mal, sauf que parfois ça beuguait (certainement due a des pics de surtentions qui rendaient le système instable). Aujourd'hui j'ai tout démonté et je l'ai refait avec une carte arduino nano. Si je ne gardais qu'une tempo, ça irai. J'ai réussi a créer un programme assez basique qui fonctionne (j'ai du inverser les commandes HIGH avec les commandes Low sur les relais car ceux ci sont inversés car ils démarrent en mode haut. J'espère que vous m'avez compris ... lol ).
    Ce que je voudrais, c'est pouvoir changer mes temps de séquences a l'aide d'un bouton a glissière 3 positions afin de pouvoir sélectionner soit : 30 min, 20 min et 10 min. J'ai trouvé des tutos qui expliquent comment allumer ou éteindre une led avec un bouton glissière 2 positions en positionnant une sortie digitale au gnd. Mais je n'arrive pas à l'adapter à mes besoins.
    Si quelqu'un pouvait m'aider ça serait très sympa.

    P.S. je ne sais pas comment mettre  le sketch que j'ai fait en piece jointe.
    P.S. J'ai essayé de mettre 3 nano en parallèles dont je gérais leur alimentation avec le bouton glissière 3 positions, mais, ça ne fonctionne pas. Les cartes se mettent en conflit car les sorties d'une des cartes sont envoyées dans les autres cartes ( c'est un peu n'importe quoi, mais j'ai tenté... ne me jugez pas lol qui ne tente rien n'a rien lol).


    //Branchements des connecteurs relais et leds


    int pinRelayTransfo = 0; // Numero de sortie relay Transformateur

    int pinRelay_A = 7;    // Numero de sortie relay E-V Zone 1
    int pinRelay_B = 8;    // Numero de sortie relay E-V Zone 2
    int pinRelay_C = 9;    // Numero de sortie relay E-V Zone 3
    int pinRelay_D = 10;     // Numero de sortie relay E-V Zone 4
    int pinRelay_E = 11;     // Numero de sortie relay E-V Zone 5
    int pinRelay_F = 12;     // Numero de sortie relay E-V Zone 6

    int pinRelayPompe = 13; // Numero de sortie relay Pompe

    int pinLed_A = 6;    // Numero de sortie LED Zone 1
    int pinLed_B = 5;    // Numero de sortie LED Zone 2
    int pinLed_C = 4;    // Numero de sortie LED Zone 3
    int pinLed_D = 3;    // Numero de sortie LED Zone 4
    int pinLed_E = 2;    // Numero de sortie LED Zone 5
    int pinLed_F = 1;    // Numero de sortie LED Zone 6


    void setup() {
      // put your setup code here, to run once:



      pinMode(pinRelayTransfo, OUTPUT);

      pinMode(pinRelay_A, OUTPUT);
      pinMode(pinRelay_B, OUTPUT);
      pinMode(pinRelay_C, OUTPUT);
      pinMode(pinRelay_D, OUTPUT);
      pinMode(pinRelay_E, OUTPUT);
      pinMode(pinRelay_F, OUTPUT);

      pinMode(pinRelayPompe, OUTPUT);

      pinMode(pinLed_A, OUTPUT);
      pinMode(pinLed_B, OUTPUT);
      pinMode(pinLed_C, OUTPUT);
      pinMode(pinLed_D, OUTPUT);
      pinMode(pinLed_E, OUTPUT);
      pinMode(pinLed_F, OUTPUT);


      // RESET DELAY


      digitalWrite(pinRelay_A, HIGH);
      digitalWrite(pinRelay_B, HIGH);
      digitalWrite(pinRelay_C, HIGH);
      digitalWrite(pinRelay_D, HIGH);
      digitalWrite(pinRelay_E, HIGH);
      digitalWrite(pinRelay_F, HIGH);

      digitalWrite(pinRelayPompe, HIGH);

      digitalWrite(pinRelayTransfo, LOW); //demarrage Transformateur


      delay(500);

      // PROGRAMME ZONE 1

      digitalWrite(pinRelay_A, LOW);     // Allumage Relay EV zone 1
      digitalWrite(pinLed_A, HIGH);       // Allumage Led EV zone 1
      delay(1000);                        // Pause 1 seconde
      digitalWrite(pinRelayPompe, LOW);  // Allumage Pompe
      delay(1800000);                     // Durée cycle d'arrosage 30 minutes

      digitalWrite(pinRelayPompe, HIGH);   // Arret de la Pompe
      delay(1000);                        // Pause 1 seconde
      digitalWrite(pinRelay_A, HIGH);      // Arret Relay EV zone 1
      digitalWrite(pinLed_A, LOW);        // Arret Led EV zone 1
      delay(500);                         // Pause 500 millisecondes

      // PROGRAMME ZONE 2

      digitalWrite(pinRelay_B, LOW);     // Allumage Relay EV zone 2
      digitalWrite(pinLed_B, HIGH);       // Allumage Led EV zone 2
      delay(1000);                        // Pause 1 seconde
      digitalWrite(pinRelayPompe, LOW);  // Allumage Pompe
      delay(1800000);                     // Durée cycle d'arrosage 30 minutes

      digitalWrite(pinRelayPompe, HIGH);   // Arret de la Pompe
      delay(1000);                        // Pause 1 seconde
      digitalWrite(pinRelay_B, HIGH);      // Arret Relay EV zone 2
      digitalWrite(pinLed_B, LOW);        // Arret Led EV zone 2
      delay(500);                         // Pause 500 millisecondes

      // PROGRAMME ZONE 3

      digitalWrite(pinRelay_C, LOW);     // Allumage Relay EV zone 3
      digitalWrite(pinLed_C, HIGH);       // Allumage Led EV zone 3
      delay(1000);                        // Pause 1 seconde
      digitalWrite(pinRelayPompe, LOW);  // Allumage Pompe
      delay(1800000);                     // Durée cycle d'arrosage 30 minutes

      digitalWrite(pinRelayPompe, HIGH);   // Arret de la Pompe
      delay(1000);                        // Pause 1 seconde
      digitalWrite(pinRelay_C, HIGH);      // Arret Relay EV zone 3
      digitalWrite(pinLed_C, LOW);        // Arret Led EV zone 3
      delay(500);                         // Pause 500 millisecondes

      // PROGRAMME ZONE 4

      digitalWrite(pinRelay_D, LOW);     // Allumage Relay EV zone 4
      digitalWrite(pinLed_D, HIGH);       // Allumage Led EV zone 4
      delay(1000);                        // Pause 1 seconde
      digitalWrite(pinRelayPompe, LOW);  // Allumage Pompe
      delay(1800000);                     // Durée cycle d'arrosage 30 minutes

      digitalWrite(pinRelayPompe, HIGH);   // Arret de la Pompe
      delay(1000);                        // Pause 1 seconde
      digitalWrite(pinRelay_D, HIGH);      // Arret Relay EV zone 4
      digitalWrite(pinLed_D, LOW);        // Arret Led EV zone 4
      delay(500);                         // Pause 500 millisecondes

      // PROGRAMME ZONE 5

      digitalWrite(pinRelay_E, LOW);     // Allumage Relay EV zone 5
      digitalWrite(pinLed_E, HIGH);       // Allumage Led EV zone 5
      delay(1000);                        // Pause 1 seconde
      digitalWrite(pinRelayPompe, LOW);  // Allumage Pompe
      delay(1800000);                     // Durée cycle d'arrosage 30 minutes

      digitalWrite(pinRelayPompe, HIGH);   // Arret de la Pompe
      delay(1000);                        // Pause 1 seconde
      digitalWrite(pinRelay_E, HIGH);      // Arret Relay EV zone 5
      digitalWrite(pinLed_E, LOW);        // Arret Led EV zone 5
      delay(500);                         // Pause 500 millisecondes

      // PROGRAMME ZONE 6

      digitalWrite(pinRelay_F, LOW);     // Allumage Relay EV zone 6
      digitalWrite(pinLed_F, HIGH);       // Allumage Led EV zone 6
      delay(1000);                        // Pause 1 seconde
      digitalWrite(pinRelayPompe, LOW);  // Allumage Pompe
      delay(1800000);                     // Durée cycle d'arrosage 30 minutes

      digitalWrite(pinRelayPompe, HIGH);   // Arret de la Pompe
      delay(1000);                        // Pause 1 seconde
      digitalWrite(pinRelay_F, HIGH);      // Arret Relay EV zone 6
      digitalWrite(pinLed_F, LOW);        // Arret Led EV zone 6
      delay(500);                         // Pause 500 millisecondes

      digitalWrite(pinRelayTransfo, HIGH); //Arret du transformateur

      delay(500);

    }

    void loop() {
      // put your main code here, to run repeatedly:




    }

    • Partager sur Facebook
    • Partager sur Twitter
      Staff 19 juin 2020 à 17:40:55

      Effectivement, il ne faut surtout pas relier 2 pins OUTPUT ensemble (que ce soit 2 pins du même arduino ou une pin de 2 arduino différents).

      Il n'y a pas non plus besoin de 3 arduino pour gérer 3 petits timers... un seul arduino est largement assez puissant pour faire ça.

      Sur un interrupteur à glissière 3 positions, il y a généralement 4 pins : une pin COMMUN et 3 autre pins pour les 3 autres position.

      Pour lire l'état, il suffit donc de relier la pin COMMUN au GND et les 3 autres sur des pins INPUT_PULLUP de l'arduino.

      La lecture se fait ensuite avec digitalRead.

      Exemple:

      #define PIN_POS_1	4	// Glissière position 1 connectée sur pin 4 arduino
      #define PIN_POS_2	5	// Glissière position 2 connectée sur pin 5 arduino
      #define PIN_POS_3	6	// Glissière position 3 connectée sur pin 6 arduino
      
      
      void setup() {
      	pinMode(PIN_POS_1, INPUT_PULLUP);
      	pinMode(PIN_POS_2, INPUT_PULLUP);
      	pinMode(PIN_POS_3, INPUT_PULLUP);
      	Serial.begin(9600);
      }
      
      
      void loop() {
      	
      	int pos1 = digitalRead(PIN_POS_1);
      	int pos2 = digitalRead(PIN_POS_2);
      	int pos3 = digitalRead(PIN_POS_3);
      	
      	int pos = 0;
      	
      	int count = ((pos1 == LOW) + (pos2 == LOW) + (pos3 == LOW));
      	
      	if (count == 1) {
      		if (pos1 == LOW) {
      			pos = 1;
      		}
      		if (pos2 == LOW) {
      			pos = 2;
      		}
      		if (pos3 == LOW) {
      			pos = 3;
      		}
      	}
      	
      	if (pos== 0) {
      		Serial.println("Ooops... erreur lecture...");
      	} else {
      		Serial.print("Position:");
      		Serial.println(pos);
      	}
      	
      }
      

      Dans ce code, je commence par lire l'état des 3 entrées.

      Ensuite, je calcul combien d'entrée sont active dans la variable count.

      Si il y a qu'une seule entrée active (ce qui est plutôt logique), je met à jour la variable pos.

      Sinon, dans le cas où aucun entrée serait active ou qu'il y en aurait 2 (en cas de rebond ou mauvais câblage), la variable pos reste à 0.

      Et enfin, on termine par un affichage histoire de voir si tout marche bien.

      Tu peux ensuite faire des delay en fonction de la valeur, soit avec une cascade de if, soit avec un switch/case.

      switch (pos) {
          case 1: delay(10*60*1000); break; // Position 1 : delay 10 min
          case 2: delay(20*60*1000); break; // Position 2 : delay 20 min
          case 3: delay(30*60*1000); break; // Position 3 : delay 30 min
          default: delay(5*60*1000); break; // Erreur lecture : delay 5 min
      }

      Si ne veux pas t'embêter avec les erreurs de lecture, tu peux aussi mettre la lecture dans une boucle while pour la refaire en boucle temps qu'elle est invalide.

      Dans ce cas, cela donne ceci :

      int pos = 0;
      
      while (pos == 0) {
          
          // ICI: le code de lecture
      
      }






      • Partager sur Facebook
      • Partager sur Twitter
        19 juin 2020 à 18:37:39

        Bonjour et Merci beaucoup lorrio, je vais essayer ça et je reviendrai donner des nouvelles. C'est super sympa de m'avoir consacré ton précieux temps.
        • Partager sur Facebook
        • Partager sur Twitter

        aide pour projet arduino, gestion delais

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        • Editeur
        • Markdown