Software buggy oder Unfähigkeit

Hallo zusammen,
ich habe einen neuen Arduino Nano (ATmega328P) und möchte damit über einen Taster zwischen 3 Modes durchschalten. Der Taster gibt bei Druck Ground auf Pin D5. Bei gedrücktem Taster sollen die Modes nicht wild durchschalten, sondern genau je Tastendruck 1x der Mode gewechselt werden - daher die Konstruktion mit dem "Merken" des Schalterstatus (StatusButtonCh1). Als visuelle Kontrolle schalte ich die interne LED bei Mode 1 & 3 ein.

Folgendes Skript funktioniert:

int ButtonCh1 = 5;
int LEDCh1 = 3;
int PWMCh1 = 0;
int StatusButtonCh1 = 0;
int ModeCh1 = 0; //Modes: 0 = aus, 1 = Modus 1, 2 = Modus 2


//*****************************************************************************************************************************
void setup() {
// put your setup code here, to run once:
pinMode(ButtonCh1, INPUT_PULLUP);
pinMode(LEDCh1, OUTPUT);
pinMode(13, OUTPUT); //internal LED
}

//******************************************************************************************************************************
void loop() {

if (digitalRead(ButtonCh1) == HIGH && StatusButtonCh1 == 1) {  // Button unpressed
StatusButtonCh1 = 0;
delay(20);
}
if (digitalRead(ButtonCh1) == LOW && StatusButtonCh1 == 0 && ModeCh1 == 0) {
ModeCh1 = 1;
StatusButtonCh1 = 1;
digitalWrite(13, HIGH);
}
if (digitalRead(ButtonCh1) == LOW && StatusButtonCh1 == 0 && ModeCh1 == 1) {
ModeCh1 = 2;
StatusButtonCh1 = 1;
digitalWrite(13, LOW);
}
if (digitalRead(ButtonCh1) == LOW && StatusButtonCh1 == 0 && ModeCh1 == 2) {
ModeCh1 = 0;
StatusButtonCh1 = 1;
digitalWrite(13, HIGH);
}
}

Wie gesagt, das Skript funktioniert: Beim Durchschalten Tasterdruck 1 - LED an, 2 - LED aus,3 - LED an, 4 -LED an, usw..

Jetzt das komische: Sobald ich in den Modes etwas machen möchte, funktioniert es nichtmehr. (Ich will ein PWM Signal auf PIN D3 ausgeben). Dazu habe ich den folgenden Code angehängt:

if(ModeCh1 = 0){
PWMCh1 = 0;
analogWrite(LEDCh1, PWMCh1);
}
if(ModeCh1 = 1){
PWMCh1 = 250;
analogWrite(LEDCh1, PWMCh1);
}
if(ModeCh1 = 2){
PWMCh1 = 5;
analogWrite(LEDCh1, PWMCh1);
}

Mit dem Zusatz funktioniert aber nichts mehr: Beim Tasterdruck 1 - LED an, und bleibt an - egal was ich mache.
Hat jemand eine Idee, woran das liegen kann??

Danke und Grüße

Doscho

Das wild Schalten kommt sicher durch fehlende Entprellung des Tasters.
Sieh dir mal Debounce an.

Den Sketch habe ich mir nicht weiter angesehen, da dieser fast nicht zu lesen ist.
Setze den bitte in Code-Tags, Schaltfläche </> oben links im Editorfenster verwenden.
Das kannst du auch nachträglich machen.
Dann wird der Sketch besser lesbar.

Danke für die schnelle Antwort. :slight_smile:
Entprellt wird ja über den Delay und das funktioniert für das erste Skript auch. Nur wenn ich das Skript erweitere nicht mehr. DAS ist das woran ich verzweifel.
Das Debounce wende ich nicht an weil ich nicht verstehe, was da passiert, bzw. das Skript so für mich als Anfänger verständlich ist.

if(ModeCh1 = 0){
Zuweisung

if(ModeCh1 == 0){
Vergleich

Eine weitere Verbesserung wäre:
Die Zustände in einer enum zu definieren und das Auswerten per switch/case

combie:

if(ModeCh1 = 0){
Zuweisung

if(ModeCh1 == 0){
Vergleich

Eine weitere Verbesserung wäre:
Die Zustände in einer enum zu definieren und das Auswerten per switch/case

Klar, du hast recht! Dankeschön! Wie dumm von mir :frowning:

delay - entprellen würde ich übrigens auch bei LOW.