Timer mit LCD, Ziffernblock und RFID

Hallo, ich bin noch ganz neu in der arduino szene und hoffe das ich hier richtig bin, denn ich habe leider keine brauchbare Anleitung gefunden.

Ich bin in der Airsoftszene sehr aktiv und hab mir überlegt eine Bombenattrappe zu bauen. Man sollte über einen Ziffernblock die Zeit eintippen können welche über ein LCD angezeigt wird. Wenns möglich ist, wäre auch noch toll wenn man 3 kabel hätte welche man austecken kann um das entschärfen zu simulieren.
Löten ist kein Problem.

MFG

Hallo Motz1711, willkommen im Forum!

Dein Projekt ist mit einem Arduino sicher umsetzbar.

Es wird wahrscheinlich nötig sein, die Aufgabe in kleine Teilschritte zu zerlegen.
Zum Beispiel:
LDC-Anzeige - Countdown (Ausgangspunkt z.B. hier: http://playground.arduino.cc/Code/LCD )
Ziffernblock zur Eingabe der Zeit (z.B. hier: http://playground.arduino.cc/Main/KeypadTutorial )
und so weiter

und dann nach und nach alles so kombinieren, wie du es brauchst.

Wenn du konkretere Fragen hast, kann dir hier im Forum sicher geholfen werden - komplett fix Fertiges gibt es hier aber eher selten :slight_smile:

Wünsche gutes Werken!

Hallo, ich habe ein kleines Problem mit dem Code.
ich bekomme das tastenfeld einfach nicht zum laufen.
bei gewissen tasten reagiert das display dann mit einem wirrwarr aus buchstaben und symbolen.

vielleicht könnte sich einer von euch mal den code anschauen.
danke im vorraus

#include <Keypad.h>
#include <LiquidCrystal.h>
#include <Tone.h>
#define pound 14

Tone tone1;

int Scount = 12; // count seconds
int Mcount = 10; // count minutes
int Hcount = 0; // count hours
int DefuseTimer = 0; // set timer to 0

long secMillis = 0; // store last time for second add
long interval = 1000; // interval for seconds

char password[4]; // number of characters in our password
int currentLength = 0; //defines which number we are currently writing
int i = 0; 
char entered[4];

int ledPin = 4; //red led
int ledPin2 = 3; //yellow led
int ledPin3 = 2; //green led

LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // the pins we use on the LCD

//replace these lines in the code when u have a 4x4 instead of 3x4 keypad.

//and add a cable to pin 6 which is pin 1 on the keypad.

const byte ROWS = 4; //four rows

const byte COLS = 4; //four columns

char keys[ROWS][COLS] = {

{'1','2','3','A'},

{'4','5','6','B'},

{'7','8','9','C'},

{'*','0','#','D'}

};

byte rowPins[ROWS] = {A0, 5, A1, A2}; //connect to the row pinouts of the keypad

byte colPins[COLS] = {A3, A4, A5, 6}; //connect to the column pinouts of the keypad

//Pins 8, 7, 6, 5 on the keypad should be connected to digital pins A0, 5, A1, A2 on //the Arduino.

//Pins 4, 3, 2, 1 on the keypad should be connected to digital pins A3, A4, A5, 6 on //the Arduino.

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


void setup(){
 pinMode(ledPin, OUTPUT); // sets the digital pin as output
 pinMode(ledPin2, OUTPUT); // sets the digital pin as output
 pinMode(ledPin3, OUTPUT); // sets the digital pin as output
 tone1.begin(9);
 lcd.begin(16, 2);
 Serial.begin(9600);
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("Enter Code: ");
 while (currentLength < 4)
 {
   lcd.setCursor(currentLength + 6, 1);
   lcd.cursor();
   char key = keypad.getKey();
   key == NO_KEY;
   if (key != NO_KEY)
   {
     if ((key != '*')&&(key != '#'))
     { 
     lcd.print(key);
     password[currentLength] = key;
     currentLength++;
     tone1.play(NOTE_C6, 200);
     }
   }
 }

 if (currentLength == 4)
 {
   delay(500);
   lcd.noCursor();
   lcd.clear();
   lcd.home();
   lcd.print("You've Entered: ");
   lcd.setCursor(6,1);
   lcd.print(password[0]);
   lcd.print(password[1]);
   lcd.print(password[2]);
   lcd.print(password[3]);

   tone1.play(NOTE_E6, 200);
   delay(3000);
   lcd.clear();
   currentLength = 0;
 }
}

void loop()
{
 timer();
 char key2 = keypad.getKey(); // get the key
 
 if (key2 == '*')
   {
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("Code: ");
     
     while (currentLength < 4)
       {
         
         timer();
         
         char key2 = keypad.getKey(); 
         if (key2 == '#')
           {
             currentLength = 0;
             lcd.clear();
             lcd.setCursor(0,0);
             lcd.print("Code: ");
           }
         else                  
         if (key2 != NO_KEY)    
           {
             
             lcd.setCursor(currentLength + 7, 0);
             lcd.cursor();
             
             lcd.print(key2);
             entered[currentLength] = key2;
             currentLength++;
             tone1.play(NOTE_C6, 200);
             delay(100);
             lcd.noCursor();
             lcd.setCursor(currentLength + 6, 0);
             lcd.print("*");
             lcd.setCursor(currentLength + 7, 0);
             lcd.cursor();
           }
       }

     if (currentLength == 4) 
       {
         if (entered[0] == password[0] && entered[1] == password[1] && entered[2] == password[2] && entered[3] == password[3])
           {
             lcd.noCursor();
             lcd.clear();
             lcd.home();
             lcd.print("Bomb Defused");
             currentLength = 0;
             digitalWrite(ledPin3, HIGH);
             delay(2500);
             lcd.setCursor(0,1);
             lcd.print("Reset the Bomb");
             delay(1000000);
           }
     else
       {
         lcd.noCursor();
         lcd.clear();
         lcd.home();
         lcd.print("Wrong Password!");
   
         if (Hcount > 0)
           {
             Hcount = Hcount - 1;
           }
   
         if (Mcount > 0)
           {
             Mcount = Mcount - 59;
           }
         if (Scount > 0)
           {
             Scount = Scount - 59;
           }
       delay(1500);
       currentLength = 0;
 
       }
     }  
   }
}

void timer()
{
 Serial.print(Scount);
 Serial.println();
 
 if (Hcount <= 0)
 {
   if ( Mcount < 0 )
   {
     lcd.noCursor();
     lcd.clear();
     lcd.home();
     lcd.print("The Bomb Has ");
     lcd.setCursor (0,1);
     lcd.print("Exploded!");
     
     while (Mcount < 0) 
     {
       digitalWrite(ledPin, HIGH); // sets the LED on
       tone1.play(NOTE_A2, 90);
       delay(100); 
       digitalWrite(ledPin, LOW); // sets the LED off
       tone1.play(NOTE_A2, 90);
       delay(100); 
       digitalWrite(ledPin2, HIGH); // sets the LED on
       tone1.play(NOTE_A2, 90);
       delay(100); 
       digitalWrite(ledPin2, LOW); // sets the LED off
       tone1.play(NOTE_A2, 90);
       delay(100); 
       digitalWrite(ledPin3, HIGH); // sets the LED on
       tone1.play(NOTE_A2, 90);
       delay(100); 
       digitalWrite(ledPin3, LOW); // sets the LED off
       tone1.play(NOTE_A2, 90);
       delay(100);
     }
   } 
 }

 lcd.setCursor (0,1); // sets cursor to 2nd line
 lcd.print ("Timer:");

 if (Hcount >= 10)
   {
     lcd.setCursor (7,1);
     lcd.print (Hcount);
   }
 if (Hcount < 10) 
   {
     lcd.setCursor (7,1);
     lcd.write ("0");
     lcd.setCursor (8,1);
     lcd.print (Hcount);
   }

 lcd.print (":");

 if (Mcount >= 10)
   {
     lcd.setCursor (10,1);
     lcd.print (Mcount);
   }
 if (Mcount < 10) 
   {
     lcd.setCursor (10,1);
     lcd.write ("0");
     lcd.setCursor (11,1);
     lcd.print (Mcount);
   }
   
 lcd.print (":");

 if (Scount >= 10) 
   {
     lcd.setCursor (13,1);
     lcd.print (Scount);
   }
 if (Scount < 10) 
   {
     lcd.setCursor (13,1);
     lcd.write ("0");
     lcd.setCursor (14,1);
     lcd.print (Scount);
   }

 if (Hcount <0) 
   {
     Hcount = 0; 
   }

 if (Mcount <0) 
   {
     Hcount --; 
     Mcount = 59; 
   }

 if (Scount <1) // if 60 do this operation
   {
     Mcount --; // add 1 to Mcount
     Scount = 59; // reset Scount
   }

 if (Scount > 0) // do this oper. 59 times
   {
     unsigned long currentMillis = millis();
 
     if(currentMillis - secMillis > interval) 
       {
         tone1.play(NOTE_G5, 200);
         secMillis = currentMillis;
         Scount --; // add 1 to Scount
         digitalWrite(ledPin2, HIGH); // sets the LED on
         delay(10); // waits for a second
         digitalWrite(ledPin2, LOW); // sets the LED off
         delay(10); // waits for a second
         //lcd.clear();
       }
   }
}

könntest du deinen Sketch bitte in code tags (< > oben links setzen)
beim kurzen Überfliegen deines Sketches ist mir aufgefallen das du die Pin’s D5 + D6 zweimal verwendest.
Einmal für’s LCD und einmal für’s Keypad

So ist jetzt glaub ich besser :slight_smile:
also das bedeutet das ein arduino keine Doppelbelegung erkennt. das ist gut zu wissen. Danke

Motz1711:
also das bedeutet das ein arduino keine Doppelbelegung erkennt. das ist gut zu wissen. Danke

Doch ein Arduino-Board kennt auch Falschverkabelung und Kurzschlüsse. Je nachdem, was Du dabei falsch machst und per Kurzschlussleitung miteinander verbindet, passiert entweder nichts (z.B. wenn zwei Eingänge miteinander kurzgeschlossen werden), oder wenn Du zwei Ausgänge mit entgegengesetzten Pegel zusammenschließt, dann fließt ein unzulässig hoher Strom in Deiner Schaltung, was zur Beschädigung von Bauteilen, bis zum Durchbrennen und zur Abgabe von “Verbrennungsgeruch” oder “Rauch” führen kann.

Also Dein Arduino “erkennt” Falschverkabelung der Hardware schon, und reagiert darauf mit Fehlfunktion, Überstrom und ggf. durch Abgabe von Schmorgeruch oder sogar kleinen Rauchwölkchen. Nachdem der Rauch raus ist, erkennt der Arduino aber dann ggf. gar nichts mehr, also auch keine korrigierte Verkabelung und womöglich auch nicht, dass Du einen neuen Sketch hochladen möchtest.

Einen Countdown-Timer mit LCD und drei Einstelltasten hatte ich hier mal gepostet:

Das ist allerdings ein “Belichtungstimer”, der nur zwei Betriebsarten kennt: Einstellen (bei stehender Uhr) und Countdown.

Geschaltet wird in dem Sketch allerdings gar nichts. Nur entweder die Zeit eingestellt oder der Countdown rückwärts gezählt, und dabei der jeweilige Stand der Zeit auf einem LCD angezeigt.

Mehr oder weniger also eine Demonstration der strukturierten Programmierung nach dem EVA-Prinzip:

  • E ingabe
  • V erarbeitung
  • A usgabe

Und zum Einstellen gibt es einfach nur zwei Tasten, wobei man die eingestellte Countdown-Zeit durch Tastendruck entweder um 10 Sekunden erhöhen oder verringern kann. Auch komplexere Programme kann man so aufbauen, dass sie mit derselben loop-Funktion funktionieren:

void loop() 
{
  eingabe();
  verarbeitung();
  ausgabe();
}

Aber egal, ob Du ein einfaches oder ein komplexes Programm auf dem Arduino ablaufen lassen möchtest: Es wäre wichtig, zuerst die Hardware korrekt anzuschließen, ohne durch Falschanschluß von Hardware unerwünschte Kurzschlussverbindungen herzustellen. Denn ohne eine korrekt angeschlossene Hardware kannst Du jedes Softwareprogramm vergessen.

So ist jetzt glaub ich besser :slight_smile:

Ja, erheblich besser. Jetzt habe ich gerade gesehen, das du den Pin 4 auch 2 mal verwendest. Fur secMillis solltest du unsignet long verwenden, für intervall=1000 kanst du auch const int nehmen.

Scount --; // add 1 to Scount

hier wird Scount um 1 vekleinert.

delay(10); // waits for a second

hier werden nur 10 ms Pause gemacht

So da mir der uno zu wenig anschlüsse hatte , hab ich mir jetzt einen Mega geholt.

ich hab den code weitestgehend geändert, dass er jetzt im grunde funktioniert.

#include <Keypad.h>
#include <LiquidCrystal.h>
#include <Tone.h>
#define pound 14

Tone tone1;

int Scount = 12; // count seconds
int Mcount = 10; // count minutes
int Hcount = 0; // count hours
int DefuseTimer = 0; // set timer to 0

long secMillis = 0; // store last time for second add
long interval = 1000; // interval for seconds

char password[4]; // number of characters in our password
int currentLength = 0; //defines which number we are currently writing
int i = 0; 
char entered[4];

int ledPin = 4; //red led
int ledPin2 = 3; //yellow led
int ledPin3 = 2; //green led

LiquidCrystal lcd(7, 8, 10, 11, 12, 13); // the pins we use on the LCD

//replace these lines in the code when u have a 4x4 instead of 3x4 keypad.

//and add a cable to pin 6 which is pin 1 on the keypad.

const byte ROWS = 4; //four rows

const byte COLS = 4; //four columns

char keys[ROWS][COLS] = {

{'1','2','3','A'},

{'4','5','6','B'},

{'7','8','9','C'},

{'*','0','#','D'}

};

byte rowPins[ROWS] = {A0, 5, A1, A2}; //connect to the row pinouts of the keypad

byte colPins[COLS] = {A3, A4, A5, 6}; //connect to the column pinouts of the keypad

//Pins 8, 7, 6, 5 on the keypad should be connected to digital pins A0, 5, A1, A2 on //the Arduino.

//Pins 4, 3, 2, 1 on the keypad should be connected to digital pins A3, A4, A5, 6 on //the Arduino.

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


void setup(){
  pinMode(ledPin, OUTPUT); // sets the digital pin as output
  pinMode(ledPin2, OUTPUT); // sets the digital pin as output
  pinMode(ledPin3, OUTPUT); // sets the digital pin as output
  tone1.begin(9);
  lcd.begin(16, 2);
  Serial.begin(9600);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Code eingeben: ");
  while (currentLength < 4)
  {
    lcd.setCursor(currentLength + 6, 1);
    lcd.cursor();
    char key = keypad.getKey();
    key == NO_KEY;
    if (key != NO_KEY)
    {
      if ((key != '*')&&(key != '#'))
      { 
      lcd.print(key);
      password[currentLength] = key;
      currentLength++;
      tone1.play(NOTE_C6, 200);
      }
    }
  }

  if (currentLength == 4)
  {
    delay(500);
    lcd.noCursor();
    lcd.clear();
    lcd.home();
    lcd.print("Der Code lauted: ");
    lcd.setCursor(6,1);
    lcd.print(password[0]);
    lcd.print(password[1]);
    lcd.print(password[2]);
    lcd.print(password[3]);

    tone1.play(NOTE_E6, 200);
    delay(3000);
    lcd.clear();
    currentLength = 0;
  }
}

void loop()
{
  timer();
  char key2 = keypad.getKey(); // get the key
  
  if (key2 == '*')
    {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Code: ");
      
      while (currentLength < 4)
        {
          
          timer();
          
          char key2 = keypad.getKey(); 
          if (key2 == '#')
            {
              currentLength = 0;
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print("Code: ");
            }
          else                  
          if (key2 != NO_KEY)    
            {
              
              lcd.setCursor(currentLength + 7, 0);
              lcd.cursor();
              
              lcd.print(key2);
              entered[currentLength] = key2;
              currentLength++;
              tone1.play(NOTE_C6, 200);
              delay(100);
              lcd.noCursor();
              lcd.setCursor(currentLength + 6, 0);
              lcd.print("*");
              lcd.setCursor(currentLength + 7, 0);
              lcd.cursor();
            }
        }

      if (currentLength == 4) 
        {
          if (entered[0] == password[0] && entered[1] == password[1] && entered[2] == password[2] && entered[3] == password[3])
            {
              lcd.noCursor();
              lcd.clear();
              lcd.home();
              lcd.print("Bombe");
              lcd.setCursor (0,1);
              lcd.print("entschaerft!"); 
              currentLength = 0;
              digitalWrite(ledPin3, HIGH);
              delay(2500);
              lcd.setCursor(0,1);
              lcd.print("Bombe reseten");
              delay(1000000);
            }
      else
        {
          lcd.noCursor();
          lcd.clear();
          lcd.home();
          lcd.print("Falsches");
          lcd.setCursor (0,1);
          lcd.print("Passwort!"); 
             
          if (Hcount > 0)
            {
              Hcount = Hcount - 1;
            }
    
          if (Mcount > 0)
            {
              Mcount = Mcount - 59;
            }
          if (Scount > 0)
            {
              Scount = Scount - 59;
            }
        delay(1500);
        currentLength = 0;
  
        }
      }  
    }
}

void timer()
{
  Serial.print(Scount);
  Serial.println();
  
  if (Hcount <= 0)
  {
    if ( Mcount < 0 )
    {
      lcd.noCursor();
      lcd.clear();
      lcd.home();
      lcd.print("Die Bombe ist ");
      lcd.setCursor (0,1);
      lcd.print("Explodiert!");
      
      
      while (Mcount < 0) 
      {
        digitalWrite(ledPin, HIGH); // sets the LED on
        tone1.play(NOTE_A2, 90);
        delay(100); 
        digitalWrite(ledPin, LOW); // sets the LED off
        tone1.play(NOTE_A2, 90);
        delay(100); 
        digitalWrite(ledPin2, HIGH); // sets the LED on
        tone1.play(NOTE_A2, 90);
        delay(100); 
        digitalWrite(ledPin2, LOW); // sets the LED off
        tone1.play(NOTE_A2, 90);
        delay(100); 
        digitalWrite(ledPin3, HIGH); // sets the LED on
        tone1.play(NOTE_A2, 90);
        delay(100); 
        digitalWrite(ledPin3, LOW); // sets the LED off
        tone1.play(NOTE_A2, 90);
        delay(100);
      }
    } 
  }

  lcd.setCursor (0,1); // sets cursor to 2nd line
  lcd.print ("Timer:");

  if (Hcount >= 10)
    {
      lcd.setCursor (7,1);
      lcd.print (Hcount);
    }
  if (Hcount < 10) 
    {
      lcd.setCursor (7,1);
      lcd.write ("0");
      lcd.setCursor (8,1);
      lcd.print (Hcount);
    }

  lcd.print (":");

  if (Mcount >= 10)
    {
      lcd.setCursor (10,1);
      lcd.print (Mcount);
    }
  if (Mcount < 10) 
    {
      lcd.setCursor (10,1);
      lcd.write ("0");
      lcd.setCursor (11,1);
      lcd.print (Mcount);
    }
    
  lcd.print (":");

  if (Scount >= 10) 
    {
      lcd.setCursor (13,1);
      lcd.print (Scount);
    }
  if (Scount < 10) 
    {
      lcd.setCursor (13,1);
      lcd.write ("0");
      lcd.setCursor (14,1);
      lcd.print (Scount);
    }

  if (Hcount <0) 
    {
      Hcount = 0; 
    }

  if (Mcount <0) 
    {
      Hcount --; 
      Mcount = 59; 
    }

  if (Scount <1) // if 60 do this operation
    {
      Mcount --; // add 1 to Mcount
      Scount = 59; // reset Scount
    }

  if (Scount > 0) // do this oper. 59 times
    {
      unsigned long currentMillis = millis();
  
      if(currentMillis - secMillis > interval) 
        {
          tone1.play(NOTE_G5, 200);
          secMillis = currentMillis;
          Scount --; // add 1 to Scount
          digitalWrite(ledPin2, HIGH); // sets the LED on
          delay(10); // waits for a second
          digitalWrite(ledPin2, LOW); // sets the LED off
          delay(10); // waits for a second
          //lcd.clear();
        }
    }
}

Ich würde allerdings den Code im vorhinein festlegen, den Timer auf 30min erhöhen und die code eingabe direkt ermöglichen ohne vorher * drücken zu müssen.

Ich wäre euch sehr dankbar, da ich beim codieren nicht so ganz durchblicke.

Motz1711:
So da mir der uno zu wenig anschlüsse hatte , hab ich mir jetzt einen Mega geholt.

Das verstehe ich nicht. Du brauchst 8 Pins (4+4) für Dein Keypad und 6 Pins für das LCD, sowie einen Pin für akustische Ausgabe, das macht nach meiner Rechnung 15 Pins. Ein UNO hat 20 Pins, von denen Du 18 (ohne Pin-0/1, die für Serial verwendet werden) verwenden kannst.

Du kannst nämlich auch die analogen Pins A0 bis A5 genau wie digitale Pins verwenden.

Von Deiner Beschreibung her sehe ich keine Notwendigkeit für einen MEGA.

Motz1711:
Ich würde allerdings den Code im vorhinein festlegen, den Timer auf 30min erhöhen und die code eingabe direkt ermöglichen ohne vorher * drücken zu müssen.

Dass der Code das Startzeichen nicht verwendet, kann man machen, allerdings besteht dann unter Umständen die Gefahr, dass bei 30 Minuten Spieldauer folgendes passiert:

a) jemand kommt und tippt zwei falsche Ziffern ein
b) jemand kommt und tippt den richtigen Code ein
c) Ergebnis: Tatsächlich eingegeben wurden falsche zwei Ziffern plus der richtige Code

