MQTT RFID Kartenlesegerät
Der gezeigte Code ist für einen ESP8266 (wie z.B. NodeMCU) entwickelt und kombiniert einen RFID-Kartenleser (MFRC522) mit WLAN- und MQTT-Funktionalität. Im Detail:
Hauptfunktionen
- RFID-Leser mit MQTT-Integration:
- Der MFRC522 RFID-Leser erkennt RFID-Karten und sendet die UID der Karte über MQTT an einen definierten MQTT-Broker.
- LEDs (grün, rot, blau) können über MQTT-Kommandos ein- oder ausgeschaltet werden.
Komponenten
- ESP8266 Mikrocontroller: Wird verwendet, um das WLAN und die MQTT-Kommunikation bereitzustellen.
- MFRC522 RFID-Reader: Erkennt RFID-Karten.
- RGB-LED: Drei einzelne LEDs (grün, rot, blau) zur Anzeige des Zustands, die über MQTT gesteuert werden können.
Pin-Konfiguration
- SS_PIN (D0): Der Chip-Select-Pin für den RFID-Leser.
- GREEN_LED_PIN (D3): Pin für die grüne LED.
- RED_LED_PIN (D2): Pin für die rote LED.
- BLUE_LED_PIN (D8): Pin für die blaue LED.
Die Pins am ESP8266 sind entsprechend der GPIO-Belegung:
- D0 entspricht GPIO16
- D3 entspricht GPIO0
- D2 entspricht GPIO4
- D8 entspricht GPIO15
Funktionsweise
Setup:
- Das WLAN wird konfiguriert.
- Die MQTT-Verbindung wird aufgebaut.
- Der RFID-Leser wird initialisiert.
- Die LED-Pins werden als Ausgänge definiert und standardmäßig ausgeschaltet.
Loop:
- Es wird ständig geprüft, ob der MQTT-Client verbunden ist. Wenn nicht, wird versucht, die Verbindung wiederherzustellen.
- Es wird überprüft, ob eine neue RFID-Karte erkannt wird. Wenn eine Karte gelesen wird, wird die UID in einem bestimmten MQTT-Thema veröffentlicht.
- Anfragen zu den LEDs (z.B. „true“ oder „false“) werden über MQTT empfangen und entsprechend ausgeführt (LED ein- oder ausschalten).
Anschlüsse
MFRC522 RFID-Leser:
- SS_PIN (SDA): Mit D0 (GPIO16) des ESP8266 verbunden.
- SCK (SPI Clock): An D5 (GPIO14).
- MOSI (Master Out Slave In): An D7 (GPIO13).
- MISO (Master In Slave Out): An D6 (GPIO12).
- GND: An GND des ESP8266.
- 3.3V: An 3.3V des ESP8266.
LEDs:
- Grüne LED: Mit D3 (GPIO0) verbunden, der andere Anschluss der LED geht an GND.
- Rote LED: Mit D2 (GPIO4) verbunden, der andere Anschluss der LED geht an GND.
- Blaue LED: Mit D8 (GPIO15) verbunden, der andere Anschluss der LED geht an GND.
Die LEDs sollten dabei über Vorwiderstände angeschlossen werden (meist ca. 220Ω), um die LED zu schützen.
MQTT-Kommunikation
- Das Gerät verbindet sich über WLAN mit einem MQTT-Server und meldet sich an Themen an, die für die Steuerung der LEDs verwendet werden.
- Wenn eine neue RFID-Karte erkannt wird, wird deren UID an den MQTT-Server gesendet.
Nutzung
- Dieser Aufbau könnte zum Beispiel für ein Zugangskontrollsystem verwendet werden. Sobald eine autorisierte Karte gescannt wird, könnten die LEDs als visuelles Feedback zur Zugangsberechtigung dienen (grün = Zugriff erlaubt, rot = Zugriff verweigert).
- Die UID der Karte wird über den MQTT-Broker veröffentlicht, was bedeutet, dass andere Geräte im Netzwerk die UID empfangen und darauf basierend Aktionen ausführen können.
#include
#include
#include
#include
#define SS_PIN D0 // (GPIO16)
#define GREEN_LED_PIN D3 // (GPIO0)
#define RED_LED_PIN D2 // (GPIO4)
#define BLUE_LED_PIN D8 // (GPI15)
MFRC522 mfrc522(SS_PIN, -1); // -1 bedeutet, dass der RST-Pin nicht verwendet wird
const char* ssid = "WLAN SSID"; // hier Dein WLAN Name eintragen
const char* password = "WLAN Passwort"; // hier Dein WLAN Passwort eintragen
const char* mqtt_server = "192.168.x.xx"; // hier die IP des MQTT-Servers eintragen
const int mqtt_port = 1885; // hier den Port des MQTT-Servers eintragen
const char* mqtt_user = "MQTT-User"; // hier den Benutzer vom MQTT-Servers eintragen
const char* mqtt_password = "MQTT-Passwort"; // hier das Passwort vom MQTT-Servers eintragen
const char* device_name = "RFID-Cardreader"; // hier den Name des Lesegerätes eintragen
WiFiClient espClient;
PubSubClient client(espClient);
void setup_wifi();
void reconnect();
void callback(char* topic, byte* payload, unsigned int length);
void setup() {
Serial.begin(115200); // Serielle Kommunikation initialisieren
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
SPI.begin(); // Keine Parameter nötig
mfrc522.PCD_Init(SS_PIN, -1); // Keine RST-Pin-Initialisierung
pinMode(GREEN_LED_PIN, OUTPUT);
pinMode(RED_LED_PIN, OUTPUT);
pinMode(BLUE_LED_PIN, OUTPUT);
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(RED_LED_PIN, LOW);
digitalWrite(BLUE_LED_PIN, LOW); // LEDs standardmäßig aus
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// Prüfen, ob eine neue Karte vorhanden ist
if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) {
delay(50); // Kleine Verzögerung zur Entlastung der CPU
return;
}
String currentUID = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
currentUID += String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : "");
currentUID += String(mfrc522.uid.uidByte[i], HEX);
}
currentUID.toUpperCase();
// UID immer veröffentlichen
String uid_topic = String(device_name) + "/rfid/UID";
client.publish(uid_topic.c_str(), currentUID.c_str(), true); // UID publizieren
mfrc522.PICC_HaltA();
}
void setup_wifi() {
delay(10);
// Verbinde mit dem WLAN
Serial.println();
Serial.print("Verbinde mit ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi verbunden");
Serial.println("IP Adresse: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
// Solange nicht verbunden, erneut versuchen
while (!client.connected()) {
Serial.print("Versuche MQTT-Verbindung... ");
// Versuche Verbindung
if (client.connect(device_name, mqtt_user, mqtt_password)) {
Serial.println("verbunden");
// Abonniere notwendige Themen hier
client.subscribe((String(device_name) + "/led/Red").c_str());
client.subscribe((String(device_name) + "/led/Green").c_str());
client.subscribe((String(device_name) + "/led/Blue").c_str());
} else {
Serial.print("fehlgeschlagen, rc=");
Serial.print(client.state());
Serial.println(" erneut in 5 Sekunden...");
// Warte 5 Sekunden bevor erneut versucht wird
delay(5000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) {
String message = "";
for (unsigned int i = 0; i < length; i++) {
message += (char)payload[i];
}
message.trim();
String red_topic = String(device_name) + "/led/Red";
String green_topic = String(device_name) + "/led/Green";
String blue_topic = String(device_name) + "/led/Blue";
bool state = (message == "true");
if (String(topic) == red_topic) {
digitalWrite(RED_LED_PIN, state ? HIGH : LOW);
} else if (String(topic) == green_topic) {
digitalWrite(GREEN_LED_PIN, state ? HIGH : LOW);
} else if (String(topic) == blue_topic) {
digitalWrite(BLUE_LED_PIN, state ? HIGH : LOW);
}
}