ODOMETRE POUR ROADBOOK

Bonjour,

Voila quelques semaines que je cherche à faire ma propre version de mon compteur kilométrique pour suivre des roadbooks lors de balades en quad.

Le principe de mon odomètre est le suivant: un capteur à effet hall compte le nombre de tours de roue et l'arduino affiche la distance parcourue. Sous l'action d'un bouton on peut remettre à 0 la distance.

Pour compliquer un peu, avec un autre bouton on gère différents affichages, sur lesquels on a un compteur A ( trip A ), un compteur B ( trip B ), et enfin un affichage de la vitesse... les compteurs A et B peuvent être remis à 0 indépendamment.

Enfin en cas d'erreur de parcours, une fonction permet de décompter la distante parcourue en cas de demi tour, et une fonction " freeze " permet de suspendre le comptage en cas de pose ou de détour non indiqué sur le roadbbok.
Plusieurs pages du web traitent partiellement des différents points mais à ma connaissance aucun programme sur la toile n'est complet.

j’espère avoir été clair dans la présentation de mon projet.....

Après plusieurs lectures intensives de tuto ( merci à Eskimon pour son merveilleux ouvrage ) je me suis lancé ..... dans des lignes de codes ...

Sauf que ça marche pas ... lors des essais sur ma breadboard (la sonde à effet hall a été remplacée par un interrupteur manuel):
1/ le bouton display qui permet de changer d'affiche marche tout est ok
2/ le comptage du nombre de tours de roues ne marche pas et en plus il change l'affichage >:( :o
( après contrôle j'ai bien un tension de 5 v au borne des deux pins et une chute de celle ci lors de l'action sur les boutons poussoirs )
Je me permets donc de vous solliciter pour m'aider car la je sèche .....

#include <Wire.h>
#include <LiquidCrystal_I2C.h> // ajout de la librairie LCD
#include <Button.h>
//#include <EEPROM.h> // ajout de la librairie EEPROM

// --- Initialisation des fonctionnalités utilisées ---
LiquidCrystal_I2C lcd(0x27,16,2) ;// Adresse , colonnes et lignes



// Vérifier les broches !!

const char hall = 2; // pin pour sonde effet hall
const char btn_disp_pin = 3 ; // num pin display
const char btn_1_pin = 5 ; // num pin btn_1
const char btn_2_pin = 6 ; // num pin btn_2
//Digital Pins Usable For Interrupts Uno, Nano, Mini, other 328-based  2, 3

// Declaration des variables

volatile unsigned long nb_chgta = 0;  // Nombre changement trip A
volatile unsigned long nb_chgtb = 0;  // Nombre changement trip B
volatile unsigned long nb_chgtV1 = 0; // Nombre changement pour calcul Vitesse
volatile unsigned long nb_chgtV2 = 0; // Nombre changement pour calcul Vitesse
volatile unsigned char affichage = 0; // Numéro d'écran
#define NB_AFFICHAGE 3 
unsigned long lastmillis = 0 ;        // Ref pour comptage de la vitesse
word P = 0;                           // Périmètre
boolean Inverse =  0 ;                // Sens inverse
boolean longPush = 0;
unsigned long varA = 0 ;              // VariableComptage neg = chgt état à partir duquel on compte en neg
unsigned long varB = 0 ;              // Comptage neg

unsigned char trip_A = 0 ;  // Affichage trip A
unsigned char trip_B = 0 ;  // Affichage trip B

unsigned long vitesse = 0 ;        // Ref pour comptage de la vitesse

// Declaration des bouttons

Button boutton1(btn_1_pin,HIGH);
Button boutton2(btn_2_pin,HIGH);
Button bouttondisp(btn_disp_pin,HIGH);

