#include <WiFi.h>
#include <PubSubClient.h>
#include <SPI.h>
#include <MFRC522.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Pin definitions for RC522
#define SS_PIN 5
#define RST_PIN 2
MFRC522 rfid(SS_PIN, RST_PIN);
// Create an LCD object with I2C address 0x27 (adjust if needed)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Replace with your network credentials
const char* WIFI_SSID = "Wokwi-GUEST";
const char* WIFI_PASSWORD = "";
// Replace with your MQTT Broker IP or domain
const char* MQTT_SERVER = "test.mosquitto.org";
// For local Node-RED, use the local machine's IP address, for example "192.168.1.100"
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(115200);
// Initialize LCD (if using)
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Starting...");
// Initialize SPI and RFID
SPI.begin();
rfid.PCD_Init();
// Connect to Wi-Fi
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected, IP: ");
Serial.println(WiFi.localIP());
// Set up MQTT
client.setServer(MQTT_SERVER, 1883);
// Display status
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("WiFi Ready");
lcd.setCursor(0, 1);
lcd.print("MQTT Setup...");
}
void loop() {
// Reconnect to MQTT if needed
if (!client.connected()) {
reconnectMQTT();
}
client.loop();
// Check for new cards
if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
String tagID = "";
for (byte i = 0; i < rfid.uid.size; i++) {
if (rfid.uid.uidByte[i] < 0x10) {
tagID += "0";
}
tagID += String(rfid.uid.uidByte[i], HEX);
if (i < rfid.uid.size - 1) {
tagID += ":";
}
}
tagID.toUpperCase();
Serial.print("RFID Detected: ");
Serial.println(tagID);
// Publish tag ID to MQTT topic
client.publish("rfid/data", tagID.c_str());
// Display on LCD (optional)
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("RFID Tag:");
lcd.setCursor(0, 1);
lcd.print(tagID);
// Halt reading this card so it doesn't repeat instantly
rfid.PICC_HaltA();
delay(2000);
// Optional: show readiness again
lcd.clear();
lcd.print("Ready for next");
}
}
void reconnectMQTT() {
// Attempt to connect until successful
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP32Client")) {
Serial.println("connected");
// You can subscribe to a topic here if needed
// client.subscribe("rfid/commands");
} else {
Serial.print("failed, rc=");
Serial.println(client.state());
delay(2000);
}
}
}