Restricción de acceso a dispositivos a través de la tarjeta RFID parte 3

Acceso restringido a dispositivos a través de tarjeta sin contacto con el NodeMCU y la tercera parte del módulo RC522: WPA, una interfaz web con protección de contraseña, información de estado y una barra de menú expandible.

Después de que en primera parte  ha definido el hardware y puede usar una tarjeta para cambiar el relé, le damos a nuestro ESP en la tercera parte de esta fila un botón WPS para asumir automáticamente la configuración de WLAN, así como una página de inicio de sesión para que nuestro ESP se configure contra personas no autorizadas Proteger el cambio.


Registro de WPA:

Para poder guardar los datos de WLAN en nuestro ESP utilizando el método de botón WPA, tenemos que expandir nuestros circuitos básicos presentados en la primera parte.

Necesitamos 3 resistencias precisas con 6.8 KOhm y un botón. Este botón cortocircuita la resistencia media del divisor de voltaje para que nuestro ESP pueda registrar la presión del botón. El diagrama anterior muestra el cableado necesario y debe AGREGARSE a nuestro cableado desde la primera sección.

Aquí está el código:

#include <SPI.h>
#include <MFRC522.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <EEPROM.h>

#definir RST_PIN     5     // Pin de restablecimiento SPI (salida D1)
#definir RELAIS_PIN  16    // Relé (salida D0) [BAJA activa] - También LED interno cerca del puerto USB
#definir SS_PIN      15    // Pin de selección de esclavo SPI

#definir RGBLED_R    2     // rojo (salida D4) 
#definir RGBLED_G    0     // Verde (salida D3): también LED interno en el módulo ESP
#definir RGBLED_B    4     // azul (salida D2)

#definir WiFiPwdLen   25   // Longitud máxima de la contraseña de WiFi
#definir STANAMELEN 20     // Longitud máxima de SSID WiFi
#definir ESPHostNameLen 20 // Número máximo de caracteres ESPHostName

#definir LED_BUILTIN 16
#definir PIN_WIRE_SDA 4 
#definir PIN_WIRE_SCL 5 

ADC_MODE(ADC_TOUT);   // Configure la entrada analógica A0 a externa. ADC_TOUT (para voltaje externo), ADC_VCC (para voltaje del sistema). 
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Crear una instancia del MFRC522
MFRC522::MIFARE_Key clave;
ESP8266WebServer servidor(80);        // Crear instancia de servidor web

