Menzelenerheide 26

46519 Alpen

Michael Arthen

Ihr Ansprechpartner

0176/34048100

immer für Sie erreichbar

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

  1. 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

  1. ESP8266 Mikrocontroller: Wird verwendet, um das WLAN und die MQTT-Kommunikation bereitzustellen.
  2. MFRC522 RFID-Reader: Erkennt RFID-Karten.
  3. 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

  1. 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.
  2. 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 <SPI.h>
#include <MFRC522.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

#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);
  }
}

				
			
Nach oben scrollen