Přidání zadávání hesla.
This commit is contained in:
+106
-24
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user