Kódový Zámek
Popis
Tento projekt slouží jako kódový zámek. Uživatel zadá heslo pomocí klávesnice, a pokud je heslo správné, systém se odemkne. Na OLED displeji se zobrazí status "Odemknuto" nebo "Špatné heslo". Tlačítko *** vymaže zadané heslo, tlačítko #** zase potvrdí
Komponenty
| Součastka | Značka | Použití | Popis |
|---|---|---|---|
| Keypad | ![]() |
Klávesnice, Pohybování v menu, Kalkulačka | Keypad je tlačítková klávesnice, která se často používá pro zadávání čísel nebo kódů – podobně jako u kalkulačky. Nejčastěji má 4 řady a 3 nebo 4 sloupce (např. 4x3 = číslice 0–9, *, #). |
| OLED | ![]() |
Zobrazování dat, kódové zámky, Kreslení obrázku | K podsvicení používájí jednotlivé pixely. |
Ukazkovy kod
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <Keypad.h>
#include <Keypad_I2C.h>
// Display
U8G2_SH1107_PIMORONI_128X128_F_HW_I2C oled(U8G2_R1, U8X8_PIN_NONE);
// Keypad
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'A', 'B', 'C', 'D'},
{'3', '6', '9', '#'},
{'2', '5', '8', '0'},
{'1', '4', '7', '*'}
};
byte rowPins[ROWS] = {7, 6, 5, 4};
byte colPins[COLS] = {0, 1, 2, 3};
Keypad_I2C keypad = Keypad_I2C(makeKeymap(keys), rowPins, colPins, ROWS, COLS, 0x20);
// Zámek
const String correctPassword = "1234";
String enteredPassword = "";
String statusMessage = "";
bool unlocked = false;
void setup() {
Serial.begin(115200);
Wire.begin(14, 15); // SDA, SCL
oled.begin();
oled.setFont(u8g2_font_ncenB14_tr);
keypad.begin(makeKeymap(keys));
}
void loop() {
char key = keypad.getKey();
if (key) {
Serial.print("Key: ");
Serial.println(key);
if (key == '#') {
if (enteredPassword == correctPassword) {
statusMessage = "Odemknuto";
unlocked = true;
} else {
statusMessage = "Spatne heslo";
}
enteredPassword = "";
}
else if (key == '*') {
enteredPassword = "";
statusMessage = "Spatne heslo";
}
else {
if (enteredPassword.length() < 8) { // limituj max 8 znaků
enteredPassword += key;
}
statusMessage = "";
}
}
// OLED výstup
oled.firstPage();
do {
// Nápis nahoře
String title = "Zadej heslo";
int titleX = (128 - oled.getStrWidth(title.c_str())) / 2;
oled.setCursor(titleX, 20);
oled.print(title);
// Heslo uprostřed
String displayText = enteredPassword;
int boxWidth = 100;
int boxHeight = 24;
int boxX = (128 - boxWidth) / 2;
int boxY = (128 - boxHeight) / 2;
oled.drawFrame(boxX, boxY, boxWidth, boxHeight);
// Text uvnitř boxu – zarovnán na střed
int textWidth = oled.getStrWidth(displayText.c_str());
int textX = (128 - textWidth) / 2;
int textY = boxY + 17; // trochu posunout dolů v boxu
oled.setCursor(textX, textY);
oled.print(displayText);
// Status message (např. Odemknuto)
if (statusMessage.length() > 0) {
int statusX = (128 - oled.getStrWidth(statusMessage.c_str())) / 2;
oled.setCursor(statusX, 120);
oled.print(statusMessage);
}
} while (oled.nextPage());
}

