Add main.cpp
This commit is contained in:
115
main.cpp
Normal file
115
main.cpp
Normal file
@@ -0,0 +1,115 @@
|
||||
#include <Arduino.h>
|
||||
#include <SPI.h>
|
||||
#include <MFRC522.h>
|
||||
#include <WiFi.h>
|
||||
#include <HTTPClient.h>
|
||||
#include <Preferences.h> // Biblioteka do pamięci nieulotnej
|
||||
|
||||
// --- KONFIGURACJA ---
|
||||
const char* ssid = "TWOJA_NAZWA_WIFI";
|
||||
const char* password = "TWOJE_HASLO_WIFI";
|
||||
const String serverUrl = "http://twoja-domena.pl/check_access.php";
|
||||
const String apiKey = "MojeTajneHaslo123";
|
||||
|
||||
#define RST_PIN 22
|
||||
#define SS_PIN 5
|
||||
#define RELAY_PIN 2
|
||||
#define CACHE_SIZE 10 // Liczba zapamiętanych kart
|
||||
|
||||
MFRC522 mfrc522(SS_PIN, RST_PIN);
|
||||
Preferences preferences;
|
||||
|
||||
// Funkcja sprawdzająca, czy UID jest w lokalnej pamięci
|
||||
bool checkLocalCache(String uid) {
|
||||
preferences.begin("access-cache", true); // Tryb tylko do odczytu
|
||||
for (int i = 0; i < CACHE_SIZE; i++) {
|
||||
String key = "uid" + String(i);
|
||||
if (preferences.getString(key.c_str(), "") == uid) {
|
||||
preferences.end();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
preferences.end();
|
||||
return false;
|
||||
}
|
||||
|
||||
// Funkcja dodająca UID do pamięci (zastępuje najstarszy wpis - Round Robin)
|
||||
void addToCache(String uid) {
|
||||
preferences.begin("access-cache", false);
|
||||
int nextIndex = preferences.getInt("nextIdx", 0);
|
||||
|
||||
String key = "uid" + String(nextIndex);
|
||||
preferences.putString(key.c_str(), uid);
|
||||
|
||||
// Inkrementacja indeksu (0-9)
|
||||
nextIndex = (nextIndex + 1) % CACHE_SIZE;
|
||||
preferences.putInt("nextIdx", nextIndex);
|
||||
|
||||
preferences.end();
|
||||
Serial.println("Dodano kartę do lokalnej pamięci cache.");
|
||||
}
|
||||
|
||||
void openGate() {
|
||||
Serial.println(">>> DOSTĘP PRZYZNANY - OTWIERAM BRAMĘ <<<");
|
||||
digitalWrite(RELAY_PIN, LOW);
|
||||
delay(2000);
|
||||
digitalWrite(RELAY_PIN, HIGH);
|
||||
}
|
||||
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
SPI.begin();
|
||||
mfrc522.PCD_Init();
|
||||
pinMode(RELAY_PIN, OUTPUT);
|
||||
digitalWrite(RELAY_PIN, HIGH);
|
||||
|
||||
WiFi.begin(ssid, password);
|
||||
Serial.print("Łączenie z WiFi");
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// 1. Wykrywanie karty
|
||||
if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) return;
|
||||
|
||||
String uid = "";
|
||||
for (byte i = 0; i < mfrc522.uid.size; i++) {
|
||||
uid += String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : "");
|
||||
uid += String(mfrc522.uid.uidByte[i], HEX);
|
||||
}
|
||||
uid.toUpperCase();
|
||||
Serial.println("\nZczytano UID: " + uid);
|
||||
|
||||
// 2. Próba weryfikacji ONLINE
|
||||
if (WiFi.status() == WL_CONNECTED) {
|
||||
HTTPClient http;
|
||||
String url = serverUrl + "?uid=" + uid + "&key=" + apiKey;
|
||||
http.begin(url);
|
||||
int httpCode = http.GET();
|
||||
|
||||
if (httpCode > 0) {
|
||||
String payload = http.getString();
|
||||
if (payload == "ALLOW") {
|
||||
addToCache(uid); // Aktualizacja cache przy każdym sukcesie online
|
||||
openGate();
|
||||
} else {
|
||||
Serial.println("Dostęp zabroniony (Serwer)");
|
||||
}
|
||||
} else {
|
||||
// Błąd połączenia z serwerem, przejdź do trybu OFFLINE
|
||||
Serial.println("Błąd serwera. Próba autoryzacji OFFLINE...");
|
||||
if (checkLocalCache(uid)) openGate();
|
||||
else Serial.println("Brak karty w pamięci lokalnej.");
|
||||
}
|
||||
http.end();
|
||||
}
|
||||
// 3. Brak WiFi - Tryb OFFLINE
|
||||
else {
|
||||
Serial.println("Brak WiFi! Próba autoryzacji OFFLINE...");
|
||||
if (checkLocalCache(uid)) openGate();
|
||||
else Serial.println("Odmowa: Karta nieznana w trybie offline.");
|
||||
}
|
||||
|
||||
mfrc522.PICC_HaltA();
|
||||
delay(1500);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user