Soucis fonction AttachIntrrupt

Bonjour à tous, j’ai un petit soucis avec la fonction AttachInterrupt, en effet je l’utilise pour connaitre le temps écoulé en 10 tours de ma roue de vélo avec un compteur et un capteur effet Hall.

Le programme marche sur PROTEUS mais je n’arrive pas à le faire marcher en vrai

Voici le code :

#include "LiquidCrystal.h"
LiquidCrystal lcd(11,10,9,8,7,6,5,4,13,12);


int hall=2;
int duree;
int temps;
int compteur;
int vitesse;
float calorie;
int production;
float distance;


void calcul() {

   if (compteur < 10)
   
   {
   compteur++;
   }
   
   else
   
   {
    duree=millis()-temps;
    temps=millis();
    delay(100);
    compteur=0;
   }

}


void setup()
{

  moteur1.run(RELEASE);
  
  lcd.begin(20,4);
  Serial.begin(9600);

  lcd.setCursor(0, 1);
  lcd.print(distance,3);
  lcd.setCursor(7, 1);
  lcd.print("km");  

  
  attachInterrupt(hall,calcul,FALLING);  // j'ai mis FALLING car le capteur effet hall envoie un signal
                                                    // constant de 5V et tombe à 0V lors d'un contact avec le aimant
}




void loop()
{  
   
   vitesse=(2*3.1415926*0.33*(10*1000/(duree)*3.6));
   production=(0.3*(vitesse/3.6)*(vitesse/3.6)*(vitesse/3.6));
   calorie=(production/4.185/1000)+calorie;
   distance=(vitesse/3.6/1000)+distance;
   
    
   lcd.home();
   lcd.print("Distance Parcouru = ");
   lcd.setCursor(0, 1);
   lcd.print(distance,3);
   lcd.setCursor(7, 1);
   lcd.print("km");                                 
   
   lcd.setCursor(0, 2);                                         // 1
   lcd.print("vitesse = ");
   lcd.setCursor(0, 3);
   lcd.print(vitesse);     
   lcd.setCursor(7, 3);
   lcd.print("km/h");        

   lcd.setCursor(19, 3);
   lcd.write((uint8_t) 0); 
   delay(1000);

L’interruption tombe tout les combien de temps ?
L’instruction delay(100) dans la fonction calcul() ne peut elle pas être la source du problème ?

phm78: L'interruption tombe tout les combien de temps ? L'instruction delay(100) dans la fonction calcul() ne peut elle pas être la source du problème ?

C'est possible, la fonction s'active environ 5 fois par seconde, mais il se trouve dans le "else" donc ne gêne pas le comptage des 10 premiers tours, il devrait donc y avoir 1 première valeur de la vitesse qui devrait d'afficher, or la vitesse reste sur 0

chipperdu13:
C’est possible, la fonction s’active environ 5 foi par seconde

Bonsoir
pas de delay() dans une interruption , en revanche il me semble que delayMicroseconds() est utilisable.

Bonjour,

Tu ne nous dit pas quelle carte tu utilises. Si c'est une UNO les interrupts sont 0 et 1, donc la céclaration avec hall=2 est incorrecte.

UtilisesdigitalPinToInterrupt

 attachInterrupt(digitalPinToInterrupt(hall),calcul,FALLING);

Et bien sur comme le dit Artouste pas de delay() dans une interruption

kamill:
Bonjour,

Tu ne nous dit pas quelle carte tu utilises.
Si c’est une UNO les interrupts sont 0 et 1, donc la céclaration avec hall=2 est incorrecte.

Bonjour, j’utilise bien une arduino UNO, donc si je comprends bien, le programme modifié serait :

#include "LiquidCrystal.h"
LiquidCrystal lcd(11,10,9,8,7,6,5,4,13,12);


int hall=0;
int duree;
int temps;
int compteur;
int vitesse;
float calorie;
int production;
float distance;


void calcul() {

   if (compteur < 10)
   
   {
   compteur++;
   }
   
   else
   
   {
    duree=millis()-temps;
    temps=millis();
    compteur=0;
   }

}


void setup()
{

  moteur1.run(RELEASE);
  
  lcd.begin(20,4);
  Serial.begin(9600);

  lcd.setCursor(0, 1);
  lcd.print(distance,3);
  lcd.setCursor(7, 1);
  lcd.print("km");  

  
  attachInterrupt(digitalPinToInterrupt(hall),calcul,FALLING);
 
}

Non le numero de l'entrée c'est 2 hall=2

et digitalPinToInterrupt(hall) va te donner 0