einen Taster mehrfach verwenden?

Hallo

Ich habe eine Frage zur mehrfachen Verwendung eines Tasters:

Ich möchte mit einem Taster einen Ablauf starten. Danach möchte ich diesen Taster anders verwenden, respektive um damit das Display umzuschalten (solange der Taster gedrückt ist, wird am Display etwas anderes angezeigt). Oder geht das nicht und bei jedem Tasterdruck wird der ursprüngliche Ablauf neu gestartet?

Ist dies überhaupt möglich bzw. falls ja, wie muss ich dies anlegen bzw. wonach suchen? Solange ich die Suchbegriffe "Taster" und "mehrfach" verwende, finde ich Lösungen zum Entprellen.

LG
Friedrich

Du möchtest einen einfachen "endlichen Automaten" bauen.

Ja, das ist möglich, wenn du dir in einer Variablen merkst, das der Ablauf schon gestartet wurde und du anschließend andere Funktionen starten möchtest.
Dabei ist natürlich auch ein entprellen nötig.
Du musst aber auch dabei berücksichtigen, dass dein Ablauf irgend wann durchgelaufen ist und wieder neu gestartet werden muss, da muss zuvor die Merker-Variable auch wieder gelöscht werden.

Ok, danke, hilft mir vorerst weiter.

@Dieter: das ist egal, denn nach dem kompletten Durchlauf ist die Sache erledigt und es wird mit dem Hauptschalter komplett abgeschaltet.

Da fällt mir in diesem Zusammenhang noch ein: ich möchte auch einen Aus-taster (Not-aus) einbauen. Soll ich diesen überhaupt über einen Port abfragen oder ist es einfacher, diesen als Reset auszuführen, da bei einem manuellen Abschalten ohnehin neu gestartet werden soll/ muss?

LG
Friedrich

Ein Notaus sollte immer unabhängig vom Prozessor funktionieren, also rein in Hardware realisiert sein z.B: Stromversorgung unterbrechen.

Gruß Tommy

Hallo,

schau dir mal die "one Buton" Lib an

Taster kurz drücken
Taster 2x kurz drücken
Taster Lang drücken

damit hast Du 3 Funktionen auf einemTaster , die Lib ist leicht verwendbar und Beispiele sind auch dabei.

@Tommy: da habe ich mich wohl etwas unglücklich ausgedrückt. Wie ein "richtiger" Not-Aus angeschlossen wird, weiß ich natürlich, auch, dass es ein Öffner sein muss wegen der Drahtbruchsicherheit. Ich möchte einfach nur in den Ablauf dahingehend eingreifen können, dass ich ihn stoppe und zum Anfang zurückkehre, nicht einfach nur pausieren. Darum die Frage, ob ich diesen Taster beim Reset anschließe. Außerdem habe ich noch einen Hauptschalter ca. 4cm daneben, falls Not am Mann ist. Richtlinien zur elektrotechnischen Sicherheit werden natürlich eingehalten.

@Rentner: danke, aber das wäre mit Kanonen auf Spatzen schließen, soviel benötige ich nicht.

LG
Friedrich

Allgemein gilt: Reset im Programm auszulösen soll nur von schlechter Programmierung ablenken.

Du kannst (fast) alle Abläufe auch gesteuert wieder auf einen definierten Zustand setzen.
Dazu musst Du das Problem aber konkret analysieren. Die allgemeinen Bemerkungen, die Du bisher abgegeben hast, genügen dazu nicht.

Gruß Tommy

Notaus:

dass ich ihn stoppe und zum Anfang zurückkehre,

Ein Notaus sollte die Anlage stoppen.
Alle Aktoren von der Steuerung abwerfen.
Die Anlage muss in einen sicheren Zustand fallen.
Gerne per Federspeicher oder Schwerkraft.

Ein "zum Anfang zurückkehren" wäre eine Aktivität, im Notaus Zustand.
Das verbietet sich in der Regel.

Man muss also wirklich und ernsthaft entscheiden, ob der Taster ein Notaus sein soll, oder ein einfaches Bedienelement der Steuerung.
In beiden Fällen hat das Bedienelement nichts am Resetpin zu suchen.

Allgemein gilt: Reset im Programm auszulösen soll nur von schlechter Programmierung ablenken.

In den meisten Fällen sicherlich richtig.
Auch wenn ich es anders formulieren würde.

Ok, ich hab's kapiert. Dachte nur, dass dies einfach ist und keinen Port belegt. Ist somit vergessen.

Nochmal: Notaus brauche ich nicht, da es keine sicherheitsrelevanten Probleme geben wird/ kann. Hatte mich nur unglücklich ausgedrückt.

LG
Friedrich

Notaus brauche ich nicht,

Also ein normales Bedienelement....

Dann:
Ich wiederhole mich gerne, für dich.

combie:
Du möchtest einen einfachen "endlichen Automaten" bauen.

combie:
...
Dann:
Ich wiederhole mich gerne, für dich.

Danke schön, dann sehe ich mir die Tutorials von agmue mal durch, die sind mir gerade ins Auge gehüpft...

buffalo64:
Danke schön, dann sehe ich mir die Tutorials von agmue mal durch, die sind mir gerade ins Auge gehüpft...

Die sind schon etwas angestaubt, ich habe sie immer entsprechend meines Kenntnisstandes geschrieben. Mit "agmue anleitung" als Suche im Forum zu finden. Bitte auch die Links zu anderen Autoren beachten, die haben es manchmal besser gemacht.

agmue:
Die sind schon etwas angestaubt, ......

Passt schon, ich auch :wink:

Ich habe es jetzt mit If-Abfragen und einer Schleife gelöst. Millis brauche ich dann aber an anderer Stelle auch, so wie jetzt ist für mich übersichtlich.
Kann man das so machen oder ist das programmtechnisch "schlecht"?

[code]
bool Run = 0;                            
int START = 7;
int Rot = 9;
int Gelb = 10;
int Gruen = 11;


void setup() {
  pinMode (Rot, OUTPUT);
  pinMode (Gelb, OUTPUT);
  pinMode (Gruen, OUTPUT);
  pinMode (START, INPUT_PULLUP);

  Serial.begin(9600);

}

void loop()
{
  Serial.println(Run);
  

  if (digitalRead(START) == LOW){
    Run = 1;
  }

  if (Run == 1){
    
    for (int i = 0; i < 1001; i++) {
      Serial.println(i);
      Serial.println();

      digitalWrite(Gelb, HIGH);
      digitalWrite(Gruen, HIGH);
      digitalWrite(Rot, LOW);


      if (digitalRead(START) == LOW) {
          digitalWrite(Gruen, LOW);
          digitalWrite(Rot, HIGH);
      }
  
      if (i == 1000)
      {
          Run = 0;
      }

    }
  }
  else {
    digitalWrite(Gelb, LOW);
    digitalWrite(Rot, LOW);
    digitalWrite(Gruen, LOW);
  }

  
}

[/code]

buffalo64:
Kann man das so machen oder ist das programmtechnisch "schlecht"?

"Ein Programm, das tut, was es soll, ist ein gutes Programm!" hat mir mal jemand geschrieben, das gebe ich weiter.

Aber Luft nach oben sehe ich schon. Konstanten sollten keinen kostbaren Variablenspeicher verschwenden und die Logik kann noch etwas bereinigt werden.

Eigentliches Problem ist aber die blockierende for-Schleife, die andere Aktivitäten verhindert. Mit einer blinkenden LED habe ich das mal verdeutlicht. So eine "Herzschlag-LED" sollte man anfangs immer einbauen, um Blockaden zu erkennen. Außerdem ist die Baudrate Zeitgeber für die Schleife.

bool Run = 0;
const byte START = 7;
const byte Rot = 9;
const byte Gelb = 10;
const byte Gruen = 11;
uint16_t jetzt, blinkMillis;

void setup() {
  pinMode (START, INPUT_PULLUP);
  pinMode (Rot, OUTPUT);
  pinMode (Gelb, OUTPUT);
  pinMode (Gruen, OUTPUT);
  pinMode (LED_BUILTIN, OUTPUT);

  Serial.begin(9600);
}

void loop()
{
  jetzt = millis();
  Serial.println(Run);

  if (Run == 1) {

    for (int i = 0; i < 1001; i++) {
      Serial.print(i);
      Serial.println("  Schleife");
      digitalWrite(Gelb, HIGH);
      if (!digitalRead(START)) {
        digitalWrite(Gruen, LOW);
        digitalWrite(Rot, HIGH);
      } else {
        digitalWrite(Gruen, HIGH);
        digitalWrite(Rot, LOW);
      }
    }
    Run = 0;
  } else {
    digitalWrite(Gelb, LOW);
    digitalWrite(Rot, LOW);
    digitalWrite(Gruen, LOW);
    if (!digitalRead(START)) {
      Run = 1;
    }
  }

  if (jetzt - blinkMillis >= 200) {
    blinkMillis = jetzt;
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  }
}

Danke für deine Hilfe.

Die for-Schleife ist nur zum Testen, weil es für mich schneller gegangen ist. Ich wollte hier nur testen, ob das mit der mehrfachen Verwendung des Tasters (Gelb dauerhaft während des Zyklus, der mit dem Taster gestartet wird und mit dem selben Taster dann zwischen rot und grün umschalten) mittels der if-Anweisungen funktioniert.
In meinem Sketch verwende ich dann die millis-Funktion für den Zyklus, aber diese ist für mich noch nicht so einfach zu durchschauen, das kommt noch....

Das mit dem Reset-Schalter seh ich etwas pragmatischer: Wenn er genau das macht was du willst, dann nutz ihn doch als Bedienelement.