Probleme mit Temperaturregelung durch Tasterdruck

Guten Abend liebe Community,

ich schreibe hier, weil ich bei einem Projekt nicht weiterkomme und irgendwie meinen Fehler versehe, aber nicht weiss, wie ich ihn umgehen kann.

Ich habe einen Arduino Mega 2560 mit einem Taster, einer Heizpatrone (80W bei 24V), welche über einen Relais angesteuert wird und den NTC-Thermistor 104N-4-R025H42G.

Wenn der Arduino mit Strom versorgt wird, dann soll das Programm aufgerufen werden, aber noch nichts passieren.
Wenn der Taster gedrückt wird, dann soll das Relais durchgeschaltet werden. sodass die Heizpatrone mit Spannung versorgt wird und diese in Wärme umwandelt.
Wenn die Zieltemperatur erreicht ist, so soll das Relais wieder öffnen und bei Unterschreiten der Zieltemperatur wieder schließen (Ziel ist das Halten der Soll-Temperatur).

Ich habe es versucht mit einer verkettenen If-Bedingung zu lösen.
Nur leider führt das dazu, dass immer die erste Bedingung erneut erfüllt werden muss (der Tastendruck), um daduch ein erneutes Abrufen der Unterfunktion zu starten. Leider komme ich nicht mehr weiter und weiss, nicht, wie ich das umgehen kann, dass ich nach dem Tastendruck eine kontinuierliche Temperaturregelung erreiche. Könnt ihr mir da helfen?

Ich füge euch mal den Code unten mit an, wie ich es bisher programmiert habe.

//Notwendige Bibliotheken
#include <thermistor.h>
#include <NTC_Thermistor.h>

//Analog_Input
const int temperaturfuehler = A0;

//Temperaturfühler
#define Referenzwiderstand  100000
#define Nominalwiderstand   100000
#define Referenztemperatur  25
#define BWert               4267
#define min 15    //Temperaturminimun
#define max 210   //Temperaturmaximum
Thermistor*thermistor;

//Notwendige Inputs und Outputs
const int relais = 4;
const int taster = 8;

void setup(){
thermistor = new NTC_Thermistor(A0, 100000, 100000, 25, 4267); //Thermistor 104NT-4-R025H42G 

pinMode(taster,      INPUT_PULLUP);
pinMode(relais,      OUTPUT);
pinMode(temperaturfuehler,   INPUT_PULLUP);
digitalWrite(relais, LOW);
}

