🔧 Co zbudujesz?
W tym projekcie zbudujesz elektroniczny zamek na kod, sterowany przez ekran dotykowy. Dzięki integracji z AI możesz dodać rozpoznawanie użytkownika, autoblokadę przy błędnym kodzie i historię logowań.
🧰 Komponenty
- ESP32
- Ekran dotykowy TFT 2.4″ (SPI, np. ILI9341 + XPT2046)
- Przekaźnik 5V lub moduł przekaźnika
- Zamek elektromagnetyczny lub inne urządzenie do otwierania
- Zasilacz 5V (lub powerbank do testów)
- Przewody połączeniowe, płytka stykowa
- Arduino IDE
- Biblioteki:
Adafruit_GFX
,Adafruit_ILI9341
,XPT2046_Touchscreen
📊 Schemat połączeń
Ekran TFT:
- VCC → 3.3V
- GND → GND
- CS → D15
- RESET → D4
- DC/RS → D2
- MOSI → D23
- SCK → D18
- LED → 3.3V
Dotyk (XPT2046):
- T_CS → D5
- T_IRQ → D21
- DIN/MOSI → D23
- DOUT/MISO → D19
- CLK → D18
- VCC/GND jak wyżej
Przekaźnik:
- IN → D25
- VCC → 5V
- GND → GND
💻 Kod programu
Przykładowy kod: weryfikacja 4-cyfrowego kodu PIN (np. 1234):
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <XPT2046_Touchscreen.h>
#define TFT_CS 15
#define TFT_DC 2
#define TFT_RST 4
#define TOUCH_CS 5
#define TOUCH_IRQ 21
#define RELAY_PIN 25
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
XPT2046_Touchscreen ts(TOUCH_CS, TOUCH_IRQ);
String pinCode = "";
const String correctCode = "1234";
void setup() {
Serial.begin(115200);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
tft.begin();
ts.begin();
ts.setRotation(1);
tft.setRotation(1);
drawKeypad();
}
void loop() {
if (ts.touched()) {
TS_Point p = ts.getPoint();
int x = map(p.x, 200, 3800, 0, 240);
int y = map(p.y, 200, 3800, 0, 320);
int col = x / 80;
int row = y / 80;
int key = row * 3 + col + 1;
if (row == 3 && col == 1) { // Enter
if (pinCode == correctCode) {
tft.fillScreen(ILI9341_GREEN);
tft.setCursor(20, 150);
tft.setTextSize(3);
tft.print("Kod OK!");
digitalWrite(RELAY_PIN, HIGH);
delay(5000);
digitalWrite(RELAY_PIN, LOW);
} else {
tft.fillScreen(ILI9341_RED);
tft.setCursor(20, 150);
tft.setTextSize(3);
tft.print("Błędny kod!");
delay(2000);
}
pinCode = "";
drawKeypad();
} else if (row < 3) {
pinCode += String(key);
tft.fillRect(0, 0, 240, 40, ILI9341_BLACK);
tft.setCursor(10, 10);
tft.setTextSize(2);
tft.setTextColor(ILI9341_WHITE);
tft.print("Kod: ");
tft.print(pinCode);
}
delay(300);
}
}
void drawKeypad() {
tft.fillScreen(ILI9341_BLACK);
tft.setTextSize(3);
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
int x = j * 80;
int y = i * 80 + 40;
tft.drawRect(x, y, 80, 80, ILI9341_WHITE);
tft.setCursor(x + 30, y + 25);
tft.print(i * 3 + j + 1);
}
}
// ENTER button
tft.drawRect(80, 280, 80, 40, ILI9341_WHITE);
tft.setCursor(95, 290);
tft.setTextSize(2);
tft.print("OK");
}
🧠 Rozszerzenie z AI
- Rejestracja logów i analiza błędów kodu: przesyłanie danych do Firebase i analiza prób logowania.
- Wykrycie nietypowego zachowania: np. 3 błędne próby = powiadomienie na telefon.
- Zamiast kodu — rozpoznawanie twarzy lub głosu (ESP32-CAM lub Raspberry Pi z OpenCV i TensorFlow Lite).
🧰 Montaż krok po kroku
- Podłącz ekran TFT i dotyk zgodnie ze schematem do ESP32.
- Podłącz przekaźnik do wybranego pinu ESP.
- Wgraj kod przez Arduino IDE z wymaganymi bibliotekami.
- Umieść całość w obudowie np. z drukarki 3D.
- Przetestuj — wpisz kod 1234 i sprawdź, czy przekaźnik zaskakuje.
🌐 Możliwe rozszerzenia
- Interfejs do zmiany kodu przez ekran
- Historia użycia — kto i kiedy otworzył
- Tryb czasowy (np. kod działa tylko między 8:00 a 18:00)
- Integracja z systemem domowym (Home Assistant, MQTT)
✅ Podsumowanie
Ten zamek to nie tylko świetna zabawa z ekranem dotykowym, ale też bardzo praktyczne rozwiązanie DIY. Możesz z niego zrobić zamek do warsztatu, szafki z narzędziami lub… własnego sejfu!