Bonjour à tous,
J'ai pour projet de mesurer la distance parcouru par une roue à trous grâce à un capteur à fourche. J'aimerais utiliser la technique de l'interruption. J'ai réalisé un code, mais il n(est pas fonctionnel. Pouvez vous m'aider à comprendre mes erreurs s'il vous plait?
const byte ledPin = 13;
const byte interruptPin = 2;
int nbrTOUR;
int nbrTour;
volatile byte state = CHANGE;
void setup() {
Serial.begin (9600);
pinMode(ledPin, OUTPUT);
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), Compteur, CHANGE);
}
void loop() {
digitalWrite(ledPin, state);
if (nbrTOUR > 6) {
nbrTour = nbrTOUR/6;
Serial.println("Le nombre de tour est");
Serial.print (nbrTour);
}
}
void Compteur () {
state = !state;
nbrTOUR = 0;
nbrTOUR++;
}
Pouvez vous m'aider à comprendre mes erreurs s'il vous plait?
Effectivement il y en a plusieurs :
int nbrTOUR; // devrait être volatile
volatile byte state = CHANGE; // quelle utilité ?
nbrTOUR = 0;
nbrTOUR++; // nbrTOUR vaudra toujours 1 en sortie
EDIT : il me semble également qu'activer l'interruption sur changement (CHANGE) n'est pas une bonne idée. RAISE ou FALL serait plus correct (une seule interruption par trou).
Si tu incrémentes nbrTOUR il vaut mieux éviter de le remettre à ZÉRO (nbrTOUR = 0;) juste avant dans la routine d'interruption, tu ne crois pas ?
nbrTOUR est un entier signé il vaudra au maximum 32767 (0x7fff).
Cela peut suffire mais toi seul peut en décider.
Si cela ne suffit pas, déclare-le en unsigned long (valeur maxi 0xffffffff ou 4294967295).
J'espère que tu as ajouté "volatile".