Problème de code pour un indicateur de rapport engagé de moto

Bonjours à tous et à toutes,
Je suis un jeune qui aime beaucoup trop l'univers Arduino et passionné de moto.
Bref j'aimerais faire un compteur de rapport engagé pour ma bécane, pour ceux qui ne savent pas, c'est un afficheur 7 segments qui dit la vitesse enclenchée.

Voici mon montage :

et voici mon code :

#define SEGMENT_A 2
#define SEGMENT_B 3
#define SEGMENT_C 4
#define SEGMENT_D 5
#define SEGMENT_E 6
#define SEGMENT_F 7
#define SEGMENT_G 8
#define POINT_MORT 13
#define CAPTEUR_PLUS 11
#define CAPTEUR_MOINS 12

int Rapport_Engage = 0;
void(*tabRapport[7])(void);

void Chiffre_1(){
  digitalWrite(SEGMENT_A, LOW);
  digitalWrite(SEGMENT_B, HIGH);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, LOW);
  digitalWrite(SEGMENT_E, LOW);
  digitalWrite(SEGMENT_F, LOW);
  digitalWrite(SEGMENT_G, LOW);
}

void Chiffre_2(){
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, HIGH);
  digitalWrite(SEGMENT_C, LOW);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, HIGH);
  digitalWrite(SEGMENT_F, LOW);
  digitalWrite(SEGMENT_G, HIGH);
}

void Chiffre_3(){
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, HIGH);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, LOW);
  digitalWrite(SEGMENT_F, LOW);
  digitalWrite(SEGMENT_G, HIGH);
}

void Chiffre_4(){
  digitalWrite(SEGMENT_A, LOW);
  digitalWrite(SEGMENT_B, HIGH);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, LOW);
  digitalWrite(SEGMENT_E, LOW);
  digitalWrite(SEGMENT_F, HIGH);
  digitalWrite(SEGMENT_G, HIGH);
}

void Chiffre_5(){
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, LOW);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, LOW);
  digitalWrite(SEGMENT_F, HIGH);
  digitalWrite(SEGMENT_G, HIGH);
}

void Chiffre_6(){
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, LOW);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, HIGH);
  digitalWrite(SEGMENT_F, HIGH);
  digitalWrite(SEGMENT_G, HIGH);
}

void Lettre_N(){
  digitalWrite(SEGMENT_A, LOW);
  digitalWrite(SEGMENT_B, LOW);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, LOW);
  digitalWrite(SEGMENT_E, HIGH);
  digitalWrite(SEGMENT_F, LOW);
  digitalWrite(SEGMENT_G, HIGH);
}

void setup() {
  Serial.begin(115200);
  pinMode(SEGMENT_A, OUTPUT);
  pinMode(SEGMENT_B, OUTPUT);
  pinMode(SEGMENT_C, OUTPUT);
  pinMode(SEGMENT_D, OUTPUT);
  pinMode(SEGMENT_E, OUTPUT);
  pinMode(SEGMENT_F, OUTPUT);
  pinMode(SEGMENT_G, OUTPUT);
  pinMode(CAPTEUR_PLUS, INPUT);
  pinMode(CAPTEUR_MOINS, INPUT);
  pinMode(POINT_MORT, INPUT);
  void(*ptChiffre1)();
  ptChiffre1 = Chiffre_1;
  void(*ptChiffre2)();
  ptChiffre2 = Chiffre_2;
  void(*ptChiffre3)();
  ptChiffre3 = Chiffre_3;
  void(*ptChiffre4)();
  ptChiffre4 = Chiffre_4;
  void(*ptChiffre5)();
  ptChiffre5 = Chiffre_5;
  void(*ptChiffre6)();
  ptChiffre6 = Chiffre_6;
  void(*ptLettreN)();
  ptLettreN = Lettre_N;
  tabRapport = ptChiffre1, ptLettreN, ptChiffre2, ptChiffre3, ptChiffre4, ptChiffre5, ptChiffre6;
}

void loop() {
  if(CAPTEUR_PLUS == HIGH)
    Rapport_Engage++;
    if(Rapport_Engage==1 && POINT_MORT!=HIGH)
      Rapport_Engage++;
  if(CAPTEUR_MOINS == HIGH)
    Rapport_Engage--;
    if(Rapport_Engage==2 && POINT_MORT!=HIGH)
      Rapport_Engage--;
  tabRapport[Rapport_Engage];
}

