[Programmation] débitmetre et interruption pin
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

débitmetre et interruption pin



  1. #1
    nicopro33250

    débitmetre et interruption pin


    ------

    bonjour à tous,


    j'ai un problème d'interruption dans un code pour lire 5 débitmètres à effet hall sur un arduino uno et un lcd key pad.

    le problème c'est que je peux lire les voie 1 et 2 qui sont sur les pin 2 et 3

    mais pas les voies 3 4 5 sur les pins 11 12 13

    les autres pins sont pris par le lcd.

    j'ai cru voir que les pins 2 et 3 sont interrupts et pas les autres


    y a t il un moyen de faire fonctionner différemment ou dois-je acheter une mega 2560 ?


    Code:
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
    
    //pins
    const int voie1Pin = 2;     //pin location of flow rate meter on voie1 line
    const int voie2Pin = 3;     //pin location of flow rate meter on voie2 line
    const int voie3Pin = 11;    //pin location of flow rate meter on voie3 line
    const int voie4Pin = 12;    //pin location of flow rate meter on voie4 line
    const int voie5Pin = 13;    //pin location of flow rate meter on voie5 line
    
    // variables
    volatile int voie1Pulsecount;  //measuring the rising edges of the signal for the voie1 line
    volatile int voie2Pulsecount;  //measuring the rising edges of the signal for the voie2 line
    volatile int voie3Pulsecount;  //measuring the rising edges of the signal for the voie3 line
    volatile int voie4Pulsecount;  //measuring the rising edges of the signal for the voie4 line
    volatile int voie5Pulsecount;  //measuring the rising edges of the signal for the voie5 line
    
    unsigned int copyvoie1Pulsecount;
    unsigned int copyvoie2Pulsecount;
    unsigned int copyvoie3Pulsecount;
    unsigned int copyvoie4Pulsecount;
    unsigned int copyvoie5Pulsecount;
    
    double voie1Read;
    double voie2Read;
    double voie3Read;
    double voie4Read;
    double voie5Read;
    
    float TOTAL = 0;
    
                       /*************************************************************************/
    
    void setup() {
      Serial.begin(9600);
    lcd.begin(16, 2);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Water Flow Meter");
    lcd.setCursor(0,1);
    lcd.print("****************");
    delay(2000);
    
     
      pinMode(voie1Pin, INPUT); //initializes digital pin 2 as an input
      pinMode(voie2Pin, INPUT); //initializes digital pin 3 as an input
      pinMode(voie3Pin, INPUT); //initializes digital pin 11 as an input
      pinMode(voie4Pin, INPUT); //initializes digital pin 12 as an input
      pinMode(voie5Pin, INPUT); //initializes digital pin 13 as an input
    
     
    attachInterrupt(digitalPinToInterrupt(2),  voie1RPM, RISING);   //attaching voie1 pulse counter interrupt to pin 2
    attachInterrupt(digitalPinToInterrupt(3),  voie2RPM, RISING);   //attaching voie2 pulse counter interrupt to pin 3
    attachInterrupt(digitalPinToInterrupt(11), voie3RPM, RISING);   //attaching voie3 pulse counter interrupt to pin 11
    attachInterrupt(digitalPinToInterrupt(12), voie4RPM, RISING);   //attaching voie4 pulse counter interrupt to pin 12
    attachInterrupt(digitalPinToInterrupt(13), voie5RPM, RISING);   //attaching voie5 pulse counter interrupt to pin 13
    }
                      /************************************************************************/
    void loop()
    {
      static unsigned long lastsecond;
    
    
      if (micros() - lastsecond >= 1000000)
      {
        lastsecond += 1000000;
        getCount();
    
                      voie1Read = (copyvoie1Pulsecount / 7.5); //(voie1 pulse frequency / 7.5Q), = flow rate in L/min
                      voie2Read = (copyvoie2Pulsecount / 7.5); //(voie2 pulse frequency / 7.5Q), = flow rate in L/min
                      voie3Read = (copyvoie3Pulsecount / 7.5); //(voie3 pulse frequency / 7.5Q), = flow rate in L/min
                      voie4Read = (copyvoie4Pulsecount / 7.5); //(voie4 pulse frequency / 7.5Q), = flow rate in L/min
                      voie5Read = (copyvoie5Pulsecount / 7.5); //(voie5 pulse frequency / 7.5Q), = flow rate in L/min
    
    
    TOTAL = TOTAL + voie1Read + voie2Read + voie3Read + voie4Read + voie5Read;
    Serial.print("TOTAL:");
    Serial.println(TOTAL);
    
     
       
        Serial.print ("voie1 : ");
        Serial.print (voie1Read, 2); //Prints the number calculated above
        Serial.println (" L/min");
          Serial.print ("voie2 : ");
          Serial.print (voie2Read, 2); //Prints the number calculated above
          Serial.println (" L/min");
            Serial.print ("voie3 : ");
            Serial.print (voie3Read, 2); //Prints the number calculated above
            Serial.println (" L/min");
    
    
    
    
         
    
       
    lcd.clear();
                 lcd.setCursor(0,0);
                 lcd.print(voie1Read, 1);
                                          lcd.setCursor(4,0);
                                          lcd.print(voie2Read, 1);
                                                                   lcd.setCursor(8,0);
                                                                   lcd.print(voie3Read, 1);
                                                                                            lcd.setCursor(12,0);
                                                                                            lcd.print(voie4Read, 1);
                                                                                                                     lcd.setCursor(0,1);
                                                                                                                     lcd.print(voie5Read, 1);
    
    lcd.setCursor(6,1);
    lcd.print("Total ");
    lcd.print(TOTAL/60,0);
       
     }}
    
    
    
    // functions -----------------------------------------------------
    
    void voie1RPM (){      //This is the function that the interupt calls
      voie1Pulsecount++;}  //This function measures the rising and falling edge of the hall effect sensors signal
    
    void voie2RPM (){      //This is the function that the interupt calls
      voie2Pulsecount++;}  //This function measures the rising and falling edge of the hall effect sensors signal
    
    void voie3RPM (){      //This is the function that the interupt calls
      voie3Pulsecount++;}  //This function measures the rising and falling edge of the hall effect sensors signal
    
    void voie4RPM (){      //This is the function that the interupt calls
      voie4Pulsecount++;}  //This function measures the rising and falling edge of the hall effect sensors signal
    
    void voie5RPM (){      //This is the function that the interupt calls
      voie5Pulsecount++;}  //This function measures the rising and falling edge of the hall effect sensors signal
    
    
    void getCount(){
      noInterrupts();
      copyvoie1Pulsecount = voie1Pulsecount;
               voie1Pulsecount = 0;
      copyvoie2Pulsecount = voie2Pulsecount;
               voie2Pulsecount = 0;
      copyvoie3Pulsecount = voie3Pulsecount;
               voie3Pulsecount = 0;
      copyvoie4Pulsecount = voie4Pulsecount;
               voie4Pulsecount = 0;
      copyvoie5Pulsecount = voie5Pulsecount;
               voie5Pulsecount = 0;
     
      interrupts();}

    -----

  2. #2
    ankou29666

    Re : débitmetre et interruption pin

    Citation Envoyé par nicopro33250 Voir le message

    le problème c'est que je peux lire les voie 1 et 2 qui sont sur les pin 2 et 3

    mais pas les voies 3 4 5 sur les pins 11 12 13

    les autres pins sont pris par le lcd.

    j'ai cru voir que les pins 2 et 3 sont interrupts et pas les autres


    y a t il un moyen de faire fonctionner différemment ou dois-je acheter une mega 2560 ?


    Code:
    attachInterrupt(digitalPinToInterrupt(2),  voie1RPM, RISING);   //attaching voie1 pulse counter interrupt to pin 2
    attachInterrupt(digitalPinToInterrupt(3),  voie2RPM, RISING);   //attaching voie2 pulse counter interrupt to pin 3
    attachInterrupt(digitalPinToInterrupt(11), voie3RPM, RISING);   //attaching voie3 pulse counter interrupt to pin 11
    attachInterrupt(digitalPinToInterrupt(12), voie4RPM, RISING);   //attaching voie4 pulse counter interrupt to pin 12
    attachInterrupt(digitalPinToInterrupt(13), voie5RPM, RISING);   //attaching voie5 pulse counter interrupt to pin 13
    Effectivement, les deux premières lignes fonctionneront, les trois suivantes non, pour les raisons que tu as toi-même deviné.
    En général on n'utilise les interruptions que pour ce qui est des traitements urgents. La lecture d'impulstions en provenance d'un débitmètre ne répond généralement pas à cette définition.
    Une alternative au Mega serait de lire l'état des pins depuis la boucle et d'incrémenter ton compteur lorsque tu détectes un changement. C'est cette méthode qui est typiquement préconisée pour les traitements non-urgents.

  3. #3
    ankou29666

    Re : débitmetre et interruption pin

    Par contre, j'ai oublié un truc : les fonctions gérant la liaison série et l'écran lcd sont bloquantes. Donc si plusieurs impulsions surviennent lorsque l'arduino est occupé à gérer d'autres tâches, les impulsions ne seront pas détectées.

    Donc si tu t'aperçois que par cette méthode (à tester donc à débit élevé), il faudra que tu modifies ton code de sorte que le traitement de ces autres tâches soit le plus court possible, c'est à dire qu'au lieu d'effectuer la totalité du boulot sur un seul et même tour de boucle, le répartir sur plusieurs tours de boucle.

  4. #4
    nicopro33250

    Re : débitmetre et interruption pin

    bon merci de ta réponse mais là on dépasse largement mon domaine de compétence

  5. A voir en vidéo sur Futura

Discussions similaires

  1. Débitmètre !
    Par invite8f77cfa3 dans le forum Technologies
    Réponses: 3
    Dernier message: 29/05/2015, 11h09
  2. PIC : interruption externe et interruption on change ?
    Par jlg_47 dans le forum Électronique
    Réponses: 10
    Dernier message: 09/04/2012, 12h41
  3. Débitmètre PT PTZ
    Par invite01eaee46 dans le forum Physique
    Réponses: 0
    Dernier message: 20/10/2010, 09h42
  4. cherche debitmetre
    Par gennyF dans le forum Habitat bioclimatique, isolation et chauffage
    Réponses: 2
    Dernier message: 20/09/2007, 09h25
  5. Debitmètre?!
    Par invite851d6b8d dans le forum Chimie
    Réponses: 6
    Dernier message: 16/03/2005, 08h14
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...