Mikrocontroller und Digitale Elektronik
›
Thread
ESP32 Tasterauswertutn Probleme
Hallo,
ich habe ein Problem mit der Tastenauswertung an einem ESP32-Wroom-32 Modul.
Ich habe 4 Taster (Pin 36, 39, 35,34) mit einem Pulldown-Widerstand angeschlossen.
Das Problem welches ich habe ist, dass wenn ich einen Taster drücke, alle anderen Taster den selben Zustand annehmen.
1
typedef enum
2
{
3
PLAY,
4
STOP,
5
NEXT,
6
SHUTDOWN,
7
NUM_OF_BUTTONS
8
} ButtonName_te;
9
10
typedef enum
11
{
12
LOW,
13
RISING,
14
HIGH,
15
FALLING,
16
ERROR
17
} ButtonState_te;
18
19
typedef struct
20
{
21
ButtonName_te name_e;
22
gpio_num_t gpioNum;
23
ButtonState_te state_e;
24
ButtonState_te oldState_e;
25
bool stateChanged_b;
26
} Button_ts;
1
case INIT:
2
{
3
for (ButtonName_te x=PLAY; x<NUM_OF_BUTTONS; x++)
4
{
5
ESP_LOGI(TAG, "IO %d: %d ", x, button_as[x].gpioNum);
6
gpio_set_direction(button_as[x].gpioNum, GPIO_MODE_INPUT);
7
gpio_input_enable(button_as[x].gpioNum);
8
gpio_set_pull_mode(button_as[x].gpioNum, GPIO_PULLDOWN_ONLY);
9
10
button_as[x].state_e = LOW;
11
button_as[x].oldState_e = LOW;
12
}
13
taskState_e = RUNNING;
14
break;
15
}
16
17
case RUNNING:
18
{
19
for (ButtonName_te x=PLAY; x<NUM_OF_BUTTONS; x++)
20
{
21
getButtonState_v(&button_as[x]);
22
}
23
24
if (true == button_as[PLAY].stateChanged_b)
25
{
26
ESP_LOGI(TAG, "BUTTON PLAY Status Changed to: %d", button_as[PLAY].state_e);
27
button_as[PLAY].stateChanged_b = false;
28
}
29
if (true == button_as[STOP].stateChanged_b)
30
{
31
32
ESP_LOGI(TAG, "BUTTON STOP Status Changed to: %d", button_as[STOP].state_e);
33
button_as[STOP].stateChanged_b = false;
34
}
35
if (true == button_as[NEXT].stateChanged_b)
36
{
37
38
ESP_LOGI(TAG, "BUTTON NEXT Status Changed to: %d", button_as[NEXT].state_e);
39
button_as[NEXT].stateChanged_b = false;
40
}
41
if (true == button_as[SHUTDOWN].stateChanged_b)
42
{
43
44
ESP_LOGI(TAG, "BUTTON SHUTDOWN Status Changed to: %d", button_as[SHUTDOWN].state_e);
45
button_as[SHUTDOWN].stateChanged_b = false;
46
}
47
break;
48
}
Tastenauswertung:
1
static void getButtonState_v(Button_ts* button_ps)
2
{
3
if (LOW == button_ps->state_e)
4
{
5
if (FALLING == button_ps->oldState_e)
6
{
7
button_ps->oldState_e = LOW;
8
button_ps->stateChanged_b = true;
9
}
10
if (1 == gpio_get_level(button_ps->gpioNum))
11
{
12
ESP_LOGI(TAG, "Button: %d", button_ps->gpioNum);
13
button_ps->oldState_e = LOW;
14
button_ps->state_e = RISING;
15
}
16
}
17
else if (RISING == button_ps->state_e)
18
{
19
if (1 == gpio_get_level(button_ps->gpioNum))
20
{
21
button_ps->oldState_e = RISING;
22
button_ps->state_e = HIGH;
23
}
24
else
25
{
26
button_ps->state_e = LOW;
27
}
28
}
29
else if (HIGH == button_ps->state_e)
30
{
31
if (RISING == button_ps->oldState_e)
32
{
33
button_ps->oldState_e = HIGH;
34
button_ps->stateChanged_b = true;
35
}
36
if (0 == gpio_get_level(button_ps->gpioNum))
37
{
38
button_ps->state_e = FALLING;
39
}
40
}
41
else if (FALLING == button_ps->state_e)
42
{
43
if (0 == gpio_get_level(button_ps->gpioNum))
44
{
45
button_ps->oldState_e = FALLING;
46
button_ps->state_e = LOW;
47
}
48
else
49
{
50
button_ps->state_e = HIGH;
51
}
52
}
53
}
Die Ausgabe aus dem INIT-State
1
I (344) GPIO: IO 0: 36
2
I (364) GPIO: IO 1: 39
3
I (364) GPIO: IO 2: 35
4
I (364) GPIO: IO 3: 34
Wenn ich jetzt eine Taste drücke (egal welche), werden alle Buttons getriggert. Ausgabe aus dem RUNNING-State wenn ich eine Taste Drücke
1
I (170074) GPIO: BUTTON PLAY Status Changed to: 2
2
I (170074) GPIO: BUTTON STOP Status Changed to: 2
3
I (170074) GPIO: BUTTON NEXT Status Changed to: 2
4
I (170074) GPIO: BUTTON SHUTDOWN Status Changed to: 2
Gleiches passiert, wenn ich den Taster loslasse.
R
Rolf
(rolf22)
28.05.2025 13:56
#7883304
Chandler B. schrieb:
Ich habe 4 Taster (Pin 36, 39, 35,34) mit einem Pulldown-Widerstand
angeschlossen.
Wer wird dieses lange Programm studieren, wenn er statt Schaltplan nur eine Wischiwaschi-Aussage bekommt?
Das Problem welches ich habe ist, dass wenn ich einen Taster drücke,
alle anderen Taster den selben Zustand annehmen.
Ach, die anderen Taster bewegen sich dann mit? Vielleicht ist Klebstoff dazwischen geraten? SCNR.
TW
Thomas W.
Gast
28.05.2025 13:57
#7883305
Chandler B. schrieb:
Hallo,
ich habe ein Problem mit der Tastenauswertung an einem ESP32-Wroom-32
Modul.
Ich habe 4 Taster (Pin 36, 39, 35,34) mit einem Pulldown-Widerstand
angeschlossen.
Ein Widerstand fuer vier Taster?
Schaltplan bitte!
Rolf schrieb:
Wer wird dieses lange Programm studieren, wenn er statt Schaltplan nur
eine Wischiwaschi-Aussage bekommt?
Anbei der Schaltplan
Jeder Taster hat seinen eigenen Widerstand.
Erstmal direkt am µC Eingang messen, was bei Tastendruck passiert und so Verdrahtungsfehler ausschließen.
Danach würde ich zur Not die KI über den Code befragen.
Viele Grüße!
PD
Peter D.
(peda)
28.05.2025 14:59
#7883345
Wer soll mit den rausgerissenen Schnipselchen was anfangen können?
Benutzt Du eine Entprellib?
Poste einen compilierbaren Code (0 errors, 0 warnings) als Anhang, d.h. nicht eingebettet!
Es sieht so aus, als machten unter RUNNING alle ifs das gleiche. Dann ersetze das if-Monster durch eine Schleife. Das ist weniger Code, besser zu verstehen und man muß es nur einmal lesen.
Tasten schaltet man vorzugsweise low aktiv. Dann besteht weniger Gefahr, die VCC versehentlich kurzzuschließen.
NM
N. M.
(mani)
28.05.2025 15:21
#7883355
Aus was für einem context heraus wird denn dein Switch Case aufgerufen und wie ist button_as[] definiert?
Was passiert wenn bei init ein anderer Zustand als Low an den Tastern anliegt?
N. M. schrieb:
Aus was für einem context heraus wird denn dein Switch Case aufgerufen
das Switch-Case wird zyklisch aufgerufen
1
static void gpioTask_v(void * pvParameters)
2
{
3
TickType_t xLastWakeTime;
4
const TickType_t xFrequency = 20;
5
6
for( ;; )
7
{
8
// Wait for the next cycle.
9
xTaskDelayUntil( &xLastWakeTime, xFrequency );
10
11
gpioExec_v();
12
// Perform action here. xWasDelayed value can be used to determine
13
// whether a deadline was missed if the code here took too long.
14
}
15
}
16
17
static void gpioExec_v(void)
18
{
19
switch(taskState_e)
20
{
21
case INIT:
22
{
23
... ... ...
24
}
25
26
case RUNNING:
27
{
28
... ... ...
29
}
30
}
31
}
N. M. schrieb:
und wie ist button_as[] definiert?
1
static Button_ts button_as[NUM_OF_BUTTONS] =
2
{
3
{
4
.name_e = PLAY,
5
.gpioNum = GPIO_INPUT_IO_PLAY,
6
.state_e = LOW,
7
.oldState_e = LOW,
8
.stateChanged_b = false
9
},
10
{
11
.name_e = STOP,
12
.gpioNum = GPIO_INPUT_IO_STOP,
13
.state_e = LOW,
14
.oldState_e = LOW,
15
.stateChanged_b = false
16
},
17
{
18
.name_e = NEXT,
19
.gpioNum = GPIO_INPUT_IO_NEXT,
20
.state_e = LOW,
21
.oldState_e = LOW,
22
.stateChanged_b = false
23
},
24
{
25
.name_e = SHUTDOWN,
26
.gpioNum = GPIO_INPUT_IO_SHUTDOWN,
27
.state_e = LOW,
28
.oldState_e = LOW,
29
.stateChanged_b = false
30
}
31
};
N. M. schrieb:
Was passiert wenn bei init ein anderer Zustand als Low an den Tastern
anliegt?
Das sollte egal sein. Erst wenn es von LOW auf HIGH wechselt sollte der Zustandswechsel erkannt werden.
Chandler B. schrieb:
Erst wenn es von LOW auf HIGH wechselt sollte der
Zustandswechsel erkannt werden
und wie entprellst du?
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
Noch kein Account?
Die Registrierung ist kostenlos und dauert nur eine Minute.
Jetzt registrieren