Firmvér pre RFID prístupový systém s API validáciou a NeoPixel vizualizáciou

Vytvorené: 24. 8. 2025 08:37 Aktualizované: 27. 8. 2025 13:14
Vyriešené
Obsah článku

title: "Firmvér pre RFID prístupový systém s API validáciou a NeoPixel vizualizáciou"
slug: "esp8266-rfid-api-neopixel-lock"
technologies: ["ESP8266", "Arduino", "RFID (MFRC522)", "NeoPixel (WS2812B)", "REST API", "Modbus TCP", "ArduinoJson", "WiFiManager"]
tags: ["iot", "access-control", "rfid", "neopixel", "api-integration", "esp8266", "modbus", "firmware", "smart-lock"]
date_solved: "2025-08-18"

Projekt/Téma: Vývoj firmvéru pre inteligentný prístupový systém založený na RFID technológii, ktorý overuje prístupové práva cez vzdialené REST API, poskytuje vizuálnu spätnú väzbu pomocou NeoPixel LED pásika a umožňuje integráciu do priemyselných systémov cez Modbus TCP.

1. Cieľ / Problém na vyriešenie: Cieľom bolo vytvoriť moderný a flexibilný prístupový systém, ktorý by nahradil tradičné offline riešenia. Kľúčové požiadavky boli:

  1. Centralizovaná správa: Prístupové práva sa nespravujú lokálne v zariadení, ale cez vzdialené API. To umožňuje okamžité pridávanie/odoberanie prístupov bez nutnosti fyzickej interakcie so čítačkou.
  2. Intuitívna spätná väzba: Užívateľ musí dostať jasnú a okamžitú vizuálnu a zvukovú informáciu o výsledku (prístup povolený/zamietnutý).
  3. Spoľahlivosť a odolnosť: Zariadenie musí byť schopné dlhodobej autonómnej prevádzky, vedieť sa zotaviť z výpadkov siete a prežiť zlyhanie API servera.
  4. Integračná schopnosť: Zariadenie musí byť možné monitorovať a čiastočne ovládať cez štandardné priemyselné protokoly (Modbus TCP).

2. Použité technológie a nástroje:

  • Mikrokontrolér: ESP8266
  • Senzor: RFID čítačka MFRC522 (SPI zbernica)
  • Vizuálny výstup: RGB LED pásik NeoPixel (WS2812B)
  • Akčný člen: 2x Relé (jedno pre zámok, druhé pre bzučiak)
  • Komunikácia a protokoly:
    • WiFi: Spravované knižnicou WiFiManager pre jednoduché nastavenie.
    • HTTPS/REST API: Pre overovanie UID RFID tagov na externom serveri. Používa BearSSL pre zabezpečené spojenie.
    • JSON: Dátový formát pre komunikáciu s API, spracovaný knižnicou ArduinoJson.
    • Modbus TCP: Pre vzdialený monitoring a ovládanie relé.
  • Správa a údržba: OTA (Over-The-Air) aktualizácie, Telnet konzola, Web server.

3. Kľúčové postupy a konfiguračné kroky:

  1. Inicializácia: Pri štarte sa inicializujú všetky periférie (SPI pre RFID, GPIO pre relé, NeoPixel pásik), načíta sa konfigurácia WiFi a zariadenie sa pripojí k sieti.
  2. Stavový automat pre RFID: Hlavná slučka (loop) je navrhnutá neblokujúco. Kontroluje prítomnosť novej RFID karty iba vtedy, ak neprebieha iná operácia (animácia, API volanie, pauza po čítaní).
  3. API Validácia: Po priložení karty sa jej UID odošle ako JSON požiadavka na server_url. Zariadenie čaká na odpoveď, ktorá obsahuje status a akciu (napr. action: "r1on").
  4. Spustenie akcie: Na základe odpovede z API sa vykoná príslušná akcia:
    • Prístup povolený: Zopne sa relé zámku na krátky impulz (RELE_ACTIVE_PULSE) a spustí sa neblokujúca animácia accessGrantedAnimation na NeoPixel pásiku (postupné zelené zhasínanie).
    • Prístup zamietnutý: Zopne sa relé bzučiaka (niekoľko krátkych pípnutí) a spustí sa animácia accessDeniedAnimation (červené prebliknutie).
  5. Monitoring API dostupnosti: Zariadenie v pravidelných intervaloch (API_CHECK_INTERVAL) posiela "ping" požiadavku na API. Ak server neodpovedá, systém prejde do offline režimu a dočasne zamietne všetky pokusy o prístup, aby sa predišlo zablokovaniu v dôsledku čakania na nedostupné API.
  6. Obsluha Modbus: Paralelne s RFID logikou beží Modbus TCP server, ktorý umožňuje čítať stav zariadenia (uptime, sila signálu) a manuálne ovládať relé (s prioritou pre RFID akcie).

4. Výsledné kódy a skripty:

  • Neblokujúca obsluha animácií: Kľúčový prvok pre responzívne správanie. Miesto použitia delay() sa využíva stavový automat (enum AnimationState) a časovače (millis()), čo umožňuje, aby ostatné časti kódu (sieť, Modbus) bežali aj počas prehrávania animácie.

    // === HLAVNÁ FUNKCIA PRE OBSLUHU ANIMÁCIÍ ===
    void handleAnimations() {
      unsigned long currentTime = millis();
    
      switch (currentAnimation) {
        case ANIM_IDLE:
          // Nič nerobíme
          break;
    
        case ANIM_GRANTED:
          // Logika pre postupne zhasinanie zelenych LED...
          break;
    
        case ANIM_DENIED:
          // Logika pre cervene blikanie...
          break;
      }
    }

5. Zistené problémy a riešenia (Gotchas):

  • Problém: Blokujúce sieťové operácie (čakanie na API odpoveď) by mohli spôsobiť, že zariadenie nereaguje na iné podnety (Modbus, OTA).
    • Riešenie: Celá hlavná slučka je navrhnutá ako neblokujúca. Sieťové volanie je síce vo svojej podstate blokujúce, ale je zapuzdrené v stavovom automate (rfid_processing), ktorý zabráni ďalším čítaniam, kým nie je operácia dokončená alebo neuplynie časový limit (RFID_PROCESSING_TIMEOUT).
  • Problém: Dlhé a zložité animácie s delay() by zablokovali celý systém.
    • Riešenie: Implementácia plne neblokujúceho animačného systému pomocou millis() a stavového automatu. Funkcia handleAnimations() je volaná v každom cykle loop() a vykoná len malý krok animácie, ak nastal čas, čím uvoľní procesor pre ostatné úlohy.
  • Problém: Výpadok API servera by mohol znefunkčniť celý prístupový systém.
    • Riešenie: Zavedenie periodickej kontroly dostupnosti API (checkApiStatus). Ak API nie je dostupné, globálny príznak isApiAvailable sa nastaví na false a všetky pokusy o validáciu karty sú okamžite zamietnuté s príslušnou animáciou. Tým sa zabráni zbytočným a dlhým timeoutom pri každom priložení karty.
  • Problém: "Odrážanie" signálu bzučiaka alebo rýchle opätovné priloženie karty mohlo spôsobiť chaos.
    • Riešenie: Po každej akcii (úspešnej aj neúspešnej) sa aktivuje krátka pauza (rfid_pause_time), počas ktorej čítačka ignoruje nové karty. Tým sa zabezpečí, že každá akcia je jasne oddelená.

6. Finálny výsledok / Záver: Výsledkom je sofistikovaný a robustný firmvér, ktorý spája hardvérovú interakciu s modernou cloudovou infraštruktúrou. Vďaka neblokujúcej architektúre je systém vysoko responzívny. Monitorovanie dostupnosti API a možnosť integrácie cez Modbus z neho robia spoľahlivé a škálovateľné riešenie pre moderné prístupové systémy. Projekt je vynikajúcim príkladom, ako aj na malej platforme ako ESP8266 možno implementovať zložité a odolné systémy.

Vyriešené: 18. 8. 2025