Also wenn der richtige Code mal angenommen 470815 wäre, aber anfänglich gibt jemand 12 ein und dann nichts weiter, dann kommt danach jemand und gibt 470815 ein, dann bekommst Du am Ende eine Eingabe
12470815
und dann?

Wenn jede Eingabe aus Startzeichen * und Abschlusszeichen # besteht, würde das Startzeichen * jedesmal die komplette Eingabe löschen und es könnte mit der Codeeingabe neu begonnen werden. Genauso wenn sich jemand nach der dritten Ziffer vertippt. Er tippt:
4700
Wenn es ein Startzeichen gäbe, würde er unmittelbar nach dem Vertipper einfach wieder das Startzeichen tippen und neu mit der Codeeingabe anfangen können.

Aber diese Fälle können bei Dir nicht vorkommen?

  • jemand tippt falsche Ziffern ein und beendet die Codeeingabe nicht
  • jemand vertippt sich bei der Codeeingabe
    Egal?

Oder siehst Du irgendeine andere Möglichkeit vor für "Lösche das zuletzt eingegebene Zeichen" oder "Fange mit der Eingabe komplett neu an"?

jurs:
Das verstehe ich nicht. Du brauchst 8 Pins (4+4) für Dein Keypad und 6 Pins für das LCD, sowie einen Pin für akustische Ausgabe, das macht nach meiner Rechnung 15 Pins. Ein UNO hat 20 Pins, von denen Du 18 (ohne Pin-0/1, die für Serial verwendet werden) verwenden kannst.