estructura WiFiEEPromData   {     char ESPHostName[ESPHostNameLen];      char APSTAName[STANAMELEN]; // STATION / AP Point Name TO Connect, si está definido     char WiFiPwd[WiFiPwdLen]; // WiFiPAssword, si está definido     char ConfigValid[3]; // Si Config es Vaild, se requiere la etiqueta "TK" "   };

estructura PICCardEEPRomData   {     char CardVaildUID[4];     char Reservado[4];   };

WiFiEEPromData MyWiFiConfig;
PICCardEEPRomData MyEEPROMValidCardUID;

// Variable global utilizada
bool Resultado  = falso;
bool LearnNewCard = falso;
Cadena temp ="";
sin firmar largo ID de sesión;

nulo configuración()     {    pinMode(RST_PIN,SALIDA);   digitalWrite(RST_PIN,ALTO);   pinMode(RELAIS_PIN,SALIDA);   pinMode(RGBLED_R,SALIDA);   pinMode(RGBLED_G,SALIDA);   pinMode(RGBLED_B,SALIDA);   digitalWrite(RELAIS_PIN,ALTO);    // relé inactivo   SetRGBLed(0,0,0,falso);            // Led apagado   De serie.comenzar(115200);               // Inicializa la comunicación serial con la PC con 115200 baudios   ceder();   De serie.println("");   temp = "ATSN:"+ Cadena(ESP.getChipId());   De serie.println(temp);   // Serial.print ("Valor ADC:"); Serial.println (analogRead (A0));   SPI.comenzar();                      // Inicializa la comunicación SPI   ESP.wdtEnable(WDTO_4S);              // Iniciar vigilancia   ESP.wdtFeed();    digitalWrite(RST_PIN,BAJA);   ID de sesión = millis();   ESP.wdtFeed();   Resultado  = startWiFiClient();   ESP.wdtFeed();     ceder();   EEPROM.comenzar(512);   EEPROM.obtener(100,MyEEPROMValidCardUID);   // La tarjeta válida se almacena desde la dirección 100   EEPROM.fin();   InitalizeHTTPServer();   digitalWrite(RST_PIN,ALTO);   mfrc522.PCD_Reset();   mfrc522.PCD_Init();              Inicializar módulo de lectura MFRC522   mfrc522.PCD_AntennaOn();   Rendimiento();   Esp.wdtFeed();   SetRGBLed(255,0,255,Falso);       Led Color Púrpura Initalización Completada   }


Iniciar Funciones de ayuda/ optimización **********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************

Vacío SetRGBLed(Byte RedValue,Byte GreenValue,Byte BlueValue,Booleana SlowFade)  Funkion para controlar el RGB Led
{   digitalWrite(RGBLED_R,Bajo);       digitalWrite(RGBLED_G,Bajo);   digitalWrite(RGBLED_B,Bajo);    Si (RedValue == 255)   { digitalWrite(RGBLED_R,Alto); }      Si (GreenValue == 255) { digitalWrite(RGBLED_G,Alto); }   Si (BlueValue == 255)  { digitalWrite(RGBLED_B,Alto); }    }

Detener la aplicación auxiliar / Funciones de optimización *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************

Iniciar funciones servidor Web ***********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************

Las rutinas de base de cookies se basan en el extracto de GIT:
//https://github.com/esp8266/ESPWebServer/blob/master/examples/SimpleAuthentification/SimpleAuthentification.ino
Bool is_authentified()
{     Si (Servidor.Hasheader("Cookie")){       Cookie encontrada      Temp = Servidor.Rúbrica("Cookie");       Serial.println(temp);      Cadena SessionStr = Cadena(Esp.getChipId()) + "=" + Cadena(Sessionid);      Si (Temp.Indexof(SessionStr) != -1) {         Autenticación web correcta        Temp = "";        devolución Verdad;       }     }        Error en la autenticación web    Temp = "";    Sessionid = Millis();    devolución Falso; 
} 

Vacío handleLogin(){   Cadena Msg;   Cookie de cadena: server.header("Cookie");   Serial.println(cookie);   Si (Servidor.hasArg("DESCONECTAR")){     Usuario de desconexión;     Servidor.sendHeader("Ubicación","/login");     Servidor.sendHeader("Control de caché","Sin caché");     Sessionid = Millis();     Temp = Cadena(Esp.getChipId()) + " NA ; HttpOnly ; SameSite-Estricto";     Servidor.sendHeader("Establecer cookie",Temp);     Temp = "";     Servidor.Enviar(301);     devolución;   }   Si (Servidor.hasArg("NOMBRE DE USUARIO") && Servidor.hasArg("PASSWORD")){     Temp = Cadena(Esp.getChipId());     Si (Servidor.Malo("NOMBRE DE USUARIO") == "admin" &&  Servidor.Malo("PASSWORD") == Temp ){       Servidor.sendHeader("Ubicación","/");       Servidor.sendHeader("Control de caché","Sin caché");       Sessionid = Millis();       Temp = Cadena(Esp.getChipId()) + "=" + Cadena(Sessionid) + "; HttpOnly ; SameSite-Estricto";       Servidor.sendHeader("Establecer cookie",Temp);       Temp = "";       Servidor.Enviar(301);       devolución;     }   Msg = "<script>alert('Nombre de usuario o contraseña incorrectos !'); </script>";   }    CSS_Header_Template();    Temp = "<head><title>Login</title></head><body><DIV ALIGN-CENTER>";    Servidor.sendContent(Temp);    Temp = "<h2>Registro en el lector de tarjetas RC522</h2><body><br><br><br>table border-0 bgcolor-black><tr><th><DIV ALIGN-RIGHT>";    Servidor.sendContent(Temp);    Temp = "<acción de formulario ''/login' método''post'>Nombre de usuario: <tipo de entrada/Nombre de texto''NOMBRE DE USUARIO' Tamaño-17 requerido><br>";    Servidor.sendContent(Temp);    Temp = "Contraseña: <tipo de entrada/nombre de la contraseña(Nombre de la contraseña) 'PASSWORD' Size (Tamaño de contraseña) ><br><br><br><br><button type>submit' ";    Servidor.sendContent(Temp);    Temp = "nombre 'Login_Button' valor '1' estilo 'altura: 30px; ancho: 100px' >Login</button><br></th></tr></form></DIV></table>";    Servidor.sendContent(Temp);    Temp = "<br><SMALL>Para iniciar sesión para trabajar, se deben permitir las cookies de este sitio web.</SMALL>";      Servidor.sendContent(Temp);    Temp = Msg + "</DIV></body></HTML>";    Servidor.sendContent(Temp);    Temp = "";
}

Vacío handleNotFound()    {   Sessionid = Millis();   Temp = "Página no encontrada.;   Temp += "URI: ";   Temp += Servidor.Uri();   Temp += "AnMethod:";   Temp += (Servidor.Método() == HTTP_GET)?"Get":"POST";   Temp += "AnArguments:";   Temp += Servidor.Args();   Temp += "Un";   Para (uint8_t Ⅰ.=0; Ⅰ.<Servidor.Args(); Ⅰ.++){     Temp += " " + Servidor.argName(Ⅰ.) + ": " + Servidor.Malo(Ⅰ.) + "Un";   }   Servidor.Enviar(404, "Texto/sin formato", Temp);   Temp = "";   }


Vacío handleNewPICC()
{   Si (!is_authentified())     {     Servidor.sendHeader("Ubicación","/login");     Servidor.sendHeader("Control de caché","Sin caché");     Servidor.Enviar(301);     devolución;     }   CSS_Header_Template();   Temp = "<head><title>Kartenleser RC522</title></head><body>";   Servidor.sendContent(Temp);   HtmlNavStructure();   Temp = "<script>alert('Bitte JETZT Karte vor den Leser halten!'); </script>";      Servidor.sendContent(Temp);   SetRGBLed(255,255,0,Falso);       Led Farbe Gelb Programmierungsmodus   LearnNewCard = Verdad;       Temp = "</body></html>";   Servidor.sendContent(Temp);   Servidor.Cliente().Parada();   Temp = "";
}



Vacío handleRoot(){   Si (!is_authentified()){     Servidor.sendHeader("Ubicación","/login");     Servidor.sendHeader("Control de caché","Sin caché");     Servidor.Enviar(301);     devolución;     }   Contenido HTML   CSS_Header_Template();   Temp = "<head><title>Kartenleser RC522</title></head><body>";   Servidor.sendContent(Temp);   HtmlNavStructure();   Temp = "<div ALIGN-CENTER><br><br><br><BIG>Willkommen auf der Smartkartenleser RC522 Webseite.</BIG><br>";   Servidor.sendContent(Temp);   Temp = "Resetgrund: " + Cadena(Esp.getResetReason()) + "<br>";   Servidor.sendContent(Temp);   Temp = "Freier Heapspeicher:" + Cadena(Esp.getFreeHeap()) + " Bytes<br>";   Servidor.sendContent(Temp);   Temp = "Int. Flash:" + Cadena(Esp.getFlashChipRealSize()) + " Bytes<br>";   Servidor.sendContent(Temp);   Resultado = mfrc522.PCD_PerformSelfTest();    mfrc522.PCD_Init();                       Initialisiere MFRC522 Lesemodul   mfrc522.PCD_AntennaOn();    Si (Resultado) {Temp = "RC522 PCD-Estado: OK<br>"; } Más {Temp = "RC522 PCD-Status: Fehler!<br>"; }    Servidor.sendContent(Temp);   Temp = "ID de CPU: " + Cadena(Esp.getChipId()) + " @ " + Cadena(Esp.getCpuFreqMHz()) + " MHz<br>";    Servidor.sendContent(Temp);   Temp = "<br>Sie sind erfolgreich angemeldet !<br><br><form action''/login' method''get'>";   Servidor.sendContent(Temp);   Temp = "<tipo de botón 'Enviar' nombre 'DISCONNECT' valor 'YES' estilo 'altura: 30px; ancho: 200px' >Logout</button>";   Servidor.sendContent(Temp);   Temp = "</form></div></body></html>";   Servidor.sendContent(Temp);   Si (Servidor.hasArg("Reiniciar") )  Sistema de reinicio      {     Esp.wdtFeed();             Esp.wdtDisable();     Temp = "<script>alert('Das System startet JETZT neu.'); </script>";        Servidor.sendContent(Temp);     Servidor.Cliente().Parada();     Temp = "";     Retraso(1000);      Esp.Restablecer();     Retraso(4000);      }     Servidor.Cliente().Parada();   Temp = "";
}

Vacío CSS_Header_Template() Formatvorlage f'r alle internen ESP Webseiten. https://wiki.selfhtml.org/wiki/CSS   {    Servidor.setContentLength(CONTENT_LENGTH_UNKNOWN);    Temp = "<! DOCTYPE HTML PUBLIC '-/-//W3C//DTD HTML 4.01 Transitional//EN'><html lang''de'><meta charset''UTF-8'>";    Servidor.Enviar (200, "texto/html", Temp);    Temp = "<tipo de estilo'texto/css'>*'margen: 0;padding: 0;' body-background:black;color:darkorchid;font-size: 16px;" ;    servidor. sendContent(temp)    temp  "font-family: sans-serif,arial;.. nav-width: 1300px;altura: 30px;margen: 0 auto;border-radius: 5px;";    Servidor.sendContent(Temp);    Temp = "ul li-list-style: none;width: 200px;line-height: 60px;position: relative;background: darkorchid;" ;    servidor. sendContent(temp)     "temp color""#434f54" estilo "color: #434f54;"> "box-shadow: 0px 2px 5px 0px gris;texto-alinear: center;float: left;background-color: #010000; ul li ul'";    Servidor.sendContent(Temp);    Temp = "posición: absoluta;. nav > ul > li:nth-of-type(1)-border-radius: 5px 0px 0px 5px;. nav > ul > li:nth-of-type(5)";    Servidor.sendContent(Temp);    Temp = "-border-radius: 0px 5px 5px 0px;- ul li a-color: rgb(182, 18, 18);width: 200px;height: 58px;display: inline-block;" ;    servidor. sendContent(temp)     "temp color""#434f54" style-"color: #434f54;">- "text-decoration: none;" ul li a:hover-font-weight: bold;border-bottom: 2px solid #fff; ul li ul-display: none;;    Servidor.sendContent(Temp);    Temp = ".nav ul li:hover ul-display: block;. fa-margen-derecha: 5px;. contenedor-ancho: 1000px;altura: 200px;" ;    servidor. sendContent(temp)    temp - "margin: 0 auto;padding:20px 20px;- @media pantalla y (ancho máximo: 480px) , encabezado, ancho: 100%; ";    Servidor.sendContent(Temp);    Temp = ".nav-display: none;width: 100%;altura: auto; ul li-ancho: 100%;float: none; ul li a-width: 100%;" ;    servidor. sendContent(temp)     "temp color""#434f54" style-"color: #434f54;"> "display: block;" ul li ul-posición: estática; ul li li a-background: #222;. fa-list.modify-display: block;-";    Servidor.sendContent(Temp);    Temp = ".contenedor-ancho: 100%;altura: auto;- body-overflow-x:hidden; </estilo>";    Servidor.sendContent(Temp);    Temp = "";   }

Vacío HtmlNavStructure()   {   Temp = "<div class''menu'><nav class'nav'><ul>";   Servidor.sendContent(Temp);   Temp = "<li><a href'''>Sistema</a>";   Servidor.sendContent(Temp);   Temp = "<ul><li><a href''/'>Información</a></li>";   Servidor.sendContent(Temp);   Temp = "<li><a href'/? Reiniciar-YES'>Neustart</a></li>";   Servidor.sendContent(Temp);   Temp = "</ul>";   Servidor.sendContent(Temp);   Temp = "</li><li><a href''''>PICC</a>";   Servidor.sendContent(Temp);   Temp = "<ul><li><a href''/newPICC'>Karte registrieren</a></li></ul>";   Servidor.sendContent(Temp);   Temp = "</li>";   Servidor.sendContent(Temp);   Temp = "</ul></nav></div>";   Servidor.sendContent(Temp);   Temp = "";   }       Vacío InitalizeHTTPServer()    {   Bool initok = Falso;   Const Char * headerkeys[] = {"Agente-usuario","Cookie"} ; Encabezado zum Tracken   Size_t headerkeyssize = Sizeof(headerkeys)/Sizeof(Char*); Encabezado zum Tracken   Servidor.En("/", handleRoot);   Servidor.En("/login", handleLogin);   Servidor.En("/newPICC", handleNewPICC);   Servidor.onNotFound ( handleNotFound );   Servidor.collectHeaders(headerkeys, headerkeyssize );Servidor anweisen, diese zu Tracken    Servidor.Comenzar(); Inicio del servidor web   }        *******************************************************************************************************************************************************************************************************************************************************************

*******************************************************************************************************************************************************************************************************************************************************
Funktion von https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/wps-mit-dem-esp8266?ls=de
Bool startWPS() {   Bool wpsSuccess = Wifi.beginWPSConfig();   Si(wpsSuccess) {       Muss nicht immer erfolgreich hei-en! Nach einem Timeout ist die SSID leer       Cadena newSSID = Wifi.Ssid();        Si(newSSID.Longitud() > 0) {         Nur wenn eine SSID gefunden wurde waren wir erfolgreich          Rendimiento();          Serial.println("ATWPS:OK");         saveCredentials(); Guardar credenciales en EEPROM              } Más {         Serial.println("ATWPS:NOK");       }   }   devolución wpsSuccess; 
}

Bool startWiFiClient() {   Bool WiFiClientStarted = Falso;   Size_t A0_ADCValue = 0;   Byte  = 0;   Byte connRes = 0;   Serial.setDebugOutput(Falso);  Zu Debugzwecken aktivieren.    Wifi.Host("CrdRdr41667");   Wifi.softAPdisconnect(Verdad);   Wifi.Desconecte();   Wifi.Modo(WIFI_STA);   Si(loadCredentials())      {      Wifi.Comenzar(MyWiFiConfig.APSTAName, MyWiFiConfig.WiFiPwd);      Mientras (( connRes != 3 ) Y( connRes != 4 ) Y ( != 30))  si connRes 0 "IDLE_STATUS - cambiar Statius"       {        ++;       Serial.print("."); Conectar vorgang auf der seriellen Schnittstelle beobachten       Esp.wdtFeed();       Retraso(500);       Rendimiento();       connRes  = Wifi.waitForConnectResult();       }      Si (connRes == 4 ) { si la contraseña es incorrecta       Serial.println("ATWIFI:PWDERR");             Wifi.Desconecte();       }      Si (connRes == 6 ) { módulo no está configurado en modo estación       Serial.println("ATWIFI:STAERR");       Wifi.Desconecte();       }      }   Si(Wifi.Estado() == WL_CONNECTED)      {     Esp.wdtFeed();      Serial.Impresión("ATIP:");     Serial.println(Wifi.localIP());     Wifi.setAutoReconnect(Verdad); Establezca si el módulo intentará volver a conectarse a un punto de acceso en caso de que se desconecte.     Configurar el respondedor MDNS     Si (!MDNS.Comenzar("CrdRdr41667"))        {       Serial.println("ATMDNS:NOK");       } Más { MDNS.addService("http", "tcp", 80); }        WiFiClientStarted = Verdad;     } Más      {     A0_ADCValue = analogRead(A0);     Wir waren nicht erfolgreich, daher starten wir WPS, wenn WPS Taster an A0 w-hrend des Resets gedr-ckt ist     Si (A0_ADCValue > 499)       {         Si(startWPS())            {             Esp.wdtFeed();              Retraso(500);             Wifi.Desconecte();             Wifi.Modo(WIFI_STA);             Wifi.Comenzar(Wifi.Ssid().c_str(), Wifi.Psk().c_str());             Esp.wdtFeed();              WiFiClientStarted = Verdad;           } Más           {             WiFiClientStarted = Falso;             Wifi.Desconecte();           }       } Más       {         Wifi.Desconecte();       }    }    devolución WiFiClientStarted; 
}
*******************************************************************************************************************************************************************************************************************************************************

*********************** Iniciar funciones Almacenar credenciales WiFi a EEPROM ******************
Bool loadCredentials() 
{
 Bool RetValue;
 Eeprom.Comenzar(512);
 Eeprom.Obtener(0,MyWiFiConfig);
 Eeprom.Final();
 Si (Cadena(MyWiFiConfig.ConfigValid) == "Tk")    {     RetValue = Verdad;   } Más   {     RetValue = Falso; No se ha encontrado la configuración de Wi-Fi.   }   Esp.wdtFeed();    devolución RetValue; 
}

Vacío saveCredentials() Guardar credenciales de Wi-Fi en EEPROM 
{   Size_t Ⅰ.;   Para (Ⅰ. = 0 ; Ⅰ. < Sizeof(MyWiFiConfig) ; Ⅰ.++) Loeschen de la antigua configuración      {       Eeprom.Escribir(Ⅰ., 0);       }   Para (Ⅰ. = 0 ; Ⅰ. < STANameLen  ; Ⅰ.++) Loeschen de la antigua configuración      {       MyWiFiConfig.WiFiPwd[Ⅰ.] = 0;       }   Para (Ⅰ. = 0 ; Ⅰ. < WiFiPwdLen ; Ⅰ.++) Loeschen de la antigua configuración      {       MyWiFiConfig.APSTAName[Ⅰ.] = 0;       }      Temp = Wifi.Ssid().c_str();   Ⅰ. = Temp.Longitud();   Temp.Tochararray(MyWiFiConfig.APSTAName,Ⅰ.+1);    Temp = Wifi.Psk().c_str();   Ⅰ. = Temp.Longitud();   Temp.Tochararray(MyWiFiConfig.WiFiPwd,Ⅰ.+1);   Temp = "";      Strncpy(MyWiFiConfig.ConfigValid , "Tk", Sizeof(MyWiFiConfig.ConfigValid) );    Eeprom.Comenzar(512);   Eeprom.Poner(0, MyWiFiConfig);   Eeprom.Cometer();   Eeprom.Final();   Esp.wdtFeed(); 
}
FUNCIONEs END StoreCredentialsto EEPROM *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
 
Vacío Bucle()  Lazo principal
{   Sólo cuando se encuentra una tarjeta y se puede leer lo hace si se ejecuta el contenido   Si (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial() )   PICC - tarjeta de circuito integrada de proximidad - tarjeta de chip sin contacto   {     Serial.Impresión("PICC UID:");     Para (Byte Ⅰ. = 0; Ⅰ. < mfrc522.Uid.Tamaño; Ⅰ.++)      {       Distancia entre los números HEX y cero a la izquierda en byte < 16       Serial.Impresión(mfrc522.Uid.uidByte[Ⅰ.] < 0x10 ? " 0" : " ");       Serial.Impresión(mfrc522.Uid.uidByte[Ⅰ.], Hexagonal);     }    Bool Isvalid = Verdad;   Si (LearnNewCard)   {    Para (Byte Ⅰ. = 0; Ⅰ. < Sizeof(MyEEPROMValidCardUID.CardVaildUID); Ⅰ.++)      {      MyEEPROMValidCardUID.CardVaildUID[Ⅰ.] = mfrc522.Uid.uidByte[Ⅰ.];      Eeprom.Comenzar(512);      Eeprom.Poner(100,MyEEPROMValidCardUID);      Eeprom.Cometer();      Eeprom.Final();      LearnNewCard = Falso;     }     Isvalid = Verdad;       } Más   {     Para (Byte Ⅰ. = 0; Ⅰ. < Sizeof(MyEEPROMValidCardUID.CardVaildUID); Ⅰ.++)      {     Si (mfrc522.Uid.uidByte[Ⅰ.] != MyEEPROMValidCardUID.CardVaildUID[Ⅰ.]) { Isvalid = Falso; }         }   }     Si (Isvalid)    {       Bool PinState= digitalRead(RELAIS_PIN);       PinState = !PinState;       digitalWrite(RELAIS_PIN, PinState);       SetRGBLed(0,255,0,Falso);        Led Green       Serial.Impresión("Válido.");       Retraso(2000);             SetRGBLed(0,0,255,Falso);        Lector de color led azul está en condiciones básicas    } Más    {             SetRGBLed(255,0,0,Falso) ;      Led Red - La última carta no era válida       Serial.Impresión("No válido.");       Retraso(2000);       }      Serial.println();      mfrc522.PICC_HaltA();  Coloca la tarjeta de lectura en modo de suspensión para buscar otras tarjetas.     Retraso(100);   }   Servidor.handleClient(); Editar solicitudes de servidor web   Rendimiento();               Llamar a funciones internas ESP8266   Esp.wdtFeed();         Perro guardián.    Retraso(20);
}

Compilamos el código y lo cargamos a nuestro ESP. Iniciamos el monitor serie y vemos la siguiente salida:

La primera línea muestra el número de serie del ESP. Tomamos nota de estos ya que los necesitamos para el primer registro en el sitio web. La segunda línea especifica la dirección IP en nuestra LAN. Ingresamos esta IP en el navegador y obtenemos la siguiente imagen:

El ID de inicio de sesión es:
Nombre de usuario: admin
Contraseña: Número de serie del chip ESP. (número ATSN)
Si el inicio de sesión falla, veremos la siguiente imagen:

De lo contrario, iremos al menú principal:

PICC - Tarjeta de Circuito Integrado de Proximidad

Para autorizar un nuevo mapa, ahora hacemos clic en registrar mapa en el menú "PICC":

El siguiente artículo de la serie dice: Down the Rabbit Hole.. nos ocupamos de las funciones de la tarjeta Classic Mifare y escribimos datos en la tarjeta con chip por primera vez.

 

 

Precipitador electrostático - 8266Proyectos para avanzados.Sensores

1 comentario

Martin Kurth

Martin Kurth

Ich würde damit eine Wallbox Für ein E-Auto freischalten wollen. Es muss nur ein 12 V / 30mA Kontakt geschaltet werden. Da nehme ich dann ein Omron G3VM Halbleiterrelais.
Sinnvoll wäre auch eine feste IP. Dann muss man nicht im Terminal nach der Adresse schauen, wenn man später darauf zugreifen will. Helfen würde mir eine Routine, die die Freigabe nach einer definierten Zeit wieder entzieht, also den Ausgang wieder abschaltet. Der Ladevorgang dauert Max ca. 8h im ungünstigsten Fall.

Deja un comentario

Todos los comentarios son moderados antes de ser publicados

Artículos de blog

  1. Ahora instalamos el esp32 a través de la administración.
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. Transporte Aéreo - programación de ESP mediante redes locales inalámbricas