Hallo en welkom bij een ander deel van de ESP Captive Portal-serie.
In het deel van vandaag breiden we onze captive portal uit met een geïntegreerde bestandsserver door een andere zeer interessante vervolgtoepassing: we verbinden een 8x8 WS1812-matrix met de ESP32 en tonen 8x8 pixel BMP-bestanden die zijn opgeslagen op de bestandsserver! Momenteel is er een beperking dat het BMP-bestand exact 8x8 pixels moet zijn om te worden weergegeven. Alle andere formaten of formaten worden niet aangeboden voor displayselectie. De selectie van welk BMP-bestand moet worden weergegeven, wordt gemaakt op de hoofdwebsite:
Allereerstja we moeten een 8x8 dot matrix-display toevoegen aan de hardware en dit aansluiten. De structuur is heel eenvoudig dankzij de enkeldraads bus van de WS2812 LED's:
*** Let ook op de veiligheidsinstructies van ons e-boek voor de inbedrijfstelling van de 8x8 matrix ***
We uploaden de uitgebreide code naar de ESP 32:
# opnemen <WiFi.B> # opnemen <WiFiClient.B> # opnemen <Webserver.B> # opnemen <ESPmDNS.B> # opnemen <SPIFFS.B> # opnemen <DNS-server.B> # opnemen <EEPROM.B> # opnemen <FastLED.B> #define GPIO_OUT_W1TS_REG (DR_REG_GPIO_BASE + 0x0008) #define GPIO_OUT_W1TC_REG (DR_REG_GPIO_BASE + 0x000c) #define LED_PIN 17 #define COLOR_ORDER GRB #define CHIPSET WS2812 statisch const byte WiFiPwdLen = 25; statisch const byte APSTANAMELEN = 20; struct WiFiEEPromData { dwaas APSTA = waar; // Toegangspunt of stationmodus - echte AP-modus dwaas PwDReq = fout; // Wachtwoord vereist dwaas CapPortal = waar ; // CaptivePortal aan in AP-modus char APSTAName[APSTANAMELEN]; // STATION / AP Punt Naam TE VERBINDEN, indien definded char WiFiPwd[WiFiPwdLen]; // WiFiPAssword, indien verdedigd char ConfigValid[3]; // Als Config Vaild is, is tag "TK" vereist " }; struct BMPHeader // BitMapStucture { uint32_t fileSize; // uint32_t makerBytes; // uint32_t imageOffset; // Start van afbeeldingsgegevens "Afbeeldingsoffset: uint32_t headerSize; // uint32_t breedte; uint32_t hoogte; uint16_t vliegtuigen; uint16_t diepte; // bits per pixel uint32_t formaat; }; / * hostnaam voor mDNS. Moet op zijn minst werken op Windows. Probeer het maar http://esp8266.local */ const char *ESPHostname = "ESP32"; // DNS-server const byte DNS_PORT = 53; DNS-server dnsServer; // Conmmon Paramenters dwaas SoftAccOK = fout; // webserver Webserver server(80); / * Soft AP-netwerkparameters * / IP-adres apIP(172, 20, 0, 1); IP-adres netMsk(255, 255, 255, 0); niet ondertekend lang huidige Millis = 0; niet ondertekend lang start Millis; / ** Huidige WLAN-status * / kort status = WL_IDLE_STATUS; Bestand fsUploadFile; // een File-object om het ontvangen bestand tijdelijk op te slaan WiFiEEPromData MyWiFiConfig; String getContentType(String bestandsnaam); // converteer de bestandsextensie naar het MIME-type dwaas handleFileRead(String pad); // stuur het juiste bestand naar de client (als het bestaat) nietig handleFileUpload(); // upload een nieuw bestand naar de SPIFFS String temp =""; byte HELDERHEID = 100; // PresetBrightness // Params voor LED's const uint8_t kMatrixWidth = 8; const uint8_t kMatrixHeight = 8; // const bool kMatrixSerpentineLayout = false; #define NUM_LEDS (kMatrixWidth * kMatrixHeight) CRGB leds_plus_safety_pixel[ NUM_LEDS + 1]; CRGB* const leds( leds_plus_safety_pixel + 1); nietig instellen() { REG_WRITE(GPIO_OUT_W1TS_REG, BIT(GPIO_NUM_16)); // Guru Meditation Error Remediation set vertraging(1); REG_WRITE(GPIO_OUT_W1TC_REG, BIT(GPIO_NUM_16)); // Guru Meditation Error Remediation clear dwaas ConnectSuccess = fout; dwaas CreateSoftAPSucc = fout; dwaas CInitFS-systeem = fout; dwaas CInitHTTPServer = fout; byte len; Serie.beginnen(9600); terwijl (!Serie) { ; // wacht tot seriële poort verbinding maakt. Nodig voor native USB } Serie.println(F("Seriële interface geïnitialiseerd op 9600 Baud.")); FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(Typisch SMD5050); FastLED.set Helderheid(HELDERHEID); FastLED.tonen(); Wifi.setAutoReconnect (fout); Wifi.aanhoudend(fout); Wifi.verbinding verbreken(); Wifi.setHostname(ESPHostname); // Stel de DHCP-hostnaam in die is toegewezen aan ESP-station. als (loadCredentials()) // Laad WLAN-inloggegevens voor WiFi-instellingen { Serie.println(F("Geldige referenties gevonden.")); als (MyWiFiConfig.APSTA == waar) // AP-modus { Serie.println(F("Toegangspuntmodus geselecteerd.")); len = strlen(MyWiFiConfig.APSTAName); MyWiFiConfig.APSTAName[len+1] = '\0'; len = strlen(MyWiFiConfig.WiFiPwd); MyWiFiConfig.WiFiPwd[len+1] = '\0'; CreateSoftAPSucc = CreateWifiSoftAP(); } anders { Serie.println(F("Station Mode geselecteerd.")); len = strlen(MyWiFiConfig.APSTAName); MyWiFiConfig.APSTAName[len+1] = '\0'; len = strlen(MyWiFiConfig.WiFiPwd); MyWiFiConfig.WiFiPwd[len+1] = '\0'; len = ConnectWifiAP(); als ( len == 3 ) { ConnectSuccess = waar; } anders { ConnectSuccess = fout; } } } anders { // Set default Config - AP maken Serie.println(F("GEEN geldige referenties gevonden.")); SetDefaultWiFiConfig (); CreateSoftAPSucc = CreateWifiSoftAP(); saveCredentials(); // Knipperen vertraging(500); } // Bestandssysteem initialiseren CInitFSSystem = InitalizeFileSystem(); als (!(CInitFSSystem)) {Serie.println(F("Bestandssysteem niet geïnitialiseerd!")); } als ((ConnectSuccess of CreateSoftAPSucc)) { Serie.afdrukken (F("IP adres: ")); als (CreateSoftAPSucc) { Serie.println(Wifi.softAPIP());} als (ConnectSuccess) { Serie.println(Wifi.localIP());} InitialiseerHTTPServer(); } anders { Serie.setDebugOutput(waar); // Foutopsporingsoutput voor WLAN op seriële interface. Serie.println(F("Fout: kan geen verbinding maken met WLAN. Stel DEFAULT-configuratie in.")); SetDefaultWiFiConfig(); CreateSoftAPSucc = CreateWifiSoftAP(); InitialiseerHTTPServer(); SetDefaultWiFiConfig(); saveCredentials(); } voor ( int ik = 0; ik < NUM_LEDS; ik++) // Helder LED-display { leds[ik]= 0x000000; } FastLED.tonen(); // Display wissen :) } nietig InitialiseerHTTPServer() { dwaas initok = fout; / * Webpagina's instellen: root, wifi-configuratiepagina's, SO captive portal detectors en niet gevonden. * / server.Aan("/", handleRoot); server.Aan("/Wifi", handvatWifi); server.Aan("/bestandssysteem", HTTP_GET,handleDisplayFS); server.Aan("/uploaden", HTTP_POST, []() { server.sturen(200, "text / plain", ""); }, handleFileUpload); // if (MyWiFiConfig.CapPortal) {server.on ("/ genereren_204", handleRoot); } // Android-captive portal. Misschien niet nodig. Kan worden behandeld door notFound-handler. // if (MyWiFiConfig.CapPortal) {server.on ("/ favicon.ico", handleRoot); } // Nog een Android-captive portal. Misschien niet nodig. Kan worden behandeld door notFound-handler. Gecontroleerd op Sony Handy // if (MyWiFiConfig.CapPortal) {server.on ("/ fwlink", handleRoot); } // Microsoft captive portal. Misschien niet nodig. Kan worden behandeld door notFound-handler. server.Aan("/ genereren_204", handleRoot); // Android captive portal. Misschien niet nodig. Kan worden behandeld door notFound-handler. server.Aan("/favicon.ico", handleRoot); // Nog een Android-captive portal. Misschien niet nodig. Kan worden behandeld door notFound-handler. Gecontroleerd op Sony Handy server.Aan("/ fwlink", handleRoot); // Microsoft captive portal. Misschien niet nodig. Kan worden behandeld door notFound-handler. server.onNotFound ( handleNotFound ); server.beginnen(); // Webserver start } Boolean InitalizeFileSystem() { dwaas initok = fout; initok = SPIFFS.beginnen(); vertraging(200); als (!(initok)) { Serie.println(F("SPIFFS formatteren")); SPIFFS.formaat(); initok = SPIFFS.beginnen(); } terug initok; } Boolean CreateWifiSoftAP() { Wifi.verbinding verbreken(); Serie.afdrukken(F("SoftAP initialiseren")); als (MyWiFiConfig.PwDReq) { SoftAccOK = Wifi.softAP(MyWiFiConfig.APSTAName, MyWiFiConfig.WiFiPwd); // Passwortlänge mindestens 8 Zeichen! } anders { SoftAccOK = Wifi.softAP(MyWiFiConfig.APSTAName); // Toegangspunt ZONDER wachtwoord // Overbelastingsfunctie :; WiFi.softAP (ssid, wachtwoord, kanaal, verborgen) } vertraging(2000); // Zonder vertraging heb ik het IP-adres leeg gezien Wifi.softAPConfig(apIP, apIP, netMsk); als (SoftAccOK) { / * Stel de DNS-server in die alle domeinen omleidt naar de apIP * / DNS server.setErrorReplyCode(DNSReplyCode::Geen fout); DNS server.begin(DNS_PORT, "*", apIP); Serie.println(F("succesvol.")); } anders { Serie.println(F("Soft AP-fout.")); Serie.println(MyWiFiConfig.APSTAName); Serie.println(MyWiFiConfig.WiFiPwd); } terug SoftAccOK; } byte ConnectWifiAP() { Serie.println(F("Initalizing Wifi Client.")); byte connRes = 0; byte ik = 0; Wifi.verbinding verbreken(); Wifi.softAPdisconnect(waar); // Functie stelt momenteel geconfigureerde SSID en wachtwoord van de soft-AP in op nulwaarden. De parameter is optioneel. Indien ingesteld op true, wordt de soft-AP-modus uitgeschakeld. vertraging(500); Wifi.beginnen(MyWiFiConfig.APSTAName, MyWiFiConfig.WiFiPwd); connRes = Wifi.waitForConnectResult(); terwijl (( connRes == 0 ) en (ik != 10)) // if connRes == 0 "IDLE_STATUS - Statius wijzigen" { connRes = Wifi.waitForConnectResult(); vertraging(2000); ik++; Serie.afdrukken(F(".")); // verklaring (en) } terwijl (( connRes == 1 ) en (ik != 10)) // if connRes == 1 NO_SSID_AVAILin - SSID kan niet worden bereikt { connRes = Wifi.waitForConnectResult(); vertraging(2000); ik++; Serie.afdrukken(F(".")); // verklaring (en) } als (connRes == 3 ) { Wifi.setAutoReconnect(waar); // Stel in of de module probeert opnieuw verbinding te maken met een toegangspunt in het geval dat de verbinding wordt verbroken. // MDNS-responder instellen als (!MDNS.beginnen(ESPHostname)) { Serie.println(F("Fout: MDNS")); } anders { MDNS.addService("http", "tcp", 80); } } terwijl (( connRes == 4 ) en (ik != 10)) // if connRes == 4 Ongeldig wachtwoord. Soms gebeurt dit met corrct PWD { Wifi.beginnen(MyWiFiConfig.APSTAName, MyWiFiConfig.WiFiPwd); connRes = Wifi.waitForConnectResult(); vertraging(2000); ik++; Serie.afdrukken(F(".")); } als (connRes == 4 ) { Serie.println(F("STA Pwd Err")); Serie.println(MyWiFiConfig.APSTAName); Serie.println(MyWiFiConfig.WiFiPwd); Wifi.verbinding verbreken(); } Serie.println(F("")); terug connRes; } uint16_t lezen16(het dossier f) { // BMP-gegevens worden little-endian opgeslagen, hetzelfde als Arduino. uint16_t resultaat; ((uint8_t *)&resultaat)[0] = f.lezen(); // LSB ((uint8_t *)&resultaat)[1] = f.lezen(); // MSB terug resultaat; } uint32_t lezen32(het dossier f) { // BMP-gegevens worden little-endian opgeslagen, hetzelfde als Arduino. uint32_t resultaat; ((uint8_t *)&resultaat)[0] = f.lezen(); // LSB ((uint8_t *)&resultaat)[1] = f.lezen(); ((uint8_t *)&resultaat)[2] = f.lezen(); ((uint8_t *)&resultaat)[3] = f.lezen(); // MSB terug resultaat; } BMPHeader ReadBitmapSpecs(Draad bestandsnaam) { het dossier het dossier; BMPHeader BMP-gegevens; het dossier =SPIFFS.Open(bestandsnaam, "r"); als (!het dossier) { het dossier.dichtbij(); terug BMP-gegevens; } // Parse BMP-header als (lezen16(het dossier) == 0x4D42) // BMP-handtekening { BMP-gegevens.bestandsgrootte = lezen32(het dossier); BMP-gegevens.makerBytes = lezen32(het dossier); BMP-gegevens.imageOffset = lezen32(het dossier); // Begin van afbeeldingsgegevens BMP-gegevens.headerSize = lezen32(het dossier); BMP-gegevens.breedte = lezen32(het dossier); BMP-gegevens.hoogte = lezen32(het dossier); BMP-gegevens.vliegtuigen = lezen16(het dossier); BMP-gegevens.diepte = lezen16(het dossier); // bits per pixel BMP-gegevens.formaat = lezen32(het dossier); } het dossier.dichtbij(); terug BMP-gegevens; } #bepalen SD_BUFFER_PIXELS 20 nietig drawBitmap_SPIFFS(Draad bestandsnaam, uint8_t X, uint8_t y) { het dossier het dossier; uint8_t buffer[3 * SD_BUFFER_PIXELS]; // pixelbuffer, grootte voor r, g, b dwaas Geldig = fout; // geldig formaat dat moet worden verwerkt dwaas omdraaien = waar; // bitmap wordt van onder naar boven opgeslagen uint32_t pos = 0; het dossier =SPIFFS.Open(bestandsnaam, "r"); als (!het dossier) { Serie.afdrukken(F("Filesytem-fout")); terug; } // Parse BMP-header als (lezen16(het dossier) == 0x4D42) // BMP-handtekening { uint32_t bestandsgrootte = lezen32(het dossier); uint32_t makerBytes = lezen32(het dossier); uint32_t imageOffset = lezen32(het dossier); // Begin van afbeeldingsgegevens uint32_t headerSize = lezen32(het dossier); uint32_t breedte = lezen32(het dossier); uint32_t hoogte = lezen32(het dossier); uint16_t vliegtuigen = lezen16(het dossier); uint16_t diepte = lezen16(het dossier); // bits per pixel uint32_t formaat = lezen32(het dossier); als ((vliegtuigen == 1) && (formaat == 0)) // ongecomprimeerd wordt afgehandeld { Serie.afdrukken(F("Bestandsgrootte: ")); Serie.println(bestandsgrootte); Serie.afdrukken(F("Afbeeldingsoffset:")); Serie.println(imageOffset); Serie.afdrukken(F("Kopgrootte:")); Serie.println(headerSize); Serie.afdrukken(F("Bitdiepte:")); Serie.println(diepte); Serie.afdrukken(F("Afbeeldingsgrootte: ")); Serie.afdrukken(breedte); Serie.afdrukken('X'); Serie.println(hoogte); uint32_t rowSize = (breedte * diepte / 8 + 3) & ~3; als (hoogte < 0) { hoogte = -hoogte; omdraaien = fout; } uint16_t w = breedte; uint16_t h = hoogte; size_t buffidx = De grootte van(buffer); // krachtbufferbelasting voor (uint16_t rij = 0; rij < h; rij++) // voor elke regel { als (omdraaien) // Bitmap wordt van onder naar boven opgeslagen (normale BMP) pos = imageOffset + (hoogte - 1 - rij) * rowSize; anders // Bitmap wordt van boven naar beneden opgeslagen pos = imageOffset + rij * rowSize; als (het dossier.positie() != pos) { // Noodzaak zoeken? het dossier.zoeken(pos,SeekSet); // Als de modus SeekSet is, wordt de positie ingesteld om bytes vanaf het begin te compenseren. // Als de modus SeekCur is, wordt de huidige positie verplaatst door offsetbytes. // als de modus SeekEnd is, wordt de positie ingesteld om bytes te compenseren vanaf het einde van de buffidx = De grootte van(buffer); // force buffer herladen } uint8_t stukjes; voor (uint16_t col = 0; col < w; col++) // voor elke pixel { // Tijd om meer pixelgegevens te lezen? als (buffidx >= De grootte van(buffer)) { het dossier.lezen(buffer, De grootte van(buffer)); buffidx = 0; // Zet de index op het begin } schakelaar (diepte) { geval 1: // één bit per pixel z / w-indeling { Geldig = waar; als (0 == col % 8) { stukjes = buffer[buffidx++]; } uint16_t bw_color = stukjes & 0x80; uint16_t PixelNum = (rij*8)+col; leds[PixelNum].rood = bw_color; leds[PixelNum].groen = bw_color; leds[PixelNum].blauw = bw_color; stukjes <<= 1; } breken; geval 24: // standaard BMP-formaat { Geldig = waar; uint16_t b = buffer[buffidx++]; uint16_t g = buffer[buffidx++]; uint16_t r = buffer[buffidx++]; uint16_t PixelNum = (rij*8)+col; leds[PixelNum].rood = r; leds[PixelNum].groen = g; leds[PixelNum].blauw = b; } breken; } } // einde pixel } // eindregel FastLED.tonen(); // Toon resultaten :) } } het dossier.dichtbij(); als (!(Geldig)) { Serie.println(F("Err: BMP")); } } nietig handleFileUpload() { als (server.uri() != "/uploaden") terug; HTTPUpload& uploaden = server.uploaden(); als (uploaden.toestand == UPLOAD_FILE_START) { Draad bestandsnaam = uploaden.bestandsnaam; als (uploaden.bestandsnaam.lengte() > 30) { uploaden.bestandsnaam = uploaden.bestandsnaam.substring(uploaden.bestandsnaam.lengte() - 30, uploaden.bestandsnaam.lengte()); // Dateinamen auf 30 Zeichen kürzen } Serie.println("FileUpload-naam:" + uploaden.bestandsnaam); als (!bestandsnaam.begint met("/")) bestandsnaam = "/" + bestandsnaam; fsUploadFile = SPIFFS.Open("/" + server.urlDecode(uploaden.bestandsnaam), "w"); bestandsnaam = Draad(); } anders als (uploaden.toestand == UPLOAD_FILE_WRITE) { als (fsUploadFile) fsUploadFile.schrijven(uploaden.buf, uploaden.Huidige grootte); } anders als (uploaden.toestand == UPLOAD_FILE_END) { als (fsUploadFile) fsUploadFile.dichtbij(); handleDisplayFS(); } } nietig handleDisplayFS() { HTML-bestandssysteem Pagina: /filesystem Temp =""; HTML-koptekst Server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); Server.sendHeader("Pragma", "no-cache"); Server.sendHeader("Verloopt", "-1"); Server.setContentLength(CONTENT_LENGTH_UNKNOWN); HTML-inhoud Server.Verzenden ( 200, "tekst/html", Temp ); Temp += "<! DOCTYPE HTML><html lang='de'><head><meta charset='UTF-8'><meta name= viewport content='width=device-width, initial-scale=1.0,'>"; Server.sendContent(Temp); Temp = ""; Temp += "<style type='text/css'><!-- DIV.container { min-hoogte: 10em; weergeven: tabelcel; verticaal uitlijnen: middelste }.button {hoogte:35px; breedte:90px; tekengrootte:16px}"; Server.sendContent(Temp); Temp = ""; Temp += "lichaam {achtergrond-kleur: powderblue;} </style><head><title>File System Manager</title></head>"; Temp += "<h2>Serial Peripheral Interface Flash Filesystem</h2><body><left>"; Server.sendContent(Temp); Temp = ""; Als (Server.Args() > 0) Parameter wurden ubergeben { Als (Server.hasArg hasArg("verwijderen")) { Tekenreeks Ftodel Ftodel = Server.Arg("verwijderen"); Als (SPIFFS (SPIFFS).Bestaat(Ftodel Ftodel)) { SPIFFS (SPIFFS).Verwijderen(Ftodel Ftodel); Temp += "Bestand" + Ftodel Ftodel + " met succes verwijderd."; } Anders { Temp += "Bestand" + Ftodel Ftodel + " kan niet worden verwijderd."; } Server.sendContent(Temp); Temp = ""; } Als (Server.hasArg hasArg("formaat") En Server.Arg("op")) { SPIFFS (SPIFFS).Formaat(); Temp += "SPI-bestandssysteem is geformatteerd."; Server.sendContent(Temp); Temp = ""; } server.client().stop(;); Stop is nodig omdat we geen inhoudslengte hebben verzonden } Temp += "<table border=2 bgcolor = witte breedte = 400 ><td><h4>Huidige SPIFFS-status: </h4>"; Temp += formatBytes(SPIFFS (SPIFFS).gebruikteBytes() * 1.05) + " van " + formatBytes(SPIFFS (SPIFFS).totalBytes()) + " gebruikt. <br>"; Temp += formatBytes((SPIFFS (SPIFFS).totalBytes() - (SPIFFS (SPIFFS).gebruikteBytes() * 1.05)))+ " gratis. <br>"; Temp += "</td></table><br>"; Server.sendContent(Temp); Temp = ""; Controleren op siteparameters Temp += "<table border=2 bgcolor = witte breedte = 400><tr><th><br>"; Temp += "<h4>Beschikbare bestanden op SPIFFS:</h4><tafelrand=2 bgcolor = wit ></tr></th><td>Bestand name</td><td>Size</td><td>Action </td></tr></th>"; Server.sendContent(Temp); Temp = ""; Bestand Root = SPIFFS (SPIFFS).Open("/"); Bestand Bestand = Root.openNextFile(); Terwijl (Bestand) { Temp += "<td> <a title=\"Download\" href =\"" + Tekenreeks(Bestand.Naam()) + "\" download=\"" + Tekenreeks(Bestand.Naam()) + "\">" + Tekenreeks(Bestand.Naam()) + "</a> <br></th>"; Temp += "<td>"+ formatBytes(Bestand.Grootte())+ "</td>"; Temp += "<td><a href =filesystem?delete=" + Tekenreeks(Bestand.Naam()) + "> Verwijderen </a></td>"; Temp += "</tr></th>"; Bestand = Root.openNextFile(); } Temp += "</tr></th>"; Temp += "</td></tr></th><br></th></tr></table></table><br>"; Temp += "<table border=2 bgcolor = witte breedte = 400 ><td><h4>Upload</h4>"; Temp += "<label> Bestand kiezen: </label>"; Temp += "<form method='POST' action='/upload' enctype='multipart/form-data' style='height:35px;' ><input type='file' name='upload' style='height:35px; lettertypegrootte:13px;' vereist>\r\n<invoertype='Submit' value='Upload' class='button'></form>"; Temp += " </table><br>"; Server.sendContent(Temp); Temp = ""; Temp += "<td><a href =filesystem?format=on> Format SPIFFS Filesystem. (Duurt maximaal 30 seconden) </a></td>"; Temp += "<table border=2 bgcolor = white width = 500 cellpadding =5 ><caption>><p><h3>Systemlinks:</h2></p></caption><<tr><th><br>"; Temp += " <a href='/>Hoofdpagina</a><br><br></th></tr></table><br><br>"; Server.sendContent(Temp); Temp = ""; Temp += "<footer><p>Programmed and designed by: Tobias Kuch</p><p>Contact informatie: <a href='mailto:tobias.kuch@googlemail.com'>tobias.kuch@googlemail.com</a>;</p></footer></body><; server.send ( 200, "", temp ); Server.sendContent(Temp); Server.Client().Stoppen(); Stop is nodig omdat we geen inhoudslengte hebben verzonden Temp = ""; } /** WLAN-referenties laden van EEPROM */ Bool loadCredentials() { Bool RetValue; Eeprom.Beginnen(512); Eeprom.Toevoegen(0, MyWiFiConfig MyWiFiConfig); Eeprom.Einde(); Als (Tekenreeks(MyWiFiConfig MyWiFiConfig.ConfigValid (ConfigValid)) == Tekenreeks("TK")) { RetValue = Waar; } Anders { RetValue = Valse; WLAN-instellingen zijn niet gevonden. } Terug RetValue; } /** Wlan-referenties opslaan bij EEPROM */ Bool referenties opslaan() { Bool RetValue; Logische fouten controleren RetValue = Waar; Als (MyWiFiConfig MyWiFiConfig.APSTA APSTA == Waar ) AP-modus { Als (MyWiFiConfig MyWiFiConfig.PwDReq PwDReq En (grootte van(Tekenreeks(MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd)) < 8)) { RetValue = Valse; Ongeldige Config } Als (grootte van(Tekenreeks(MyWiFiConfig MyWiFiConfig.APSTAName)) < 1) { RetValue = Valse; Ongeldige Config } } Als (RetValue) { Eeprom.Beginnen(512); Voor (Int I = 0 ; I < grootte van(MyWiFiConfig MyWiFiConfig) ; I++) { Eeprom.Schrijven(I, 0); } strncpy strncpy( MyWiFiConfig MyWiFiConfig.ConfigValid (ConfigValid) , "TK", grootte van(MyWiFiConfig MyWiFiConfig.ConfigValid (ConfigValid)) ); Eeprom.zet(0, MyWiFiConfig MyWiFiConfig); Eeprom.Commit(); Eeprom.Einde(); } Terug RetValue; } Void SetDefaultWiFiConfig() { Byte Len; MyWiFiConfig MyWiFiConfig.APSTA APSTA = Waar; MyWiFiConfig MyWiFiConfig.PwDReq PwDReq = Waar; standaard PW vereist MyWiFiConfig MyWiFiConfig.CapPortal CapPortal = Waar; strncpy strncpy( MyWiFiConfig MyWiFiConfig.APSTAName, "ESP_Config", grootte van(MyWiFiConfig MyWiFiConfig.APSTAName) ); Len = strlen strlen(MyWiFiConfig MyWiFiConfig.APSTAName); MyWiFiConfig MyWiFiConfig.APSTAName[Len+1] = '\0'; strncpy strncpy( MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd, "12345678", grootte van(MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd) ); Len = strlen strlen(MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd); MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd[Len+1] = '\0'; strncpy strncpy( MyWiFiConfig MyWiFiConfig.ConfigValid (ConfigValid), "TK", grootte van(MyWiFiConfig MyWiFiConfig.ConfigValid (ConfigValid)) ); Len = strlen strlen(MyWiFiConfig MyWiFiConfig.ConfigValid (ConfigValid)); MyWiFiConfig MyWiFiConfig.ConfigValid (ConfigValid)[Len+1] = '\0'; Seriële.println(F('WiFi-referenties opnieuw instellen'.)); } Void handleRoot() { Hoofdpagina: Temp = ""; Korte PicCount (PicCount) = 0; Byte ServArgs ServArgs ServArgs = 0; Pagina bouwen HTML-koptekst Server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); Server.sendHeader("Pragma", "no-cache"); Server.sendHeader("Verloopt", "-1"); Server.setContentLength(CONTENT_LENGTH_UNKNOWN); HTML-inhoud Server.Verzenden ( 200, "tekst/html", Temp ); Speichersparen - Schon mal dem Client senden Temp = ""; Temp += "<! DOCTYPE HTML><html lang='de'><head><meta charset='UTF-8'><meta name= viewport content='width=device-width, initial-scale=1.0,'>"; Temp += "<style type='text/css'><!-- DIV.container { min-hoogte: 10em; weergeven: tabelcel; verticaal uitlijnen: middelste }.button {hoogte:35px; breedte:90px; tekengrootte:16px}"; Server.sendContent(Temp); Temp = ""; Temp += "lichaam {achtergrond-kleur: powderblue;} </stijl>"; Temp += "<head><title>Tobi's LED Display</title><head>"; Temp += "<h2>LED Display</h2>"; Temp += "<body>"; Server.sendContent(Temp); Temp = ""; Gebruikersverzoek verwerken Als (Server.Args() > 0) Parameter wurden ubergeben { Temp += "<br>Eingaben werden verarbeitet. Bitte warten.. <br><br>";; Server.sendContent(Temp); Temp = ""; Achtergrondpapier bijwerken Als (Server.Arg("PicSelect") == "korting") Led-display wissen { Temp = ""; Voor ( Int I = 0; I < NUM_LEDS; I++) { Leds[I]= 0x000000; } FastLED (VastLED).Toon(); } Anders { Temp = Server.Arg("PicSelect"); Bild gewählt. Inhalt per Picselect hergstellt weergeven drawBitmap_SPIFFS(Temp,0,0); Temp = ""; } } Temp += "<table border=2 bgcolor = white ><caption><p><h3>Beschikbare afbeeldingen in SPIIFS voor 8x8 Display</h2></p></caption>"; Temp += "<form>"; Temp += "<tr><th><input type='radio' naam='PicSelect' waarde = 'off' checked> Clear LED Display<br><th></tr>"; Temp += "<tr><th>"; Beschikbare BMP-bestanden in SPIFFS aanbieden Bestand Root = SPIFFS (SPIFFS).Open("/"); Bestand Bestand = Root.openNextFile(); PicCount (PicCount) = 1; Terwijl (Bestand) { Als (Tekenreeks(Bestand.Naam()).eindigtMet(".bmp") Of Tekenreeks(Bestand.Naam()).eindigtMet(". BMP")) { BMPHeader BMPHeader PicData PicData PicData = LeesBitmapSpecs(Bestand.Naam()); Als ((PicData PicData PicData.Breedte < kMatrixWidth + 1) En (PicData PicData PicData.Hoogte < kMatrixHeight +1 )) Alleen weergeven in de lijst, wanneer Bitmap de weergaveresolutie niet overschrijdt. Grotere afbeeldingen worden niet weergegeven. { Temp += "<label voor='radio1'><img src='"+ Tekenreeks(Bestand.Naam())+"' alt='"+ Tekenreeks(Bestand.Naam())+"' border='3' bordercolor=green> Image "+ PicCount (PicCount)+"</label><inputtype='radio' value='"+ Tekenreeks(Bestand.Naam())+"' naam='PicSelect'/> <br>"; Temp += Tekenreeks(Bestand.Naam())+ " Res: "+ Tekenreeks(PicData PicData PicData.Breedte) + "x" + Tekenreeks(PicData PicData PicData.Hoogte) + "px Bestandsgrootte: "+ formatBytes(Bestand.Grootte()) + "</th></tr><tr><th>"; PicCount (PicCount) ++; } } Bestand = Root.openNextFile(); } Server.sendContent(Temp); Temp = ""; Temp = "<button type='submit' name='action' value='0' style='height: 50px; breedte: 280px'>Afbeelding weergeven op led-display</button>"; Temp += "</vorm>"; Temp += "<br><table border=2 bgcolor = white width = 280 cellpadding =5 ><caption><p><h3>Systemlinks:</h2></p></caption>"; Temp += "<tr><th><br>"; Temp += "<a href="/nl/wifi">WIFI Settings</a><br><br>br>"; Temp += "<a href="/nl/filesystem">Filemanager</a><br><br>br>"; Temp += "</th></tr></table><br><br>"; Temp += "<footer><p>Geprogrammeerd en ontworpen door: Tobias Kuch</p><p>Contactgegevens: <a href='mailto:tobias.kuch@googlemail.com'>tobias.kuch@googlemail.com</a></p></footer>"; Temp += "</body></html>"; Server.sendContent(Temp); Temp = ""; Server.Client().Stoppen(); Stop is nodig omdat we geen inhoudslengte hebben verzonden } Void handleNotFound() { Als (captivePortal()) { Als caprive portal redirect in plaats van het weergeven van de fout pagina. Terug; } Als (!handleFileRead(Server.Uri())) { Temp = ""; HTML-koptekst Server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); Server.sendHeader("Pragma", "no-cache"); Server.sendHeader("Verloopt", "-1"); Server.setContentLength(CONTENT_LENGTH_UNKNOWN); HTML-inhoud Temp += "<! DOCTYPE HTML><html lang='de'><head><meta charset='UTF-8'><meta name= viewport content='width=device-width, initial-scale=1.0,'>"; Temp += "<style type='text/css'><!-- DIV.container { min-hoogte: 10em; weergeven: tabelcel; verticaal uitlijnen: middelste }.button {hoogte:35px; breedte:90px; tekengrootte:16px}"; Temp += "lichaam {achtergrond-kleur: powderblue;} </stijl>"; Temp += "<head><title>Bestand niet gevonden</title></head>"; Temp += "<h2> 404 File Not Found</h2><br>"; Temp += "<h4>Foutopsporingsinformatie:<h4><br>"; Temp += "<body>"; Temp += "URI: "; Temp += Server.Uri(); Temp += "\nMethode: "; Temp+= ( Server.Methode() == HTTP_GET ) ? "GET" : "POST"; Temp += "<br>Argumenten: "; Temp += Server.Args(); Temp += "\n"; Voor ( uint8_t I = 0; I < Server.Args(); I++ ) { Temp += " " + Server.argName ( I ) + ": " + Server.Arg ( I ) + "\n"; } Temp += "<br>Server Hostheader: "+ Server.hostHeader(); Voor ( uint8_t I = 0; I < Server.Headers(); I++ ) { Temp += " " + Server.headerName ( I ) + ": " + Server.Header ( I ) + "\n<br>"; } Temp += </table></form><<br><br><table border=2 bgcolor = white width = 500 cellpadding =5 ><caption><p><<h2>U bladeren naar:</h2></p;</caption>; Temp += "<tr><th>"; Temp += "<a href="/nl">Hoofdpagina</a><br>"; Temp += "<a href="/nl/wifi">WIFI Settings</a><br>"; Temp += "<a href="/nl/filesystem">Filemanager</a><br>"; Temp += "</th></tr></table><br><br>"; Temp += "<footer><p>Geprogrammeerd en ontworpen door: Tobias Kuch</p><p>Contactgegevens: <a href='mailto:tobias.kuch@googlemail.com'>tobias.kuch@googlemail.com</a></p></footer>"; Temp += "</body></html>"; Server.Verzenden ( 404, "", Temp ); Server.Client().Stoppen(); Stop is nodig omdat we geen inhoudslengte hebben verzonden Temp = ""; } } /** Omleiden naar captive portal als we een verzoek voor een ander domein kregen. Retourtrue in dat geval, zodat de paginahandler het verzoek niet opnieuw probeert te verwerken. */ Booleaanse captivePortal() { Als (!Isip(Server.hostHeader()) && Server.hostHeader() != (Tekenreeks(ESPHostname)+".lokaal")) { Serial.println("Verzoek doorgestuurd naar captive portal"; Server.sendHeader("Locatie", Tekenreeks("http://") + toStringIp(Server.Client().localIP()), Waar); Server.Verzenden ( 302, "tekst/vlakte", ""); Lege inhoud remt Content-length header, dus we moeten de socket zelf sluiten. Server.Client().Stoppen(); Stop is nodig omdat we geen inhoudslengte hebben verzonden Terug Waar; } Terug Valse; } /** Wifi config pagina handler */ Void handleWifi() { Pagina: /wifi Byte I; Byte Len ; Temp = ""; Controleren op siteparameters Als (Server.hasArg hasArg("Reboot") ) Opnieuw opstarten van systeem { Temp = "Rebooting System in 5 Seconds.."; Server.Verzenden ( 200, "tekst/html", Temp ); Vertraging(5000); Server.Client().Stoppen(); Wifi.Verbreken(); Vertraging(1000); } Als (Server.hasArg hasArg("WiFiMode") En (Server.Arg("WiFiMode") == "1") ) STA Station Mode Maak verbinding met een ander WIFI-station { startMillis = millis(); Reset Time Up Counter om te voorkomen dat idle mode whiole werken Verbinding maken met bestaand station Als ( grootte van(Server.Arg("WiFi_Network")) > 0 ) { Seriële.println("STA-modus"); MyWiFiConfig MyWiFiConfig.APSTA APSTA = Valse; Access Point of Station Mode - valse stationsmodus Temp = ""; Voor ( I = 0; I < APSTANamelen APSTANameLen;I++) { MyWiFiConfig MyWiFiConfig.APSTAName[I] = 0; } Temp = Server.Arg("WiFi_Network"); Len = Temp.Lengte(); Voor ( I = 0; I < Len;I++) { MyWiFiConfig MyWiFiConfig.APSTAName[I] = Temp[I]; } MyWiFiConfig.APSTAName[len+1] = '\0'; Temp = ""; Voor ( I = 0; I < WiFiPwdLen WiFiPwdLen;I++) { MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd[I] = 0; } Temp = Server.Arg("STAWLANPW"); Len = Temp.Lengte(); Voor ( I = 0; I < Len;I++) { Als (Temp[I] > 32) Steuerzeichen raus { MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd[I] = Temp[I]; } } MyWiFiConfig.WiFiPwd[len+1] = '\0'; Temp = "WiFi Verbinding maken met AP: -"; Temp += MyWiFiConfig MyWiFiConfig.APSTAName; Temp += "-<br>WiFi PW: -"; Temp += MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd; Temp += "-<br>"; Temp += "Verbinding maken met de STA-modus in 2 seconden.. <br>"; Server.Verzenden ( 200, "tekst/html", Temp ); Server.sendContent(Temp); Vertraging(2000); Server.Client().Stoppen(); Server.Stoppen(); Temp = ""; Wifi.Verbreken(); Wifi.softAPdisconnect(Waar); Vertraging(500); ConnectWifiAP Bool SaveOk = referenties opslaan(); I = ConnectWifiAP(); Vertraging(700); Als (I != 3) 4: WL_CONNECT_FAILED - Wachtwoord is onjuist 1: WL_NO_SSID_AVAILin - Geconfigureerde SSID is niet bereikbaar { Seriële.Afdrukken(F("Kan geen verbinding maken met gespecificeerd netwerk. Reden: ")); Seriële.println(I); Server.Client().Stoppen(); Vertraging(100); Wifi.setAutoReconnect (Valse); Vertraging(100); Wifi.Verbreken(); Vertraging(1000); SetDefaultWiFiConfig(); CreateWifiSoftAP(); Terug; } Anders { Veilige Config Bool SaveOk = referenties opslaan(); InitalizeHTTPServer(); Terug; } } } Als (Server.hasArg hasArg("WiFiMode") En (Server.Arg("WiFiMode") == "2") ) AP-modus wijzigen { startMillis = millis(); Reset Time Up Counter om te voorkomen dat idle mode whiole werken Access Point configureren Temp = Server.Arg("APPointName"); Len = Temp.Lengte(); Temp =Server.Arg("APPW"); Als (Server.hasArg hasArg("PasswordReq")) { I = Temp.Lengte(); } Anders { I = 8; } Als ( ( Len > 1 ) En (Server.Arg("APPW") == Server.Arg("APPWRepeat")) En ( I > 7) ) { Temp = ""; Seriële.println(F("APMode")); MyWiFiConfig MyWiFiConfig.APSTA APSTA = Waar; Access Point- of sation-modus - echte AP-modus Als (Server.hasArg hasArg("CaptivePortal")) { MyWiFiConfig MyWiFiConfig.CapPortal CapPortal = Waar ; CaptivePortal aan in AP-modus } Anders { MyWiFiConfig MyWiFiConfig.CapPortal CapPortal = Valse ; } Als (Server.hasArg hasArg("PasswordReq")) { MyWiFiConfig MyWiFiConfig.PwDReq PwDReq = Waar ; Wachtwoord vereist in ap-modus } Anders { MyWiFiConfig MyWiFiConfig.PwDReq PwDReq = Valse ; } Voor ( I = 0; I < APSTANamelen APSTANameLen;I++) { MyWiFiConfig MyWiFiConfig.APSTAName[I] = 0; } Temp = Server.Arg("APPointName"); Len = Temp.Lengte(); Voor ( I = 0; I < Len;I++) { MyWiFiConfig MyWiFiConfig.APSTAName[I] = Temp[I]; } MyWiFiConfig MyWiFiConfig.APSTAName[Len+1] = '\0'; Temp = ""; Voor ( I = 0; I < WiFiPwdLen WiFiPwdLen;I++) { MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd[I] = 0; } Temp = Server.Arg("APPW"); Len = Temp.Lengte(); Voor ( I = 0; I < Len;I++) { MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd[I] = Temp[I]; } MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd[Len+1] = '\0'; Temp = ""; Als (referenties opslaan()) Sla AP ConfigCongfig op { Temp = "Daten des AP Modes erfolgreich gespeichert. Reboot notwendig."; } Anders { Temp = "Daten des AP Modes fehlerhaft."; } } Anders Als (Server.Arg("APPW") != Server.Arg("APPWRepeat")) { Temp = ""; Temp = "WLAN Passwort nicht gleich. Abgebrochen.; } Anders { Temp = ""; Temp = "WLAN Passwort oder AP Naam zu kurz. Abgebrochen.; } WifiAP beëindigen } HTML-koptekst Server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); Server.sendHeader("Pragma", "no-cache"); Server.sendHeader("Verloopt", "-1"); Server.setContentLength(CONTENT_LENGTH_UNKNOWN); HTML-inhoud Temp += "<! DOCTYPE HTML><html lang='de'><head><meta charset='UTF-8'><meta name= viewport content='width=device-width, initial-scale=1.0,'>"; Server.Verzenden ( 200, "tekst/html", Temp ); Temp = ""; Temp += "<style type='text/css'><!-- DIV.container { min-hoogte: 10em; weergeven: tabelcel; verticaal uitlijnen: middelste }.button {hoogte:35px; breedte:90px; tekengrootte:16px}"; Temp += "lichaam {achtergrond-kleur: powderblue;} </style><head><title>Smartes Tuerschild - WiFi Settings</title></head>"; Server.sendContent(Temp); Temp = ""; Temp += "<h2>WiFi Settings</h2><body><left>"; Temp += "<table border=2 bgcolor = witte breedte = 500 ><td><h4>Huidige WiFi-instellingen: </h4>"; Als (Server.Client().localIP() == apIP) { Temp += "Mode : Soft Access Point (AP)<br>"; Temp += "SSID : " + Tekenreeks (MyWiFiConfig MyWiFiConfig.APSTAName) + "<br><br>"; } Anders { Temp += "Modus : Station (STA) <br>"; Temp += "SSID : "+ Tekenreeks (MyWiFiConfig MyWiFiConfig.APSTAName) + "<br>"; Temp += "BSSID : " + Wifi.BSSIDstr BSSIDstr()+ "<br><br>"; } Temp += "</td></table><br>"; Server.sendContent(Temp); Temp = ""; Temp += "<form action='/wifi' methode='post'>"; Temp += "<table border=2 bgcolor = witte breedte = 500><tr><th><br>"; Als (MyWiFiConfig MyWiFiConfig.APSTA APSTA == 1) { Temp += "<input type='radio' value='1' name='WiFiMode' > WiFi Station Mode<br>"; } Anders { Temp += "<input type='radio' value='1' name='WiFiMode' checked > WiFi Station Mode<br>"; } Temp += "Available WiFi Networks:<table border=2 bgcolor = white ></tr></th><td>Number </td><td>SSID </td><td>Encryption </td><td>WiFi Strength </td>"; Server.sendContent(Temp); Temp = ""; Wifi.scanDelete(); Int N = Wifi.scanNetwerken(Valse, Valse); WiFi.scanNetworks(async, show_hidden) Als (N > 0) { Voor (Int I = 0; I < N; I++) { Temp += "</tr></th>"; Tekenreeks Nrb = Tekenreeks(I); Temp += "<td>" + Nrb + "</td>"; Temp += "<td>" + Wifi.Ssid(I) +"</td>"; Nrb = GetEncryptionType(Wifi.versleutelingType(I)); Temp += "<td>"+ Nrb + "</td>"; Temp += "<td>" + Tekenreeks(Wifi.Rssi(I)) + "</td>"; } } Anders { Temp += "</tr></th>"; Temp += "<td>1 </td>"; Temp += "<td>No WLAN found</td>"; Temp += "<td> --- </td>"; Temp += "<td> --- </td>"; } Temp += "</table><table border=2 bgcolor = white ></tr></th><td>Connect to WiFi SSID: </td><td><select name='WiFi_Network' >"; Als (N > 0) { Voor (Int I = 0; I < N; I++) { Temp += "<optiewaarde='" + Wifi.Ssid(I) +"'>" + Wifi.Ssid(I) +"</optie>"; } } Anders { Temp += "<option value='No_WiFi_Network'>Geen WiFiNetwork gevonden !/option>"; } Server.sendContent(Temp); Temp = ""; Temp += "</select></td></tr></th></tr></th><td>WiFi Password: </td><td>"; Temp += "<input type='text' name='STAWLanPW' maxlength='40' size='40'>"; Temp += "</td></tr></th><br></th></tr></table></table><table border=2 bgcolor = witte breedte = 500 ><tr><th><<br>"; Server.sendContent(Temp); Temp = ""; Als (MyWiFiConfig MyWiFiConfig.APSTA APSTA == Waar) { Temp += "<input type='radio' name='WiFiMode' value='2' checked> WiFi Access Point Mode <br>"; } Anders { Temp += "<input type='radio' name='WiFiMode' value='2' > WiFi Access Point Mode <br>"; } Temp += "<table border=2 bgcolor = white ></tr></th> <td>WiFi Access Point Name: </td><td>"; Server.sendContent(Temp); Temp = ""; Als (MyWiFiConfig MyWiFiConfig.APSTA APSTA == Waar) { Temp += "<invoertype='text' name='APPointName' maxlength='"+Tekenreeks(APSTANamelen APSTANameLen-1)+"' grootte='30' waarde='" + Tekenreeks(MyWiFiConfig MyWiFiConfig.APSTAName) + "></td>"; } Anders { Temp += "<invoertype='text' name='APPointName' maxlength='"+Tekenreeks(APSTANamelen APSTANameLen-1)+"' grootte='30' ></td>"; } Server.sendContent(Temp); Temp = ""; Als (MyWiFiConfig MyWiFiConfig.APSTA APSTA == Waar) { Temp += "</tr></th><td>WiFi Password: </td><td>"; Temp += "<input type='password' name='APPW' maxlength='"+Tekenreeks(WiFiPwdLen WiFiPwdLen-1)+"' grootte='30' waarde='" + Tekenreeks(MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd) + "'> </td>"; Temp += "</tr></th><td>WiFi-wachtwoord herhalen: </td>"; Temp += "<td><input type='password' name='APPWRepeat' maxlength='"+Tekenreeks(WiFiPwdLen WiFiPwdLen-1)+"' grootte='30' waarde='" + Tekenreeks(MyWiFiConfig MyWiFiConfig.WiFiPwd WiFiPwd) + "'> </td>"; } Anders { Temp += "</tr></th><td>WiFi Password: </td><td>"; Temp += "<input type='password' name='APPW' maxlength='"+Tekenreeks(WiFiPwdLen WiFiPwdLen-1)+"' grootte='30'> </td>"; Temp += "</tr></th><td>WiFi-wachtwoord herhalen: </td>"; Temp += "<td><input type='password' name='APPWRepeat' maxlength='"+Tekenreeks(WiFiPwdLen WiFiPwdLen-1)+"' grootte='30'> </td>"; } Temp += "</tabel>"; Server.sendContent(Temp); Temp = ""; Als (MyWiFiConfig MyWiFiConfig.PwDReq PwDReq) { Temp += "<input type='checkbox' naam='PasswordReq' aangevinkt> Wachtwoord voor inloggen vereist. "; } Anders { Temp += "<invoertype='checkbox' naam='PasswordReq' > Wachtwoord voor inloggen vereist. "; } Server.sendContent(Temp); Temp = ""; Als (MyWiFiConfig MyWiFiConfig.CapPortal CapPortal) { Temp += "<input type='checkbox' naam='CaptivePortal' aangevinkt> Captive Portal activeren"; } Anders { Temp += "<invoertype='checkbox' naam='CaptivePortal' > Captive Portal activeren"; } Server.sendContent(Temp); Temp = ""; Temp += "<br></tr></th></table><br> <button type='submit' name='Settings' value='1' style='height: 50px; breedte: 140px' autofocus>WiFi-instellingen instellen</button>"; Temp += "<button type='submit' name='Reboot' value='1' style='height: 50px; breedte: 200px' >Systeem</button>opnieuw opstarten; Server.sendContent(Temp); Temp = ""; Temp += "<button type='reset' name='action' value='1' style='height: 50px; breedte: 100px' >Reset</button></form>"; Temp += "<table border=2 bgcolor = white width = 500 cellpadding =5 ><caption>><p><h3>Systemlinks:</h2></p></caption><<tr><th><br>"; Server.sendContent(Temp); Temp = ""; Temp += "<a href='/>Hoofdpagina</a><br><br></th></tr></table><br><br>"; Temp += "<footer><p>Geprogrammeerd en ontworpen door: Tobias Kuch</p><p>Contactgegevens: <a href='mailto:tobias.kuch@googlemail.com'>tobias.kuch@googlemail.com</a></p></footer>"; Temp += "</body></html>"; Server.sendContent(Temp); Server.Client().Stoppen(); Stop is nodig omdat we geen inhoudslengte hebben verzonden Temp = ""; } Void handleUploadSave() { Tekenreeks Bestandsgegevens ; Temp = ""; Voor (Byte I = 0; I < Server.Args(); I++) { Temp += "Arg " + (Tekenreeks)I + " –> "; De huidige iteratiewaarde opnemen Temp += Server.argName(I) + ": "; De naam van de parameter krijgen Temp += Server.Arg(I) + "\n"; De waarde van de parameter krijgen } server.send(200, "text/plain", temp); Antwoord op de HTTP-aanvraag Bestandsgegevens = Server.Arg("datei"); Server.sendHeader("Locatie", "filesystem", Waar); Server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); Server.sendHeader("Pragma", "no-cache"); Server.sendHeader("Verloopt", "-1"); Server.Verzenden ( 302, "tekst/vlakte", ""); Lege inhoud remt Content-length header, dus we moeten de socket zelf sluiten. Server.Client().Stoppen(); Stop is nodig omdat we geen inhoudslengte hebben verzonden } /** Is dit een IP? */ Booleaanse Isip(Tekenreeks Str) { Voor (Int I = 0; I < Str.Lengte(); I++) { Int C = Str.charAt(I); Als (C != '.' && (C < '0' || C > '9')) { Terug Valse; } } Terug Waar; } Tekenreeks GetEncryptionType(Byte ditType) { Tekenreeks Output = ""; lees het versleutelingstype en print de naam uit: Schakelen (ditType) { Geval 5: Output = "WEP"; Terug Output; Breken; Geval 2: Output = "WPA"; Terug Output; Breken; Geval 4: Output = "WPA2"; Terug Output; Breken; Geval 7: Output = "None"; Terug Output; Breken; Geval 8: Output = "Auto"; Terug Output; Breken; } } /** IP naar String? */ Tekenreeks toStringIp(IPAddress Ip) { Tekenreeks Res = ""; Voor (Int I = 0; I < 3; I++) { Res += Tekenreeks((Ip >> (8 * I)) & 0xFF) + "."; } Res += Tekenreeks(((Ip >> 8 * 3)) & 0xFF); Terug Res; } Tekenreeks formatBytes(size_t Bytes) { lesbare Anzeige der Speichergrößen Als (Bytes < 1024) { Terug Tekenreeks(Bytes) + " Byte"; } Anders Als (Bytes < (1024 * 1024)) { Terug Tekenreeks(Bytes / 1024.0) + " KB"; } Anders Als (Bytes < (1024 * 1024 * 1024)) { Terug Tekenreeks(Bytes / 1024.0 / 1024.0) + "MB"; } } Tekenreeks getContentType(Tekenreeks Bestandsnaam) { de bestandsextensie converteren naar het MIME-type Als (Bestandsnaam.eindigtMet(".htm")) Terug "tekst/html"; Anders Als (Bestandsnaam.eindigtMet(".css")) Terug "tekst/css"; Anders Als (Bestandsnaam.Eindigt met(".js")) Terug "applicatie/javascript"; Anders Als (Bestandsnaam.Eindigt met(".ico")) Terug "afbeelding/x-pictogram"; Anders Als (Bestandsnaam.Eindigt met(".gz")) Terug "applicatie/x-gzip"; Anders Als (Bestandsnaam.Eindigt met(".bmp")) Terug "beeld/bmp"; Anders Als (Bestandsnaam.Eindigt met(".tif")) Terug "beeld/tiff"; Anders Als (Bestandsnaam.Eindigt met(".pbm")) Terug "image/x-portable-bitmap"; Anders Als (Bestandsnaam.Eindigt met(".jpg")) Terug "beeld/woord-------------; Anders Als (Bestandsnaam.Eindigt met(".gif")) Terug "beeld/gif"; Anders Als (Bestandsnaam.Eindigt met(".png")) Terug "afbeelding/png"; Anders Als (Bestandsnaam.Eindigt met(".svg")) Terug "image/svg+xml"; Anders Als (Bestandsnaam.Eindigt met(".html")) Terug "tekst/html"; Anders Als (Bestandsnaam.Eindigt met(".wav")) Terug "audio/x-wav"; Anders Als (Bestandsnaam.Eindigt met(".zip")) Terug "toepassing/zip"; Anders Als (Bestandsnaam.Eindigt met(".rgb")) Terug "beeld/x-rg"; Volledige lijst op https://wiki.selfhtml.org/wiki/MIME-Type/Overzicht Terug "tekst/vlakte"; } Bool handleFileRead(Tekenreeks Pad) { het juiste bestand naar de client verzenden (als het bestaat) Als (Pad.Eindigt met("/")) Pad += "index.html"; Als een map wordt aangevraagd, stuurt u het indexbestand Tekenreeks Contenttype = getContentType(Pad); Het MIME-type krijgen Tekenreeks pathWithGz = Pad + ".gz"; Als (SPIFFS (SPIFFS).Bestaat(pathWithGz) || SPIFFS (SPIFFS).Bestaat(Pad)) { Als het bestand bestaat, als gecomprimeerd archief of als normaal Als (SPIFFS (SPIFFS).Bestaat(pathWithGz)) Als er een gecomprimeerde versie beschikbaar is Pad += ".gz"; Gebruik de gecomprimeerde verion Bestand Bestand = SPIFFS (SPIFFS).Open(Pad, "r"); Het bestand openen Size_t Verzonden = Server.streamFile(Bestand, Contenttype); Stuur het naar de klant Bestand.Sluiten(); Het bestand opnieuw sluiten Terug Waar; } Terug Valse; } Void Lus() { Als (SoftAccOK SoftAccOK) { dnsServer.processNextRequest(); Dns } HTTP Server.handleClient(); }
Ik heb een paar 8x8 BMP graphics in verschillende kleurdiepte voor u om te testen:
In het volgende deel zorgen we voor een hogere resolutie van ons LED-display. Tot die tijd, wens u veel plezier met het weergeven van uw eigen BMP-bestanden op het LED-display.
3 Reacties
aschommer
Es hat doch etwas länger gedauert, aber jetzt habe ich “meinen Fork” erstellt: https://github.com/a-schommer/Tobis-General-Display
Rückmeldungen würden mich freuen – ich habe (noch) keine Routine damit, Software zu “veröffentlichen”, also glaube ich selbst nicht so ganz, dass es fehlerfrei ist.
Tobias
Hallo aschommer
Sämtliche Codes hier von mir stehen unter der GPL 3, wenn nicht anders im Code angegeben. Die Codes werden zuätzlich von mir auf GitHub unter https://github.com/kuchto zeitverzögert veröffentlich. Gerne kann für die einzelnen Projekte ein Fork angelegt werden.
Viele Grüße
aschommer
Unter welcher Lizenz stehen die Programme hier eigentlich? Ich würde gerne eine Variante für SSD1306-OLEDs (via u8g2-Library) beisteuern.