3 Leds ohne delay blinken lassen in bestimmter Reihenfolge.

Nabend,

Habe folgenden Code:

#include <Password.h> //http://playground.arduino.cc/uploads/Code/Password.zip //tells to use password library
#include <Keypad.h> //http://www.arduino.cc/playground/uploads/Code/Keypad.zip  //tells to use keypad library
Password password = Password( "11" ); //password to unlock, can be changed



const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {5, 6, 7, 8,};
byte colPins[COLS] = {2, 3, 4};

// Create the Keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  Serial.begin(9600);
  Serial.write(254);
  Serial.write(0x01);
  delay(100);
  pinMode(11, OUTPUT);  //Display Reset
  digitalWrite(11, HIGH);
  keypad.addEventListener(keypadEvent); //add an event listener for this keypad
  pinMode(12, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
    
  }


void loop()
{
  {
  keypad.getKey();
  }

digitalWrite(9, HIGH); // set the LED on
delay(100); // wait for a second
digitalWrite(9, LOW); // set the LED off
delay(100); // wait for a second
digitalWrite(12, HIGH); // set the LED on
delay(100); // wait for a second
digitalWrite(12, LOW); // set the LED on
delay(100); // wait for a second
digitalWrite(12, HIGH); // set the LED on
delay(100); //
digitalWrite(12, LOW); // set the LED on
delay(100); // wait for a second
digitalWrite(10, HIGH); // set the LED on
delay(100); //
digitalWrite(10, LOW); // set the LED on
delay(3000); //
}


  //take care of some special events
  void keypadEvent(KeypadEvent eKey){
  switch (keypad.getState()){
  case PRESSED:
  
  Serial.print("Enter:");
  Serial.println(eKey);
  delay(10);
  
  Serial.write(254);
  switch (eKey){
    case '3': checkPassword(); delay(1); break; //# beendet Code
    
    case '2': password.reset(); delay(1); break; //Ziffer sperrt Code und muss als erste Ziffer genutzt werden
    
     default: password.append(eKey); delay(1);
}
  }
  }

void checkPassword(){
  
if (password.evaluate()){  //if password is right open
    
    Serial.println("Accepted");
    Serial.write(254);delay(10);
    //Add code to run if it works

    digitalWrite(11, LOW);
    delay(80);
    digitalWrite(11, HIGH);
    
    
}
else
{
    Serial.println("Denied"); //if passwords wrong keep locked
    Serial.write(254);delay(10);
    //add code to run if it did not work
}
}

Das problem dabei ist das sich durch delay die Tasten (keypad.getKey()) nicht mehr abfragen lassen.

Ich möchte eigentlich nur in den bestehenden Loop eine LED Blinkfrequenz einbauen. 3 LEDs die in folgender Reihenfolge blinken sollen:

Rot
Weiß
Weiß
Blau

So das ich aber weiterhin die Tasten nutzen kann.

Grüße hugolost

P.S.: Das ganze wird hinterher ein Teil eines Escape Rooms.

hat schon jemand etwas von millis() geschrieben?

Wenn Du unbedingt darauf bestehst: Anleitung Ein Endlicher Automat entsteht mit Links am Ende, wobei mir der Wachmann gefällt.

Auch wenn ich mich wiederhole, es ist wirklich besser, wenn du die Grundlagen lernst.
In deinem vorherigen Thread mit obigem Post habe ich doch versucht dir dir zu erklären, wie es funktioniert.
Du must es nur anhand des Beispiels umsetzen.

Ich habe dir mal für die Led 10 ein Beispiel gemacht:
ersetze

digitalWrite(10, HIGH); // set the LED on
delay(100); //
digitalWrite(10, LOW); // set the LED on
delay(3000); //

durch

digitalWrite(10,(millis()%(100+3000))<100); //Led an Pin 10 geht für 100 ms an und für 3000 ms aus

das kannst du auch mit den anderen Led's machen

ardubu:

digitalWrite(10,(millis()%(100+3000))<100); 

//Led an Pin 10 geht für 100 ms an und für 3000 ms aus

Gute Codezeile, aber für den TE noch nicht ganz zielführend. Die LED soll ja ggf. nicht dauernd blinken.
Also noch mit Statusvariable verknüpfen, die High gemacht wird, wenn das Blinken anfangen soll. Selbige löst einen millis Timer aus und der deaktiviert die Statusvariable s, wenn er abgelaufen ist. Diese Variable kann man dan auch Nutzen, um z.B. die Eingabe zu sperren, solange die LED blinkt.

Edit: Ich habe mir den Code nochmals genauer angesehen. Schließe mich agmue an. Endlicher Automat. Und dessen Zustand zum verriegeln benutzen.

ElEspanol:
Edit: Ich habe mir den Code nochmals genauer angesehen. Schließe mich agmue an. Endlicher Automat. Und dessen Zustand zum verriegeln benutzen.

Das habe ich nur als Neujahrsgeschenk für Uwe geschrieben, war seine Idee :slight_smile: