/* Webserver SD webpage example for LaskaKit ESPlan * Place index.htm file on SD card or create your own html example, rename it to index.htm and place it on SD card * After boot connect to http://esplan.local or to IP adress of ESP32 (for example 192.168.0.98) * You should see webpage saved on SD card * Email:podpora@laskakit.cz * Web:laskakit.cz */ #include #include #include #include #include #include #include const char *host = "esplan"; // SD card defines #define SCK 14 #define MISO 12 #define MOSI 13 #define CS 15 SPIClass spi = SPIClass(HSPI); WebServer server(80); // LAN8720A parameters #define ETH_POWER_PIN -1 #define ETH_ADDR 0 #define ETH_MDC_PIN 23 #define ETH_MDIO_PIN 18 #define ETH_NRST_PIN 5 static bool eth_connected = false; void WiFiEvent(WiFiEvent_t event) { switch (event) { case ARDUINO_EVENT_ETH_START: Serial.println("ETH Started"); // set eth hostname here ETH.setHostname("esplan"); break; case ARDUINO_EVENT_ETH_CONNECTED: Serial.println("ETH Connected"); break; case ARDUINO_EVENT_ETH_GOT_IP: Serial.print("ETH MAC: "); Serial.print(ETH.macAddress()); Serial.print(", IPv4: "); Serial.print(ETH.localIP()); if (ETH.fullDuplex()) { Serial.print(", FULL_DUPLEX"); } Serial.print(", "); Serial.print(ETH.linkSpeed()); Serial.println("Mbps"); eth_connected = true; break; case ARDUINO_EVENT_ETH_DISCONNECTED: Serial.println("ETH Disconnected"); eth_connected = false; break; case ARDUINO_EVENT_ETH_STOP: Serial.println("ETH Stopped"); eth_connected = false; break; default: break; } } void handleNotFound() { String message = "SD card or index.htm file not detected\n\n"; message += "URI: "; message += server.uri(); message += "\nMethod: "; message += (server.method() == HTTP_GET) ? "GET" : "POST"; message += "\nArguments: "; message += server.args(); message += "\n"; for (uint8_t i = 0; i < server.args(); i++) { message += " NAME:" + server.argName(i) + "\n VALUE:" + server.arg(i) + "\n"; } server.send(404, "text/plain", message); Serial.print(message); } void handleRoot() { spi.begin(SCK, MISO, MOSI, CS); if (SD.begin(CS, spi)) { Serial.println("SD Card initialized."); } else { handleNotFound(); return; } File dataFile = SD.open("/index.htm"); if (!dataFile) { SD.end(); spi.end(); handleNotFound(); return; } if (server.streamFile(dataFile, "text/html") != dataFile.size()) { Serial.println("Sent less data than expected!"); } dataFile.close(); SD.end(); spi.end(); } void eth_setup() { // For reseting LAN8720A pinMode(ETH_NRST_PIN, OUTPUT); digitalWrite(ETH_NRST_PIN, LOW); delay(500); digitalWrite(ETH_NRST_PIN, HIGH); WiFi.onEvent(WiFiEvent); ETH.begin(ETH_ADDR, ETH_POWER_PIN, ETH_MDC_PIN, ETH_MDIO_PIN, ETH_PHY_LAN8720, ETH_CLOCK_GPIO17_OUT); } void DNS_setup() { if (MDNS.begin(host)) { MDNS.addService("http", "tcp", 80); Serial.println("MDNS responder started"); Serial.print("You can now connect to http://"); Serial.print(host); Serial.println(".local"); } } void setup(void) { Serial.begin(115200); Serial.print("\n"); eth_setup(); DNS_setup(); server.on("/", handleRoot); // Main page server.onNotFound(handleNotFound); server.begin(); Serial.println("HTTP server started"); } void loop(void) { server.handleClient(); delay(2); // allow the cpu to switch to other tasks }