Appel de fonction non exécuté

Bonjour,
une petite aide svp.

Voilà un bout de code qui mesure un signal de fréquence et le transforme en valeur de régime (rpm en tr/min).
Suivant la valeur de rpm des LED doivent s'allumer .

Le code fonctionne parfaitement si j'utilise le "if rpm allumé LED" dans la fonction loop (partie en grisé), mais si je veux mettre ces conditions dans une fontion spécifique "void SHIFT()" mes LED ne s'allument jamais (pourtant c'est le même code que le "grisé") ??

Je ne comprend pas pourquoi !

//configuration for the Tachometer variables 
const int sensorPin = 2; 
const int sensorInterrupt = 0; 
const int timeoutValue = 5; 

const int led1 = 3;
const int led2 = 4;
const int led3 = 5;
const int led4 = 6;
const int led5 = 7;
const int led6 = 8;

volatile unsigned long lastPulseTime; 
volatile unsigned long interval = 0; 
volatile int timeoutCounter; 

int rpm; 
int rpmlast = 3000; 

//SETUP ******************************************************
void setup() { 
 Serial.begin(9600); 
// config for the Tach 
  pinMode(sensorPin, INPUT); 
  pinMode(led1, OUTPUT);  
  pinMode(led2, OUTPUT);  
  pinMode(led3, OUTPUT);  
  pinMode(led4, OUTPUT);  
  pinMode(led5, OUTPUT);  
  pinMode(led6, OUTPUT);
 
attachInterrupt(sensorInterrupt, sensorIsr, RISING); 
lastPulseTime = micros(); 
timeoutCounter = 0; 
}

//************************************************************ 
void sensorIsr() 
{ 
unsigned long now = micros(); 
interval = now - lastPulseTime; 
lastPulseTime = now; 
timeoutCounter = timeoutValue; 
} 

// LOOP ********************************************************
void loop() { 
 
      if (timeoutCounter != 0) 
      { 
           --timeoutCounter; 
           float rpm = 60e6/(float)interval; // ORIGINAL 
           
          if (rpm>=10000){rpm=0;}
          
          /*
          //code grisé **********************************************
          if(rpm > 500) 
              {
              digitalWrite (led1,HIGH);
              }
              else digitalWrite (led1,LOW);
      
          if(rpm >= 3000) 
              {
              digitalWrite (led2,HIGH);
              }
              else digitalWrite (led2,LOW);
      
          if(rpm >= 4000) 
              {
              digitalWrite (led3,HIGH);
              }
              else digitalWrite (led3,LOW);
      
          if(rpm >= 5000) 
              {
              digitalWrite (led4,HIGH);
              }
              else digitalWrite (led4,LOW);
      
          if(rpm >= 5500) 
              {
              digitalWrite (led5,HIGH);
              }
              else digitalWrite (led5,LOW);
              
          if(rpm >= 6500) 
              {
              digitalWrite (led6,HIGH);
              }
              else digitalWrite (led6,LOW);
           // fin code grisé **********************************************
           */
              
         SHIFT();  // affiche _LED                      
          Serial.println(rpm,0); 

          if (rpm > rpmlast+500){rpm=rpmlast;} //remove erroneous results 
          
          rpmlast = rpm; 

          //Let's keep this RPM value under control, between 0 and 8000 
         rpm = constrain (rpm, 0, 10000);            
 
      }
} 

       
// SHIFT_LED ********************************************************   
void SHIFT() {  
         if(rpm > 500) {
    digitalWrite (led1,HIGH);
        }
        else digitalWrite (led1,LOW);
      
        if(rpm >= 3000) {
    digitalWrite (led2,HIGH);
        }
        else digitalWrite (led2,LOW);
      
        if(rpm >= 5000) {
    digitalWrite (led3,HIGH);
        }
        else digitalWrite (led3,LOW);
      
              if(rpm >= 6000) {
    digitalWrite (led4,HIGH);
        }
        else digitalWrite (led4,LOW);
      
              if(rpm >= 8000) {
    digitalWrite (led5,HIGH);
        }
        else digitalWrite (led5,LOW);
              if(rpm >= 12000) {
    digitalWrite (led6,HIGH);
        }
        else digitalWrite (led6,LOW); 
}

Dans ton loop(), tu as :
float rpm = 60e6/(float)interval; // ORIGINAL
Cette variable reçoit le résultat de ton calcul

Mais dans les déclarations globales tu as :
int rpm;
C'est cette variable qui sera utilisée par le compilateur dans la fonction SHIFT()
Et comme elle n'a reçu aucune valeur elle est initialisée à 0 par le compilateur

De manière générale il vaut mieux éviter d'avoir une variable globale ayant le même nom qu'une variable locale. C'est un nid a emm...dement pour la lisibilité et le debuggage.

Tu peu aussi remplacer ta fonction SHIFT()
par :

void SHIFT() {
    digitalWrite(led1, (rpm>  500    ? HIGH : LOW));
    digitalWrite(led2, (rpm>=3000  ? HIGH : LOW));
    digitalWrite(led3, (rpm>=5000  ? HIGH : LOW));
    digitalWrite(led4, (rpm>=6000  ? HIGH : LOW));
    digitalWrite(led5, (rpm>=8000  ? HIGH : LOW));      
    digitalWrite(led6, (rpm>=12000 ? HIGH : LOW));
}

YES

MERCI Alain