Integracion del receptor de tarjetas RFID-RC522 con modulo ESP8266. Primero realizamos las conexiones como se muestran:


Incluimos el archivo rc522_sensor.h en el directorio config de ESPHOME, junto con el .yaml del dispositivo. Este archivo contiene la informacion y conexion del receptor para que ESPHOME lo pueda reconocer y trabajar con el. Este es el contenido de dicho archivo:
#include "esphome.h"
#include <SPI.h>
#include <MFRC522.h>
#define D1 5 // Configurable, see typical pin layout above
#define D2 4 // Configurable, take a unused pin, only HIGH/LOW required
MFRC522 mfrc522; // Create MFRC522 instance.
unsigned long tempo2 = 0;
class RFIDRC522Sensor : public Component{
public:
TextSensor *rfid = new TextSensor();
TextSensor *rfidlast = new TextSensor();
std:: string idnumberstd = "";
std:: string last_cardstd= "";
void setup() override {
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(D2,D1); // Init each MFRC522 card
}
void loop() override {
// Look for new cards
if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size, mfrc522.PICC_GetTypeName(piccType)); //llama a la funcion que trabaja con nuestra tarjeta
// Halt PICC
mfrc522.PICC_HaltA();
// Stop encryption on PCD
mfrc522.PCD_StopCrypto1();
}
if (millis() > tempo2 && tempo2 != 0){
//Borramos tarjeta y publicamos (vacio)
idnumberstd.clear();
rfid->publish_state(idnumberstd);
tempo2 = 0;
}
}
void dump_byte_array(byte *ID, byte IDSize, String picc) {
//le damos formato al numero de de la tarjeta leido
String idnumber = "";
for(byte i=0; i < IDSize; i++){
if(ID[i] < 0x10){ //Añadimos el 0 de la izquierda en cada byte (si lo tuviera).
idnumber += "0";
}
idnumber += String (ID[i], HEX);
}
idnumberstd = idnumber.c_str(); //pasamos a variable standard para que funcione en ESPHome y podamos mandarla
//creamos los datos de la ultima tarjeta leida
String last_card = (" ID card: " + idnumber + " PICC type: " + picc);
last_cardstd = last_card.c_str(); //pasamos a variable standard para que funcione en ESPHome y podamos mandarla
//Publicamos la tarjeta leida
rfid->publish_state(idnumberstd);
rfidlast->publish_state(last_cardstd);
//Activamos temporizador de borrado
tempo2 = millis() + 1000;
}
};
Generamos el archivo .yaml con ESPHOME, con la configuracion incluida del dispositivo, red wifi, mqtt y descubrimiento de Home Assistant. Este es el archivo:
esphome:
name: rc_522
platform: ESP8266
board: esp01_1m
includes:
- rc522_sensor.h
libraries:
- "MFRC522"
- "SPI"
wifi:
ssid: "Ibiza2,4"
password: "xwpum3j1bv"
mqtt:
broker: 192.168.1.142
username: anderaanmqtt
password: laspresillas32
# Enable logging
logger:
# Enable Home Assistant API
api:
ota:
text_sensor:
- platform: custom
lambda: |-
auto my_sensor = new RFIDRC522Sensor();
App.register_component(my_sensor);
return {my_sensor->rfid, my_sensor->rfidlast};
text_sensors:
- name: "RFID ID (tiempo real)"
- name: "RFID (última lectura)"
Con esto y su reinicio, home assistant ya ha de reconocer una nueva integraccion de ESPHOME, y dos dispositivos relacionados con las tarjetas. En este punto, ya podremos utilizarlos para nuestras automatizaciones.
