Design-Herausforderung, Teil 2

vor 3 years 4 weeks
In Erwartung eines dicken Schecks, studierst gerade einen Karibik-Reisekatalog. Da klingelt das Telefon. Stimme: Hallo, hier ist Super Blink Spaß. Ihre Korrektur hat das Problem mit dem Fahrradlicht gelöst. Das Fahrradlicht funktioniert hervorragend. Leider blinkt es nicht. Wir sind aber das Super Blink Spaß Unternehmen. Können Sie das Licht zum Blinken bringen? Wir werden Ihnen dann nächste Woche den Scheck schicken. Vielen Dank, Auf Wiederhören Du denkst dir, was soll's, das kann ja nicht zu schwierig sein. Du veränderst den Sketch so, dass er wie der hier aussieht.
/* * Fahrradlicht Version 3.0, blinkend */ int led1Pin = 12; int led2Pin = 11; int led3Pin = 10; int led4Pin = 9; int led5Pin = 8;   int switchPin = 2; // Schalter ist mit Pin 2 verbunden int val; // Variable für den Pin Zustand int val2; // variable für den Prellstatus int buttonState; // Variable für den letzten Schalterzustand int lightMode = 0; // Ist das Licht an oder aus?     void setup() { pinMode(switchPin, INPUT); // Schalter-Pin ist Input pinMode(led1Pin, OUTPUT); pinMode(led2Pin, OUTPUT); pinMode(led3Pin, OUTPUT); pinMode(led4Pin, OUTPUT); pinMode(led5Pin, OUTPUT);   buttonState = digitalRead(switchPin); // Anfangszustand lesen }   void loop() { val = digitalRead(switchPin); // Eingabewert lesen und in val speichern delay(10); // 10 Millisekunden warten val2 = digitalRead(switchPin); // Eingabe noch einmal lesen if (val == val2) { // Unterscheiden sich die beiden Werte if (val != buttonState) { // Der Zustand des Schalters hat sich verändert if (val == LOW) { // Ist der Schalter gedrückt? if (lightMode == 0) { // Ist das Licht aus? lightMode = 1; // Licht einschalten! digitalWrite(led1Pin, HIGH); digitalWrite(led2Pin, HIGH); digitalWrite(led3Pin, HIGH); // Licht an! digitalWrite(led4Pin, HIGH); digitalWrite(led5Pin, HIGH);   delay(100);   digitalWrite(led1Pin, LOW); digitalWrite(led2Pin, LOW); digitalWrite(led3Pin, LOW); // Licht aus! digitalWrite(led4Pin, LOW); digitalWrite(led5Pin, LOW);   delay(100);   } else { lightMode = 0; // Licht ausschalten! // Es muss nichts mehr getan werden, weil das Licht am Ende // vom Blinken ausgeschaltet ist } } buttonState = val; // Zustand merken } } }
Du bist ganz stolz, weil du dich daran erinnert hast, dass die LEDs nicht mehr ausgeschaltet werden müssen, wenn der Sketch in den "Licht ausschalten!" Zweig betritt. Sie sind am Ende des Codes bereits aus, wenn lightMode gleich 1 ist. Übertrage diesen Sketch auf deinen Fahrradlicht-Prototypen und versuche ihn aus. Blitz Quiz
  • Funktioniert dieser Sketch richtig? Markiere den folgenden Text mit der Maus, um die Lösung zu sehen Nein!
  • Was macht er? Markiere den folgenden Text mit der Maus, um die Lösung zu sehen Wenn der Schalter zum Einschalten gedrückt wird, gibt es nur ein Blinken.
  • Verwende die println() Funktion und strenge dein Hirn an, warum dieser Sketch nicht funktioniert. Was passiert unmittelbar nachdem der Schalter zum Einschalten gedrückt wird? Was passiert, wenn die loop() Prozedur das nächste Mal durchlaufen wird? Markiere den folgenden Text mit der Maus, um die Lösung zu sehen In dem Moment, in dem der Schalter gedrückt wird, ist die Bedingung in der if Anweisung wahr und lightMode ändert sich von 0 (aus) auf 1 (an). Die LEDs leuchten für 100ms und sind dann 100ms aus. Beim nächsten Durchlauf der loop() Prozedur, ist die Bedingung in der if Anweisung falsch (der Zustand des Schalters hat sich nicht verändert) und der Code, der die LEDs blinken lassen sollte, kommt nicht zur Ausführung. Es kommt nur zu einem kurzen Blinken.
Die Falle hier ist, dass du die loop() Prozedur in zwei Teile aufgetrennt hast. Der erste Teil prüft den Schalter mit Entprellen und ob sich der Zustand des Schalters verändert hat. Falls ja, wird die lightMode Variable erwartungsgemäß verändert. Nachdem diese niedere Tätigkeit verrichtet ist, überprüft der nächste Teil die Variable lightMode und führt die entsprechende Aktion aus. Mehr nicht. Versuche das Problem zu lösen. Markiere den folgenden Text mit der Maus, um die Lösung zu sehen /* *  Fahrradlicht Version 3.1, blinkend */ int led1Pin = 12; int led2Pin = 11; int led3Pin = 10; int led4Pin = 9; int led5Pin = 8; int switchPin = 2;              // Schalter ist mit Pin 2 verbunden int val;                        // Variable für den Pin Zustand int val2;                       // variable für den Prellstatus int buttonState;                // Variable für den letzten Schalterzustand int lightMode = 0;              // Ist das Licht an oder aus? void setup() {   pinMode(switchPin, INPUT);          // Schalter-Pin ist Input   pinMode(led1Pin, OUTPUT);   pinMode(led2Pin, OUTPUT);   pinMode(led3Pin, OUTPUT);   pinMode(led4Pin, OUTPUT);   pinMode(led5Pin, OUTPUT);      buttonState = digitalRead(switchPin);   // Anfangszustand lesen } void loop() { val = digitalRead(switchPin);          // Eingabewert lesen und in val speichern delay(10);                             // 10 Millisekunden warten   val2 = digitalRead(switchPin);       // Eingabe noch einmal lesen   if (val == val2) {                   // Unterscheiden sich die beiden Werte     if (val != buttonState) {          // Der Zustand des Schalters hat sich verändert       if (val == LOW) {                // Ist der Schalter gedrückt?         if (lightMode == 0) {          // Ist das Licht aus?           lightMode = 1;               // Licht einschalten!         }         else {           lightMode = 0;               // Licht ausschalten!          // Es muss nichts mehr getan werden, weil das Licht am Ende          // vom Blinken ausgeschaltet ist         }       }       buttonState = val;                 // Zustand merken     }   }      // Jetzt das tun, was in lightMode steht   if (lightMode == 1) {           digitalWrite(led1Pin, HIGH);           digitalWrite(led2Pin, HIGH);           digitalWrite(led3Pin, HIGH); // Licht an!           digitalWrite(led4Pin, HIGH);           digitalWrite(led5Pin, HIGH);           delay(100);           digitalWrite(led1Pin, LOW);           digitalWrite(led2Pin, LOW);           digitalWrite(led3Pin, LOW);  // Licht aus!           digitalWrite(led4Pin, LOW);           digitalWrite(led5Pin, LOW);           delay(100);   }   // Wenn lightmode gleich 0 ist, muss nichts gemacht werden,   // da die LEDs bereits aus sind }

1 Antwort auf “Design-Herausforderung, Teil 2”


  1. Lutz (not verified) sagt:

    Hi, ich muss zugeben, das ich den Fehler eine ganze Zeit nicht gefunden habe. Jetzt wo ich lösung aber kenne, ist es wie mit allem, ganz einfach.

    Login or register to post comments