void setup() {
// put your setup code here, to run once:

// initialisation des broches 
pinMode(hall , INPUT ) ;                // Capteur effet HALL
pinMode(btn_disp , INPUT ) ;            // Bouton Display
pinMode(btn_1 , INPUT ) ;               // Bouton 1
pinMode(btn_2 , INPUT ) ;               // Bouton 2

lcd.begin(16,2); // Initialise le LCD avec 16 colonnes x 2 lignes 
delay(10); // pause rapide pour laisser temps initialisation

// Initialisation du LCD + test

//lcd.setCursor(0, 0); // top left
//lcd.setCursor(15, 0); // top right
//lcd.setCursor(0, 1); // bottom left
//lcd.setCursor(15, 1); // bottom right

  lcd.init();                      // initialize the lcd
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(3,0);
  lcd.print("LCD ok");
  lcd.setCursor(0,1);
  lcd.print("Terratrip V0.02");
  delay(2000); // pause de 2 secondes
  lcd.clear(); // // efface écran et met le curseur en haut à gauche
  delay(10); // pour laisser temps effacer écran

// Compteur de tour effet HALL
attachInterrupt( 0,nbtour,FALLING );//  interruption externe n°0 sur la broche numérique 2


// Gestion des boutons

boutton1.isReleased(ButtonReleaseEvents1); // Fait appel à la fonction relaché et incrémente en +1
boutton2.isReleased(ButtonReleaseEvents2);
bouttondisp.isReleased(ButtonReleaseEventsDisp);
bouttondisp.getHoldDelay();
bouttondisp.isHold(longPush);// retunr true if the button has been held for a period of time
}

void loop() {
  // put your main code here, to run repeatedly:
  
// Fonction affichage

 switch (affichage) { 
      case 1:   // Trip A - compteur en kilomètre
  lcd.clear();
  lcd.setCursor (0,0);
  lcd.print ( "TRIP A" );
  lcd.setCursor (0,1);
  lcd.print(tripA);
  break;

      case 2:   // Trip B - compteur en mètre
  lcd.clear();
  lcd.setCursor (0,0); // curseur début de deuxième ligne
  lcd.print ( "TRIP B" );
  lcd.setCursor (0,1);
  lcd.print(tripB);
  break;

      case 3:  // Calcul de la vitese
  nb_chgtV1 = nb_chgta;
  lastmillis = millis ();
    if (millis () - lastmillis == 3000)
    {
    nb_chgtV2 = nb_chgta ;
    vitesse = (nb_chgtV2 - nb_chgtV1)*P /3000*360;
  lcd.clear();
  lcd.setCursor (0,0);
  lcd.print ( "VITESSE" );
  lcd.setCursor (0,1);
  lcd.print(vitesse);
    }
   break;
  }
}

// Boutton 1

void ButtonReleaseEvents1() {
  if (affichage <=2) { // 
   detachInterrupt (0); // Freeze 
    }
  }

// Boutton 2

void ButtonReleaseEvents2() {

  if (affichage==1) { // 
   nb_chgta = 0; // RAZ Trip A
  }
  if (affichage==2) { // 
   nb_chgtb = 0; // RAZ Trip B
  }
}

// Bouton 1 + boutton 2
//{
//Inverse ++;
// if ( Inverse == 0)
// {
//  nb_chgta = varA;
//  nb_chgtb = varB;
// }
//}


// Boutton display

void ButtonReleaseEventsDisp() {

  if (!longPush) { // si appuie long
    lcd.clear();
    lcd.setCursor (0,1); // curseur début de deuxième ligne
    lcd.print ( "  Menu SET en construction " );
    delay(2000); // pause de 2 secondes
  longPush = false;
  } 
    else { // Change screen
      affichage ++;
      if (affichage > NB_AFFICHAGE) {affichage = 1;}
         }  
 }
 

// Fonctions complémentaires:
void nbtour() // comptage des changement d'état
  {
  nb_chgta ++;
  nb_chgtb ++;
  }
int tripA()
  {
  if ( Inverse == 0 )
    {
   trip_A = nb_chgta * P ;
     }
   else
     {
    trip_A = (varA - (nb_chgta-varA))* P;
    }
   return trip_A ; 
  }
int tripB() 
  {
  if ( Inverse == 0 )
   {
    trip_B = nb_chgtb * P ;
  return trip_B ;
     }
   else
     {
    trip_B = (varB - (nb_chgtb-varB)) * P;
    return trip_B ; 
     }
    }

en Pj le shéma à la main du montage que j'ai réalisé ....

Merci de votre aide

point de schema

en supposant qu'une action su BP mette à la masse, il est préférable de déclarer tes entrées en pull up

pinMode(btn_1 , INPUT_PULLUP );

ta routine d'interruption ne devrait qu’implémenter les deux variables. cette routine doit etre le plus courte (rapide ) possible, et travailler sur du volatile.

tes calculs peuvent se faire ensuite

à suivre...