So here is my code. As I have already said, it really is a mix of multiple sketches which I found online.
How it works:
When a card if scanned, it sends the card ID via MQTT on the home/rfid
topic.
Then an automation checks if it is the correct card. If it is it disarms the alarm and sends accept
to home/alarm/rfid
. If the card it refused, it sends refuse
to home/alarm/rfid
.
The hardware:
ESP8266
MFRC-522
RGB LED
Here is the code:
//RFID FIRMWARE FOR ESP8266 WITH MFRC522 WITH LEDS
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <SPI.h>
#include <MFRC522.h>
/* wiring the MFRC522 to ESP8266
Red = D0
Green = D1
Blue = D2
RST = D3
SCK = D5
MISO = D6
MOSI = D7
SDA(SS) = D8
GND = GND
3.3V = 3.3V
*/
#define RST_PIN D3 // RST-PIN
#define SS_PIN D8 // SDA-PIN
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance
//Define RGB LED pins
const int redPin = D0;
const int greenPin = D1;
const int bluePin = D2;
// Wifi Connection details
const char* ssid = "";
const char* password = "";
const char* mqtt_server = ""; // mqtt IP
const char* mqtt_user = ""; // mqtt user
const char* mqtt_password = ""; // mqtt password
const char* clientID = "RFID"; // rfid name
const char* rfid_topic = "home/rfid"; // rfid path
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
void setup() {
Serial.begin(115200);
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
Serial.begin(115200);
delay(10);
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522
delay(2);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
reconnect();
}
// Connect to Wifi
void setup_wifi() {
//Turn off Access Point
WiFi.mode(WIFI_STA);
analogWrite(redPin, 238);
analogWrite(greenPin, 130);
analogWrite(bluePin, 238);
// We start by connecting to a WiFi network
Serial.println();
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
analogWrite(redPin, 0);
analogWrite(greenPin, 0);
analogWrite(bluePin, 200);
}
// Check for incoming messages
void callback(char* topic, byte* payload, unsigned int length) {
Serial.println("");
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
char s[20];
sprintf(s, "%s", payload);
if ( (strcmp(topic,"home/alarm/rfid")==0))
{
payload[length] = '\0';
String sp = String((char*)payload);
// Green LED if card accepted
if (sp == "accept")
{
Serial.println();
Serial.print("RFID Accepted");
Serial.println();
analogWrite(redPin, 0);
analogWrite(greenPin, 255);
analogWrite(bluePin, 0);
delay(2000);
analogWrite(redPin, 0);
analogWrite(greenPin, 0);
analogWrite(bluePin, 0);
}
// Red LED if card refused
else if (sp == "refuse")
{
Serial.println();
Serial.print("RFID Refused");
Serial.println();
analogWrite(redPin, 255);
analogWrite(greenPin, 0);
analogWrite(bluePin, 0);
delay(2000);
analogWrite(redPin, 0);
analogWrite(greenPin, 0);
analogWrite(bluePin, 0);
}
}
}
/* interpret the ascii digits in[0] and in[1] as hex
* notation and convert to an integer 0..255.
*/
int hex8(byte *in)
{
char c, h;
c = (char)in[0];
if (c <= '9' && c >= '0') { c -= '0'; }
else if (c <= 'f' && c >= 'a') { c -= ('a' - 0x0a); }
else if (c <= 'F' && c >= 'A') { c -= ('A' - 0x0a); }
else return(-1);
h = c;
c = (char)in[1];
if (c <= '9' && c >= '0') { c -= '0'; }
else if (c <= 'f' && c >= 'a') { c -= ('a' - 0x0a); }
else if (c <= 'F' && c >= 'A') { c -= ('A' - 0x0a); }
else return(-1);
return ( h<<4 | c);
}
// Reconnect to wifi if connection lost
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {;
analogWrite(redPin, 0);
analogWrite(greenPin, 0);
analogWrite(bluePin, 200);
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect(clientID, mqtt_user, mqtt_password)) {
Serial.println("connected");
// Once connected, publish an announcement...
client.publish("home/rfid", "connected");
// ... and resubscribe
client.subscribe("home/alarm/rfid");
analogWrite(redPin, 0);
analogWrite(greenPin, 200);
analogWrite(bluePin, 0);
delay(500);
analogWrite(redPin, 0);
analogWrite(greenPin, 0);
analogWrite(bluePin, 0);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
// Main functions
void loop() {
if (!client.connected()) {
software_Reset();
}
client.loop();
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent()) {
delay(50);
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial()) {
delay(50);
return;
}
// Show some details of the PICC (that is: the tag/card)
Serial.println("");
Serial.print(F("Card UID:"));
dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
Serial.println();
//digitalWrite(idPin, HIGH);
delay(500);
//digitalWrite(idPin, LOW);
delay(500);
// Send data to MQTT
String rfidUid = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
rfidUid += String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : "");
rfidUid += String(mfrc522.uid.uidByte[i], HEX);
}
const char* id = rfidUid.c_str();
client.publish("home/rfid", id);
delay(3000);
}
// Helper routine to dump a byte array as hex values to Serial
void dump_byte_array(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
}
/****reset***/
void software_Reset() // Restarts program from beginning but does not reset the peripherals and registers
{
Serial.print("resetting");
ESP.reset();
}