Přidání zadávání hesla.

This commit is contained in:
Matěj Kubíček
2026-06-08 10:03:51 +02:00
parent f2ba4556c8
commit 6f747c4b55
+106 -24
View File
@@ -23,17 +23,28 @@ LiquidCrystal_I2C lcd(0x27, 16, 2);
// proměnné // proměnné
// příklad je zadávané heslo, stavy, apod. // příklad je zadávané heslo, stavy, apod.
String password = ""; int password = 0; // 0-9999
int passwordValue = 0;
String savedPassword = ""; String savedPassword = "";
// chování zámku // enkodér
void OpenLock() { int lastCLK = HIGH;
servo.write(OPEN_POS);
// maska po kolika ms nečinnosti se heslo maskuje
constexpr unsigned long MASK_DELAY_MS = 2000;
unsigned long lastEncoderMove = 0;
bool masked = false;
// přeformátování kódu na 4 cifry
String formatCode(int value) {
String s = String(value);
while (s.length() < 4) s = "0" + s;
return s;
} }
void CloseLock() { // chování zámku
servo.write(CLOSED_POS); void OpenLock() { servo.write(OPEN_POS); }
} void CloseLock() { servo.write(CLOSED_POS); }
// chování bzučáku // chování bzučáku
void OpenSound() { void OpenSound() {
@@ -53,6 +64,14 @@ void CloseSound() {
noTone(BUZZER_PIN); noTone(BUZZER_PIN);
} }
void ConfirmSound() {
tone(BUZZER_PIN, 440, 100);
delay(130);
tone(BUZZER_PIN, 880, 200);
delay(230);
noTone(BUZZER_PIN);
}
// chování RGB LED // chování RGB LED
void OpenLED() { void OpenLED() {
analogWrite(RGB_GREEN_PIN, 120); analogWrite(RGB_GREEN_PIN, 120);
@@ -74,21 +93,90 @@ void NeutralLED() {
} }
void ButtonPressed() { void ButtonPressed() {
if (savedPassword == "") { if (savedPassword != "")
savedPassword = password; {
} if (formatCode(password) == savedPassword) {
else {
if (password == savedPassword) {
OpenLock(); OpenLock();
OpenSound(); OpenSound();
OpenLED(); OpenLED();
password = ""; password = 0;
} }
else { else {
CloseLock(); CloseLock();
CloseSound(); CloseSound();
CloseLED(); CloseLED();
password = ""; password = 0;
}
}
}
// setup hesla
void showSetupScreen(bool showValue) {
lcd.setCursor(0, 0);
lcd.printstr("Nastavte heslo: ");
lcd.setCursor(0, 1);
if (showValue) {
String code = formatCode(passwordValue);
// mezery okolo pro vizuální oddělení číslic
String display = code[0] + String(" ") + code[1] + String(" ") + code[2] + String(" ") + code[3] + String(" ");
lcd.printstr(display.c_str());
} else {
lcd.printstr("* * * * ");
}
}
// setup fáze blokující, dokud není heslo uloženo
void runPasswordSetup() {
NeutralLED();
passwordValue = 0;
masked = false;
lastEncoderMove = millis();
lastCLK = digitalRead(ENCODER_CLK_PIN);
showSetupScreen(true);
while (savedPassword == "") {
// čtení enkodéru
int currentCLK = digitalRead(ENCODER_CLK_PIN);
if (currentCLK != lastCLK && currentCLK == LOW) {
int dt = digitalRead(ENCODER_DT_PIN);
if (dt != currentCLK) {
passwordValue = (passwordValue + 1) % 10000;
} else {
passwordValue = (passwordValue - 1 + 10000) % 10000;
}
masked = false;
lastEncoderMove = millis();
showSetupScreen(true);
}
lastCLK = currentCLK;
// maskování po nečinnosti
if (!masked && millis() - lastEncoderMove >= MASK_DELAY_MS) {
masked = true;
showSetupScreen(false);
}
// potvrzení tlačítkem
if (digitalRead(BUTTON_PIN) == HIGH) {
savedPassword = formatCode(passwordValue);
ConfirmSound();
lcd.setCursor(0, 0);
lcd.printstr("Heslo ulozeno! ");
lcd.setCursor(0, 1);
lcd.printstr("* * * * ");
delay(1500);
// přechod do normálního režimu
lcd.setCursor(0, 0);
lcd.printstr("Zadejte heslo: ");
lcd.setCursor(0, 1);
lcd.printstr(" ");
// debounce
while (digitalRead(BUTTON_PIN) == HIGH) {}
delay(50);
} }
} }
} }
@@ -120,28 +208,22 @@ void setup() {
lcd.setCursor(0, 1); lcd.setCursor(0, 1);
lcd.printstr("NastavujiSePiny."); lcd.printstr("NastavujiSePiny.");
Serial.println("Nastavování pinů"); Serial.println("Nastavování pinů");
// nastavení pinu na tlačítko
pinMode(BUTTON_PIN, INPUT_PULLDOWN); // nezmáčknuto = 0
Serial.println("Piny: 1/8");
// nastavení pinů pro RGB LED (bude přes pwm, není to nutné přes pinmode, ale lepší to udělat) // Credit: formátování vymyšleno přes Claude Sonnet 4.6
pinMode(BUTTON_PIN, INPUT_PULLDOWN); Serial.println("Piny: 1/8");
pinMode(RGB_RED_PIN, OUTPUT); Serial.println("Piny: 2/8"); pinMode(RGB_RED_PIN, OUTPUT); Serial.println("Piny: 2/8");
pinMode(RGB_GREEN_PIN, OUTPUT); Serial.println("Piny: 3/8"); pinMode(RGB_GREEN_PIN, OUTPUT); Serial.println("Piny: 3/8");
pinMode(RGB_BLUE_PIN, OUTPUT); Serial.println("Piny: 4/8"); pinMode(RGB_BLUE_PIN, OUTPUT); Serial.println("Piny: 4/8");
// nastavení pinů pro enkodér
pinMode(ENCODER_CLK_PIN, INPUT); Serial.println("Piny: 5/8"); pinMode(ENCODER_CLK_PIN, INPUT); Serial.println("Piny: 5/8");
pinMode(ENCODER_DT_PIN, INPUT); Serial.println("Piny: 6/8"); pinMode(ENCODER_DT_PIN, INPUT); Serial.println("Piny: 6/8");
// nastavení pinu pro servo
pinMode(SERVO_PIN, OUTPUT); Serial.println("Piny: 7/8"); pinMode(SERVO_PIN, OUTPUT); Serial.println("Piny: 7/8");
// nastavení pinu pro bzučák
pinMode(BUZZER_PIN, OUTPUT); Serial.println("Piny: 8/8"); pinMode(BUZZER_PIN, OUTPUT); Serial.println("Piny: 8/8");
Serial.println("Piny nastaveny."); Serial.println("Piny nastaveny.");
lcd.setCursor(0, 1); lcd.setCursor(0, 1);
lcd.printstr("Piny nastaveny. "); lcd.printstr("Piny nastaveny. ");
delay(1000); delay(1000);
runPasswordSetup();
} }
void loop() { void loop() {