Was muss ich an meinem Arduino-Programm ändern?
Was ist falsch an meinem Arduino-Programm?
Bis jetzt bewirkt es, dass, wenn man die Taste 2 oder A drückt, die rote LED leuchtet und ein nehativer Ton erklingt. Mehr nicht.
Eigntlich soll die Schaltung so funktioneren, dass, wenn man den Code 2009 eingibt, die grüne LED leuchtet, ein fröhlicher Ton aus dem Buzzer erklingt und der Servo sich für 50 Sekunden um 90 Grad öffnet. Sollte man den Code falsch eingeben, leuchtet die rote LED, ein negativer Ton erklingt und der Servo bleibt verschlossen.
#include <Keypad.h>
#include <Servo.h>
#define Buzzer 11
Servo Servo;
int roteLED = 12;
int grueneLED = 13;
void setLocked(bool locked)
{
if (locked) {
digitalWrite(roteLED, HIGH);
digitalWrite(grueneLED, LOW);
Servo.write(0);
tone(Buzzer, 400, 500);
delay(500);
noTone(Buzzer);
digitalWrite(roteLED, LOW);
}
else {
digitalWrite(roteLED, LOW);
digitalWrite(grueneLED, HIGH);
Servo.write(90);
tone(Buzzer, 1000, 200);
delay(250);
tone(Buzzer, 1500, 200);
delay(250);
tone(Buzzer, 2000, 200);
delay(250);
noTone(Buzzer);
delay(50000);
Servo.write(0);
}
}
int position = 0;
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 colPins[COLS] = {2, 3, 4, 5};
byte rowPins[ROWS] = {6, 7, 8, 9};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
const char code[5] = "2009";
void setup()
{
pinMode(roteLED, OUTPUT);
pinMode(grueneLED, OUTPUT);
pinMode(Buzzer, OUTPUT);
Servo.attach(10);
setLocked(true);
}
void loop()
{
const char key = keypad.getKey();
if (key == '*'||key == '#') {
position = 0;
setLocked(true);
}
if (key == code[position]) {
position++;
}
else
position = 0;
if (position == 4) {
setLocked(false);
}
delay(100);
}
2 Antworten
Du musst dem Menschen auch Zeit geben, die Taste loszulassen.
Ich würde das Programm erstmal so gestalten, dass das eingeben der Sequenz funktioniert.
Also erstmal was machen, was einen langen Tastendruck als einen Tastendruck erkennt.
Dann etwas, was einen Zähler hochzählt nach jedem Tastendruck und beim 4 Druck auf 0 geht.
Dann die Werte speichern und vergleichen.
Dann das volle Programm.
Jeweils die Fortschritte einzeln testen.
Ich würde erstmal 4 LEDs anschließen oder den Zustand mit serieller Schnitstelle und println ausgeben.
Dann würde ich vielleicht mal anfangen zu lernen selbst zu programmieren, statt dir Code generieren zu lassen von ChatGPT und Co...
Zusätzlich zur Antwort von W00dp3ckr:
Welche Keypad Library verwendest du denn und was liefert die wenn keine Taste gedrückt wird?
Die Zeile:
const char code[5] = "2009";
Stimmt zwar ist aber Fehleranfällig.
const char* code = "2009";
Ist hier besser, weil du die Länge nicht explizit angeben musst.
Zudem muss man hier aufpassen wegen dem Read. C überprüft Arraygrenzen nicht.
Es ist zwar implizit je nach verhalten dee Keypad library nicht möglich, aber wenn position == strlen(code) ist sollte position nicht weiter erhöht werden.
Ja ich weiß aber nicht wie das ist ja das Problem