Clignotement LED et compteur d'appui

Bonjour à tous,

J'ai un problème avec une LED et 4 boutons poussoir. Ils sont tous reliés à un MCP23017.

Je souhaite interrompre le clignotement de la LED et la rendre fixe lorsque j'appuie 3x sur l'un des quatre boutons. Ca peut-être sur le 1er, le 2nd, le 3eme ou le 4eme, qu'importe.

Pour cela j'ai écrit un code qui compte le nombre d'appuis. Problème: il prend en compte le bouton 1 mais pas les trois autres ! J'ai beau appuyer dessus, ils sont comme transparents. Pourquoi ? Où se trouve mon erreur ?

Merci d'avance...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62

 [color=#339933]#include[/color][color=#ff0000] <Wire.h>[/color]
[color=#339933]#include[/color][color=#ff0000] "Adafruit_MCP23017.h"[/color]
 
 
[color=#0000ff]int[/color] buttonCounter1 = [color=#cc66cc]0[/color];[color=#808080]// variable pour le comptage du nombre d'appuis sur le bouton poussoir[/color]
[color=#0000ff]int[/color] buttonCounter= [color=#cc66cc]0[/color];[color=#808080]//Variable pour l'état actuel du bouton poussoir[/color]
[color=#0000ff]int[/color] lastButtonCounter = [color=#cc66cc]0[/color];[color=#808080]// Variable pour l'état précédent du bouton poussoir[/color]
 
[color=#0000ff]bool[/color] clignotement1 = [color=#0080ff]true[/color];
[color=#0000ff]const[/color] [color=#0000ff]unsigned[/color] [color=#0000ff]long[/color] Intervaldeclignotement = [color=#cc66cc]250[/color];
[color=#0000ff]unsigned[/color] [color=#0000ff]long[/color] Millisactuel;
[color=#0000ff]unsigned[/color] [color=#0000ff]long[/color] Millisprecedent;
 
 
[color=#0000ff]void[/color] setup[color=black]([/color][color=black])[/color] [color=black]{[/color]
 
[color=#0080ff]Serial[/color].begin[color=black]([/color][color=#cc66cc]9600[/color][color=black])[/color];
mcp.begin[color=black]([/color][color=black])[/color];
 
mcp.[color=#0080ff]pinMode[/color][color=black]([/color][color=#cc66cc]1[/color], [color=#0080ff]OUTPUT[/color][color=black])[/color];[color=#808080]//LED[/color]
mcp.[color=#0080ff]pinMode[/color][color=black]([/color][color=#cc66cc]2[/color], [color=#0080ff]INPUT[/color][color=black])[/color];[color=#808080]//BP1[/color]
mcp.pullUp[color=black]([/color][color=#cc66cc]2[/color], [color=#0080ff]HIGH[/color][color=black])[/color];
mcp.[color=#0080ff]pinMode[/color][color=black]([/color][color=#cc66cc]3[/color], [color=#0080ff]INPUT[/color][color=black])[/color];[color=#808080]//BP2[/color]
mcp.pullUp[color=black]([/color][color=#cc66cc]3[/color], [color=#0080ff]HIGH[/color][color=black])[/color];
mcp.[color=#0080ff]pinMode[/color][color=black]([/color][color=#cc66cc]4[/color], [color=#0080ff]INPUT[/color][color=black])[/color];[color=#808080]//BP3[/color]
mcp.pullUp[color=black]([/color][color=#cc66cc]4[/color], [color=#0080ff]HIGH[/color][color=black])[/color];
mcp.[color=#0080ff]pinMode[/color][color=black]([/color][color=#cc66cc]5[/color], [color=#0080ff]INPUT[/color][color=black])[/color];[color=#808080]//BP4[/color]
mcp.pullUp[color=black]([/color][color=#cc66cc]5[/color], [color=#0080ff]HIGH[/color][color=black])[/color];
 
[color=black]}[/color]
 
[color=#0000ff]void[/color] loop[color=black]([/color][color=black])[/color] [color=black]{[/color]
 
[color=#0000ff]if[/color] [color=black]([/color]clignotement1[color=black])[/color] [color=black]{[/color] 
 
 Millisactuel = [color=#0080ff]millis[/color][color=black]([/color][color=black])[/color];
 [color=#0000ff]if[/color] [color=black]([/color][color=black]([/color][color=black]([/color][color=#0000ff]unsigned[/color] [color=#0000ff]long[/color][color=black])[/color][color=black]([/color]Millisactuel - Millisprecedent[color=black])[/color] >= Intervaldeclignotement[color=black])[/color] [color=black])[/color] [color=black]{[/color]
 mcp.[color=#0080ff]digitalWrite[/color][color=black]([/color][color=#cc66cc]1[/color], !mcp.[color=#0080ff]digitalRead[/color][color=black]([/color][color=#cc66cc]1[/color][color=black])[/color][color=black])[/color];
 Millisprecedent = Millisactuel;
 [color=black]}[/color]
 [color=black]}[/color] [color=#0000ff]else[/color] [color=black]{[/color]
 mcp.[color=#0080ff]digitalWrite[/color][color=black]([/color][color=#cc66cc]1[/color], [color=#0080ff]HIGH[/color][color=black])[/color];
[color=black]}[/color]
 
 
 
buttonCounter1 = [color=black]([/color]mcp.[color=#0080ff]digitalRead[/color][color=black]([/color][color=#cc66cc]2[/color][color=black])[/color] | mcp.[color=#0080ff]digitalRead[/color][color=black]([/color][color=#cc66cc]3[/color][color=black])[/color] | mcp.[color=#0080ff]digitalRead[/color][color=black]([/color][color=#cc66cc]4[/color][color=black])[/color] | mcp.[color=#0080ff]digitalRead[/color][color=black]([/color][color=#cc66cc]5[/color][color=black])[/color][color=black])[/color];
 
[color=#0000ff]if[/color] [color=black]([/color]buttonCounter1 != lastButtonCounter[color=black])[/color] [color=black]{[/color]
[color=#0000ff]if[/color] [color=black]([/color]buttonCounter1 == [color=#0080ff]LOW[/color][color=black])[/color] [color=black]{[/color]
buttonCounter++;
[color=black]}[/color]
lastButtonCounter = buttonCounter1;
[color=black]}[/color]
 
[color=#0000ff]if[/color] [color=black]([/color]buttonCounter >= [color=#cc66cc]3[/color][color=black])[/color] [color=black]{[/color]
clignotement1 = [color=#0080ff]false[/color];
 
 [color=black]}[/color]
 
 
[color=black]}[/color]

Bonjour

Pour comprendre ce qui se passe dans un programme, lorsque le comportement n'est pas celui attendu, il faut ajouter des Serial.print.

Cela permet de vérifier le contenu des variables, ainsi que les portions de code exécutées.

A la lecture du code source, je vois seulement que la variable buttonCounter n'est jamais remise à zéro, donc l'arrêt du clignotement est définitif.

C'est peut-être un usage non approprié du mcp.
Même si la programmation par digitalRead/write a l'air d'être aussi simple qu'avec les pins de l'Arduino, il ne faut pas oublier que c'est un composant sur bus I2C.
Chaque digitalRead/Write contient en réalité toute une étape de communication avec le mcp via le bus I2C.
La ligne mcp.digitalRead(2) | mcp.digitalRead(3) | .... mériterait probablement d'être remplacée par une seule instruction qui récupère directement l'état de tous les registres du mcp.

Et sinon, ben réduire le problème à seulement deux boutons, faire différents tests peut permettre de comprendre ce qui cloche.

Bonjour,

Je ne vois pas ou est défini mcp dans ton code.

Mets ton code entre balises de code (et profites en pour formater correctement ton code avec ctrl T).