Zugangsbeschränkung zu Geräten per RFID-Card Teil 3 - AZ-Delivery

Accesso limitato ai dispositivi tramite scheda contactless con NodeMCU e il modulo RC522 di terza parte: WPA, un'interfaccia Web con protezione tramite password, informazioni sullo stato e una barra dei menu espandibile.

Dopo che siamo entrati prima parte  abbiamo definito l'hardware e possiamo usare una scheda per cambiare il relè, diamo al nostro ESP nella terza parte di questa riga un pulsante WPS per assumere automaticamente la configurazione WLAN, così come una pagina di accesso per il nostro ESP da configurare contro persone non autorizzate Proteggi il cambiamento.


Registrazione WPA:

Per poter salvare i dati WLAN nel nostro ESP utilizzando il metodo del pulsante WPA, dobbiamo espandere i circuiti di base presentati nella prima parte.

Abbiamo bisogno di 3 resistori precisi con 6,8 KOhm e un pulsante. Questo pulsante mette in corto circuito la resistenza media del partitore di tensione in modo che il nostro ESP possa registrare la pressione del pulsante. Lo schema sopra mostra il cablaggio necessario e deve essere AGGIUNTO al nostro cablaggio dalla prima sezione.

Ecco il codice:

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

#define RST_PIN     5     // Pin di reset SPI (uscita D1)
#define RELAIS_PIN  16    // Relè (uscita D0) [LOW attivo] - Anche LED interno vicino alla porta USB
#define SS_PIN      15    // Pin di selezione slave SPI

#define RGBLED_R    2     // rosso (uscita D4) 
#define RGBLED_G    0     // Verde (uscita D3) - Anche LED interno sul modulo ESP
#define RGBLED_B    4     // blu (uscita D2)

#define WiFiPwdLen   25   // Lunghezza massima della password WiFi
#define STANameLen 20     // Lunghezza massima SSID WiFi
#define ESPHostNameLen 20 // Numero massimo di caratteri ESPHostName

#define LED_BUILTIN 16
#define PIN_WIRE_SDA 4 
#define PIN_WIRE_SCL 5 

ADC_MODE(ADC_TOUT);   // Configura l'ingresso analogico A0 su esterno. ADC_TOUT (per tensione esterna), ADC_VCC (per tensione di sistema). 
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Crea un'istanza di MFRC522
MFRC522::MIFARE_Key chiave;
ESP8266WebServer server(80);        // Crea un'istanza del web server

struct WiFiEEPromData   {     carbonizzare ESPHostName[ESPHostNameLen];      carbonizzare APSTAName[STANameLen]; // Nome punto STATION / AP TO Connect, se indicato     carbonizzare WiFiPwd[WiFiPwdLen]; // WiFiPAssword, se difeso     carbonizzare ConfigValid[3]; // Se Config è Vaild, è richiesto il tag "TK" "   };

struct PICCardEEPRomData   {     carbonizzare CardVaildUID[4];     carbonizzare riservata[4];   };

WiFiEEPromData MyWiFiConfig;
PICCardEEPRomData MyEEPROMValidCardUID;

// Variabile globale utilizzata
bool risultato  = falso;
bool LearnNewCard = falso;
stringa Temp ="";
unsigned lungo SessionID;

vuoto configurazione()     {    pinMode(RST_PIN,USCITA);   digitalWrite(RST_PIN,ALTA);   pinMode(RELAIS_PIN,USCITA);   pinMode(RGBLED_R,USCITA);   pinMode(RGBLED_G,USCITA);   pinMode(RGBLED_B,USCITA);   digitalWrite(RELAIS_PIN,ALTA);    // relè inattivo   SetRGBLed(0,0,0,falso);            // Led spento   serial.iniziare(115200);               // Inizializza la comunicazione seriale con il PC con 115200 baud   resa();   serial.println("");   Temp = "ATSn"+ stringa(ESP.getChipId());   serial.println(Temp);   // Serial.print ("Valore ADC:"); Serial.println (analogRead (A0));   SPI.iniziare();                      // Inizializza la comunicazione SPI   ESP.wdtEnable(WDTO_4S);              // Avvia watchdog   ESP.wdtFeed();    digitalWrite(RST_PIN,LOW);   SessionID = millis();   ESP.wdtFeed();   risultato  = startWiFiClient();   ESP.wdtFeed();     resa();   EEPROM.iniziare(512);   EEPROM.get(100,MyEEPROMValidCardUID);   // La carta valida è memorizzata dall'indirizzo 100   EEPROM.fine();   InitalizeHTTPServer();   digitalWrite(RST_PIN,ALTA);   mfrc522.PCD_Reset();   mfrc522.PCD_Init();              // Inizializzazione del modulo di lettura MFRC522   mrc522.PCD-u Antenna();   rendimento();   ESP.wdtFeed();   Impostazioni(255,0,255,false);       Inizializzazione porpora color pelle completa   }


***********************************************

vuoto Impostazioni(scambio RedValue,scambio GreenValue,scambio BlueValue,booleano Slovacchia)  //Radio kion per il controllo di RGB Led
{   digitalacWrite(RGBLED R,BASSA);       digitalacWrite(RGBLED G,BASSA);   digitalacWrite(RGBLED B,BASSA);    se (RedValue == 255)   { digitalacWrite(RGBLED R,ALTA); }      se (GreenValue == 255) { digitalacWrite(RGBLED G,ALTA); }   se (BlueValue == 255)  { digitalacWrite(RGBLED B,ALTA); }    }

*********************************************

Avvia funzionalità Webserver

//Basic cookie routine si basano sull’estratto di GIT:
//https://github.com/esp8266/ESPWebServer/blob/master/examples/SimpleAuthentification/SimpleAuthentification.ino
bl au au au au()
{     se (server.hasHeader(Biscotto.)){       // Cookie trovato      Tempi = server.intestazione(Biscotto.);       //Serial.println(temp);      Stringa Sessione = Stringa(ESP.getChipName()) + "=" + Stringa(SessionID);      se (Tempi.indice(Sessione) != -1) {         // Web Autenticazione riuscita        Tempi = "";        ritorno Vero;       }     }        // Web Autenticazione non riuscita    Tempi = "";    SessionID = millimetri();    ritorno false; 
} 

vuoto handleLogin(){   Stringa CleverMouse;   //String cookie = server.header("cookie");   //Serial.println(cookie);   se (server.hasohGenericName("DISCONNECT")){     //Utenti di disconnessione;     server.Select(Posizione,"/login");     server.Select(Cache-Control,"no-cache");     SessionID = millimetri();     Tempi = Stringa(ESP.getChipName()) + "= NA; HttpOnly; SameSite=Stretto";     server.Select(Autunno,Tempi);     Tempi = "";     server.inviare(301);     ritorno;   }   se (server.hasohGenericName("USERNOME") && server.hasohGenericName(PASSWORD)){     Tempi = Stringa(ESP.getChipName());     se (server.arrabbiato("USERNOME") == admin &&  server.arrabbiato(PASSWORD) == Tempi ){       server.Select(Posizione,"/");       server.Select(Cache-Control,"no-cache");       SessionID = millimetri();       Tempi = Stringa(ESP.getChipName()) + "=" + Stringa(SessionID) + "; HttpOnly; SameSite=Right";       server.Select(Autunno,Tempi);       Tempi = "";       server.inviare(301);       ritorno;     }   CleverMouse = "<script>alert (nome utente sbagliato o password));</script>";   }    CSS intestazione modello();    Tempi = "<Head><title>Login</title></Head><<<<DIV ALIGN=CENTER>";    server.sendContent(Tempi);    Tempi = "<h2>Registration to RC522</h2><body><br><table border=0 bgcolor=black><tr><DIV ALIGN=GIUSTO>";    server.sendContent(Tempi);    Tempi = "<form action='/login'mean='post'>Username: <input type=text Name='USERNAME'Size=17 required><br>";    server.sendContent(Tempi);    Tempi = "Password: <input type=password name='PASSWORD'Size=17 required><br><<<button type='subject'"";    server.sendContent(Tempi);    Tempi = "name='Login'u Button'value='1'style='heard: 30px; width: 100px'> Login</button><, br></th>/tr></form>;</DIV gt&t;;;;";    server.sendContent(Tempi);    Tempi = "<br><SMALL> </SMALL> <;;</SMALL>";      server.sendContent(Tempi);    Tempi = CleverMouse + "</DIV></body></HTML>";    server.sendContent(Tempi);    Tempi = "";
}

vuoto handleNotefound()    {   SessionID = millimetri();   Tempi = Pagina non trovata.;   Tempi += URI:;   Tempi += server.e();   Tempi += "nMethod:;   Tempi += (server.metodo() == HTTP GET)?"GET":POST;   Tempi += "nArgoments:;   Tempi += server.Arrabbiato();   Tempi += "n";   per (u t i=0; i<server.Arrabbiato(); i++){     Tempi += " " + server.Arrabbiato(i) + ": " + server.arrabbiato(i) + "n";   }   server.inviare(404, "testo/pianura", Tempi);   Tempi = "";   }


vuoto handleNewPIC()
{   se (!au au au au())     {     server.Select(Posizione,"/login");     server.Select(Cache-Control,"no-cache");     server.inviare(301);     ritorno;     }   CSS intestazione modello();   Tempi = "<Head><title>card reader RC522</title></head><body>";   server.sendContent(Tempi);   HtmlNavStructure();   Tempi = "<script>alert('Tieni la tua carta davanti al lettore!);</script>";      server.sendContent(Tempi);   Impostazioni(255,255,0,false);       //Led Color Yellow Programming Mode   Learn NewCard = Vero;       Tempi = "</body></html>";   server.sendContent(Tempi);   server.cliente().Stop!();   Tempi = "";
}



vuoto handleRoot(){   se (!au au au au()){     server.Select(Posizione,"/login");     server.Select(Cache-Control,"no-cache");     server.inviare(301);     ritorno;     }   // contenuto HTML   CSS intestazione modello();   Tempi = "<Head><title>card reader RC522</title></head><body>";   server.sendContent(Tempi);   HtmlNavStructure();   Tempi = "<div ALIGN=CENTER><br><br><br><BIG>Benvenuti al sito web di lettori di carte intelligenti RC522.</BIG>";   server.sendContent(Tempi);   Tempi = "Viaggio: + Stringa(ESP.getReimportazione()) + "<br>";   server.sendContent(Tempi);   Tempi = "Free Heat Storage: + Stringa(ESP.getFreeHeap()) + "Bytes<br>";   server.sendContent(Tempi);   Tempi = "Int. Flash: + Stringa(ESP.getFlashChipRealSize()) + "Bytes<br>";   server.sendContent(Tempi);   Risultato = mrc522.PCD PerforamSelfTest();    mrc522.PCD Init();                       // Inizializzazione del modulo di lettura MFRC522   mrc522.PCD-u Antenna();    se (Risultato) {Tempi = "Stato PCD RC522: OK<br>"; } e {Tempi = "Stato PCD RC522: Errore!<br>"; }    server.sendContent(Tempi);   Tempi = "Codice CPU: + Stringa(ESP.getChipName()) + " @ " + Stringa(ESP.getCpuqMHz()) + "MHz<br>";    server.sendContent(Tempi);   Tempi = "<br>Sei stato registrato con successo!<br><form action='/login'mean='get'>";   server.sendContent(Tempi);   Tempi = "<button type='subject'name='DISCONNECT'value='YE'style='heaght: 30px; width: 200px' >Logout</button>";   server.sendContent(Tempi);   Tempi = "</form></div></body></html>";   server.sendContent(Tempi);   se (server.hasohGenericName(Autunno) )  // Sistema di reboot      {     ESP.wdtFeed();             ESP.wdtDisable();     Tempi = "<script>alert('The system riavvies NOW);</script>";        server.sendContent(Tempi);     server.cliente().Stop!();     Tempi = "";     ritardo(1000);      ESP.reset();     ritardo(4000);      }     server.cliente().Stop!();   Tempi = "";
}

vuoto CSS intestazione modello() // Formato modello per tutti i siti web di ESP interni. https://wiki.selfhtml.org/wiki/CSS   {    server.setContentLength(CONTENUTO sconosciuto);    Tempi = "<?DOCTYPE HTML PUBBLICO'-//W3C//DTD HTML 4.01 Transitional//EN'><html lang='de'><meta charset='UTF-8'>";    server.inviare (200, "text/html", Tempi);    Tempi = Tylsty=/ testo/css&&&igg;*{margine: 0;padding: 0;;;}corpo di persone{sottofondo:nero;colore:darkoirchid; dimensione del font: 16px;" server.>>>>>>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;">"font-family: sans-serif,arial;}.nav{width: 1300px;altezza: 30px;margine: 0 auto;border-radio: 5px;";    server.sendContent(Tempi);    Tempi = Se vuoi fare questo, sarai in grado di usare l'altezza della linea: 60px; posizione: relativa; posizione: posizione: relativa; sfondo: sfondo: Darkochichid; sfondo: sfondo: sfondo: backbackbackin: in questo modo, potrai essere in grado di utilizzare la linea-altezza: 60px; posizione; posizione: relativa; sfondo: sfondo: backbackback: darkorchchid; back: back: backbackbackbackbackbackback,;;>>>>>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;">= "box-shadow: 0px 2px 5px 0px grigio;text-allineation: center;float: left;ground-color:'35; 010000;">"box-shadow;    server.sendContent(Tempi);    Tempi = "posizione: assoluta;}.nav > ul > li:nth-of-type(1){raggio di frontiera: 5px 0px 0px 5px;}.nav > ul > li:nth-of-type(5)";    server.sendContent(Tempi);    Tempi = "{border-radio: 0px 5px 5px x x x;;;}lli ni ni un colore: a rgb(181818181818181818181818181818181818; larghlarghlarghlarghlarghlarghlarghlarghlargha20px; altezza: 55px; impaimpaimpaimpainin- in- il-bloc;"""<<>>>>>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;">"testo-decorazione: nessuno;} li a:hover{font-weight: audace;border-bottom: 2px solido \35; f;}ul li ul ul ul ul display: nessuno;}";    server.sendContent(Tempi);    Tempi = Se vuoi vedere lo show: blocco;}.fa{margine-destro: 5px;.container{widspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspans434f54;"sendContenttemp temp temptemp temp= "margine: 0 auto;padding:20px 20px;}@media screen e (max-width: 480px){header{width: 100%;}";    server.sendContent(Tempi);    Tempi = Se si desidera mostrare il display: no;larghezza: 100%;altezza: auto;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\bespanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspan16434343444444444444444444444444444444444444 4 4 4 4 35; 434f54;">.>>>>>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;">= "display: block;>"li{position: static;}li li li li li li{background: 35; 222;}.fa-list.modifica{display: blocco;}";    server.sendContent(Tempi);    Tempi = "contenitore{larghezza: 100%;altezza: auto;}corpo{overflow-x:hidden;}<";    server.sendContent(Tempi);    Tempi = "";   }

vuoto HtmlNavStructure()   {   Tempi = "<div class='menu'><nav class='nav'><";   server.sendContent(Tempi);   Tempi = "<li><a href=''35;">System</a>";   server.sendContent(Tempi);   Tempi = "<ul><li><a href='>Information</a></li>";   server.sendContent(Tempi);   Tempi = "<li><a href='/?Reboot=SÌ>Reboot</a>/li>";   server.sendContent(Tempi);   Tempi = "</ul>";   server.sendContent(Tempi);   Tempi = "</li><li><a thref=''35;';">PIC</a>";   server.sendContent(Tempi);   Tempi = "<ul><li><a href=/newPIC'>Register Map</a>/li></ul>";   server.sendContent(Tempi);   Tempi = "</li>";   server.sendContent(Tempi);   Tempi = "</ul></nav></diva>";   server.sendContent(Tempi);   Tempi = "";   }       vuoto Inizializzazione HTTPPSServer()    {   bl Pathoswithin = false;   to Heavyiron * intestazione[] = {Autore,Biscotto.} ; //Header for Tracking   Dimensione t intestazione = dimensioni(intestazione)/dimensioni(Heavyiron*); //Header for Tracking   server.su("/", handleRoot);   server.su("/login", handleLogin);   server.su("/newPIC", handleNewPIC);   server.onNotefound ( handleNotefound );   server.CollectHeaders(intestazione, intestazione );// Strumenti server per rintracciare questi    server.Inizio(); // Web server start   }        ************************************************************************************************************************************************************************************************

*************************************************
// Funzione di https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/wps-mit-dem-esp8266?ls=de
bl startWPS() {   bl wpsSuccess = WiFi.startWPMSConfig();   se(wpsSuccess) {       Non deve sempre avere successo.Dopo un timeout il SSID è vuoto       Stringa newSSID = WiFi.SSID();        se(newSSID.lunghezza() > 0) {         // Solo quando è stato trovato un SSID abbiamo avuto successo          rendimento();          Serial.Stampa(Bene.);         saveCredenziali(); Salvare i crediti a EEPROM       } e {         Serial.Stampa(ATWPS:NOK);       }   }   ritorno wpsSuccess; 
}

bl startWiFiClient() {   bl WiFiClientstart = false;   Dimensione t A0 ADCValue = 0;   scambio i = 0;   scambio connect = 0;   Serial.setDebugOutput(false);  // Abilita per debugging.    WiFi.hostname("CrdRd41667");   WiFi.softAPdisconnesso(Vero);   WiFi.disconnettere();   WiFi.modalità(WIFI STA);   se(loadCrediti())      {      WiFi.Inizio(MyWiFiConfig.APSTA, MyWiFiConfig.WiFiPwd);      mentre (( connect != 3 ) e( connect != 4 ) e (i != 30))  //if connRes = 0 "IDLE" u STATUS -change Statius"       {        i++;       // Serial.print(");// Monitor Connect process on serial interface       ESP.wdtFeed();       ritardo(500);       rendimento();       connect  = WiFi.Risultato di waitForConnectult();       }      se (connect == 4 ) { // se la password non è corretta       Serial.Stampa("ATWIFI:PWDRER");             WiFi.disconnettere();       }      se (connect == 6 ) { // modulo non è configurato in modalità stazione       Serial.Stampa("Stelle");       WiFi.disconnettere();       }      }   se(WiFi.status() == WL CONNEGATO)      {     ESP.wdtFeed();      Serial.stampa(ATIP:);     Serial.Stampa(WiFi.localIP());     WiFi.setAutoReconnett(Vero); // Imposta se il modulo tenterà di riconnettersi ad un punto di accesso in caso di disconnessione.     // Installazione MDNS risponde     se (!MDNS.Inizio("CrdRd41667"))        {       Serial.Stampa("ATMDNS:NOK");       } e { MDNS.addService("http://www.", "Tcp", 80); }        WiFiClientstart = Vero;     } e      {     A0 ADCValue = analogico(A0);     //Non abbiamo avuto successo, quindi iniziamo WPS se il pulsante WPS viene premuto a A0 durante il reset     se (A0 ADCValue > 499)       {         se(startWPS())            {             ESP.wdtFeed();              ritardo(500);             WiFi.disconnettere();             WiFi.modalità(WIFI STA);             WiFi.Inizio(WiFi.SSID().c u r(), WiFi.SoUrcerer().c u r());             ESP.wdtFeed();              WiFiClientstart = Vero;           } e           {             WiFiClientstart = false;             WiFi.disconnettere();           }       } e       {         WiFi.disconnettere();       }    }    ritorno WiFiClientstart; 
}
******************************************************************************************

Funzioni di avvio Memorizza crediti WiFi a EEPROM
bl loadCrediti() 
{
 bl RetValue;
 PROM.Inizio(512);
 PROM.capra(0,MyWiFiConfig);
 PROM.fine();
 se (Stringa(MyWiFiConfig.Configura) == TK)    {     RetValue = Vero;   } e   {     RetValue = false; Impostazioni WLAN non trovate.   }   ESP.wdtFeed();    ritorno RetValue; 
}

vuoto saveCredenziali() Conservare le credenziali WLAN su EEPROM 
{   Dimensione t i;   per (i = 0 ; i < dimensioni(MyWiFiConfig) ; i++) // Loose la vecchia configurazione      {       PROM.scrivi(i, 0);       }   per (i = 0 ; i < STATO  ; i++) // Loose la vecchia configurazione      {       MyWiFiConfig.WiFiPwd[i] = 0;       }   per (i = 0 ; i < WiFicwdLen ; i++) // Loose la vecchia configurazione      {       MyWiFiConfig.APSTA[i] = 0;       }      Tempi = WiFi.SSID().c u r();   i = Tempi.lunghezza();   Tempi.toCharArray(MyWiFiConfig.APSTA,i+1);    Tempi = WiFi.SoUrcerer().c u r();   i = Tempi.lunghezza();   Tempi.toCharArray(MyWiFiConfig.WiFiPwd,i+1);   Tempi = "";      Strisce(MyWiFiConfig.Configura , TK, dimensioni(MyWiFiConfig.Configura) );    PROM.Inizio(512);   PROM.bene(0, MyWiFiConfig);   PROM.impegno();   PROM.fine();   ESP.wdtFeed(); 
}
************************************
 
vuoto Esecuzione()  // Main loop
{   // Solo quando una mappa è trovata e può essere letta il contenuto di IF sarà eseguito   se (mrc522.PIC IsNewCardPresent() && mrc522.PIC ReadCardSerial() )   // PIC = scheda di circuito integrato = scheda di chip senza contatto   {     Serial.stampa("PIC UID:);     per (scambio i = 0; i < mrc522.uide.dimensioni; i++)      {       // Distanza tra i numeri HEX e il principale zero a Byte < 16       Serial.stampa(mrc522.uide.uidByte[i] < 0x10 ? " 0" : " ");       Serial.stampa(mrc522.uide.uidByte[i], HEX);     }    bl IsValida = Vero;   se (Learn NewCard)   {    per (scambio i = 0; i < dimensioni(MyEEPROMPValidaCardUID.CardVailUID); i++)      {      MyEEPROMPValidaCardUID.CardVailUID[i] = mrc522.uide.uidByte[i];      PROM.Inizio(512);      PROM.bene(100,MyEEPROMPValidaCardUID);      PROM.impegno();      PROM.fine();      Learn NewCard = false;     }     IsValida = Vero;       } e   {     per (scambio i = 0; i < dimensioni(MyEEPROMPValidaCardUID.CardVailUID); i++)      {     se (mrc522.uide.uidByte[i] != MyEEPROMPValidaCardUID.CardVailUID[i]) { IsValida = false; }         }   }     se (IsValida)    {       bl PIN= digitaleRead(PIN DI RELISI);       PIN = !PIN;       digitalacWrite(PIN DI RELISI, PIN);       Impostazioni(0,255,0,false);        //Led Green       Serial.stampa("Valido".);       ritardo(2000);             Impostazioni(0,0,255,false);        //Led Color Blue Reader è in condizioni di base    } e    {             Impostazioni(255,0,0,false) ;      //Led Red - Last card non è stata valida       Serial.stampa("invalido".);       ritardo(2000);       }      Serial.Stampa();      mrc522.PIC Stop();  // Sposta la mappa di lettura in una modalità di riposo per cercare altre mappe.     ritardo(100);   }   server.handleClient(); // Modifica le query del server web   rendimento();               // invocare le funzioni interne ESP8266   ESP.wdtFeed();         Metti giù il cane.    ritardo(20);
}

Compiliamo il codice e lo carichiamo sul nostro ESP.Iniziamo il monitor seriale e vediamo il seguente output:

La prima riga mostra il numero di serie del ESP.Ne prendiamo atto perché ci servono per la prima registrazione sul sito web.La seconda riga specifica l'indirizzo IP nella nostra LAN.Inseriamo questo IP nel browser e otteniamo la seguente immagine:

L’identificazione della registrazione è:*35;
Nome utente: admin
Password: numero di serie del chip ESP.(numero ATSN)
Se la registrazione fallisce, vediamo il seguente quadro:

Altrimenti arriviamo al menu principale:

PIC = Tessera Integrata di prossimità

Per autorizzare una nuova mappa, fare clic sul menu "PIC" sulla mappa:

Il prossimo articolo della serie dice: Giù il coniglio.Ci occupiamo delle funzioni della carta Mifare Classic scriviamo dati per la prima volta sulla scheda chip.

 

 

Esp-8266Projekte für fortgeschritteneSensoren

1 commento

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.

Lascia un commento

Tutti i commenti vengono moderati prima della pubblicazione