// flowchart
flowchart TD
A([START]) --> B[Serial.begin 115200]
B --> C[initWiFi]
C --> C1[WiFi.begin\nSSID + password]
C1 --> C2{WiFi\nconnected?}
C2 -- No --> C3[Wait 500 ms] --> C2
C2 -- Yes --> C4[Print IP · RSSI · MAC]
C4 --> D[initMQTTbroker]
D --> D1[setServer broker:1883]
D1 --> D2[setCallback → callback]
D2 --> E[SPI.begin]
E --> F[mfrc522.PCD_Init]
F --> G[Set 7-segment pins as OUTPUT]
G --> LOOP
subgraph LOOP [" loop() "]
L1{MQTT\nconnected?} -- No --> L2[mqttConnect]
L2 --> L2a{Connect OK?}
L2a -- Yes --> L2b[Publish hello\nSubscribe EscapeGame/Number]
L2a -- No --> L2c[Wait 5 s] --> L2
L2b --> L3
L1 -- Yes --> L3[mqttClient.loop\nprocess messages]
L3 --> L4[Prepare MIFARE key 0xFFFFFF]
L4 --> L5{New card\npresent?}
L5 -- No --> L1
L5 -- Yes --> L6{Read card\nserial OK?}
L6 -- No --> L1
L6 -- Yes --> L7[Authenticate block 1\nwith Key A]
L7 --> L8{Auth OK?}
L8 -- No --> L9[Print auth error] --> L1
L8 -- Yes --> L10[Read block 1 → buffer]
L10 --> L11{Read OK?}
L11 -- No --> L12[Print read error] --> L1
L11 -- Yes --> L13[Print 6 bytes to Serial]
L13 --> L14[Publish buffer to\nEscapeGame/ScannedCode]
L14 --> L15[Delay 1000 ms]
L15 --> L16[PICC_HaltA\nPCD_StopCrypto1]
L16 --> L1
end
subgraph CALLBACK [" callback() — triggered by incoming MQTT "]
CB1[Receive topic + message] --> CB2[Assemble message string]
CB2 --> CB3{Topic ==\nEscapeGame/Number?}
CB3 -- No --> CB_END([Return])
CB3 -- Yes --> CB4{Message\nvalue?}
CB4 -- 1 --> CB5[Display 1]
CB4 -- 2 --> CB6[Display 2]
CB4 -- 3 --> CB7[Display 3]
CB4 -- 4 --> CB8[Display 4]
CB4 -- 0 --> CB9[All segments OFF]
CB5 & CB6 & CB7 & CB8 & CB9 --> CB_END
end