Türöffnung

Hallo!

Ich würde gerne für einen Geocache ein Türschloss mit einer 4 stelligen Zahl benutzen. Nach einiger Recherche bin ich schließlich zu folgendem gelangt:

#include <Keypad.h>

char* secretCode = "1234";
int position = 0;
boolean locked = true;

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] = {9, 8, 7, 6}; 
byte colPins[cols] = {4, 3, 2}; 
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols);
int redPin = 11;
int greenPin = 12;
int yellowPin=1;
int magnetpin=13;
int buzzer=10;

void setup()
{
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(magnetpin, OUTPUT);
pinMode (buzzer, OUTPUT);
updateOutputs();
}

void loop()


{
char key = keypad.getKey();
if (key == '#')
{
position = 0;
digitalWrite(yellowPin, HIGH);
delay(500);
digitalWrite(buzzer, LOW);
}
if (key == secretCode[position])
{
position ++;
}
if (position == 4)
{
locked=false;
updateOutputs();
}

delay(100);
}
void updateOutputs()

{
if (locked)
{
digitalWrite(redPin, HIGH);
digitalWrite(greenPin, LOW); 
digitalWrite(magnetpin, LOW);

}
else
{
digitalWrite(redPin, LOW);
digitalWrite(greenPin, HIGH); 
digitalWrite(buzzer, HIGH);
digitalWrite(magnetpin, HIGH);
delay(5000);
digitalWrite(redPin, HIGH);
digitalWrite(greenPin, LOW); 
digitalWrite(buzzer, LOW);
digitalWrite(magnetpin, LOW);
}

}

soweit so gut, allerdings hätte ich gerne, dass nach der Eingabe vier falscher Tasten eine Lampe leuchtet und die Eingabe gleich zurückgesetzt wird, anstatt jedes Mal # zum Zurücksetzen drücken zu müssen.

Bin für jeden Rat dankbar :slight_smile:

if (key == secretCode[position])
{
     position++;
}

Da noch einen else-Zweig einfügen und mitzählen wie oft die Eingabe falsch war. Dann nach jeder falschen Eingabe überprüfen wo dieser Zähler steht.

und mit welchen Befehlen klappt das am geschicktesten?

Ich habe das ein oder andere an dieser Stelle versucht, mit dem Ergebnis, dass ständig ein Fehler angezeigt wurde, nicht erst nach vier falschen Eingaben. Bin allerdings auch erst ganz frisch eingestiegen in diese Thematik, weswegen mich das nicht sonderlich verwundert.

Geht es in etwa so?

if (key == secretCode[position])
{ position++;}
else
{
position1 ++;}

if position1 == 4
{
digitalRead(led, HIGH);
delay(500);
digitalRead(led, LOW);
position = 0;
}

?

Ja. Du solltest der Variable aber einen vernünftigen Namen geben. z.B. sowas wie "error" oder "falseInput"

Außerdem musst du sie wieder auf 0 zurücksetzen. Sonst geht das nur ein mal.

Würde digitalWrite anstelle von digitalRead benützen, um die LED ein- und aus zu schalten.
Ausserdem denke ich, wird die Eingabe von einigen richtigen und einigen falschen Zahlen zu einer längeren Abfolge führen als geplant war, da position1 nur bei falschen Eingaben weitergezählt wird.

Wenn ich mir deinen eingangs geposteten Code genauer anschaue, sehe ich gar keine Stelle, an der eine falsche Eingabe behandelt wird. Wenn ich mir das so vorstelle, kommt es mir vor, als könnte ich einfach alle Zahlen der Reihe nach durchdrücken, wenn sie falsch ist, passiert nichts, wenn es die richtige ist, zählt es weiter, bis irgendwann alle vier gedrückt wurden. Korrigier mich, wenn ich mich irre.

Könnte mir einen Ablauf etwa folgendermassen vorstellen (vereinfacht geschrieben):

if (key gedrückt) {			// abfragen, ob ein key gedrückt wurde, ob falsch oder richtig ist egal
	count++;		        		// Anzahl Eingaben festhalten
	if (key stimmt) {			// auswerten ob richtig
		position++;		// wenn ja, positionszähler weiterzählen, wenn falsch, wird nur count inkrementiert
	}
}

if (count == 4)				// wenn vier eingaben erfolgt sind, unabhängig ob richtig oder falsch
	if (position == 4)  {		// schauen, ob alle vier richtig waren
		// unlock			// wenn ja, das Ding aufschliessen und alles auf null setzen
		// alles zurücksetzen
	}
	else {
		// alles zurücksetzen 	// wenn position nicht auf 4 ist, war wohl eine oder mehrere falsche Eingaben dabei
		// Fehleranzeige
	}
}

Mit der letzten Hilfestellung hab ichs hinbekommen, vielen Dank!