Je sais que j'ai une erreur avec la mise en tableau, sauf que c'est une amie qui m'a aidée à faire ce code et elle ne se souvenait plus trop du C++, donc je me retourne vers vous car je ne comprends pas l'erreur. Pour plus de précision c'est cette ligne qui pose problème :

tabRapport = ptChiffre1, ptLettreN, ptChiffre2, ptChiffre3, ptChiffre4, ptChiffre5, ptChiffre6;

Pour les capteurs plus et moins j'utilise des capteur de porte avec un aimant le même principe qu'un bouton.

Merci d'avance à vous tous

Initialiser un tableau peut se faire à la définition, entre accolades int tableau[] = {21,52,34}; mais si on veut le remplir plus tard faut y aller à la main

int tableau[3];
...
tableau[0] = 21;
tableau[1] = 52;
tableau[2] = 34;

Donc si vous déclarez votre tableau en global après la définition des fonctions vous pourrez fairevoid(*tabRapport[])() = {Chiffre_1, Lettre_N, ...};sans avoir à vous embêtez avec les pointeurs dans le setup sinon dans la setup vous pouvez faire

tabRapport[0] = Chiffre_1;
tabRapport[1] = Lettre_N;
...

bonjour , Pepemax , j'ai juste une question en rapport a votre montage
qui m 'intéresse :
dans le cas ou le contact est coupé avec une vitesse enclenché,
quelle valeur va afficher le 7 segment , a la "remise" du contact?
merci.

Bonjour à tous,
Merci beaucoup pour vos réponses si rapides.

Voici mon code du coup

#define SEGMENT_A 2
#define SEGMENT_B 3
#define SEGMENT_C 4
#define SEGMENT_D 5
#define SEGMENT_E 6
#define SEGMENT_F 7
#define SEGMENT_G 8
#define POINT_MORT 13
#define CAPTEUR_PLUS 11
#define CAPTEUR_MOINS 12

int Rapport_Engage = 0;


void Chiffre_1(){
  digitalWrite(SEGMENT_A, LOW);
  digitalWrite(SEGMENT_B, HIGH);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, LOW);
  digitalWrite(SEGMENT_E, LOW);
  digitalWrite(SEGMENT_F, LOW);
  digitalWrite(SEGMENT_G, LOW);
}

void Chiffre_2(){
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, HIGH);
  digitalWrite(SEGMENT_C, LOW);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, HIGH);
  digitalWrite(SEGMENT_F, LOW);
  digitalWrite(SEGMENT_G, HIGH);
}

void Chiffre_3(){
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, HIGH);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, LOW);
  digitalWrite(SEGMENT_F, LOW);
  digitalWrite(SEGMENT_G, HIGH);
}

void Chiffre_4(){
  digitalWrite(SEGMENT_A, LOW);
  digitalWrite(SEGMENT_B, HIGH);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, LOW);
  digitalWrite(SEGMENT_E, LOW);
  digitalWrite(SEGMENT_F, HIGH);
  digitalWrite(SEGMENT_G, HIGH);
}

void Chiffre_5(){
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, LOW);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, LOW);
  digitalWrite(SEGMENT_F, HIGH);
  digitalWrite(SEGMENT_G, HIGH);
}

void Chiffre_6(){
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, LOW);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, HIGH);
  digitalWrite(SEGMENT_F, HIGH);
  digitalWrite(SEGMENT_G, HIGH);
}

void Lettre_N(){
  digitalWrite(SEGMENT_A, LOW);
  digitalWrite(SEGMENT_B, LOW);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, LOW);
  digitalWrite(SEGMENT_E, HIGH);
  digitalWrite(SEGMENT_F, LOW);
  digitalWrite(SEGMENT_G, HIGH);
}

void(*tabRapport[7])() = {Chiffre_1, Chiffre_2, Chiffre_3, Chiffre_4, Chiffre_5, Chiffre_6, Lettre_N};

void setup() {
  Serial.begin(9600);
  pinMode(SEGMENT_A, OUTPUT);
  pinMode(SEGMENT_B, OUTPUT);
  pinMode(SEGMENT_C, OUTPUT);
  pinMode(SEGMENT_D, OUTPUT);
  pinMode(SEGMENT_E, OUTPUT);
  pinMode(SEGMENT_F, OUTPUT);
  pinMode(SEGMENT_G, OUTPUT);
  pinMode(CAPTEUR_PLUS, INPUT);
  pinMode(CAPTEUR_MOINS, INPUT);
  pinMode(POINT_MORT, INPUT);
}

void loop() {
  Serial.println(Rapport_Engage);
  if(CAPTEUR_PLUS == HIGH)
    Rapport_Engage++;
    if(Rapport_Engage==1 && POINT_MORT!=HIGH)
      Rapport_Engage++;
  if(CAPTEUR_MOINS == HIGH)
    Rapport_Engage--;
    if(Rapport_Engage==2 && POINT_MORT!=HIGH)
      Rapport_Engage--;
  tabRapport[Rapport_Engage];
}

Pouvez-vous me dire si cela est correct.

PBZOOM très bonne question, je n'y avais pas pensé, au départ je me disais que quand on démarre on est au point mort du coup soit j'essaye de sauvegarder le chiffre en mémoire mais le soucis c'est que si je le garde en mémoire et que je coupe le contact imaginons je sauvegarde le chiffre 4 mais que je me mets en 1ère la valeur est faussée.
Donc ce que je pense faire, c'est de prévoir un bouton pour remettre à zéro le compteur au cas où il y aurait un bug (je n'ai que 17 ans donc je suis encore en 50cm3 et après pour les gros cubes je lirai directement l'information de la prise diagnostic sur un pin analogique).

Merci encore

PS : l'afficheur n'affiche encore aucune valeur surement une erreur de branchement et la variable Rapport_Engage ne change pas, surement une erreur également (Si vous avez des idées pour m'aider je suis preneur)

if(CAPTEUR_PLUS == HIGH)
...
if(CAPTEUR_MOINS == HIGH)

pour lire la valeur d'un pin il faut faire un digitalRead() sinon vous testez si le N° de la pin vaut 1 tel que c'est écrit.... à mon avis ce n'est pas ce que vous voulez :slight_smile:

(idem avec POINT_MORT!=HIGH)

attention les boutons ça rebondit... voir si vous avez besoin de pull-up etc..

Pour bien débuter avec l'arduino, un bon point de départ c'est de lire les tutos d'eskimon --> regardez le chapitre sur les boutons.

Sinon

 tabRapport[Rapport_Engage];

n'est pas la bonne écriture pour appeler une fonction par son pointeur. ça s'écrit

(*[color=blue]pointeurSurFonction[/color])();

lire les pointeurs sur fonctions sur openClassroom par exemple

Pour gérer le problème de l'arrêt avec un rapport engagé, il suffit de tester à la mise sous tension (dans le setup() par exemple) si on est au point mort. Si ce n'est pas le cas on affiche une erreur (un E sur l'afficheur) pour signaler que l'on est pas au point mort.

Bon j'ai re-modifié mon code mais le chiffre ne s'affiche je pense que c'est dans la loop avec le (*tabRapport[Rapport_Engage]);

Mon new code

#define SEGMENT_A 2
#define SEGMENT_B 3
#define SEGMENT_C 4
#define SEGMENT_D 5
#define SEGMENT_E 6
#define SEGMENT_F 7
#define SEGMENT_G 8
#define CAPTEUR_POINT_MORT 13
#define CAPTEUR_PLUS 11
#define CAPTEUR_MOINS 12

byte Rapport_Engage = 0;

void Chiffre_1(){
  digitalWrite(SEGMENT_A, LOW);
  digitalWrite(SEGMENT_B, HIGH);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, LOW);
  digitalWrite(SEGMENT_E, LOW);
  digitalWrite(SEGMENT_F, LOW);
  digitalWrite(SEGMENT_G, LOW);
}

void Chiffre_2(){
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, HIGH);
  digitalWrite(SEGMENT_C, LOW);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, HIGH);
  digitalWrite(SEGMENT_F, LOW);
  digitalWrite(SEGMENT_G, HIGH);
}

void Chiffre_3(){
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, HIGH);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, LOW);
  digitalWrite(SEGMENT_F, LOW);
  digitalWrite(SEGMENT_G, HIGH);
}

void Chiffre_4(){
  digitalWrite(SEGMENT_A, LOW);
  digitalWrite(SEGMENT_B, HIGH);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, LOW);
  digitalWrite(SEGMENT_E, LOW);
  digitalWrite(SEGMENT_F, HIGH);
  digitalWrite(SEGMENT_G, HIGH);
}

void Chiffre_5(){
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, LOW);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, LOW);
  digitalWrite(SEGMENT_F, HIGH);
  digitalWrite(SEGMENT_G, HIGH);
}

void Chiffre_6(){
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, LOW);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, HIGH);
  digitalWrite(SEGMENT_F, HIGH);
  digitalWrite(SEGMENT_G, HIGH);
}

void Lettre_N(){
  digitalWrite(SEGMENT_A, LOW);
  digitalWrite(SEGMENT_B, LOW);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, LOW);
  digitalWrite(SEGMENT_E, HIGH);
  digitalWrite(SEGMENT_F, LOW);
  digitalWrite(SEGMENT_G, HIGH);
}

void Erreur(){
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, LOW);
  digitalWrite(SEGMENT_C, LOW);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, HIGH);
  digitalWrite(SEGMENT_F, HIGH);
  digitalWrite(SEGMENT_G, HIGH);
}

void(*tabRapport[7])() = {Chiffre_1, Chiffre_2, Chiffre_3, Chiffre_4, Chiffre_5, Chiffre_6, Lettre_N};

void setup() {
  Serial.begin(9600);
  pinMode(SEGMENT_A, OUTPUT);
  pinMode(SEGMENT_B, OUTPUT);
  pinMode(SEGMENT_C, OUTPUT);
  pinMode(SEGMENT_D, OUTPUT);
  pinMode(SEGMENT_E, OUTPUT);
  pinMode(SEGMENT_F, OUTPUT);
  pinMode(SEGMENT_G, OUTPUT);
  pinMode(CAPTEUR_PLUS, INPUT);
  pinMode(CAPTEUR_MOINS, INPUT);
  pinMode(CAPTEUR_POINT_MORT, INPUT);
  
}

void loop() {
  
  Serial.println(Rapport_Engage);
  
  boolean Plus = digitalRead(CAPTEUR_PLUS);
  boolean Moins = digitalRead(CAPTEUR_MOINS);
  boolean Point_Mort = digitalRead(CAPTEUR_POINT_MORT);
    
  if(Plus == HIGH){
    Rapport_Engage++;
  }
  
  if(Moins == HIGH) {
    Rapport_Engage--;
  }
  if(Point_Mort == HIGH){
    Rapport_Engage = 0;
  }
  (*tabRapport[Rapport_Engage]);
  if(Rapport_Engage < 0 || Rapport_Engage > 6){
   Erreur();
  }
}

Après je connaissais pour les boutons mais à chaque fois j'oublie le digital ou analogread

Pouvez-vous me dire que faire.

Et pour l'instant j'ai juste fais une erreur si la valeur descend en dessous de 0 ou dépasse la valeur 6 et si on à l'erreur on se met au point mort et on clique sur le bouton de reset

Rapport_Engage ne peut pas être négatif, parce que dans votre nouveau code vous l'avez déclaré comme cela

byte Rapport_Engage = 0;

et un byte c'est un entier non signé sur 1 octet. donc s'il vaut 0 et que vous enlevez un, il passe à 255

sinon   (*tabRapport[Rapport_Engage]); --> ce n'est pas ce que j'ai dit plus haut :slight_smile:
il manque une paire de parenthèses après --> (*[color=blue]pointeurSurFonction[/color])[color=red]()[/color];

N'utilisez pas la pin13 en input, elle a une LED connectée et donc se comporte parfois un peu bizarrement. prenez plutôt la pin 10 pour le point mort

essayez ce code - je suis passé en INPUT_PULLUP donc pour qu'un bouton soit appuyé il faut qu'il soit vu à LOW et on le câble entre PIN (en pull-up) <---> BOUTON <----> GND, il n'y a pas besoin de résistance
==> il faut recâbler sur la breadboard

J'ai aussi mis la console série à 115200 bauds, donc à changer dans votre fenêtre Série

#define SEGMENT_A 2
#define SEGMENT_B 3
#define SEGMENT_C 4
#define SEGMENT_D 5
#define SEGMENT_E 6
#define SEGMENT_F 7
#define SEGMENT_G 8

#define CAPTEUR_POINT_MORT 10
#define CAPTEUR_PLUS 11
#define CAPTEUR_MOINS 12


int Rapport_Engage;

void Chiffre_1() {
  Serial.println(1);
  digitalWrite(SEGMENT_A, LOW);
  digitalWrite(SEGMENT_B, HIGH);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, LOW);
  digitalWrite(SEGMENT_E, LOW);
  digitalWrite(SEGMENT_F, LOW);
  digitalWrite(SEGMENT_G, LOW);
}

void Chiffre_2() {
  Serial.println(2);
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, HIGH);
  digitalWrite(SEGMENT_C, LOW);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, HIGH);
  digitalWrite(SEGMENT_F, LOW);
  digitalWrite(SEGMENT_G, HIGH);
}

void Chiffre_3() {
  Serial.println(3);
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, HIGH);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, LOW);
  digitalWrite(SEGMENT_F, LOW);
  digitalWrite(SEGMENT_G, HIGH);
}

void Chiffre_4() {
  Serial.println(4);
  digitalWrite(SEGMENT_A, LOW);
  digitalWrite(SEGMENT_B, HIGH);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, LOW);
  digitalWrite(SEGMENT_E, LOW);
  digitalWrite(SEGMENT_F, HIGH);
  digitalWrite(SEGMENT_G, HIGH);
}

void Chiffre_5() {
  Serial.println(5);
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, LOW);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, LOW);
  digitalWrite(SEGMENT_F, HIGH);
  digitalWrite(SEGMENT_G, HIGH);
}

void Chiffre_6() {
  Serial.println(6);
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, LOW);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, HIGH);
  digitalWrite(SEGMENT_F, HIGH);
  digitalWrite(SEGMENT_G, HIGH);
}

void Lettre_N() {
  Serial.println('N');
  digitalWrite(SEGMENT_A, LOW);
  digitalWrite(SEGMENT_B, LOW);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, LOW);
  digitalWrite(SEGMENT_E, HIGH);
  digitalWrite(SEGMENT_F, LOW);
  digitalWrite(SEGMENT_G, HIGH);
}

void Erreur() {
  Serial.println('E');
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, LOW);
  digitalWrite(SEGMENT_C, LOW);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, HIGH);
  digitalWrite(SEGMENT_F, HIGH);
  digitalWrite(SEGMENT_G, HIGH);
}

void(*tabRapport[])() = {Lettre_N, Chiffre_1, Chiffre_2, Chiffre_3, Chiffre_4, Chiffre_5, Chiffre_6};
byte nbFontionRapports = sizeof(tabRapport) / sizeof(tabRapport[0]);

void setup()
{
  Serial.begin(115200);
  pinMode(SEGMENT_A, OUTPUT);
  pinMode(SEGMENT_B, OUTPUT);
  pinMode(SEGMENT_C, OUTPUT);
  pinMode(SEGMENT_D, OUTPUT);
  pinMode(SEGMENT_E, OUTPUT);
  pinMode(SEGMENT_F, OUTPUT);
  pinMode(SEGMENT_G, OUTPUT);
  pinMode(CAPTEUR_PLUS, INPUT_PULLUP);
  pinMode(CAPTEUR_MOINS, INPUT_PULLUP);
  pinMode(CAPTEUR_POINT_MORT, INPUT_PULLUP);

  Rapport_Engage = 0; // POINT MORT --> A améliorer ultérieurement pour voir si un rapport est engagé
  (*tabRapport[Rapport_Engage])();
}

void loop()
{
  int Ancien_Rapport_Engage = Rapport_Engage;
  if (digitalRead(CAPTEUR_PLUS) == LOW) {
    Rapport_Engage++;
  }
  if (digitalRead(CAPTEUR_MOINS) == LOW) {
    Rapport_Engage--;
  }
  if (digitalRead(CAPTEUR_POINT_MORT) == LOW) {
    Rapport_Engage = 0;
  }

  if (Ancien_Rapport_Engage != Rapport_Engage) { // on a changé de rapport
    if (Rapport_Engage < 0)  {
      Erreur();
      Rapport_Engage = 0;
    }
    else if (Rapport_Engage >= nbFontionRapports)  {
      Erreur();
      Rapport_Engage = nbFontionRapports - 1;
    }
    else {
      Serial.print(F("Changement de rapport = "));
      (*tabRapport[Rapport_Engage])();
    }
    delay(15); // anti rebond du pauvre :-)
  }
}

(j'ai tapé cela ici donc pas sûr que ça compile)

J'ai repris en grand partie votre code ... et vous verrez que vous avez oublié de prendre en compte quelque chose sur les boutons :slight_smile:

Bonjour,

Merci pour le code il fonctionne parfaitement

Je me rappelle qu'il fallait enregistrer l'état du bouton pour éviter que ma variable ne fasse que s'incrémenter mais pour ça il faut que je me replonge dans mes anciens code :).

Je n'avais pas penser à faire directement les boutons en INPUT_PULLUP, c'est vrai que ça sera plus simple pour mon circuit imprimé.

Par contre juste une question sur une moto il y a généralement 6 vitesse + le neutre et les vitesses sont organisée comme ça :
6
5
4
3
2
N
1

Donc pour passer la première ça sera le capteur moins qui s'activera et après ça sera que le capteur plus pour aller de la 2 à la 6 vitesses.

C'était pour ça que mon amie avait mis les fonctions dans un tableau.

Est-ce que vous avez une idée si possible en réutilisant au maximum ce code

#define SEGMENT_A 2
#define SEGMENT_B 3
#define SEGMENT_C 4
#define SEGMENT_D 5
#define SEGMENT_E 6
#define SEGMENT_F 7
#define SEGMENT_G 8

#define CAPTEUR_POINT_MORT 10
#define CAPTEUR_PLUS 11
#define CAPTEUR_MOINS 12

int Rapport_Engage;

void Chiffre_1() {
  Serial.println(1);
  digitalWrite(SEGMENT_A, LOW);
  digitalWrite(SEGMENT_B, HIGH);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, LOW);
  digitalWrite(SEGMENT_E, LOW);
  digitalWrite(SEGMENT_F, LOW);
  digitalWrite(SEGMENT_G, LOW);
}

void Chiffre_2() {
  Serial.println(2);
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, HIGH);
  digitalWrite(SEGMENT_C, LOW);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, HIGH);
  digitalWrite(SEGMENT_F, LOW);
  digitalWrite(SEGMENT_G, HIGH);
}

void Chiffre_3() {
  Serial.println(3);
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, HIGH);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, LOW);
  digitalWrite(SEGMENT_F, LOW);
  digitalWrite(SEGMENT_G, HIGH);
}

void Chiffre_4() {
  Serial.println(4);
  digitalWrite(SEGMENT_A, LOW);
  digitalWrite(SEGMENT_B, HIGH);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, LOW);
  digitalWrite(SEGMENT_E, LOW);
  digitalWrite(SEGMENT_F, HIGH);
  digitalWrite(SEGMENT_G, HIGH);
}

void Chiffre_5() {
  Serial.println(5);
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, LOW);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, LOW);
  digitalWrite(SEGMENT_F, HIGH);
  digitalWrite(SEGMENT_G, HIGH);
}

void Chiffre_6() {
  Serial.println(6);
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, LOW);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, HIGH);
  digitalWrite(SEGMENT_F, HIGH);
  digitalWrite(SEGMENT_G, HIGH);
}

void Lettre_N() {
  Serial.println('N');
  digitalWrite(SEGMENT_A, LOW);
  digitalWrite(SEGMENT_B, LOW);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, LOW);
  digitalWrite(SEGMENT_E, HIGH);
  digitalWrite(SEGMENT_F, LOW);
  digitalWrite(SEGMENT_G, HIGH);
}

void Erreur() {
  Serial.println('E');
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, LOW);
  digitalWrite(SEGMENT_C, LOW);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, HIGH);
  digitalWrite(SEGMENT_F, HIGH);
  digitalWrite(SEGMENT_G, HIGH);
}

void(*tabRapport[])() = {Lettre_N, Chiffre_1, Chiffre_2, Chiffre_3, Chiffre_4, Chiffre_5, Chiffre_6};
byte nbFontionRapports = sizeof(tabRapport) / sizeof(tabRapport[0]);

void setup()
{
  Serial.begin(9600);
  pinMode(SEGMENT_A, OUTPUT);
  pinMode(SEGMENT_B, OUTPUT);
  pinMode(SEGMENT_C, OUTPUT);
  pinMode(SEGMENT_D, OUTPUT);
  pinMode(SEGMENT_E, OUTPUT);
  pinMode(SEGMENT_F, OUTPUT);
  pinMode(SEGMENT_G, OUTPUT);
  pinMode(CAPTEUR_PLUS, INPUT_PULLUP);
  pinMode(CAPTEUR_MOINS, INPUT_PULLUP);
  pinMode(CAPTEUR_POINT_MORT, INPUT_PULLUP);

  Rapport_Engage = 0; // POINT MORT --> A améliorer ultérieurement pour voir si un rapport est engagé
  (*tabRapport[Rapport_Engage])();
}

void loop()
{
  int Ancien_Rapport_Engage = Rapport_Engage;
  if (digitalRead(CAPTEUR_PLUS) == LOW) {
    Rapport_Engage++;
  }
  if (digitalRead(CAPTEUR_MOINS) == LOW) {
    Rapport_Engage--;
  }
  if (digitalRead(CAPTEUR_POINT_MORT) == LOW) {
    Rapport_Engage = 0;
  }

  if (Ancien_Rapport_Engage != Rapport_Engage) { // on a changé de rapport
    if (Rapport_Engage < 0)  {
      Erreur();
      Rapport_Engage = 0;
    }
    else if (Rapport_Engage >= nbFontionRapports)  {
      Erreur();
      Rapport_Engage = nbFontionRapports - 1;
    }
    else {
      Serial.print(F("Changement de rapport = "));
      (*tabRapport[Rapport_Engage])();
    }
    delay(15); // anti rebond du pauvre :-)
  }
}

PS : Code de J-M-L

Merci à tous

ben vous mettez Rapport_Engage = 1; // POINT MORT --> A améliorer ultérieurement pour voir si un rapport est engagédans le setup() et vous modifiez le tableau de fonctionsvoid(*tabRapport[])() = {Chiffre_1, Lettre_N,  Chiffre_2, Chiffre_3, Chiffre_4, Chiffre_5, Chiffre_6};pour que ce soit dans le bon ordre

(à moins que + quand vous êtes en 1 doit passer en 2 et pas au Neutre)

Je me rappelle qu'il fallait enregistrer l'état du bouton pour éviter que ma variable ne fasse que s'incrémenter mais pour ça il faut que je me replonge dans mes anciens code :).

oui faut attendre que le bouton soit relâché avant de considérer que c'est un nouvel appui

Merci JML,
C'est ça pour les vitesses, si je suis en première et que je monte je suis en deuxième, je compte mettre un bouton de point mort donc quand j'appuie dessus ça me mets sur neutre, donc il faudrait que je fasses un truc du genre :

Si Rapport_Engage est égale à 0 (donc la première vitesse) et que le Capteur_Plus est égal à LOW (bouton appuyé) et que Point_Mort est en HIGH (bouton relâché) alors Rapport_Engage est égale à 2.

Et il faut que je fasse une autre condition pour du passage de la seconde vitesse à la première.

Est-ce que cela vous dérangerez pas de me le rajouter dans ce code s'il vous plaît et pouvez-vous m'indiquer un lien pour le faire votre système pour les boutons.

oui faut attendre que le bouton soit relâché avant de considérer que c'est un nouvel appui

Voici mon code (plutôt le votre :slight_smile: ) :

#define SEGMENT_A 2
#define SEGMENT_B 3
#define SEGMENT_C 4
#define SEGMENT_D 5
#define SEGMENT_E 6
#define SEGMENT_F 7
#define SEGMENT_G 8

#define CAPTEUR_POINT_MORT 10
#define CAPTEUR_PLUS 11
#define CAPTEUR_MOINS 12

int Rapport_Engage;

void Chiffre_1() {
  Serial.println(1);
  digitalWrite(SEGMENT_A, LOW);
  digitalWrite(SEGMENT_B, HIGH);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, LOW);
  digitalWrite(SEGMENT_E, LOW);
  digitalWrite(SEGMENT_F, LOW);
  digitalWrite(SEGMENT_G, LOW);
}

void Chiffre_2() {
  Serial.println(2);
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, HIGH);
  digitalWrite(SEGMENT_C, LOW);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, HIGH);
  digitalWrite(SEGMENT_F, LOW);
  digitalWrite(SEGMENT_G, HIGH);
}

void Chiffre_3() {
  Serial.println(3);
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, HIGH);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, LOW);
  digitalWrite(SEGMENT_F, LOW);
  digitalWrite(SEGMENT_G, HIGH);
}

void Chiffre_4() {
  Serial.println(4);
  digitalWrite(SEGMENT_A, LOW);
  digitalWrite(SEGMENT_B, HIGH);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, LOW);
  digitalWrite(SEGMENT_E, LOW);
  digitalWrite(SEGMENT_F, HIGH);
  digitalWrite(SEGMENT_G, HIGH);
}

void Chiffre_5() {
  Serial.println(5);
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, LOW);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, LOW);
  digitalWrite(SEGMENT_F, HIGH);
  digitalWrite(SEGMENT_G, HIGH);
}

void Chiffre_6() {
  Serial.println(6);
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, LOW);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, HIGH);
  digitalWrite(SEGMENT_F, HIGH);
  digitalWrite(SEGMENT_G, HIGH);
}

void Lettre_N() {
  Serial.println('N');
  digitalWrite(SEGMENT_A, LOW);
  digitalWrite(SEGMENT_B, LOW);
  digitalWrite(SEGMENT_C, HIGH);
  digitalWrite(SEGMENT_D, LOW);
  digitalWrite(SEGMENT_E, HIGH);
  digitalWrite(SEGMENT_F, LOW);
  digitalWrite(SEGMENT_G, HIGH);
}

void Erreur() {
  Serial.println('E');
  digitalWrite(SEGMENT_A, HIGH);
  digitalWrite(SEGMENT_B, LOW);
  digitalWrite(SEGMENT_C, LOW);
  digitalWrite(SEGMENT_D, HIGH);
  digitalWrite(SEGMENT_E, HIGH);
  digitalWrite(SEGMENT_F, HIGH);
  digitalWrite(SEGMENT_G, HIGH);
}

void(*tabRapport[])() = {Chiffre_1, Lettre_N, Chiffre_2, Chiffre_3, Chiffre_4, Chiffre_5, Chiffre_6};
byte nbFontionRapports = sizeof(tabRapport) / sizeof(tabRapport[0]);

void setup()
{
  Serial.begin(9600);
  pinMode(SEGMENT_A, OUTPUT);
  pinMode(SEGMENT_B, OUTPUT);
  pinMode(SEGMENT_C, OUTPUT);
  pinMode(SEGMENT_D, OUTPUT);
  pinMode(SEGMENT_E, OUTPUT);
  pinMode(SEGMENT_F, OUTPUT);
  pinMode(SEGMENT_G, OUTPUT);
  pinMode(CAPTEUR_PLUS, INPUT_PULLUP);
  pinMode(CAPTEUR_MOINS, INPUT_PULLUP);
  pinMode(CAPTEUR_POINT_MORT, INPUT_PULLUP);

  Rapport_Engage = 1; // POINT MORT --> A améliorer ultérieurement pour voir si un rapport est engagé
  (*tabRapport[Rapport_Engage])();
}

void loop()
{
  int Ancien_Rapport_Engage = Rapport_Engage;
  if (digitalRead(CAPTEUR_PLUS) == LOW) {
    Rapport_Engage++;
  }
  if (digitalRead(CAPTEUR_MOINS) == LOW) {
    Rapport_Engage--;
  }
  if (digitalRead(CAPTEUR_POINT_MORT) == LOW) {
    Rapport_Engage = 0;
  }

  if (Ancien_Rapport_Engage != Rapport_Engage) { // on a changé de rapport
    if (Rapport_Engage < 0)  {
      Erreur();
      Rapport_Engage = 0;
    }
    else if (Rapport_Engage >= nbFontionRapports)  {
      Erreur();
      Rapport_Engage = nbFontionRapports - 1;
    }
    else {
      Serial.print(F("Changement de rapport = "));
      (*tabRapport[Rapport_Engage])();
    }
    delay(15); // anti rebond du pauvre :-)
  }
}

Merci beaucoup

essayez un peu au moins de coder cela :slight_smile:

Ok merci je vais essayer de chercher merci pour tout je reviendrai peux-être vers vous si je n'y arrive pas

hello

comment fonctionne ton sélecteur de rapports?

la 1ere en bas, tu le remontes une fois=point mort, tu le remontes une deuxième fois = 2ème

si tu es en 2ème, tu le descends une fois = point mort, tu le descends une deuxième fois = 1ère

ce n'est pas comme ça ?

Ça fait longtemps que je ne suis pas monté sur une moto mais de mon temps c’était comme ça...

Ah non maintenant ce sont des sélecteur magnétique à retour plastique :smiley: :smiley: :smiley:

Non je rigole c'est bien ça.

Exemple : Si je roule je suis en 3 je veux redescendre en 1, je vais débrayer appuyer le sélecteur vers le bas et là je serais en 2 et ensuite si tu appuie encore une fois à fond sur le sélecteur tu redescend en 1 le point mort c'est entre, je sais que pour ceux qui ne font pas de moto c'est compliqué mais bon.

Et sur certaines bécanes tu as un indicateur de point mort qui à la valeur soit 0 ou 1 donc je simule ce capteur par un bouton dans mon cas.

Mais je vais faire une doc git pour expliquer son fonctionnement