Dopo aver definito l'hardware nella prima parte e aver utilizzato una scheda per cambiare saldamente il relè, doniamo una prima interfaccia utente al nostro ESP nella seconda parte di questa serie per poter eseguire attività di configurazione intorno al nostro lettore di schede. Il sito web sarà ampliato da una parte all'altra di questa serie e dotato di più funzioni.
Le istruzioni del prima parte.
Prima di tutto, dobbiamo adattarci alle nostre esigenze o al nostro Wi-Fi locale nelle seguenti righe del codice:
Wifi.Iniziare("Deine_WLANSSID","Dein_Passwort");
Carichiamo il seguente codice sul nostro NodeMcu:
#include <Spi.H> #include <Numero di unità DI CRITTOGRAFIA.H> #include <ESP8266WiFi.H> #include <WiFiClient.h> #include <Server Web ESP8266.H> #include <ESP8266mDNS (dns).H> #include <Eeprom.H> # define RST_PIN 5 SPI Reset Pin (uscita D1) # define RELAIS_PIN 16 Relè (uscita D0) [LOW Active] - Anche LED interno vicino alla porta USB # define SS_PIN 15 SPI Slave Seleziona Pin # 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 SSID WiFi massima # define ESPHostNameLen 20 Numero massimo di caratteri ESPHostName # define LED_BUILTIN 16 # define PIN_WIRE_SDA 4 # define PIN_WIRE_SCL 5 Numero di unità DI CRITTOGRAFIA mfrc522(SS_PIN, RST_PIN); Crea istanza di MFRC522 Numero di unità DI CRITTOGRAFIA::MIFARE_Key Chiave; Server Web ESP8266 Server(80); Crea istanza server Web Struct WiFiEEPromData { Char Nomehost ESPHost[ESPHostNameLen]; Char Nome APSTA[STANameLen]; STATION Nome da collegare, se defondato Char WiFiPwd[WiFiPwdLen]; WiFiPAssword, se detrovato Char ConfigValid (Valido)[3]; Se Config è Vaild, è necessario il tag "TK"" }; Struct PICCardEEPRomData { Char CardVaildUID[4]; Char Reservered[4]; }; WiFiEEPromData MyWiFiConfig; PICCardEEPRomData MyEEPROMValidCardUID; Bool Risultato = False; Bool LearnNewCard = False; Vuoto Installazione() { PinMode (Modalità pin)(RST_PIN,Output); digitalWrite (Scrittura digitale)(RST_PIN,alto); PinMode (Modalità pin)(RELAIS_PIN,Output); PinMode (Modalità pin)(RGBLED_R,Output); PinMode (Modalità pin)(RGBLED_G,Output); PinMode (Modalità pin)(RGBLED_B,Output); digitalWrite (Scrittura digitale)(RELAIS_PIN,alto); Relè inattivo digitalWrite (Scrittura digitale)(RGBLED_R,Basso); Led OFF digitalWrite (Scrittura digitale)(RGBLED_G,Basso); digitalWrite (Scrittura digitale)(RGBLED_B,Basso); Seriale.Iniziare(9600); Inizializzare la comunicazione seriale con il PC Rendimento(); Seriale.println(Spagnolo.getChipId()); Spi.Iniziare(); Inizializzare la comunicazione SPI digitalWrite (Scrittura digitale)(RST_PIN,Basso); Risultato = startWiFiClient (avviOWiFiClient)(); Rendimento(); Eeprom.Iniziare(512); Eeprom.Ottieni(100,MyEEPROMValidCardUID); Dall'indirizzo 100 viene memorizzata la KArte valida Eeprom.Fine(); InitalizeHTTPServer(); digitalWrite (Scrittura digitale)(RST_PIN,alto); mfrc522.PCD_Reset(); mfrc522.PCD_Init(); Inizializzare il modulo di lettura MFRC522 mfrc522.PCD_AntennaOn(); Rendimento(); digitalWrite (Scrittura digitale)(RGBLED_R,alto); Led Colore Viola Inialization Completato digitalWrite (Scrittura digitale)(RGBLED_G,Basso); digitalWrite (Scrittura digitale)(RGBLED_B,alto); } Per le funzioni di avvio, il server Web delle funzioni di avvio, o ome di posta o me , . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . O , , , , , , , . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Vuoto handleNotFound() { } Vuoto handleRoot() Casa { Stringa Temp =""; Se (Server.hasArg("AuthCard") ) Riavvia il sistema { Temp = "Si prega di tenere la carta di fronte ai lettori."; Server.Invia ( 200, "testo/html", Temp ); digitalWrite (Scrittura digitale)(RGBLED_R,alto); Modalità di programmazione giallo colore a Led digitalWrite (Scrittura digitale)(RGBLED_G,alto); digitalWrite (Scrittura digitale)(RGBLED_B,Basso); LearnNewCard = Vero; Server.Client().Fermare(); } Server.sendHeader (Intestazione)("Cache-Control", "no-cache, no-store, must-revalidate"); Server.sendHeader (Intestazione)("Pragma", "no-cache"); Server.sendHeader (Intestazione)("Scadenza", "-1"); Server.setContentLength (lunghezza in cui è impostato)(CONTENT_LENGTH_UNKNOWN); Contenuto HTML Server.Invia ( 200, "testo/html", Temp ); Speichersparen - Schon mal dem Cleint senden Temp = ""; Temp += "<! HTML DOCTYPE><html lang>'de'><head><meta charset''UTF-8'><meta name'viewport content''width'device-width, initial-scale'1.0,'>"; Server.sendContent(Temp); Temp = ""; Temp += "<tipo di stile>'testo/css'><!-- DIV.container : min-height: 10em; display:cella di tabella; vertical-align: middle .button : altezza:35px; width:90px; font-size:16px; Server.sendContent(Temp); Temp = ""; Temp += "corpo: colore di sfondo: powderblue; </style>"; Temp += "<head><title>Kartenleser RC522</title></head>"; Temp += "<h2>Kartenleser RC522 Konfiguration</h2>"; Temp += "<corpo>"; Server.sendContent(Temp); Temp = ""; Temp += "<azione modulo''/' metodo''post'>"; Temp += "<tipo di pulsante''submit' name'''AuthCard' value''1' style''height: 50px; larghezza: 200px' >Authorisiere n'chste Karte an Leser</button>"; Temp += "</form>"; Server.sendContent(Temp); Temp = ""; Server.Client().Fermare(); } Vuoto InitalizeHTTPServer() { Bool initok = False; Server.su("/", handleRoot); Server.onNotFound (innotiere) ( handleNotFound ); Server.Iniziare(); Avvio del server Web } "" , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , "" , o oos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bool startWiFiClient (avviOWiFiClient)() { Bool WiFiClientStarted = False; Size_t A0_ADCValue = 0; byte Ho = 0; byte connRes = 0; Serial.setDebugOutput(true); Aktivieren Debugzwecken. Wifi.Hostname("CrdRdr41667"); Wifi.softAPdisconnect (softAPdisconnect)(Vero); Wifi.Scollegare(); Wifi.Modalità(WIFI_STA); Se(loadCredentials()) { Wifi.Iniziare(MyWiFiConfig.Nome APSTA, MyWiFiConfig.WiFiPwd); Mentre (( connRes != 3 ) E( connRes != 4 ) E (Ho != 30)) se connRes : 0 "IDLE_STATUS - modificare Statius" { Ho++; Serial.print(""); Collegare vorgang auf der seriellen Schnittstelle beobachten Ritardo(500); Rendimento(); connRes = Wifi.waitForConnectResult(); } Se (connRes == 4 ) { se la password non è corretta Seriale.println("ATWIFI:PWDERR"); Wifi.Scollegare(); } Se (connRes == 6 ) { modulo non è configurato in modalità stazione Seriale.println("ATWIFI:STAERR"); Wifi.Scollegare(); } } Se(Wifi.Stato() == WL_CONNECTED) { Seriale.Stampare("ATIP:"); Seriale.println(Wifi.localIP (informazioni in locale)()); Wifi.setAutoReconnect(Vero); Impostare se il modulo tenterà di riconnettersi a un punto di accesso nel caso in cui sia disconnesso. Configurare il risponditore MDNS Se (!Mdns.Iniziare("CrdRdr41667")) { Seriale.println("ATMDNS:NOK"); } Altro { Mdns.addService (servizio aggiuntivo)("http" (http), "tcp", 80); } WiFiClientStarted = Vero; } Altro { Wifi.Scollegare(); Wifi.Modalità(WIFI_STA); Wifi.Iniziare("Deine_WLANSSID","Dein_Passwort"); Il bzw di ndern. apassen! saveCredentials (informazioni in base alle credenziali del servizio(); Mentre (( connRes != 3 ) E( connRes != 4 ) E (Ho != 30)) se connRes : 0 "IDLE_STATUS - modificare Statius" { Ho++; Serial.print(""); Collegare vorgang auf der seriellen Schnittstelle beobachten Ritardo(500); Rendimento(); connRes = Wifi.waitForConnectResult(); } } WiFi.printDiag(Serial); Aktivieren Debugzwecken. Ritorno WiFiClientStarted; } "" , o oos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Le funzioni di avvio per l'eSEProM s., o, con il valore di e- , o le funzioni di avvio , ovvero le funzioni di avvio per l'EEPROM. Bool loadCredentials() { Bool RetValue (RetValue); Eeprom.Iniziare(512); Eeprom.Ottieni(0,MyWiFiConfig); Eeprom.Fine(); Se (Stringa(MyWiFiConfig.ConfigValid (Valido)) == "TK") { RetValue (RetValue) = Vero; } Altro { RetValue (RetValue) = False; Impostazioni WLAN nicht gefunden. } Ritorno RetValue (RetValue); } Vuoto saveCredentials (informazioni in base alle credenziali del servizio() Credenziali Di Speicehre Wlan su EEPROM { Stringa Un; Size_t Ho.; Per (Ho. = 0 ; Ho. < Sizeof(MyWiFiConfig) ; Ho.++) Loeschen della vecchia configurazione { Eeprom.Scrivere(Ho., 0); } Per (Ho. = 0 ; Ho. < STANameLen ; Ho.++) Loeschen della vecchia configurazione { MyWiFiConfig.WiFiPwd[Ho.] = 0; } Per (Ho. = 0 ; Ho. < WiFiPwdLen ; Ho.++) Loeschen della vecchia configurazione { MyWiFiConfig.Nome APSTA[Ho.] = 0; } Un = Wifi.Ssid().c_str(); Ho. = Un.Lunghezza(); Un.Tochararray(MyWiFiConfig.Nome APSTA,Ho.+1); Un = Wifi.Psk().c_str(); Ho. = Un.Lunghezza(); Un.Tochararray(MyWiFiConfig.WiFiPwd,Ho.+1); Strncpy(MyWiFiConfig.ConfigValid (Valido) , "TK", Sizeof(MyWiFiConfig.ConfigValid (Valido)) ); Eeprom.Iniziare(512); Eeprom.Mettere(0, MyWiFiConfig); Eeprom.Commettere(); Eeprom.Fine(); } Funzioni FINE StoreCredenzialiineDi SDSM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . O , , , , , , . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Vuoto Ciclo() Ciclo principale { Solo quando una scheda viene trovata e potrebbe essere letta se esegue il contenuto Se (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial() ) PICC - scheda di circuito integrato di prossimità - scheda chip contactless { Seriale.Stampare("PICC UID:"); Per (Byte Ho. = 0; Ho. < mfrc522.Uid.Dimensione; Ho.++) { Distanza tra i numeri HEX e lo zero iniziale al byte < 16 Seriale.Stampare(mfrc522.Uid.bytedByte[Ho.] < 0x10 (in modo 0x10) ? " 0" : " "); Seriale.Stampare(mfrc522.Uid.bytedByte[Ho.], Hex); } Bool Isvalid = Vero; Se (LearnNewCard) { Per (Byte Ho. = 0; Ho. < Sizeof(MyEEPROMValidCardUID.CardVaildUID); Ho.++) { MyEEPROMValidCardUID.CardVaildUID[Ho.] = mfrc522.Uid.bytedByte[Ho.]; Eeprom.Iniziare(512); Eeprom.Mettere(100,MyEEPROMValidCardUID); Eeprom.Commettere(); Eeprom.Fine(); LearnNewCard = False; } Isvalid = Vero; } Altro { Per (Byte Ho. = 0; Ho. < Sizeof(MyEEPROMValidCardUID.CardVaildUID); Ho.++) { Se (mfrc522.Uid.bytedByte[Ho.] != MyEEPROMValidCardUID.CardVaildUID[Ho.]) { Isvalid = False; } } } Se (Isvalid) { Bool PinState= digitalRead (Lettura digitale)(RELAIS_PIN); PinState = !PinState; digitalWrite (Scrittura digitale)(RELAIS_PIN, PinState); digitalWrite (Scrittura digitale)(RGBLED_R,Basso); Verde Led digitalWrite (Scrittura digitale)(RGBLED_G,alto); digitalWrite (Scrittura digitale)(RGBLED_B,Basso); Seriale.Stampare("Valido".); Ritardo(2000); digitalWrite (Scrittura digitale)(RGBLED_R,Basso); Lettore blu a led è in condizioni di base digitalWrite (Scrittura digitale)(RGBLED_G,Basso); digitalWrite (Scrittura digitale)(RGBLED_B,alto); } Altro { digitalWrite (Scrittura digitale)(RGBLED_R,alto); Led Rosso - Ultima carta non valida digitalWrite (Scrittura digitale)(RGBLED_G,Basso); digitalWrite (Scrittura digitale)(RGBLED_B,Basso); Seriale.Stampare("Non valido".); Ritardo(2000); } Seriale.println(); Mette la scheda letta in modalità di sospensione per cercare altre schede. mfrc522.PICC_HaltA(); Ritardo(1000); } Server.handleClient(); Modificare le richieste del server Web Rendimento(); Chiamare le funzioni ESP8266 interne Ritardo(20); }
Compiliamo il codice e lo carichiamo sul nostro NodeMcu. Durante il caricamento dello schizzo, il nostro LED RGB si illumina "rosso". Dopo il caricamento riuscito, il colore del LED cambia in "viola" dopo qualche tempo. La modifica del colore indica che l'operazione di caricamento è stata eseguita correttamente.
Per consentire un caricamento nel NodeMcu Affidabile Il pulsante "Flash" sul NodeMcu deve essere premuto e tenuto premuto durante la compilazione!
Quando il processo di caricamento viene completato correttamente, viene avviato il terminale seriale nell'IDE e la velocità di trasferimento viene impostata su 9600. Otteniamo un output che emette il nostro indirizzo IP sulla rete locale:
Abbiamo ping l'indirizzo visualizzato per verificare se tutto ha funzionato. Quando riceviamo una risposta ai nostri ping, andiamo al sito web dell'ESP digitando l'indirizzo IP mostrato sopra nel browser:
Poiché il nostro ESP non ha ancora salvato una carta autorizzata nella EEPROM interna, ora facciamo clic sul pulsante. Riceviamo il seguente avviso:
Il LED si illumina in giallo per indicare che una carta può essere tenuta davanti al lettore. La carta successiva tenuta davanti al lettore in questa modalità viene accettata e salvata come autorizzata. La precedente carta autorizzata verrà eliminata. È possibile autorizzare una sola carta alla volta.
Nella parte successiva collegheremo un pulsante al nostro NodeMcu con il quale possiamo scambiare automaticamente le chiavi WPS con il nostro router e scrivere i dati di accesso WLAN in modo permanente nella nostra EEPROM. Pertanto, l'ultima parte della configurazione fissa viene dinamizzata dal nostro codice. Una volta compilato, il codice può essere utilizzato con qualsiasi router e scheda. Continueremo a utilizzare il file system interno dell'ESP per essere in grado di gestire diverse schede tramite l'interfaccia web.
Fino alla prossima parte
1 commento
Martin
Im Terminal kommt immer nur das. Keine IP
rl
$⸮⸮|
⸮$⸮|⸮$⸮c|⸮⸮⸮2⸮r⸮b⸮#⸮⸮on⸮lNo⸮⸮⸮Bp⸮⸮${l{lp⸮N⸮⸮l⸮⸮bo⸮|l⸮⸮b⸮⸮no⸮$⸮⸮
$`⸮ood`n{⸮ےo#⸮d{⸮⸮n
18:34:54.645 → ATSN:7427403D⸮⸮