Safe mit Nummernschloss

vor 9 Wochen 1 Stunde von Dave123

Hi zusammen!

Hatte wieder mal etwas Zeit um etwas zu basteln.
Ich möchte schlussendlich eine Kiste bauen die mittels einer Zahleneingabe geöffnet werden kann.

Da ich noch Anfänger bin, habe ich die Sache erst mal klein angefangen.

Ich habe 3 Buttons und eine LED.
Nun möchte ich, dass nach der Codeeingabe die LED blinkt.

Folgendes habe ich nun mal ausprobiert:

int Button1 = 12;
int Button2 = 11;
int Button3 = 10;
int LEDpin = 9;
int var1;
int var2;
int var3;

void setup()
{
pinMode(LEDpin, OUTPUT);
pinMode(Button1, INPUT);
pinMode(Button2, INPUT);
pinMode(Button3, INPUT);
}

void loop()
{
var1 = digitalRead(Button1); // Liest Zustand des Buttons aus
var2 = digitalRead(Button2); // Liest Zustand des Buttons aus
var3 = digitalRead(Button3); // Liest Zustand des Buttons aus

if(var1 == HIGH && var2 == LOW && var3 == HIGH){
digitalWrite(LEDpin, HIGH); // LED blinkt wenn bedingung erfüllt wurde.
delay (100);
digitalWrite(LEDpin, LOW);
delay (100);
digitalWrite(LEDpin, HIGH);
delay (100);
digitalWrite(LEDpin, LOW);
delay (100);
digitalWrite(LEDpin, HIGH);
delay (100);
digitalWrite(LEDpin, LOW);
delay (100);
digitalWrite(LEDpin, HIGH);
delay (100);
digitalWrite(LEDpin, LOW);
delay (100);
digitalWrite(LEDpin, HIGH);
delay (100);
digitalWrite(LEDpin, LOW);
delay (100);
digitalWrite(LEDpin, HIGH);
delay (100);
digitalWrite(LEDpin, LOW);
delay (100);
digitalWrite(LEDpin, HIGH);
delay (100);
digitalWrite(LEDpin, LOW);
delay (100);
}

Nun muss man natürlich Button 1 + 3 gleichzeitig drücken, damit die LED blinkt (oder das Schloss aufgeht...)
Wie kann ich denn die vorher eingegebenen Werte speichern, damit die LED erst blinkt wenn ZUERST Button1 und DANACH Button2 gedrückt wird???

Gruss Dave

Ähnliche Posts

17 Antworten auf “Safe mit Nummernschloss”


Darstellungsoptionen

Wähle hier deine bevorzugte Anzeigeart für Kommentare und klicke auf „Einstellungen speichern“ um die Änderungen zu übernehmen.
  1. Dave123 sagt:

    Weis da echt keiner eine Lösung?

    Irgendwie müsste man doch herausfiltern können, welches der erste, der zweite und der dritte Tastendruck war...

    Antworten quote

  1. Jan sagt:

    Dafür könntest Du die Werte in ein Array schreiben.

    Antworten quote

  1. Dave123 sagt:

    Habe gerade ein Projekt gefunden, dass meinem Stark gleicht.
    Jedoch checke ich nicht wirklich was der für merkwürdige zeichen in denem Code benützt.
    &amp , &gt...

    Und ausserdem will er, dass der User einen Code vorgeben kann. Das lass ich vorerst mal sein.

    Antworten quote

  1. twinflyer sagt:

    Hi...
    ich hab das gerade mal probiert, aber ich glaube ich steh aufm Schlauch.
    Folgendermaßen läuft der Code ab.

    Der richtige Code wird in einem Array ("ziffer") gespeichert
    Zuerst werden alle 5 Schalter ausgelesen (1-3 für Zahlen, 4 als "Eingabetaste", 5 als Programierknopf...noch nutzlos, für später gedacht.

    Dann werden die Schaltereingabe ausgewertet.
    Sprich wenn button1 2 oder 3: "pressed" = 1 2 oder 3. 4 startet die Überprüfung.

    Anschließend wird der gedrückte button in einem Array auf platz 0 gespeichert. Zu einer Variable wird 1 addiert, um beim nächsten Durchlauf "pressed" auf platz 2 zu speichern.

    sind 4 werte im Array und man drückt die Eingabetaste (button4) werden die Werte in Array mit den Werten in "Ziffer" nacheinander verglichen. Wenn alles einstimmig ist, wird die LED eingeschaltet.

    Nur leider klappt das nicht.
    Habt ihr Tipps, oder soll ich noch den Code posten?

    Gruß Max

    Antworten quote

  1. Dave123 sagt:

    Genau das selbe Problem habe ich auch.

    Bei mir sieht dann das ganze etwa so aus
    (Endvergleich mit dem Code habe ich noch weggelassen, da das Schreiben ins Array schon gar nicht funktioniert... Programm zeigt keinerlei Reaktion auf Tastendrücke!):

    //Array
    int myArray[3] = {0, 0, 0};
    int Arraypos = 0;

    // Inputs
    int Button1 = 12;
    int Button2 = 11;
    int Button3 = 10;
    int Enter = 13;

    // Outputs
    int ledPin = 9;

    void setup()
    {
    Serial.begin(9600);
    pinMode (Button1, INPUT);
    pinMode (Button2, INPUT);
    pinMode (Button3, INPUT);
    pinMode (Enter, INPUT);

    pinMode (ledPin, OUTPUT);
    }

    void loop()
    {
    for (Arraypos = 0; Arraypos <= 2; Arraypos = Arraypos + 1) // Erhöht die Arraypos
    {
    if (Button1 == HIGH) // Wenn dieser Button gedrückt wurd,
    {
    myArray[Arraypos] = 1; // die Zahl 1 an die tiefste Arraypos.

    digitalWrite(ledPin, HIGH); // Zur bestätigung ein LED blinken
    delay (500);
    digitalWrite(ledPin, HIGH);

    Serial.print("myArray[3] = {"); // zur Einsicht wie das Array nun aussieht.
    Serial.print(myArray[0]);
    Serial.print(",");
    Serial.print(myArray[1]);
    Serial.print(",");
    Serial.print(myArray[2]);
    Serial.println("}");
    }

    if (Button2 == HIGH)
    {
    myArray[Arraypos] = 2;

    digitalWrite(ledPin, HIGH);
    delay (500);
    digitalWrite(ledPin, LOW);

    Serial.print("myArray[3] = {");
    Serial.print(myArray[0]);
    Serial.print(",");
    Serial.print(myArray[1]);
    Serial.print(",");
    Serial.print(myArray[2]);
    Serial.println("}");
    }

    if (Button3 == HIGH)
    {
    myArray[Arraypos] = 3;

    digitalWrite(ledPin, HIGH);
    delay (500);
    digitalWrite(ledPin, LOW);

    Serial.print("myArray[3] = {");
    Serial.print(myArray[0]);
    Serial.print(",");
    Serial.print(myArray[1]);
    Serial.print(",");
    Serial.print(myArray[2]);
    Serial.println("}");
    }

    }

    /*
    if(Enter == HIGH)
    {
    Hier will ich dan später das Array mit einem voreingestellten Code vergleichen...
    }
    */

    }

    Antworten quote

  1. twinflyer sagt:

    Ok, ich hänge meinen Code auch nochmal mit an.
    Es scheint, als hätte ich einen ganz anderen weg verfolgt.
    Könnte da mal einer drüberschauen, irgendwie will das nicht laufen.
    Hab leider keine Kommentare rein geschrieben, ich hoffe es geht auch so.

    Gruß Max

    /////////////////

    int ziffer[4] = {1,3,3,2};

    int button1 = 11;
    int button2 = 6;
    int button3 = 3;
    int button4 = 2;
    int record = 4;

    int buttonstate1;
    int buttonstate2;
    int buttonstate3;
    int buttonstate4;
    int pressed;
    int arraypos = 0;
    int richtig = 0;

    int kombination[4] = {0,0,0,0};

    int led = 13;

    void setup() {
    Serial.print("bereit");
    pinMode(button1, INPUT);
    pinMode(button2, INPUT);
    pinMode(button3, INPUT);
    pinMode(button4, INPUT);
    pinMode(record, INPUT);
    pinMode(led, OUTPUT);
    Serial.begin(9600);
    }

    void loop() {
    abfrage;
    }

    void abfrage() {
    buttonstate1 = digitalRead(button1);
    buttonstate2 = digitalRead(button2);
    buttonstate3 = digitalRead(button3);
    buttonstate4 = digitalRead(button4);
    delay(10);
    auswertung;
    }

    void auswertung() {
    if(buttonstate1 == HIGH) {
    pressed = 1;
    code;
    }
    if(buttonstate2 == HIGH) {
    pressed = 2;
    code;
    }
    if(buttonstate3 == HIGH) {
    pressed = 3;
    code;
    }
    if(buttonstate4 == HIGH) {
    pressed = 4;
    testen;
    }
    if(buttonstate1 == 0 && buttonstate2 == 0 && buttonstate3 == 0 && buttonstate4 == 0) {
    abfrage;
    }
    }

    void code() {
    kombination[arraypos] = pressed;
    arraypos = arraypos + 1;
    resetlite;
    }

    void testen() {
    if(kombination[0] == ziffer[0] && kombination[1] == ziffer[1] && kombination[2] == ziffer[2] && kombination[3] == ziffer[3]) {
    richtig = 1;
    }
    else {
    hardreset;
    }
    ausgabe;
    }

    void ausgabe() {
    if(richtig == 1) {
    digitalWrite(led, HIGH);
    }
    }

    void resetlite() {
    buttonstate1 = LOW;
    buttonstate2 = LOW;
    buttonstate3 = LOW;
    buttonstate4 = LOW;
    loop;
    }

    void hardreset() {
    setup;
    }

    Antworten quote

  1. uwe sagt:

    Hallo Dave123
    hat wenig mit dem technischen Thema zu tun, aber weil Du es gefragt hast:

    &amp , &gt... sind Umschreibngen in HTML für Sonderzeichen.
    mehr: http://www.webhilfen.de/html/sonderzeichen.html

    Grüeß Uwe

    Antworten quote

  1. chrimbo sagt:

    Mal ne frage zu eurer hardware. Habt ihr ueberhaut pulldowns?
    Taster werden idr. nach masse geschaltet, um die internen pullups des atmegas zu benutzen.

    Antworten quote

  1. twinflyer sagt:

    Also ich ja ;)
    Einzelne schalter lassen sich auch auslesen und verarbeiten, aber in einer bestimmten Reihenfolge will das irgendwie nicht.

    Gruß Max

    Antworten quote

  1. Dave123 sagt:

    Jop... Hardware habe ich einzeln getestet.

    Antworten quote

  1. chrimbo sagt:

    Also ihr seid ganz sicher, dass einzelne schalter sowohl low als auch high erkannt werden? Es wird schalter gedrueckt und wieder losgelassen erkannt? Mit ausgabe ueber usb geprueft?

    Antworten quote

  1. chrimbo sagt:

    so ich schreib jetzt mal vom PC aus, da geht das schneller (war sonst am Tablet PC)
    erstmal formatiert euern Code gescheit,
    http://freeduino.de/filter/tips/1#filter-bbcode-0

    Das lässt sich sonst nur mühselig lesen!

    so nun zum ersten Kandidaten Dave:
    ich fasse mal ganz kurz zusammen:

    void loop()
    {
    	for (Arraypos = 0; Arraypos <= 2; Arraypos = Arraypos + 1) // Erhöht die Arraypos
    	{
    		if (Button1 == HIGH) // Wenn dieser Button gedrückt wurd,
    		{
    			blablabla
    		}
     
    		if (Button2 == HIGH)
    		{
    			blablabla
    		}
     
    		if (Button3 == HIGH)
    		{
    			blablabla
    		}
     
    	}

    ... du musst da schon sehr schnell nach programmstart drücken, damit das klappt:)
    Die Wahrscheinlichkeit, dass wenn du Button 1 zuerst drückst, dass der auch an der Array Position steht ist sehr sehr sehr klein.
    Außerdem solltest du digitalRead(Button3) verwenden, ob es so geht weiß ich nicht... ich programmier nichtmehr soviel mit dem Arduino

    next one:)

    void loop() {
    	abfrage;
    }

    da fehlen klammern abfrage();

    void abfrage() {
    	buttonstate1 = digitalRead(button1);
    	buttonstate2 = digitalRead(button2);
    	buttonstate3 = digitalRead(button3);
    	buttonstate4 = digitalRead(button4);
    	delay(10);
    	auswertung;
    }

    hier fehlen auch klammern auswertung(); haut dir der Compiler da keinen Fehler um die Ohren? wenn nicht, dann sollte er das tun, sieht ja scheußlich aus.
    da fehlen noch mehrere Klammern... :)
    weiteres spar ich mir durchzudenken, nur ein grober Fehler ist da noch, du erzeugst höchstwahrscheinlich Stack overflows dass es kracht!

    nehmen wir an Button1 wird gedrückt:
    setup wird ausgeführt
    loop wird ausgeführt
    loop ruft abfrage auf
    abfrage ruft auswertung auf
    auswertung ruft code auf
    code ruft resetlite auf
    resetlite ruft loop auf
    mit jedem Funktionsaufruf wird die Rücksprungadresse auf den Speicher gelegt, du kannst aber niemals zurückspringen, wenn du immer neu aufrufst, du verstehst?

    wenn du bei resetlite auf das loop verzichtest, sieht das so aus:
    setup wird ausgeführt
    loop wird ausgeführt
    loop ruft abfrage auf
    abfrage ruft auswertung auf
    auswertung ruft code auf
    code ruft resetlite auf
    resetlite springt zurück zu code
    code springt zurück zu auswertung
    auswertung springt zurück zu abfrage
    abfrage springt zurück zu loop
    loop ruft abfrage auf.....

    grüße

    PS: ich hab sowas mal mit einem Button programmiert, allerdings musste da unterschieden werden, ob lange oder kurz gedrückt wird. Das wurde mit einem voreingestellten code verglichen und jenachdem etwas ausgeführt

    Antworten quote

  1. Dave123 sagt:

    So.. Habe mittlerweile das Ganze etwas weiterentwickelt!
    Anstatt der Knöpfe wird nun ein Poti verwendet. Ausserdem kamen noch ein Display, 2 Servos (Für das Öffnen und Schliessen + Verriegeln der Tresor-Türe), ein Horntreiber (Für Signaltöne + Alarm), und sogar eine selbst geätzte Platine dazu.

    Habe ein kleines Video zur Veranschaulichung der momentanen Situation gemacht:

    Antworten quote

  1. chrimbo sagt:

    es blinkt doch immer noch, zumindest wenn der Code falsch eingegeben wurde...
    und dass das display mist zeigt, wenn es länger nicht angeschlossen war (anderer thread) liegt daran, dass es noch irgendeinen müll im ram hat

    Antworten quote

  1. Fujitsu313 sagt:

    Sieht doch schonmal richtig toll aus ;)
    Wenn der Alarm an geht, könnte man doch über ein Ethernet Shield oder irgendwie über ein Handy eine Warnung an den Besitzer des Safes ausgeben.

    Antworten quote

  1. Dave123 sagt:

    Ja, das Blinken, wenn der Code falsch eingegeben wurde, ist in real nicht so schlimm.
    Es sieht aus als ob es Absicht wäre. Darum werd ichs vorerst mal so lassen.

    @ Fujitsu313 Wäre ja voll cool! Ist das auch Wireless möglich? Der Tresor soll nämlich mobil werden. (Soll nicht wirklich ein richtiger Tresor geben, sondern eine Haushaltskasse für meine Freundin und mich...)

    Ein Problem habe ich aber noch... Wieso kann ich die Servos nur an Pin 9 und 10 betreiben, wie das bei 0016 der Fall war? Ich müsste diese an 3 und 5 betreiben.

    Antworten quote

  1. Dave123 sagt:

    Weis niemand wieso ich die Servos nicht an Pin D 9 und D 10 betreiben kann?
    Sollte doch eigentlich mit dem neuen IDE gehen...???

    Antworten quote

Kommentar hinzufügen

Der Inhalt dieses Feldes wird nicht öffentlich zugänglich angezeigt.
Array
CAPTCHA
Diese Frage hat den Zweck zu testen, ob man ein menschlicher Benutzer ist und um automatisierten Spam vorzubeugen.
Apfelsa_t:
Inhalt abgleichen