void loop(){
  double celsius = thermistor->readCelsius(); //Temperatur auslesen
       if(digitalRead(taster)==LOW){
       taster();
       }
        if(celsius >= max){
       maxtemp();
}

void taster(){
    double celsius = thermistor->readCelsius(); //Temperatur auslesen
     if(celsius < max ){
         digitalWrite(mosfet_heizung, HIGH);
     }
     else
     {maxtemp();
     }
}

void maxtemp(){
    double celsius = thermistor->readCelsius(); //Temperatur auslesen
    digitalWrite(relais, LOW);
    delay(5000);
    digitalWrite(relais, HIGH);
    delay(5000);
    }


Ich verstehe, warum er natürlich die Unterfunktionen taster() oder maxtemp() erst wieder bei erneutem Tastendruck aufruft, aber ich weiss, wie ich die TEmperaturregelung innerhalb einer Unterfunktion "loopen" lassen kann. Eine If-Bedingung mit "digtialread(taster)==HIGH;" und der Bedingung für die Temperatur würde ja dem Grundzustand entsprechen (wenn noch nie ein Taster bedient wurde). Also würde er dann (meinem Verständnis nach) schon aufheizen, obwohl noch kein Knopf gedrückt ist oder wurde. Das darf auf keinen Fall passieren.

Über eure Hilfe bin ich sehr dankbar.

Liebe Grüße und einen schönen Abend,

Maschbau

Hallo @maschbau

herzlich willkommen im Arduino-Forum.

hört sich nach Maschinenbauer an. Aber (bisher) keine Programmierkenntnisse

Ist die beschriebene Funktionalität:

Warte auf den Tastendruck
Wenn Tastendruck detektiert wurde dann
halte Temperatur durch ein/auschalten des Relais auf einem bestimmten Wert.

Alles was du brauchst?

Wenn die Temperaturregelung beendet werden soll dann schaltest du dem Arduino Mega den Strom ab und das war's?

Oder kommen da eventuell doch noch weitere Sachen dazu?

Wenn das wirklich alles ist dann könntest du in
void setup()
eine while-schleife programmieren
while taste == "nicht gedrückt"
.
und den rest in
void loop()
dann macht es genau das wie oben beschrieben.

Wenn du doch mehr machen möchtest daaannnn muss man das anders programmieren.

vgs

Hallo Stefan, danke für deine Antwort. ja, aus meinem Benutzernamen hast du schon richtig abgeleitet, dass meine Programmierkenntnisse nicht soo gut sind. Ich habe schonmal mit einem Arduino und C gearbeitet, aber das ist auch schon was her und nicht in der Komplexität.

Die Problematik der Temperaturregelung ist tatsächlich bisher die einzige Stelle, wo der Code hängt. Der Rest der Funktionen, die dahinterkommen (wie das dauerhafte Drehen eines Steppermotors mit Hilfe der MobaTools bei dem Druck eines anderen Tasters) funktionieren einigermaßen gut. Zumindest habe ich beider Simulation bisher keine Fehler gefunden, und der Rest läuft sauber durch.

Das war in meinen Augen die einzige Stelle wo es hakt. Natürlich kann ich aber gerne mal das komplette Projekt reinstellen unnd beschreiben, was passieren soll.

//Notwendige Bibliotheken
#include <LiquidCrystal.h>
#include <thermistor.h>
#include <NTC_Thermistor.h>
#include <Ethernet.h>
#include <MobaTools.h>
#include <Bounce2.h>

//Display_Input
LiquidCrystal lcd(48, 49, 50,51, 52, 53);

//Analog_Input
const int temperaturfuehler = A0;

//Temperaturfühler
#define Referenzwiderstand  100000
#define Nominalwiderstand   100000
#define Referenztemperatur  25
#define BWert               4267
#define min 15    //Temperaturminimun
#define max 60   //Temperaturmaximum
Thermistor*thermistor;

//Relais_OUTPUT
const int relais_bauteil = 4;
const int relais_hotend = 5;
const int relais_gehaeuse= 6;
const int relais_heizung = 7;

//Steppermotor_INPUT
const int steppermotor_enable = 15;
const int steppermotor_step = 19;
const int steppermotor_dir = 20;

//Taster_INPUT
const int TASTER_SCHWARZ = 8;
const int TASTER_ROT = 25;
const int TASTER_GELB = 27;
const int TASTER_GRUEN = 29;

MoToStepper myStepper( 200, STEPDIR);

void setup() {
Serial.begin(9600);
thermistor = new NTC_Thermistor(A0, 100000, 100000, 25, 4267); //Thermistor 104NT-4-R025H42G 

pinMode(TASTER_SCHWARZ,      INPUT_PULLUP);
pinMode(TASTER_ROT,          INPUT_PULLUP); 
pinMode(TASTER_GELB,         INPUT_PULLUP);
pinMode(TASTER_GRUEN,        INPUT_PULLUP);
pinMode(relais_bauteil,      OUTPUT);
pinMode(relais_hotend,       OUTPUT);
pinMode(relais_gehaeuse,     OUTPUT);
pinMode(relais_heizung,      OUTPUT);
pinMode(temperaturfuehler,   INPUT_PULLUP);
pinMode(steppermotor_enable, OUTPUT);
pinMode(steppermotor_step,   OUTPUT);
pinMode(steppermotor_dir,    OUTPUT);

digitalWrite(steppermotor_enable, LOW);
digitalWrite(relais_hotend,   LOW);
digitalWrite(relais_bauteil,  HIGH);
digitalWrite(relais_gehaeuse, HIGH);

lcd.begin(16, 2);

  Serial.begin(115200);   
  while(!Serial); 
  myStepper.attach(19, 20 ); 
  myStepper.attachEnable( 15, 100, LOW );
  myStepper.setSpeed( 600 );    // 60 Umdr/Min
}


void loop(){
  double celsius = thermistor->readCelsius(); //Temperatur auslesen
  lcd.setCursor(0,0);
  lcd.print("Temp:");
  lcd.setCursor(6,0);
  lcd.print(celsius);
  lcd.setCursor(12,0);
  lcd.print("C/210C");


    if(digitalRead(TASTER_SCHWARZ)==LOW){
    schwarz();
    }
    if(celsius >= max){
    maxtemp();
    stepper_vor();
    stepper_halt();
    }
  if(digitalRead(TASTER_ROT)==LOW){
  stepper_vor();
  }
  if(digitalRead(TASTER_GRUEN)==LOW){
  stepper_halt();
  }
  if(digitalRead(TASTER_GELB)==LOW){
    gelb();
  }
  }

void schwarz(){
    double celsius = thermistor->readCelsius(); //Temperatur auslesen
    digitalWrite(relais_gehaeuse, HIGH);

if(celsius < max ){
  digitalWrite(relais_heizung, HIGH);
  void stepper_halt();
}
  else
  {
  digitalWrite(relais_heizung, LOW);
  void stepper_vor();
  }
}


void maxtemp(){
    double celsius = thermistor->readCelsius(); //Temperatur auslesen
    digitalWrite(relais_hotend, HIGH);
    digitalWrite(relais_heizung, LOW);
    delay(5000);
    digitalWrite(relais_heizung, HIGH);
    delay(5000);
    }


void stepper_vor(){
  double celsius = thermistor->readCelsius(); //Temperatur auslesen
  if (celsius >= max){
        //digitalWrite(E_STEP_PIN, HIGH); // Motor an
        myStepper.rotate(1);
        }    
    else{
    //digitalWrite(E_STEP_PIN, LOW// Motor aus
    myStepper.rotate(0);
}
}

void stepper_halt(){
  double celsius = thermistor->readCelsius(); //Temperatur auslesen
    if (celsius >= max){
        //digitalWrite(E_STEP_PIN, HIGH); // Motor an
        myStepper.rotate(0);
}
}

void gelb(){
  digitalWrite(relais_heizung, LOW);
  digitalWrite(relais_gehaeuse, HIGH);
  digitalWrite(relais_hotend, HIGH);
  digitalWrite(relais_bauteil, LOW);
  //if(millis() - previousMillis > 3000){ 
  //digitalWrite(relais_gehaeuse, LOW);
  }

(Die Relais Gehause, Bauteil und Hotend sind einfach nur drei 24V Lüfter, welche über Relais geschaltet werden.)
Der komplette Funktionsablauf sieht folgendermaßen aus:

Arduino an: Grundzustand, Display an und zeigt Temperaturwert, sowie dauerhafte Aktivierung zweier Lüfter
Schwarze Taste drücken: relais_heizung wird durchgeschaltet und Temperatur wird erfasst. (Wenn Solltemperatur erreicht soll ein Takten des Relais erfolgen)
Rote Taste drücken: Schrittmotor soll anfangen zu drehen, bis eine Tasteneingabe (zum Beispiel über grünen Taster) erfolgt
Grüne Taste drücken: Schrittmtor wird angehalten, bis neue Tasteneingabe (zum Beispiel über den roten Taster) erfolgt
gelbe Taste gedrückt: die Tatsendruck soll ein Reset auslösen. Schrittmotor wird angehalten und üm eine Umdrehung zurückgedreht. Relais-Heizung wird dauerhaft geöffnet.

Wenn jetzt erneut auf den schwarzen Taster gedrückt wird, so soll der Zyklus ( der Möglichkeiten) wieder von neuen starten. (Kann man das ganze vom Funktionsaufbau schon als Finite State Machine bezeichnen?)

Mir ist grade doch noch ein Problem aufgefallen. Der Steppermotor hört einfach nach 5000 Steps (25 Umdrehungen auf) , ohne, dass er per grünem Taster dazu gebracht wurde.
Und die Verzweigungen der if-Bendigungen führt dazu, dass die Abfrage der einzelnen Taster extrem langsam ist. So dass man zum Beispiel den roten oder grünen Taster lange drücken muss, damit der Tastendruck registriert wird (Kann das am Delay der Temperaturregelung liegen? Ein Delay pausiert ja ein komplettes Programm)

Viele Grüße,

Maschbau

Warte auf den Tastendruck
Wenn Tastendruck detektiert wurde dann
halte Temperatur durch ein/auschalten des Relais auf einem bestimmten Wert.<

Hallo Stefan,

Ja, so ungefähr.
Es würde alles damit anfangen, dass wenn der Tastendruck detektiert wurde, dass das Relais durchschalten soll, bis die Solltemperatur erreicht wurde. Erst danach soll er die Temperatur halten durch Ein/Ausschalten des Relais.

Viele Grüße,

Maschbau

Ja genau. Das liegt am delay()
Das delay hätte man besser

freeze_code_execution_completely_until_freezing_time_is_over()
nennen sollen.
Dann wird jeder daruf gestoßen was es macht und wegen des langen Namens will es keiner mehr verwenden

Habe ich es mir doch gedacht, dass das Programm noch mehr macht.
Damit der Code jeweils schnell auf einen Tastendruck reagiert muss der gesamte Code
nicht-blockierend programmiert werden.
Das bedeutet:
null delay()
null while-schleifen
0,1 for-schleifen (es gibt ein paar wenige Ausnahmen)

Die einzige Schleife die es gibt ist void loop() selbst.

void loop() läuft im Kreis und alles andere wird mit state-machines und if-bedingungen gemacht.

Auch für dein Programm lohnt es sich die Funktionsweise von state-machines zu erlernen weil eine state-machine die notwendige Anzahl-if-bedingungen minimiert.

Wie gut kannst du englisch?

Hallo Stefan,

da du das Thema nicht blockierende Programmierung anspricht. Sind Blockaden bei mir drin, die ich nicht erkenne?

Die einzige Schleife die es gibt ist void loop() selbst.<

Meinst du damit , dass in den loop selbst nur die Abfragen der Taster und der Temperatur stehen darf und dadurch dann auf die Unterfunktionen zugegriffen werden?

Was ich nicht ganz verstehe, warum der Schrittmotor einfach nach einer bestimmen Anzahl an Umdrehungen stoppt. Weist du was der Grund für dieses Verhalten ist? Eigentlich dürfte das meinem Verständis der Unterfunktion nach nicht passieren.

Wie gut kannst du englisch?<

Meine Englisch-Kenntisse sind gut.

Gibt es eine gute Anleitung für FSM? Ich habe noch nie damit gearbeitet, bin aber gewillt mich da sehr gerne reinzuarbeiten.

Viele Grüße,

Maschbau

Do solltest in regelmäßigen Abständen die Tastenkombination

Strg-T

benutzen um den Code automatisch formatieren zu lassen

Tutorial für non-blocking timing

Tutorial für state-machines

Aber vielleicht kommst du auch darum herum.
Dein Code macht ja ausser dem relais_heizung ein / aus im 5 Sekunden-Takt
nur Sachen die schnell abgearbeitet sind.

Hier eine Code-Version die im 5-Sekunden-Takt nicht-blockierend Heizung an / aus macht.
Sollte kompilieren muss es aber nicht.
Ich habe nicht alle deine libs installiert

//Notwendige Bibliotheken
#include <LiquidCrystal.h>
#include <thermistor.h>
#include <NTC_Thermistor.h>
#include <Ethernet.h>
#include <MobaTools.h>
#include <Bounce2.h>

//Display_Input
LiquidCrystal lcd(48, 49, 50, 51, 52, 53);

//Analog_Input
const int temperaturfuehler = A0;

//Temperaturfühler
#define Referenzwiderstand  100000
#define Nominalwiderstand   100000
#define Referenztemperatur  25
#define BWert               4267
#define min 15    //Temperaturminimun
#define max 60   //Temperaturmaximum
Thermistor*thermistor;

//Relais_OUTPUT
const int relais_bauteil = 4;
const int relais_hotend = 5;
const int relais_gehaeuse = 6;
const int relais_heizung = 7;

//Steppermotor_INPUT
const int steppermotor_enable = 15;
const int steppermotor_step = 19;
const int steppermotor_dir = 20;

//Taster_INPUT
const int TASTER_SCHWARZ = 8;
const int TASTER_ROT = 25;
const int TASTER_GELB = 27;
const int TASTER_GRUEN = 29;

MoToStepper myStepper( 200, STEPDIR);


unsigned long myTempTimer;
unsigned long tempIntervall = 5000;

void setup() {
  Serial.begin(115200);
  while (!Serial);
  Serial.println("Setup-Start");

  thermistor = new NTC_Thermistor(A0, 100000, 100000, 25, 4267); //Thermistor 104NT-4-R025H42G

  pinMode(TASTER_SCHWARZ,      INPUT_PULLUP);
  pinMode(TASTER_ROT,          INPUT_PULLUP);
  pinMode(TASTER_GELB,         INPUT_PULLUP);
  pinMode(TASTER_GRUEN,        INPUT_PULLUP);
  pinMode(relais_bauteil,      OUTPUT);
  pinMode(relais_hotend,       OUTPUT);
  pinMode(relais_gehaeuse,     OUTPUT);
  pinMode(relais_heizung,      OUTPUT);
  pinMode(temperaturfuehler,   INPUT_PULLUP);
  pinMode(steppermotor_enable, OUTPUT);
  pinMode(steppermotor_step,   OUTPUT);
  pinMode(steppermotor_dir,    OUTPUT);

  digitalWrite(steppermotor_enable, LOW);
  digitalWrite(relais_hotend,   LOW);
  digitalWrite(relais_bauteil,  HIGH);
  digitalWrite(relais_gehaeuse, HIGH);

  lcd.begin(16, 2);

  myStepper.attach(19, 20 );
  myStepper.attachEnable( 15, 100, LOW );
  myStepper.setSpeed( 600 );    // 60 Umdr/Min
}


void loop() {
  double celsius = thermistor->readCelsius(); //Temperatur auslesen
  lcd.setCursor(0, 0);
  lcd.print("Temp:");
  lcd.setCursor(6, 0);
  lcd.print(celsius);
  lcd.setCursor(12, 0);
  lcd.print("C/210C");


  if (digitalRead(TASTER_SCHWARZ) == LOW) {
    schwarz();
  }

  if (celsius >= max) {
    maxtemp();
    stepper_vor();
    stepper_halt();
  }

  if (digitalRead(TASTER_ROT) == LOW) {
    stepper_vor();
  }

  if (digitalRead(TASTER_GRUEN) == LOW) {
    stepper_halt();
  }

  if (digitalRead(TASTER_GELB) == LOW) {
    gelb();
  }
}


void schwarz() {
  double celsius = thermistor->readCelsius(); //Temperatur auslesen
  digitalWrite(relais_gehaeuse, HIGH);

  if (celsius < max ) {
    digitalWrite(relais_heizung, HIGH);
    stepper_halt();
  }
  else {
    digitalWrite(relais_heizung, LOW);
    stepper_vor();
  }
}


void maxtemp() {
  double celsius = thermistor->readCelsius(); //Temperatur auslesen

  // prüfe ob - seit dem letztem mal - mehr als tempIntervall Millisekunden vergangen sind
  if ( TimePeriodIsOver(myTempTimer, tempIntervall) ) {
    // wenn mehr als tempIntervall Millisekunden vergangen sind 
    // starte das intervall automatisch neu 
    // und führe den code in der If-bedingung aus
    
    if (digitalRead(relais_heizung) == LOW) { // wenn relais_heizung auf LOW steht
      digitalWrite(relais_heizung, HIGH);
    }
    else { // wenn relais_heizung auf HIGH steht 
      digitalWrite(relais_hotend, HIGH);
      digitalWrite(relais_heizung, LOW);
    }
  }
}


void stepper_vor() {
  double celsius = thermistor->readCelsius(); //Temperatur auslesen
  if (celsius >= max) {
    //digitalWrite(E_STEP_PIN, HIGH); // Motor an
    myStepper.rotate(1);
  }
  else {
    //digitalWrite(E_STEP_PIN, LOW// Motor aus
    myStepper.rotate(0);
  }
}


void stepper_halt() {
  double celsius = thermistor->readCelsius(); //Temperatur auslesen
  if (celsius >= max) {
    //digitalWrite(E_STEP_PIN, HIGH); // Motor an
    myStepper.rotate(0);
  }
}


void gelb() {
  digitalWrite(relais_heizung, LOW);
  digitalWrite(relais_gehaeuse, HIGH);
  digitalWrite(relais_hotend, HIGH);
  digitalWrite(relais_bauteil, LOW);
}


// easy to use helper-function for non-blocking timing
boolean TimePeriodIsOver (unsigned long &startOfPeriod, unsigned long TimePeriod) {
  unsigned long currentMillis  = millis();
  if ( currentMillis - startOfPeriod >= TimePeriod ) {
    // more time than TimePeriod has elapsed since last time if-condition was true
    startOfPeriod = currentMillis; // a new period starts right here so set new starttime
    return true;
  }
  else return false;            // actual TimePeriod is NOT yet over
}

vgs

Hallo Stefan,

vielen lieben Dank für deine Hilfe. Es haben sich durch den Timer alle vorherigen Probleme in Luft auflösen lassen. Der Ansprechen der Taster ist genau so, wie ich es mir gewünscht habe.

In deine zwei Dokumentationen werde ich mich heute Abend und morgen einlesen und sie versuche zu verstehen.

Nach meinem Verständis:
Die HIlfsfunktion "Timer" ist ja ne boolsche Variable, welche je nach Bedingung des Timers auf false oder true gesetzt wird und dann in dieser "Schleife" aus Bedingungen weiterläuft.

Jetzt meine Frage dazu:
Kann ich den Timer für bestimmte Unterfunktionen "deaktivieren" oder "killen"?
Er fängt nämlich an mir in meine Unterfunktion "gelb()" reinzuwirken. Das heisst, es wird über den gelben Tastendruck erstmal alles abgeschaltet und der Motor um eine Umdrehung zurückgedreht(so wie es erwünscht ist), aber dann fängt der Timer wieder an zu wirken und taktet wieder mein Relais an der Heizung.

Viele Grüße,

Maschbau

Kommt mir das nur so vor oder bist Du von nebenan hierher gewandert?
Wenn ja, was hat Dir an den Antworten nebenan nicht gefallen?

Gruß Tommy

Dann ist jetzt doch state-machine die Methode der Wahl.
Deine Anfangsbeschreibung oben hat das nicht zum Ausrduck gebracht, dass nach Druck auf Taste "gelb" das Heizen ausgeschaltet bleiben soll.

Und an der Stelle wird es jetzt auch ein Stück weit ärgerlich weil
du in dem anderen Thread eine Menge dazu erklärt hast so dass man ein genaueres Verständnis deines Programms haben könnte.

Aber dadurch dass du in einem anderen Forum einen neuen Thread gestartet hast fehlen diese Detail-Informationen.

Um da nicht immer wieder neue Überraschungen zu erleben solltest du gaaaanz dringend
erst mal eine vollständig detaillierte Ablaufbeschreibung erstellen.
Kann ja gerne ein Programmablaufplan sein.

vgs

Dieser Ablaufplan sollte alle möglichen Betriebszustände enthalten.

Wirklich alle.

Hallo Tommy,

ich werde das Cross-Posting in Zukunft sein lassen und mich auf ein Forum (respektive ein Thread) beschränken. Mir war nicht bewusst, dass die zwei Foren zusammenhängen.

Viele Grüße,

Maschbau

Hallo Stefan,

das sind (nach meinem Verständnis) alle Zustände des Programms, die nachher erfüllt werden sollen und durch das jeweilige Drücken der Taste erfüllt werden sollen.

Viele Grüße,

Maschbau

Programmablaufplan.pdf (65,5 KB)

Den PAP haben wir nebenan schon kritisiert. Er hat nichts geändert. Also beratungsresistent.

Gruß Tommy

Mach die keine Sorgen, die hängen nicht zusammen und du kannst dir dort die Informationen besorgen und verwerten wo du möchtst.

Richtig, aber die Leute in den Foren können auch entscheiden, wem sie helfen und wem nicht. Crossposter werden von mir nicht unterstützt, es sei denn, sie verlinken gleich von Anfang an beide Threads aufeinander.
Ich bin nicht der Einzige, der das so sieht.

Gruß Tommy

Ich helfe gerne.

Also der Ablaufplan enthält Ungereimtheiten
Wie kann denn etwas was gar keine Abfrage ist eine Antwort "nein" produzieren?
image

Wenn du solche Ablaufpläne zu kompliziert findest dann tut es auch eine verbale Beschreibung.
Die muss dann aber wirklich detailliert sein. Sonst fehlt ja wieder etwas.

Gern kannst Du das, das war ja nur meine persönliche Meinung zum Cross-/Multi-posting.

Gruß Tommy

Hallo Tommy,

ich habe doch den vor die bemängelten "Reset" nun auch so benannt.
Und die Bennenung von "Taster als Schalter" ist eine für mich gedachte Verständnisbrücke, damit ich für mich weis, dass der Tastendruck eine Unterfunktion starten soll und nicht, wie es zum Beispiel sehr oft bei Anfangsbeispielen mit LED gehandhabt wird, dass in einem solchen Fall die LED nur leuchtet, wenn der Taster gedückt ist und gedrückt gehalten wird.

Viele Grüße,

Maschbau