Partage
  • Partager sur Facebook
  • Partager sur Twitter

Temporisation ARDUINO

    3 mai 2021 à 13:37:14

    Bonjour,

    je viens vers vous car je n'arrive pas a controler un moteur avec la fonction millis(). Car je veux que le programme ne s'arrete pas (c'est pour quoi je n'utilise pas delay()) j'ai 4 boutons:

    - Reed5: le moteur doit fonctionner 5min et doit s'arreter aprés.

    - Reed10: le moteur doit fonctionner 10min et doit s'arreter aprés.

    - Reed20: le moteur doit fonctionner 20min et doit s'arreter aprés.

    - Reed30: le moteur doit fonctionner 30min et doit s'arreter aprés.

    Alors quand je click sur Reed5 ou Reed30 le moteur fonctionne mais sans respecter la temporisation mais les 2 autres bouton aucune reaction.

    (j'utilise proteus pour la simulation)

    Voici mon code:

    <#include <Servo.h>
    
    #include <Wire.h>
    
    #include <Adafruit_Sensor.h>
    
    #include <Adafruit_HMC5883_U.h>
    
    /* Assign a unique ID to this sensor at the same time */
    
    Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345);
    
    Servo myservo;
    
    int servoPos = 90; //
    
    int compassCorrection = 0; // set to 0 (not used)
    
    int LED5 = 3;
    
    int LED10 = 4;
    
    int LED20 = 5;
    
    int LED30 = 6;
    
    int REED5 = 7;
    
    int REED10 = 10;
    
    int REED20 = 11;
    
    int REED30 = 12;
    
    int RelaisM1 = 13;
    
    int RelaisM2 = 9;
    
    unsigned long StartTime;
    
    bool flag = 1;
    
    void displaySensorDetails(void)
    
    {
    
      sensor_t sensor;
    
      mag.getSensor(&sensor);
    
      myservo.attach(8);
    
      delay(500);
    
    }
    
    void setup(void) 
    
    {
    
      Serial.begin(115200);
    
      /* Initialise the sensor */
    
      if(!mag.begin())
    
      {
    
        /* There was a problem detecting the HMC5883 ... check your connections */
    
        Serial.println("Ooops, no HMC5883 detected ... Check your wiring!");
    
        while(1);
    
      }
    
      /* Display some basic information on this sensor */
    
      displaySensorDetails();
    
      myservo.write(90);
    
      delay(2000);
    
      pinMode(LED5, OUTPUT);
    
      pinMode(LED10, OUTPUT);
    
      pinMode(LED20, OUTPUT);
    
      pinMode(LED30, OUTPUT);
    
      pinMode(REED5, INPUT);
    
      pinMode(REED10, INPUT);
    
      pinMode(REED20, INPUT);
    
      pinMode(REED30, INPUT);
    
      pinMode(RelaisM1, OUTPUT);
    
      pinMode(RelaisM2, OUTPUT);
    
      digitalWrite(LED5, HIGH);
    
      digitalWrite(LED10, HIGH);
    
      digitalWrite(LED20, HIGH);
    
      digitalWrite(LED30, HIGH);
    
      delay(500);
    
      digitalWrite(LED5, LOW);
    
      digitalWrite(LED10, LOW);
    
      digitalWrite(LED20, LOW);
    
      digitalWrite(LED30, LOW);
    
    }
    
     //const int headingdirection = headingDegreesInteger;
    
     static int headingDegreesInteger;
    
    void loop(void) 
    
    {
    
      sensors_event_t event; 
    
      mag.getEvent(&event);
    
      float heading = atan2(event.magnetic.y, event.magnetic.x);  
    
      int headingDegrees = (heading * 180/M_PI); 
    
    if (headingDegreesInteger==0)
    
    {
    
    headingDegreesInteger =headingDegrees;
    
    }
    
      Serial.print("Heading (Initial): "); Serial.println(headingDegreesInteger);
    
      Serial.print("headingDegrees: "); Serial.println(headingDegrees);
    
      delay(500);
    
    int offset =   headingDegreesInteger - headingDegrees;
    
    myservo.write(servoPos - offset);
    
      if (digitalRead(REED5) == HIGH){
    
      digitalWrite(LED5, HIGH);
    
      digitalWrite(LED10, LOW);
    
      digitalWrite(LED20, LOW);
    
      digitalWrite(LED30, LOW);
    
      minutes5();      
    
      }
    
      if (digitalRead(REED10) == HIGH){
    
      digitalWrite(LED5, LOW);
    
      digitalWrite(LED10, HIGH);
    
      digitalWrite(LED20, LOW);
    
      digitalWrite(LED30, LOW);
    
      minutes10();    
    
    }
    
      if (digitalRead(REED20) == HIGH){
    
      digitalWrite(LED5, LOW);
    
      digitalWrite(LED10, LOW);
    
      digitalWrite(LED20, HIGH);
    
      digitalWrite(LED30, LOW);
    
      minutes20();    
    
    }
    
      if (digitalRead(REED30) == HIGH){
    
      digitalWrite(LED5, LOW);
    
      digitalWrite(LED10, LOW);
    
      digitalWrite(LED20, LOW);
    
      digitalWrite(LED30, HIGH);
    
      minutes30();    
    
    }
    
    }
    
    void minutes5(){
    
      digitalWrite(RelaisM1, HIGH);
    
      if (flag == 1)
    
      {
    
      StartTime = millis();
    
      flag = 0;
    
      if (millis() - StartTime >= 5000){
    
        digitalWrite(RelaisM1, LOW);
    
        flag = 1;
    
      }
    
    }
    
    void minutes10(){
    
      digitalWrite(RelaisM1, HIGH);
    
      StartTime = millis();
    
      if (millis() - StartTime >= 10000){
    
        digitalWrite(RelaisM1, LOW);
    
      }
    
    }
    
    void minutes20(){
    
      digitalWrite(RelaisM1, HIGH);
    
      StartTime = millis();
    
      if (millis() - StartTime >= 20000){
    
        digitalWrite(RelaisM1, LOW);
    
      }
    
    }
    
    void minutes30(){
    
      digitalWrite(RelaisM1, HIGH);
    
      StartTime = millis();
    
      if (millis() - StartTime >= 30000){
    
        digitalWrite(RelaisM1, LOW);
    
      }
    
    }


    NB: je remplace les minutes par les secondes pour les tests

    Par avance merci

    -
    Edité par lorrio 4 mai 2021 à 19:33:27

    • Partager sur Facebook
    • Partager sur Twitter
      4 mai 2021 à 19:43:10

      Dans ton code, tu fais appel à ta fonction minutes5 au travers d'un if qui permet de l'appeler uniquement si le bouton REED5 est enfoncé.

      Du coup, si ton bouton n'est pas enfoncé, la fonction n'est pas appelé et donc la condition d'arrêt n'est pas testée.

      Ce qu'il te faut faire, c'est tester la condition d'arrêt en permanence à partir du moment où elle a été activée.

      Et comme chaque bouton agit sur le même relais et donc la même condition d'arrêt, il te faudrait mettre une variable qui retient la durée du timer associé.

      Exemple :

      unsigned long StartTime = 0;		// Timer d'enclenchement
      unsigned long TimeoutValue = 0;		// Durée d'activation
      
      void traiterTimer5() {
      
      	// Si le bouton 5 est enfoncé, on lance le timer sur 5 secondes
      	if (digitalRead(bouton5) == HIGH) {
      		StartTime = millis();
      		TimeoutValue = 5000;	// Timeout: 5000ms = 5s
      		digitalWrite(relais, HIGH);
      	}
      
      	// Si le bouton 10 est enfoncé, on lance le timer sur 10 secondes
      	if (digitalRead(bouton10) == HIGH) {
      		StartTime = millis();
      		TimeoutValue = 10000;	// Timeout: 10000ms = 10s
      		digitalWrite(relais, HIGH);
      	}
      	
      	// etc...
      	
      	// Et ensuite, dans tous les cas, on test la condition d'ârret
      	// Si le timer a été lancé
      	if ( StartTime != 0 ) {
      	
      		// Et que la durée est écoulée
      		if ( (millis() - StartTime) >= TimeoutValue ) {
      			
      			// Alors on coupe tout (le timer, et le relais)
      			// On repasse le timer à 0 pour ne plus revenir dans cette condition d'arrêt
      			StartTime = 0;
      			// Et on coupe le relais aussi
      			digitalWrite(relais, LOW);
      			
      		}
      		
      	}
      	
      }



      • Partager sur Facebook
      • Partager sur Twitter

      Temporisation ARDUINO

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown