Interupteur nul!

szdfszdfdzfszdfszdgfzsdgfzsdgfqzsdgfvzsdgfdgzgzdgfzdgf

Tu parles de cette ligne ?

unsigned char m24[8] = {Temoins,Temoins,s,0x00,dt,0x52,0x01,0x70};     //0x60D

Je suppose que tu veux alterner entre 0x70 et 0x71 à chaque appui. Ça revient à changer la valeur de m24[7]

Tu définis une variable booléenne (appelons la : infos) qui passera alternativement de true à false à chaque fois que l'interruption sera lancée.

infos = !infos;

Renseigne-toi sur l'utilisation des interruptions, par exemple ici. Tu dois déclarer une fonction qui modifiera la variable booléenne :

void boolchange()
{
  infos = !infos;
}

et déclarer que cette fonction est appelée lors d'un changement d'état du bouton par la ligne

attachInterrupt(numéro, boolchange, CHANGE);

ou mieux (voir ici)

attachInterrupt(digitalPinToInterrupt(pinBP), boolchange, CHANGE);

numéro est le numéro d’interruption concernée. Il s’agira de 0 ou 1 sur un Arduino Uno, ce qui correspond respectivement aux broches 2 et 3. Sur un Arduino Mega, les numéros 0 à 5 seront possibles et correspondent, dans l’ordre, aux broches 21, 20, 19, 18, 2 et 3.

pinBP est le numéro de la broche sur laquelle est branchée ton bouton poussoir (à choisir dans la liste fournie dans le lien précédent selon ton modèle d'Arduino), avec ceci dans le setup :

pinMode(pinBP,INPUT_PULLUP);

La variable doit être déclarée globale et volatile:

volatile bool infos = false;

Ensuite, je vais faire sursauter les puristes, mais sachant que true vaut 1 et false vaut 0, tu peux dans la boucle infinie ajouter la ligne (avant ta série de sendMsgBuf) :

m24[7] = 0x70 + infos;

Bonjour,

Pourquoi une interruption?
Il suffit de tester le bouton à l'intérieur du while()

kamill:
Il suffit de tester le bouton à l'intérieur du while()

C'est probable, mais comme ça il apprendra à se servir d'une interruption. Et si ça ne marche pas, il reviendra à al solution plus simple de lecture du bouton dans le while...

Est ce que la modification de l'affichage ne dure que le temps où le bouton est activé, ou bascule-t-elle définitivement, lors d'appui sur le bouton?

lesept:
C'est probable, mais comme ça il apprendra à se servir d'une interruption. Et si ça ne marche pas, il reviendra à al solution plus simple de lecture du bouton dans le while...

Oui, pourquoi faire simple quand on peu faire compliqué :slight_smile:

dbrion06:
Est ce que la modification de l'affichage ne dure que le temps où le bouton est activé, ou bascule-t-elle définitivement, lors d'appui sur le bouton?

Dès que j'appuie sur le bouton, l'affichage change sur la prochaine info de la voiture (moyenne km/h, consommation, vitesse moyenne, ...)

Oui, mais est ce que l'affichage revient à l'affichage ordinaire si vous relâchez le bouton?
Ou, au contraire, faut il réappuyer sur le bouton pour faire un second changement (qui annule donc le précédent et qui est sensible aux rebonds)

dbrion06:
Oui, mais est ce que l'affichage revient à l'affichage ordinaire si vous relâchez le bouton?
Ou, au contraire, faut il réappuyer sur le bouton pour faire un second changement (qui annule donc le précédent et qui est sensible aux rebonds)

Oui il faut réappuyer pour changer d'infos

Est ce que votre bouton peut souffrir de parasitage ou de rebonds?

La partie entre le commentaire //REVEIL et le while(1) devrait être placée dans setup() puisqu'elle n'est exécutée qu'une fois.
Le while(1) est inutile dans la mesure où loop() est une boucle infinie.
Tu pourras ainsi gérer autant de boutons que tu veux dans loop()

dbrion06:
Est ce que votre bouton peut souffrir de parasitage ou de rebonds?

Non pour ça il y a pas de problème

Je reviens vers vous pour vous dire que ça ne fonctionne pas avec "attachInterrupt"...

Mets ton programme

Problème dans attachInterrupt
C'est

 attachInterrupt(digitalPinToInterrupt(BP), boolchange, FALLING);

Non, j'ai essayé ça aussi et ça ne fonctionne pas mieux

Affiches la valeur de infos avec un Serial.print() dans la loop
Il n'y a pas de traitement antirebond pour le bouton.

Quand je regarde sur le moniteur série, le BP est initialement à 0 et passe à 1 quand j'appuie mais ça arrive qu'il inverse le sens quand j'appuie trop vite.

Je pense que dans ton cas (interruption), il faut faire un antirebond hardware, comme ceci :


Juste une capacité (100 nF) et une résistance pour faire un filtre. Rp1 est la résistance de pullup, elle est déjà dans le microcontrôleur, pas besoin de l'ajouter.

pinMode(2,OUTPUT);

Ça n'a rien à faire là, surtout que tu les déclares en INPUT_PULLUP plus loin