problema al abrir puerta con RC522 y ESP8266

Muy buenas!

Hace poco que estoy trasteando con Arduino y de lenguaje de programación ni idea. Lo que he hecho hasta ahora es ir sumando la programacion de uno y de otro, copiando los sketch publicados.

Os cuento lo que quiero hacer. Tengo un NodeMCU V3 que tiene el ESP8266 (que ya podría ser el arduino micro, o mega, es lo de menos), una MC-RC522 lectora de rfid.

El propósito del proyecto es abrir una puerta con unos cuantos rfid y que además se pueda abrir conectándote a la wifi montando un servidor y pulsando un boton en el navegador.

Lo que he hecho hasta ahora es hacerlo por separado: tengo una programación que funciona genial con el RC522 abriendo cuando procede, etc. Y otra creando un botón en html que cuando esté apagado se encienda y cuando esté encendido que se apague y funciona ok. El problema viene cuando los “sumo”.

Os pongo el sketch del RFID:

#include <MFRC522.h>//Descargar e incluir la librería

#include <SPI.h>

/*
Pins  SPI    UNO  Mega2560  Leonardo          NodeMcu
1 (NSS) SAD (SS)   10     53        10          D2
2       SCK        13     52        SCK1        D5
3       MOSI       11     51        MOSI1       D7
4       MISO       12     50        MISO1       D6
5       IRQ        *      *         *           
6       GND       GND     GND       GND         GND
7       RST        5      ?         Reset       D1
8      +3.3V (VCC) 3V3     3V3       3.3V       3v3
* No necesario
*/

#define SAD 4
#define RST 5
MFRC522 nfc(SAD, RST);


#define ledPinAbierto  16
#define ledPinCerrado  2


void setup() {
  pinMode(ledPinAbierto  , OUTPUT);   
  pinMode(ledPinCerrado, OUTPUT);   
  SPI.begin();
  Serial.begin(9600);
  Serial.println("Buscando RC522");
  nfc.begin();
  byte version = nfc.getFirmwareVersion();
  if (! version) {//Entra si no encuentra el módulo.
    Serial.print("No ha encontrado RC522");
    while(1); //detener
  }

  Serial.print("Ha encontrado RC522");
  Serial.print("Firmware version 0x");
  Serial.print(version, HEX);
  Serial.println(".");
}

#define AUTHORIZED_COUNT 1 //Para autoriazar más tarjetas ponemos el número aqui y la añadimos abajo
byte Authorized[AUTHORIZED_COUNT][6] = {

                            {0xB2, 0x95, 0x5E, 0xB2, 0xFF, 0xFF, }
                           //,{0x10, 0x39, 0x14, 0x2E, 0xFF, 0xFF, } ejemplo de como autorizar más tarjetas  0x83,.....
                            
                          };
                          
void printSerial(byte *serial);
boolean isSame(byte *key, byte *serial);
boolean isAuthorized(byte *serial);



void loop() {
  byte status;
  byte data[MAX_LEN];
  byte serial[6];
  boolean Abierto = false;
  digitalWrite(ledPinAbierto, Abierto);
  digitalWrite(ledPinCerrado, !Abierto);
  status = nfc.requestTag(MF1_REQIDL, data);

  if (status == MI_OK) {
    status = nfc.antiCollision(data);
    memcpy(serial, data, 6);
    
    if(isAuthorized(serial))
    { 
      Serial.println("Autorizado");
      Abierto = true;
    }
    else
    { 
      printSerial(serial);
      Serial.println("NO autorizado");
      Abierto = false;
    }
    
    nfc.haltTag();
    digitalWrite(ledPinAbierto, Abierto);
    digitalWrite(ledPinCerrado, !Abierto);
    delay(4000);
  }//if (status == MI_OK)

  delay(500);

}//void loop()

boolean isSame(byte *key, byte *serial)
{
    for (int i = 0; i < 4; i++) {
      if (key[i] != serial[i])
      { 
        return false; 
      }
    }
    
    return true;

}

boolean isAuthorized(byte *serial)
{
    for(int i = 0; i<AUTHORIZED_COUNT; i++)
    {
      if(isSame(serial, Authorized[i]))
        return true;
    }
   return false;
}

void printSerial(byte *serial)
{
        Serial.print("Serial:");
    for (int i = 0; i < 5; i++) {// aumentar a 5 para leer el número de la tarjeta completo
      Serial.print(serial[i], HEX);
      Serial.print(" ");
    }
}

Y ya os digo que funciona ok. Cuando paso una tarjeta no reconocida no hace nada, cuando se la paso se abre 4 segundos y y se vuelve a cerrar. Todo ok hasta aquí.

Os copio ahora el sketch del botón:

#include <ESP8266WiFi.h>
#include <ESP8266WiFiAP.h>
#include <ESP8266WiFiGeneric.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266WiFiScan.h>
#include <ESP8266WiFiSTA.h>
#include <ESP8266WiFiType.h>
#include <WiFiClient.h>
#include <WiFiClientSecure.h>
#include <WiFiServer.h>
#include <WiFiUdp.h>

/*
 NodeMCU Server - Conexión en modo Station con un punto de acceso (router) por Dani No www.esploradores.com
 Crea una conexión del NodeMCU en modo Station con un punto de acceso que permite 
 encender y apagar un LED conectado a la salida D4 (GPIO02) del módulo NodeMCU.
 Este código de ejemplo es de público dominio.
 */
 
 
const char* ssid = "NOMBRE DE MI RED";          //Indicamos el nombre de la red WiFi (SSID) a la que queremos conectarnos.
const char* password = "PASS DE MI RED";      //Indicamos la contraseña de de red WiFi
WiFiServer server(80);                     //Definimos el puerto de comunicaciones
 
int PinLED = 16; // GPIO2                   //Definimos el pin de salida - GPIO2 / D4
int estado = LOW;                          //Definimos la variable que va a recoger el estado del LED
 
void setup() {
 
  Serial.begin(115200);
 
  pinMode(PinLED, OUTPUT);                 //Inicializamos el GPIO2 como salida
  digitalWrite(PinLED, LOW);               //Dejamos inicialmente el GPIO2 apagado
 
  WiFi.begin(ssid, password);              //Inicializamos  la conexión del NodeMCU con la red WiFi
  Serial.printf("Conectando a la red: %sn", WiFi.SSID().c_str());
 
  while (WiFi.status() != WL_CONNECTED) {  // Verifica el estado de la conexión del NodeMCU cada 0,5s hasta que conecta 
    delay(500);
    Serial.print(".");                    
  }
  Serial.println("");
  Serial.println("WiFi conectada");        // Indica que el NodeMCU conectado con la red WiFi 
 
  server.begin();                          // Inicia el NodeMCU en modo Station
  Serial.println("Servidor inicializado");
 
  Serial.printf("Utiliza esta URL para conectar: http://%s/n", WiFi.localIP().toString().c_str());
} 
 
void loop(){
 
  WiFiClient client = server.available();  // Comprueba si el cliente ha conectado
  if (!client) {
    return;
  }
 
  Serial.println("nuevo cliente");         // Espera hasta que el cliente envía alguna petición
  while(!client.available()){
    delay(1);
  }
 
  String peticion = client.readStringUntil('\r');  // Lee la petición
  Serial.println(peticion);
  client.flush();
 
  // Comprueba la petición
  if (peticion.indexOf('/LED=ON') != -1) {
    estado = HIGH;
  } 
  if (peticion.indexOf('/LED=OFF') != -1){
    estado = LOW;
  }
 
  digitalWrite(PinLED, estado);           //Enciende o apaga el LED en función de la petición
 
  client.println("HTTP/1.1 200 OK");      //Envía la página HTML de respuesta al cliente
  client.println("");                     //No olvidar esta línea de separación
 
  client.print("<h1 align=center>El LED está ahora: ");
 
    
  //Se crea un único botón para modificar el estado del LED
  if(estado == HIGH) {
    client.print("<button type='button' onClick=location.href='/LED=OFF'> APAGAR </button>

");  
  } else {
    client.print("<button type='button' onClick=location.href='/LED=ON'> ENCENDER </button>

");
  }
  client.println("</html>");
  delay(1);
  Serial.println("Peticion finalizada");   // Se finaliza la petición al cliente. Se inicializa la espera de una nueva petición.
  Serial.println("");
 
}

La cuestión es que sumando todo me dan los siguientes errores, que no sé como quitarlos o solventarlos:

Le pongo la tarjeta y no la lee hasta que entro o actualizo en la web que se crea y entonces es cuando lee la tarjeta y abre (no hace falta que pulse el botón de apagar o encender, solo creo que detecta si hay cliente y entonces es cuando el RC522 empieza).

El otro problemilla me lo encuentro cuando quito el WHILE de si hay cliente en el html y es que cuando pulso el botón de encender. Se habilita el botón de apagar pero se queda en intermitencia de encendid y apagado una fracción de segundo mínima. Entra en bucle hasta que la apago desde el html.

Es un poco lioso, lo entiendo. No pido que me lo hagan, me conformo con que detecten lo que no va bien para poder formarme y modificarlo.

Mil gracias de antemano!!!

Mencionar que el actuador es el pin 16 del NodeMCU, y ahí tengo preparado el sistema del relee con optoacoplador etc etc. Por lo que uso la señal del led para activarlo.

Hola, si bien mis conocimientos no dan para entender lo del RC522 (supongo que es el mecanismo que actúa sobre el pasador de la puerta? como un electro imán?) pero entiendo que el pin 16 es la salida que activa el relé que pone en marcha el "invento".
¿Has probado controlar el ESP8266 con el programa Blynk?
Es un programa para terminales telefónicos que te permite activar esa salida simplemente tocando un botón en la pantalla del teléfono móvil, funciona aunque no tengas wifi en el teléfono.
Disculpa si esto es una burrada, es por ayudar...

Muevo el tema a Software.
No es una consulta para Proyectos.