Arduino Polska Forum
Drzwi na kod. - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Programowanie w Arduino (https://forum.arduinopolska.pl/dzial-programowanie-w-arduino)
+--- Wątek: Drzwi na kod. (/watek-drzwi-na-kod)



Drzwi na kod. - Atypowy - 01-11-2020

Witam,
próbuje zrobić drzwi na hasło z arduino, ale mam jeden problem którego nie potrafię rozwiązać.
Chodzi mi o to, że jeżeli mam kod "123"i wpisuje go w klawiaturę to wszystko działa, ale gdy wpiszę np. "0123" to też działa (a nie chce).
Chcę żeby był jakiś limit do trzech liczb żeby odczytywało w taki sposób: "012" a nie taki "0123".

Liczę na waszą pomoc! [Obrazek: icon_wink.gif]

Tutaj kod:

#include <Servo.h>
#include <Keypad.h>
Servo ServoMotor;
char* password = "123";
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 rowPins[ROWS] = { 9, 8, 7, 6 };
byte colPins[COLS] = { 5, 4, 3, 2 };
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
int RedpinLock = 12;
int GreenpinUnlock = 13;
void setup()
{
pinMode(RedpinLock, OUTPUT);
pinMode(GreenpinUnlock, OUTPUT);
ServoMotor.attach(11);
LockedPosition(true);
}
void loop()
{
char key = keypad.getKey();
if (key == '*' || key == '#')
{
position = 0;
LockedPosition(true);
}
if (key == password[position])
{
position ++;
}
if (position == 3)
{
LockedPosition(false);
}
delay(100);
}
void LockedPosition(int locked)
{
if (locked)
{
digitalWrite(RedpinLock, HIGH);
digitalWrite(GreenpinUnlock, LOW);
ServoMotor.write(11);
}
else
{
digitalWrite(RedpinLock, LOW);
digitalWrite(GreenpinUnlock, HIGH);
ServoMotor.write(90);
}
}


RE: Drzwi na kod. - kaczakat - 02-11-2020

position ++; to nie jest dobry pomysł, masz w password tablicę na trzy znaki + 0, czyli cztery elementy.
position++ może być tylko wtedy jeżeli jest mniejsze równe 2. Pod indeksem 3 ma być zawsze 0 kończące napis.
if (position<=2) position++; else position=0;
Nie porównuj literek tylko cały przypisany napis do napisu zawierającego hasło.
Oczywiście jak wszędzie nauka obsługi czasu, kiedy upłynie np. 10s od wciśnięcia ostatniego znaku decyzja, że hasło błędne, reset na pozycję 0.