Captive Portal Blog Deel 4 : BMP-bestandsweergave op 8x8 Matrix-display

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='/wifi'>WIFI Settings</a><br><br>br>";   Temp += "<a href='/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='/'>Hoofdpagina</a><br>";     Temp += "<a href='/wifi'>WIFI Settings</a><br>";     Temp += "<a href='/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:

 BMP-afbeeldingen downloaden

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.

Esp-8266Projekte für fortgeschritteneSensoren

3 Kommentare

aschommer

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

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

aschommer

Unter welcher Lizenz stehen die Programme hier eigentlich? Ich würde gerne eine Variante für SSD1306-OLEDs (via u8g2-Library) beisteuern.

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert