IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Interrompre un processus


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 354
    Par défaut Interrompre un processus
    Bonjour à tous,

    J'ai une demande d'aide à vous faire pour savoir comment m'y prendre pour interrompre un processus.

    J'ai une électrovanne qui est commandée par SMS (Vanne_on ou Vanne_off).

    Lors de la réception du SMS, l'électrovanne s'active pendant un temps déterminé l'aide de delay(420000) soit 7 minutes.

    L'utilisation de delay() suspend donc le reste de l'exécution du script.

    Mais si je souhaite interrompre à tout moment et à distance le fonctionnement de l'électrovanne, comment dois-je m'y prendre car l'envoi d'un SMS "Vanne_off" ne sera traité qu'après la fin du delay()

    Merci pour votre aide


    Voici mon script:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    #include <SoftwareSerial.h> // Library for using serial communication
    SoftwareSerial SIM900(7, 8); // Pins 7, 8 are used as used as software serial pins
     
    String incomingData;   // for storing incoming serial data
    String message = "";   // A String for storing the message
    int relay_pin = 2;    // Initialized a pin for relay module
     
    void setup()
    {
      Serial.begin(115200); // baudrate for serial monitor
      SIM900.begin(19200); // baudrate for GSM shield
     
      pinMode(relay_pin, OUTPUT);   // Setting erlay pin as output pin
      digitalWrite(relay_pin, HIGH);  // Making relay pin initailly low
     
      // set SMS mode to text mode
      SIM900.print("AT+CMGF=1\r");  
      delay(100);
     
      // set gsm module to tp show the output on serial out
      SIM900.print("AT+CNMI=2,2,0,0,0\r"); 
      delay(100);
    }
     
    void loop()
    {
      //Function for receiving sms
      receive_message();
     
      // if received command is to turn on relay
      if(incomingData.indexOf("Vanne_on")>=0)
      {
        digitalWrite(relay_pin, LOW);
        message = "Vanne ON";
        // Send a sms back to confirm that the relay is turned on
        send_message(message);
        delay(420000);
      }
     
      // if received command is to turn off relay
      if(incomingData.indexOf("Vanne_off")>=0)
      {
        digitalWrite(relay_pin, HIGH);
        message = "Vanne OFF";
        // Send a sms back to confirm that the relay is turned off
        send_message(message);
      }        
    }
     
    void receive_message()
    {
      if (SIM900.available() > 0)
      {
        incomingData = SIM900.readString(); // Get the data from the serial port.
        Serial.print(incomingData); 
        delay(10); 
      }
    }
     
    void send_message(String message)
    {
      SIM900.println("AT+CMGF=1");    //Set the GSM Module in Text Mode
      delay(100);  
      SIM900.println("AT+CMGS=\"+12345678\""); 
      delay(100);
      SIM900.println(message);   // The SMS text you want to send
      delay(100);
      SIM900.println((char)26);  // ASCII code of CTRL+Z
      delay(100);
      SIM900.println();
      delay(1000);  
    }

  2. #2
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Bonjour,

    la fonction delay(), comme tu l'indiques, est bloquante, elle empêche le déroulement du programme. Elle est donc à éviter. A place utilise les fonctions millis() ou micros() qui t'indiquent le temps écoulé depuis la mise sous tension de l'Arduino.
    Pseudo code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    if (new_SMS)
    {
       // traiter le SMS
       if (SMS_openValve)
      {
            openValve();
            t1 = millis();
            isValveOpen = true;
      }
     
      if (SMS_closeValve) 
      {
          closeValve();
          isValveOpen = false;
      }
    }
     
    if (millis-t1 > duration && isValveOpen)
    {
          closeValve();
          isValveOpen = false;
    }
    Mais le mieux pour mesurer un écart de temps est la bibliothèque EllapsedMillis.

  3. #3
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 910
    Par défaut
    petite précision sur le pseudo code d'Auteur :
    --> lors du codage il faut bien s'assurer de prendre un unsigned long (ou uint32_t) pour le type de la variable t1

  4. #4
    Membre éclairé Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 354
    Par défaut
    Merci pour vos réponses.

    J'ai apporté une modification qui fonctionne partiellement.
    A la réception du message "vanne_on" l'électrovanne s'allume... mais constamment jusqu'à ce que j'envoie le message "vanne_off".

    J'avoue être un peu perdu car la dernière condition ne fonctionne pas et je ne vois pas pourquoi.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
     
    #include <SoftwareSerial.h> // Library for using serial communication
    SoftwareSerial SIM900(7, 8); // Pins 7, 8 are used as used as software serial pins
     
    String incomingData;   // for storing incoming serial data
    String message = "";   // A String for storing the message
    int relay_pin = 2;    // Initialized a pin for relay module
     
    unsigned long previousMillis = 0;
    const long duration = 2000; // pump working duration
     
    void setup()
    {
      Serial.begin(115200); // baudrate for serial monitor
      SIM900.begin(19200); // baudrate for GSM shield
     
      pinMode(relay_pin, OUTPUT);   // Setting erlay pin as output pin
      digitalWrite(relay_pin, HIGH);  // Making relay pin initailly low
     
      // set SMS mode to text mode
      SIM900.print("AT+CMGF=1\r");  
      delay(100);
     
      // set gsm module to tp show the output on serial out
      SIM900.print("AT+CNMI=2,2,0,0,0\r"); 
      delay(100);
    }
     
    void loop()
    {
      unsigned long currentMillis = millis();
     
      //Function for receiving sms
      receive_message();
     
      // if received command is to turn on relay
      if(incomingData.indexOf("Vanne_on")>0)
      {
        digitalWrite(relay_pin, LOW);
        message = "Vanne ON";
        // Send a sms back to confirm that the relay is turned on
        send_message(message);
     
      }
     
      // if received command is to turn off relay
      if(incomingData.indexOf("Vanne_off")>0)
      {
        digitalWrite(relay_pin, HIGH);
        message = "Vanne OFF";
        // Send a sms back to confirm that the relay is turned off
        send_message(message);
      }        
      if ((relay_pin == HIGH) && (currentMillis - previousMillis >= duration)){ 
       digitalWrite(relay_pin, HIGH);
        message = "Vanne OFF";
        // Send a sms back to confirm that the relay is turned off
        send_message(message);  			
      }
     
     
    }
     
    void receive_message()
    {
      if (SIM900.available() > 0)
      {
        incomingData = SIM900.readString(); // Get the data from the serial port.
        Serial.print(incomingData); 
        delay(10); 
      }
    }
     
    void send_message(String message)
    {
      SIM900.println("AT+CMGF=1");    //Set the GSM Module in Text Mode
      delay(100);  
      SIM900.println("AT+CMGS=\"+12345678\""); 
      delay(100);
      SIM900.println(message);   // The SMS text you want to send
      delay(100);
      SIM900.println((char)26);  // ASCII code of CTRL+Z
      delay(100);
      SIM900.println();
      delay(1000);  
    }

  5. #5
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonjour legrandse

    Ton code est "parsemé" de petites erreurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	 unsigned long currentMillis = millis();
    Placé ainsi, currentMillis vaut toujours millis(), donc inutile.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	 if(incomingData.indexOf("Vanne_on")>0)
    Si la chaîne Vanne_on est présente, mais au début de incomingData, l'indexOf vaut 0 donc la condition ne fonctionne pas, il faut mettre > -1, -1 veut dire chaîne pas présente. C'est aussi valable pour la commande Vanne_off.
    Un autre méthode, que j'utilise souvent, est l'usage de la fonction String.startWith() et la condition donne ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	if(incomingData.startsWith("Vanne_on"))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	 if ((relay_pin == HIGH) && (currentMillis - previousMillis >= duration)){
    relay_pin vaut 2 puisque c'est le numéro de la pin (int relay_pin = 2;), digitalRead(relay_pin) est mieux.

    Je te mets la version corrigée de ta loop()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    void loop()
    {
      //unsigned long currentMillis = millis();
     
      //Function for receiving sms
      receive_message();
      // if received command is to turn on relay
      if(incomingData.indexOf("Vanne_on") > -1)
      {
        digitalWrite(relay_pin, LOW);
        message = "Vanne ON";
        // Send a sms back to confirm that the relay is turned on
        send_message(message);
    	previousMillis = millis();
    	incomingData = "";
      }
     
      // if received command is to turn off relay
      if(incomingData.indexOf("Vanne_off") > -1)
      {
        digitalWrite(relay_pin, HIGH);
        message = "Vanne OFF";
        // Send a sms back to confirm that the relay is turned off
        send_message(message);
    	incomingData = "";
      }        
      if ((digitalRead(relay_pin) == LOW) && (millis() - previousMillis >= duration)){ 
       digitalWrite(relay_pin, HIGH);
        message = "Vanne OFF";
        // Send a sms back to confirm that the relay is turned off
        send_message(message);  			
      }
    }
    Je te laisses jouer aux 7 différences et poser les bonnes questions.

    Cordialement
    jpbbricole

  6. #6
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 910
    Par défaut
    Citation Envoyé par jpbbricole Voir le message
    Je te laisses jouer aux 7 différences et poser les bonnes questions.


    Bravo bonne idée de le laisser chercher un peu LA bonne question (au moins une pour que ça compile) !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Processus paralleles
    Par Lyes dans le forum Threads & Processus
    Réponses: 4
    Dernier message: 11/02/2003, 13h04
  2. probleme avec les processus
    Par saidi dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 05/02/2003, 00h18
  3. [VB6] [Système] Tuer un processus courant
    Par mdoyer dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 22/10/2002, 14h47
  4. Réponses: 2
    Dernier message: 04/10/2002, 09h13
  5. [VB6] Interrompre toutes procédures
    Par lutin_vert dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 10/09/2002, 11h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo