Projekt: Zahlenschloss mit dem Arduino

Eigentlich hatte ich beim letzten Mal versprochen, dass ich noch etwas Nützliches mit dem Arduino mache. Einen elektronischen Würfel hatte ich auch gebaut, allerdings hab ich heute ein kleines, selbst gemachtes, Projekt auf Lager. Was auch bedingt nützlich sein kann ;) . Kopieren und aus Büchern abschreiben kann letztendlich jeder. Und wie kann man besser lernen, als wenn man sich selber etwas ausdenkt und versucht es zu realisieren. Da mir meine zur Verfügung stehenden Materialien momentan immer noch stark begrenzt sind, musste etwas Einfaches her. Wobei es dann doch relativ knackig wurde. Aber man wächst ja mit der Herausforderung! Dabei steckte wie oft die meiste Arbeit im Source-Code. Die eigentliche Verdrahtung auf dem Breadboard, fällt ziemlich unspektakulär aus.

Hier auf dem Bild sieht man wunderbar den Aufbau. Außerdem habe ich auch noch ein Schaltplan (Fritzing) hinzugefügt. So lässt es sich dann doch einfacher nachvollziehen.
Ich habe 3 LEDs und 6 Taster für die Anzeige/Steuerung verwendet:

Zahlenschloss_Arduin_Projekt • Die rote LED für “zu”
• Die grüne LED für “offen”
• Die gelbe LED für den Status (Bestätigungszeit/Programmiermodus)
• 1 Taster für öffnen/schließen
• 1 Taster für die Änderung des Codes
• 4 Taster für die Code-Eingabe

Wie man sehen kann, ist alles noch recht einfach gehalten. Die tollen Funktionen stecken dann im Source Code.
Beim Starten des Programms ist der… ähm ich sag jetzt mal „Tresor“ geschlossen.
Durch betätigen von Code-Taster 1-4 lässt sich der Code eingeben. Hier ist beim ersten Start des Arduinos die Reihenfolge von 1,2,3,4 festgelegt. Hat man den Code eingegeben leuchtet die gelbe LED nun 10 Sek. Lang auf und man hat Zeit den Code mit dem Taster öffnen/schließen zu bestätigen.
War der Code richtig, öffnet sich der „Tresor“. War der Code falsch, hat man erneut den Versuch den Code einzugeben. Das Schöne daran ist, dass die LEDs jedesmal bei Tastendruck ein „Feedback“ durch kurzes blinken geben :) .
Hat man den Code richtig eingegeben, leuchtet die Grüne LED. Der „Tresor“ ist nun offen. Nun ist die Möglichkeit gegeben, den „Tresor“ wieder mit der Taste öffnen/schließen zu schließen, oder aber man drückt den Taster für Programmieren. Entscheidet man sich für letzteres leuchtet die Gelbe LED auf und man befindet sich im Programmier-Modus. Durch betätigen der Code-Taster 1-4 lässt sich nun ein beliebiger 4 stelliger Code eingeben. Nach dem Neuprogrammieren befindet man sich wieder im „Tresor offen“ Modus. Hat man sich bei der Eingabe vertan, kann man erneut den Code umprogrammieren, oder aber man Schließt den „Tresor“ wieder.

Den Sketch/Source Code habe ich unter weiterlesen angefügt, da er sonst mein gesamtes Layout sprengen würde. Es sind viele Zeilen Code geworden. Aber Ich denke ich hab ihn ausreichend kommentiert und er erklärt sich ein wenig von selber. Wenn Fragen da sind, versuch ich natürlich zu helfen.
Es kann durchaus sein das es einfachere Möglichkeiten da draußen gibt. Allerdings hab ich mir alles selber erarbeitet und das ohne Google um Rat zu fragen. Unzählige kleiner Fehler hatten sich eingeschlichen aber auch eine Unmenge an Erfahrung wurde beim Programmieren dazu gewonnen. Ich freue mich auf meine nächsten Projekte und vielleicht habt ihr ja noch ein Paar Ideen, um das Projekt hier zu erweitern/Modifizieren.

Viel Spaß

//////////////////////////////////////////
//   Zahlenschloss mit Arduino          //
//   18.03.2012 A. Weichselbaumer       //
//////////////////////////////////////////

  int PasswortArray[4] = {1,2,3,4};   // Code beim Start.
 
  int ZifferEins = 0; // Dient als Zwischenablage unserer gedrückten
  int ZifferZwei = 0; // Tasten um später zu verlgiechen.
  int ZifferDrei = 0;
  int ZifferVier = 0;
 
  int PinOS = 2;
  int PinProgrammieren = 3;
  int PinEins = 4;
  int PinZwei = 5;
  int PinDrei = 6;
  int PinVier = 7;
 
  int LEDoffen = 12;
  int LEDzu = 13;
  int LEDprog = 11;
 
  int Freigabe = 0;
  unsigned long time = 0;
  unsigned long time2 = 0;
 
//===================================================================================================================================================
 
  void setup() {
  //Serial.begin(9600); // zur Fehlersuche im Code.
 
  pinMode(PinOS,INPUT); // Festlegen der einzelnen Aus/Eingänge.
  pinMode(PinProgrammieren,INPUT);
  pinMode(PinEins,INPUT);
  pinMode(PinZwei,INPUT);
  pinMode(PinDrei,INPUT);
  pinMode(PinVier,INPUT);
 
  pinMode(LEDoffen,OUTPUT);
  pinMode(LEDzu,OUTPUT);
  pinMode(LEDprog,OUTPUT);
  digitalWrite(LEDzu,HIGH);            // Schloss "Zu"
  }
//======================================================
  void loop() {
     // Programm startet
     // Abfrage ob "Zu" Status vorhanden ist und auch nicht "Offen" ist
     if(digitalRead(LEDzu) == HIGH && digitalRead(LEDoffen) == LOW){
       Zahleneingabe();  // Springt zum "Eingabe Modus"
       }

      digitalWrite(LEDprog,HIGH); // Gelbe LED leuchtet. Zeit um öffnen zu bestätigen.
     
      time = millis();  // erste Zeit nehmen
      do{
          if(digitalRead(PinOS) == HIGH) // wurde der öffnen Pin gedrückt ?
            {
              if((PasswortArray[0] == ZifferEins) && (PasswortArray[1] == ZifferZwei) && (PasswortArray[2] == ZifferDrei) && (PasswortArray[3] == ZifferVier))
                { // waren die gedrückten Tasten identisch mit dem Gespeicherten Passwort ?
                LEDgruenblinken();
                digitalWrite(LEDzu,LOW);
                Freigabe = 1;
                break;
                }
              else
                {
                LEDrotblinken();
                Freigabe = 0;
                break;
                }
            }
       
          time2 = millis(); // zweite Zeit nehmen
       
            if(time2 >= time + 10000){   // sind mehr als 10 Sekunden ohne Aktion vergangen ?
            LEDrotblinken();
            break;}  // dann abbruch.
       }while(1);  // Schleife immer erfüllt, Abbruch nur durch eine der internen Bedingungen mit "break;" .

          digitalWrite(LEDprog,LOW);
          delay(500);
       
//----------------------------------------------- OFFEN ---------------------  
        time = millis(); // Zeitabnahme vor der "Offen" Schleife
       
        while(1 && (Freigabe == 1)){
            time2 = millis(); // Zeit in der Schleife      
            if(Freigabe == 1 && digitalRead(PinProgrammieren) == HIGH)
                {
                Programmierung();          // Neue Programmierung der Tasten
                }
           
            if((Freigabe == 1) && (digitalRead(PinOS) == HIGH))  // Wieder manuell schließen
            //if((Freigabe == 1) && (digitalRead(PinOS) == HIGH) || (time2 >= time + 30000))  // Wieder manuell schließen, oder nach 30 Sekunden automatisch.
                {
                digitalWrite(LEDoffen,LOW);
                LEDrotblinken();
                Freigabe = 0;
                //Serial.println("zu");
                break;
                delay(100);
                }
         }
//-------------------------------------------------- OFFEN ENDE ------------------
  }
//====================================================  
  void Zahleneingabe() {          // Eingabe Modus
    for(int i = 1; i < 5; i++){   // 4 mal wird ein Taster abgefragt
       
        do
        {  
        delay(50);    // warte darauf das Taster gedrückt wird
        }
        while((digitalRead(PinEins) == LOW) && (digitalRead(PinZwei) == LOW) && (digitalRead(PinDrei) == LOW) && (digitalRead(PinVier) == LOW));
   
   
          if(digitalRead(PinEins) == HIGH){ // Abfrage welcher Taster gedrückt wurde
            ZifferEins = i;                 // Schreibe Reihenfolge in unsere Zwischenablage
            //Serial.println(i);
            LEDrotblinken();
            delay(100);
            }
          else if(digitalRead(PinZwei) == HIGH){
            ZifferZwei = i;
            //Serial.println(i);
            LEDrotblinken();
            delay(100);
            }
          else if(digitalRead(PinDrei) == HIGH){
            ZifferDrei = i;
            //Serial.println(i);
            LEDrotblinken();
            delay(100);
            }
          else if(digitalRead(PinVier) == HIGH){
            ZifferVier = i;
            //Serial.println(i);
            LEDrotblinken();
            delay(100);
            }
       }
   
  }
 
//===================================================================================================================================================
 
  void Programmierung() {
   
    digitalWrite(LEDprog,HIGH);  // Programmier-Modus gelbe LED ein
    for(int i = 1; i < 5; i++)
      {  
        do{  
        delay(50);
        }
        while((digitalRead(PinEins) == LOW) && (digitalRead(PinZwei) == LOW) && (digitalRead(PinDrei) == LOW) && (digitalRead(PinVier) == LOW));
   
   
          if(digitalRead(PinEins) == HIGH){
            ZifferEins = i;
            //Serial.println(i);
            LEDgelbblinken();
            delay(100);
            }
          else if(digitalRead(PinZwei) == HIGH){
            ZifferZwei = i;
            //Serial.println(i);
            LEDgelbblinken();
            delay(100);
            }
          else if(digitalRead(PinDrei) == HIGH){
            ZifferDrei = i;
            //Serial.println(i);
            LEDgelbblinken();
            delay(100);
            }
          else if(digitalRead(PinVier) == HIGH){
            ZifferVier = i;
            //Serial.println(i);
            LEDgelbblinken();
            delay(100);
            }    
       }
      // Neuer Code wird ins Arrey geschrieben
      PasswortArray[0] = ZifferEins;
      PasswortArray[1] = ZifferZwei;
      PasswortArray[2] = ZifferDrei;
      PasswortArray[3] = ZifferVier;
           
      delay(50);
      digitalWrite(LEDprog,LOW); // Programmier-Modus gelbe LED aus
  }
//=========================================================
 
  void LEDrotblinken() {
      digitalWrite(LEDzu,HIGH);
      delay(100);
      digitalWrite(LEDzu,LOW);
      delay(100);
      digitalWrite(LEDzu,HIGH);
      delay(100);
      digitalWrite(LEDzu,LOW);
      delay(100);
      digitalWrite(LEDzu,HIGH);
      }
//===========================================================
 
  void LEDgruenblinken(){
          digitalWrite(LEDoffen,HIGH);
          delay(100);
          digitalWrite(LEDoffen,LOW);
          delay(100);
          digitalWrite(LEDoffen,HIGH);
          delay(100);
          digitalWrite(LEDoffen,LOW);
          delay(100);
          digitalWrite(LEDoffen,HIGH);
          }
//============================================================

  void LEDgelbblinken(){
          digitalWrite(LEDprog,HIGH);
          delay(100);
          digitalWrite(LEDprog,LOW);
          delay(100);
          digitalWrite(LEDprog,HIGH);
          delay(100);
          digitalWrite(LEDprog,LOW);
          delay(100);
          digitalWrite(LEDprog,HIGH);
          }
Dieser Beitrag wurde unter Arduino, Basteln veröffentlicht. Setze ein Lesezeichen auf den Permalink.

5 Antworten auf Projekt: Zahlenschloss mit dem Arduino

  1. HerrUmbrarum sagt:

    Fang doch mal an Videos davon zu machen ;)

  2. Andre sagt:

    Sobald es finanziell wieder besser um mich gestellt ist, werde ich mir denke ich mal etwas mehr Ausrüstung “zulegen” ;) . Mal sehn, vielleicht sind dann in Zukunft auch ein paar Videos mit drin.

  3. ce elektrotechnik sagt:

    Hallo,
    danke für interessanter Artikel!

    Sie haben es richtig super gemacht! Ich hab auch für Ihre Schema mein LED gemacht und es funktioniert echt super!!

    Aber wie Herr Umbrarum gesagt hat, es wäre gut, wenn Sie eine Video mit Ihre Ergebnisse mit uns teilen könnten!

    Vielen Dank im Voraus und viel Erfolg!

  4. Maik sagt:

    Hallo,

    meine Idee ist folgende:

    Ich möchte gerne so ein Zahlenschloss basteln, allerdings zur Eingabe eine alte Wählscheibe eines Telefons nutzen.
    Ähnlich wie hier: http://www.instructables.com/id/Interface-a-rotary-phone-dial-to-an-Arduino/
    Kannst Du mir dabei helfen? :)

    Maik

    • Andre sagt:

      Das ist durchaus eine nette Idee… leider bin ich gerade voll im Umzugsstress und kann nur übers smartphone ins
      Internet

      was mir aber spontan einfällt ist das hier:
      http://bwir.de/schaltungen/waehlscheibe
      vll hilft das ein wenig… oder schafft neue Ideen und Ansätze.

      Mfg Andre (hoffentlich bald wieder mit normalem Internet )

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *


sechs + = elf

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>