Es bleibt aber nicht dabei, ich möchte noch einen G-Sensor und ein (ich nenns einfach) NFC-Modul verbauen. deswegen der Mega.

Dass der Code das Startzeichen nicht verwendet, kann man machen, allerdings besteht dann unter Umständen die Gefahr, dass bei 30 Minuten Spieldauer folgendes passiert:

a) jemand kommt und tippt zwei falsche Ziffern ein
b) jemand kommt und tippt den richtigen Code ein
c) Ergebnis: Tatsächlich eingegeben wurden falsche zwei Ziffern plus der richtige Code

Das sind alles sehr gute Einwände die ich nicht bedacht habe, danke fürs drauf Aufmerksam machen.

Dann lasse ich das mit Startzeichen drin.
Ist es möglich die Zeit bei falsch Eingabe zu beschleunigen? wenn ja wie?
Es tut mir Leid das ich so viele fragen stelle, aber in Sachen Programmieren hab ich einfach ein Brett vorm Kopf.

Motz1711:
Ist es möglich die Zeit bei falsch Eingabe zu beschleunigen? wenn ja wie?

Du kannst natürlich den Countdown-Zähler auch dahingehend manipulieren, dass er die Zeit falsch herunterzählt. Also dass beispielsweise fünf Sekunden von 3:05 auf 3:00 schon innerhalb von zwei Sekunden herunterlaufen. Das mußt Du Dir nur genau überlegen, wie es laufen soll - und genau das dann programmieren.

Also beispielsweise bei Falscheingabe das Zählintervall herabsetzen:
Normal ==> Alle 1000 ms um eine Sekunde herunterzählen
Beschleunigt ==> Alle 900 ms um eine Sekunde herunterzählen
Doppelte Zählgeschwindigkeit ==> Alle 500 ms um eine Sekunde herunterzählen

Oder wie auch immer Du Dir das überlegst.

Wäre es vielleicht möglich dass mir jemand diesen code

#include <SPI.h>

#include <MFRC522.h>

#define SS_PIN 53

#define RST_PIN 4

MFRC522 mfrc522(SS_PIN, RST_PIN);

 

void setup ()

{

Serial.begin(9600);

SPI.begin();

MFRC522.PCD_Init();

pinMode (2, OUTPUT);

}

 

void loop()

{

if ( ! mfrc522.PICC_IsNewCardPresent())

{

return;

}

 

if ( ! mfrc522.PICC_ReadCardSerial())

{

return;

}

 

long code=0;

for (byte i = 0; i < mfrc522.uid.size; i++)

 

 

{

code=((code+mfrc522.uid.uidByte[i])*10);

}

 

 

 

 

Serial.print("Die Kartennummer lautet:");

Serial.println(code);

 

if (code==1031720)

{

digitalWrite (2, HIGH);

delay (5000);

digitalWrite (2, LOW);

}

 

}

in diesen hier

#include <Keypad.h>
#include <LiquidCrystal.h>
#include <Tone.h>
#define pound 14

Tone tone1;

int Scount = 00; // count seconds
int Mcount = 30; // count minutes
int Hcount = 0; // count hours
int DefuseTimer = 0; // set timer to 0

long secMillis = 0; // store last time for second add
long interval = 1000; // interval for seconds

char password[4]; // number of characters in our password
int currentLength = 0; //defines which number we are currently writing
int i = 0; 
char entered[4];

int ledPin = 4; //red led
int ledPin2 = 3; //yellow led
int ledPin3 = 2; //green led

LiquidCrystal lcd(7, 8, 10, 11, 12, 13); // the pins we use on the LCD

//replace these lines in the code when u have a 4x4 instead of 3x4 keypad.

//and add a cable to pin 6 which is pin 1 on the keypad.

const byte ROWS = 4; //four rows

const byte COLS = 4; //four columns

char keys[ROWS][COLS] = {

{'1','2','3','A'},

{'4','5','6','B'},

{'7','8','9','C'},

{'*','0','#','D'}

};

byte rowPins[ROWS] = {A0, 5, A1, A2}; //connect to the row pinouts of the keypad

byte colPins[COLS] = {A3, A4, A5, 6}; //connect to the column pinouts of the keypad

