Go Down

Topic: 3 Leds ohne delay blinken lassen in bestimmter Reihenfolge. (Read 314 times) previous topic - next topic

hugolost

Nabend,

Habe folgenden Code:

Code: [Select]


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

uwefed


agmue

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

HotSystems

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.
I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

ardubu

Ich habe dir mal für die Led 10 ein Beispiel gemacht:
ersetze
Code: [Select]
digitalWrite(10, HIGH); // set the LED on
delay(100); //
digitalWrite(10, LOW); // set the LED on
delay(3000); //

durch
Code: [Select]
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

ElEspanol

Code: [Select]
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.

agmue

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  :)

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy