Integracion RFID-RC522 con ESP8266

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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *