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;"""</spanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspaninspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspaninspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanGli spanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspanspan spanspanspanspanspanspanspanspanspanspanspanspanspans4f54"style="Color: Color: 434f54; 434f54><>>>>>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;">"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.
1 commento
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.