//Pins 8, 7, 6, 5 on the keypad should be connected to digital pins A0, 5, A1, A2 on //the Arduino.

//Pins 4, 3, 2, 1 on the keypad should be connected to digital pins A3, A4, A5, 6 on //the Arduino.

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


void setup(){
  pinMode(ledPin, OUTPUT); // sets the digital pin as output
  pinMode(ledPin2, OUTPUT); // sets the digital pin as output
  pinMode(ledPin3, OUTPUT); // sets the digital pin as output
  tone1.begin(9);
  lcd.begin(16, 2);
  Serial.begin(9600);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Code eingeben: ");
  while (currentLength < 4)
  {
    lcd.setCursor(currentLength + 6, 1);
    lcd.cursor();
    char key = keypad.getKey();
    key == NO_KEY;
    if (key != NO_KEY)
    {
      if ((key != '*')&&(key != '#'))
      { 
      lcd.print(key);
      password[currentLength] = key;
      currentLength++;
      tone1.play(NOTE_C6, 200);
      }
    }
  }

  if (currentLength == 4)
  {
    delay(500);
    lcd.noCursor();
    lcd.clear();
    lcd.home();
    lcd.print("Der Code lauted: ");
    lcd.setCursor(6,1);
    lcd.print(password[0]);
    lcd.print(password[1]);
    lcd.print(password[2]);
    lcd.print(password[3]);

    tone1.play(NOTE_E6, 200);
    delay(3000);
    lcd.clear();
    currentLength = 0;
  }
}

void loop()
{
  timer();
  char key2 = keypad.getKey(); // get the key
  
  if (key2 == '*')
    {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Code: ");
      
      while (currentLength < 4)
        {
          
          timer();
          
          char key2 = keypad.getKey(); 
          if (key2 == '#')
            {
              currentLength = 0;
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print("Code: ");
            }
          else                  
          if (key2 != NO_KEY)    
            {
              
              lcd.setCursor(currentLength + 7, 0);
              lcd.cursor();
              
              lcd.print(key2);
              entered[currentLength] = key2;
              currentLength++;
              tone1.play(NOTE_C6, 200);
              delay(100);
              lcd.noCursor();
              lcd.setCursor(currentLength + 6, 0);
              lcd.print("*");
              lcd.setCursor(currentLength + 7, 0);
              lcd.cursor();
            }
        }

      if (currentLength == 4) 
        {
          if (entered[0] == password[0] && entered[1] == password[1] && entered[2] == password[2] && entered[3] == password[3])
            {
              lcd.noCursor();
              lcd.clear();
              lcd.home();
              lcd.print("Bombe");
              lcd.setCursor (0,1);
              lcd.print("entschaerft!"); 
              currentLength = 0;
              digitalWrite(ledPin3, HIGH);
              delay(2500);
              lcd.setCursor(0,1);
              lcd.print("Bombe reseten");
              delay(1000000);
            }
      else
        {
          lcd.noCursor();
          lcd.clear();
          lcd.home();
          lcd.print("Falscher");
          lcd.setCursor (0,1);
          lcd.print(" Code!"); 
             
          if (Hcount > 0)
            {
              Hcount = Hcount - 1;
            }
    
          if (Mcount > 0)
            {
              Mcount = Mcount - 59;
            }
          if (Scount > 0)
            {
              Scount = Scount - 59;
            }
        delay(1500);
        currentLength = 0;
  
        }
      }  
    }
}

void timer()
{
  Serial.print(Scount);
  Serial.println();
  
  if (Hcount <= 0)
  {
    if ( Mcount < 0 )
    {
      lcd.noCursor();
      lcd.clear();
      lcd.home();
      lcd.print("Die Bombe ist ");
      lcd.setCursor (0,1);
      lcd.print("Explodiert!");
      
      
      while (Mcount < 0) 
      {
        digitalWrite(ledPin, HIGH); // sets the LED on
        tone1.play(NOTE_A2, 90);
        delay(100); 
        digitalWrite(ledPin, LOW); // sets the LED off
        tone1.play(NOTE_A2, 90);
        delay(100); 
        digitalWrite(ledPin2, HIGH); // sets the LED on
        tone1.play(NOTE_A2, 90);
        delay(100); 
        digitalWrite(ledPin2, LOW); // sets the LED off
        tone1.play(NOTE_A2, 90);
        delay(100); 
        digitalWrite(ledPin3, HIGH); // sets the LED on
        tone1.play(NOTE_A2, 90);
        delay(100); 
        digitalWrite(ledPin3, LOW); // sets the LED off
        tone1.play(NOTE_A2, 90);
        delay(100);
      }
    } 
  }

  lcd.setCursor (0,1); // sets cursor to 2nd line
  lcd.print ("Timer:");

  if (Hcount >= 10)
    {
      lcd.setCursor (7,1);
      lcd.print (Hcount);
    }
  if (Hcount < 10) 
    {
      lcd.setCursor (7,1);
      lcd.write ("0");
      lcd.setCursor (8,1);
      lcd.print (Hcount);
    }

  lcd.print (":");

  if (Mcount >= 10)
    {
      lcd.setCursor (10,1);
      lcd.print (Mcount);
    }
  if (Mcount < 10) 
    {
      lcd.setCursor (10,1);
      lcd.write ("0");
      lcd.setCursor (11,1);
      lcd.print (Mcount);
    }
    
  lcd.print (":");

  if (Scount >= 10) 
    {
      lcd.setCursor (13,1);
      lcd.print (Scount);
    }
  if (Scount < 10) 
    {
      lcd.setCursor (13,1);
      lcd.write ("0");
      lcd.setCursor (14,1);
      lcd.print (Scount);
    }

  if (Hcount <0) 
    {
      Hcount = 0; 
    }

  if (Mcount <0) 
    {
      Hcount --; 
      Mcount = 59; 
    }

  if (Scount <1) // if 60 do this operation
    {
      Mcount --; // add 1 to Mcount
      Scount = 59; // reset Scount
    }

  if (Scount > 0) // do this oper. 59 times
    {
      unsigned long currentMillis = millis();
  
      if(currentMillis - secMillis > interval) 
        {
          tone1.play(NOTE_G5, 200);
          secMillis = currentMillis;
          Scount --; // add 1 to Scount
          digitalWrite(ledPin2, HIGH); // sets the LED on
          delay(10); // waits for a second
          digitalWrite(ledPin2, LOW); // sets the LED off
          delay(10); // waits for a second
          //lcd.clear();
        }
    }
}

so einbauen dass ich mit der Karte (1567230) und mit dem Chip (1233320) die “bombe” entschärfen kann.

Danke im vorraus.

Du gibst Dir ja sehr viel Mühe :angry: - wieviel ist Dir Programmierung durch Dritte wert?

Klaus_ww:
Du gibst Dir ja sehr viel Mühe :angry: - wieviel ist Dir Programmierung durch Dritte wert?

ich dachte eigentlich dass ein Forum da ist um anderen zu helfen, aber das scheint bei dir offensichtlich ja nicht zu zutreffen. :disappointed_relieved:

Mein Problem jetzt ist dass anscheinend das rfid Modul nicht gefunden wird.
kann mir jemand sagen wo hier der Fehler liegt?

#include <Keypad.h>
#include <LiquidCrystal.h>
#include <Tone.h>
#include <MFRC522.h>
#include <SPI.h>
#define SS_PIN 53
#define RST_PIN 4

MFRC522 mfrc522(SS_PIN, RST_PIN);  

Tone tone1;

int Scount = 00; 
int Mcount = 30; 
int Hcount = 0; 
int DefuseTimer = 0; 

String inhalt = "";

long secMillis = 0; 
long interval = 1000; 

char password[4]; 
int currentLength = 0; 
int i = 0; 
char entered[4];

int ledPin = 4; //red led
int ledPin2 = 3; //yellow led
int ledPin3 = 2; //green led
int reset = 0;

LiquidCrystal lcd(7, 8, 10, 11, 12, 13);  

const byte ROWS = 4; 

const byte COLS = 4; 

char keys[ROWS][COLS] = {

{'1','2','3','A'},

{'4','5','6','B'},

{'7','8','9','C'},

{'*','0','#','D'}

};

byte rowPins[ROWS] = {A0, 5, A1, A2};

byte colPins[COLS] = {A3, A4, A5, 6}; 

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


void setup(){
  pinMode(ledPin, OUTPUT); 
  pinMode(ledPin2, OUTPUT); 
  pinMode(ledPin3, OUTPUT); 
  SPI.begin();      
  mfrc522.PCD_Init(); 
  tone1.begin(9);
  menu();
}
void menu() {
  lcd.begin(16, 2);
  Serial.begin(9600);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Code oder Karte:");
  while (currentLength < 4)
  {
    lcd.setCursor(currentLength + 6, 1);
    lcd.cursor();
    char key = keypad.getKey();
    key == NO_KEY;
    if (key != NO_KEY)
    {
      if ((key != '*')&&(key != '#'))
      { 
      lcd.print(key);
      password[currentLength] = key;
      currentLength++;
      tone1.play(NOTE_C6, 200);
      }
    }
  }

  if (currentLength == 4)
  {
    delay(500);
    lcd.noCursor();
    lcd.clear();
    lcd.home();
    lcd.print("Der Code lauted: ");
    lcd.setCursor(6,1);
    lcd.print(password[0]);
    lcd.print(password[1]);
    lcd.print(password[2]);
    lcd.print(password[3]);

    tone1.play(NOTE_E6, 200);
    delay(3000);
    lcd.clear();
    currentLength = 0;
  }
}

void loop()
{

  timer();
  char key2 = keypad.getKey(); 
  
  if (key2 == '*')
    {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Code: ");
      
      while (currentLength < 4)
        {
          
          timer();
          
          char key2 = keypad.getKey(); 
          if (key2 == '#')
            {
              currentLength = 0;
              lcd.clear();
              lcd.setCursor(0,0);
              lcd.print("Code: ");
            }
          else                  
          if (key2 != NO_KEY)    
            {
              
              lcd.setCursor(currentLength + 7, 0);
              lcd.cursor();
              
              lcd.print(key2);
              entered[currentLength] = key2;
              currentLength++;
              tone1.play(NOTE_C6, 200);
              delay(100);
              lcd.noCursor();
              lcd.setCursor(currentLength + 6, 0);
              lcd.print("*");
              lcd.setCursor(currentLength + 7, 0);
              lcd.cursor();
            }
        }

      if (currentLength == 4) 
        {
          if (entered[0] == password[0] && entered[1] == password[1] && entered[2] == password[2] && entered[3] == password[3])
            {
              lcd.noCursor();
              lcd.clear();
              lcd.home();
              lcd.print("Bombe");
              lcd.setCursor (0,1);
              lcd.print("entschaerft!"); 
              currentLength = 0;
              digitalWrite(ledPin3, HIGH);
              delay(2500);
              lcd.setCursor(0,1);
              lcd.print("Bombe reseten");
              delay(1000000);
            }
      else
        {
          lcd.noCursor();
          lcd.clear();
          lcd.home();
          lcd.print("Falscher");
          lcd.setCursor (0,1);
          lcd.print(" Code!"); 
             
          if (Hcount > 0)
            {
              Hcount = Hcount - 1;
            }
    
          if (Mcount > 0)
            {
              Mcount = Mcount - 59;
            }
          if (Scount > 0)
            {
              Scount = Scount - 59;
            }
        delay(1500);
        currentLength = 0;
  
        }
      }  
    }
    {
  
  check();
}
}



void timer()
{
  Serial.print(Scount);
  Serial.println();
  
  if (Hcount <= 0)
  {
    if ( Mcount < 0 )
    {
      lcd.noCursor();
      lcd.clear();
      lcd.home();
      lcd.print("Die Bombe ist ");
      lcd.setCursor (0,1);
      lcd.print("Explodiert!");
      
      
      while (Mcount < 0) 
      {
        digitalWrite(ledPin, HIGH); 
        tone1.play(NOTE_A2, 90);
        delay(100); 
        digitalWrite(ledPin, LOW); 
        tone1.play(NOTE_A2, 90);
        delay(100); 
        digitalWrite(ledPin2, HIGH); 
        tone1.play(NOTE_A2, 90);
        delay(100); 
        digitalWrite(ledPin2, LOW); 
        tone1.play(NOTE_A2, 90);
        delay(100); 
        digitalWrite(ledPin3, HIGH); 
        tone1.play(NOTE_A2, 90);
        delay(100); 
        digitalWrite(ledPin3, LOW); 
        tone1.play(NOTE_A2, 90);
        delay(100);
      }
    } 
  }

  lcd.setCursor (0,1); 
  lcd.print ("Timer:");

  if (Hcount >= 10)
    {
      lcd.setCursor (7,1);
      lcd.print (Hcount);
    }
  if (Hcount < 10) 
    {
      lcd.setCursor (7,1);
      lcd.write ("0");
      lcd.setCursor (8,1);
      lcd.print (Hcount);
    }

  lcd.print (":");

  if (Mcount >= 10)
    {
      lcd.setCursor (10,1);
      lcd.print (Mcount);
    }
  if (Mcount < 10) 
    {
      lcd.setCursor (10,1);
      lcd.write ("0");
      lcd.setCursor (11,1);
      lcd.print (Mcount);
    }
    
  lcd.print (":");

  if (Scount >= 10) 
    {
      lcd.setCursor (13,1);
      lcd.print (Scount);
    }
  if (Scount < 10) 
    {
      lcd.setCursor (13,1);
      lcd.write ("0");
      lcd.setCursor (14,1);
      lcd.print (Scount);
    }

  if (Hcount <0) 
    {
      Hcount = 0; 
    }

  if (Mcount <0) 
    {
      Hcount --; 
      Mcount = 59; 
    }

  if (Scount <1) 
    {
      Mcount --; 
      Scount = 59; 
    }

  if (Scount > 0) 
    {
      unsigned long currentMillis = millis();
  
      if(currentMillis - secMillis > interval) 
        {
          tone1.play(NOTE_G5, 200);
          secMillis = currentMillis;
          Scount --; 
          digitalWrite(ledPin2, HIGH); 
          delay(10); 
          digitalWrite(ledPin2, LOW);
          delay(10); 
          //lcd.clear();
        }
    }
}

void check() 
{
  Serial.flush();
  inhalt = "";
  
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }
  
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }
 
  mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
    inhalt.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
    inhalt.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  Serial.println();
  Serial.print("Nachricht : ");
  inhalt.toUpperCase();
  if (inhalt.substring(1) == "75 DF B6 76")
  {
    timer();
      
  }
  if  (inhalt.substring(1) == "3D BE 73 65") 
  {
              lcd.noCursor();
              lcd.clear();
              lcd.home();
              lcd.print("Bombe");
              lcd.setCursor (0,1);
              lcd.print("entschaerft!"); 
              currentLength = 0;
              digitalWrite(ledPin3, HIGH);
              delay(2500);
              lcd.setCursor(0,1);
              lcd.print("Bombe reseten");
              delay(1000000);
  }
}

Motz1711:
ich dachte eigentlich dass ein Forum da ist um anderen zu helfen, aber das scheint bei dir offensichtlich ja nicht zu zutreffen. :disappointed_relieved:

Ich unterscheide eben zwischen "machen" und "helfen". Das ist für einige halt oft das Gleiche.
Und mein Verständnis von "helfen" muss ja nicht mit Deinem übereinstimmen. Musst Du genauso akzeptieren wie ich Deine Einstellung.