Compte tour laser (compte tour, compteur de passage ect...)

Bizounours:

volatile byte half_revolutions; // Pourquoi volatile byte ? volatile parce que la valeur est modifiée par l'interruption

unsigned int rpm;
unsigned long timeold;

void setup()
{
  Serial.begin(9600); // Communication serie
  attachInterrupt(0, rpm_fun, RISING); // interruption
  half_revolutions = 0;             //
  rpm = 0;                          // Déclarer toutes les valeurs a 0 ??
  timeold = 0;                    //  devrait être initialisée avec millis() sinon la première mesure est fausse
}
void loop()
{
  if (half_revolutions >= 20) //
{   //
    //Update RPM every 20 counts, increase this for better RPM resolution,
    //decrease for faster update
    // conversion de 2 impulsion par tour en tours par minute
    // on calcul le temps écoulé depuis la dernière mesure millis() - timeold puis on converti en tours/min
    rpm = 30*1000/(millis() - timeold)*half_revolutions;     // Je ne comprend pas cette ligne,
    timeold = millis();     // Ni elle du coup. on mémorise le temps où on a effectué du dernier calcul
    half_revolutions = 0;     // Valeur mise a jour par l'interruption ? on remet le compteur à zéro
    Serial.println(rpm,DEC);
  }
}
void rpm_fun()
{
  half_revolutions++;
  //Each rotation, this interrupt function is run twice
  // Pourquoi half_revolutions ? parce que l'interruption pète 2 fois par tour c'est écrit la ligne au-dessus
}




Le programme semble écrit pour un capteur qui génère 2 impulsions par tour.

volatil permet d'interdire au compilateur de faire des optimisations sur la variable en question. En particulier elle est relue à chaque fois qu'on l'utilise dans un calcul.