Go Down

Topic: einen Taster mehrfach verwenden? (Read 688 times) previous topic - next topic

agmue

#15
Jan 23, 2019, 05:58 pm Last Edit: Jan 24, 2019, 03:21 pm by agmue
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.

Code: [Select]

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));
  }
}
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

buffalo64

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....

Mahimus

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

Go Up