diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 0f0d740..080e70d 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,7 +1,10 @@ -{ - // See http://go.microsoft.com/fwlink/?LinkId=827846 - // for the documentation about the extensions.json format - "recommendations": [ - "platformio.platformio-ide" - ] -} +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "platformio.platformio-ide" + ], + "unwantedRecommendations": [ + "ms-vscode.cpptools-extension-pack" + ] +} diff --git a/src/main.cpp b/src/main.cpp index 4eaff61..47c70ee 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,42 +1,225 @@ -/********* - Rui Santos - Complete project details at https://randomnerdtutorials.com -*********/ +// Example posting to display: +// curl -XPOST --data-binary @- -H 'Content-Type:text/plain' http://esp32oled.local/oled -// I connected SCK to D22 and SDA to D21 - but all I get is a weird pattern - is the dislay broken? +// I connected SCK to D22 and SDA to D21 #include #include #include #include #include +#include +#include +#include +#include +#include +#include +const char* host = "esp32oled"; +const char* ssid = "JoNelsDarlings"; +const char* password = "Paris2016"; + +WebServer server(80); + +// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels -// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); -void setup() { - Serial.begin(115200); +/* + * Login page + */ + +const char* loginIndex = + "
" + "" + "" + "" + "
" + "
" + "" + "" + "" + "" + "
" + "
" + "" + "" + "" + "
" + "
" + "" + "" + "" + "" + "
" + "
ESP32 Login Page
" + "
" + "
Username:
Password:
" +"
" +""; + +/* + * Server Index Page + */ + +const char* serverIndex = +"" +"
" + "" + "" + "
" + "
progress: 0%
" + ""; + + +void writeToOled(String text){ + display.clearDisplay(); + display.setTextColor(WHITE); + display.setCursor(0, 0); + display.setTextSize(2); + display.print(text); + display.display(); +} + +/* + * setup function + */ +void setup(void) { + Serial.begin(9600); if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64 Serial.println(F("SSD1306 allocation failed")); for(;;); } delay(2000); - display.clearDisplay(); - display.display(); - - display.setTextSize(2); - display.setTextColor(WHITE); - display.setCursor(0, 10); - // Display static text - display.println("Hello, world!"); - display.display(); -} - -void loop() { + writeToOled("Startup"); + + // Connect to WiFi network + WiFi.begin(ssid, password); + Serial.println(""); + + // Wait for connection or reboot if it doesn't connect for too long + uint32_t wifiConnAttements = 0; + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + if (wifiConnAttements++ > 120) { + Serial.println(""); + ESP.restart(); + } + } + + + Serial.println(""); + Serial.print("Connected to "); + Serial.println(ssid); + Serial.print("IP address: "); + Serial.println(WiFi.localIP()); + + /*use mdns for host name resolution*/ + if (!MDNS.begin(host)) { //http://esp32ota.local + Serial.println("Error setting up MDNS responder!"); + while (1) { + delay(1000); + } + } + Serial.println("mDNS responder started"); + /*return index page which is stored in serverIndex */ + server.on("/", HTTP_GET, []() { + server.sendHeader("Connection", "close"); + server.send(200, "text/html", loginIndex); + }); + server.on("/serverIndex", HTTP_GET, []() { + server.sendHeader("Connection", "close"); + server.send(200, "text/html", serverIndex); + }); + server.on(UriBraces("/oled/{}"), HTTP_GET, []() { + server.sendHeader("Connection", "close"); + String text = server.pathArg(0); + writeToOled(text); + server.send(200, "text/html", text); + }); + server.on("/oled", HTTP_POST, []() { + server.sendHeader("Connection", "close"); + String text = server.arg(0); + writeToOled(text); + server.send(200, "text/html", text); + }); + /*handling uploading firmware file */ + server.on("/update", HTTP_POST, []() { + server.sendHeader("Connection", "close"); + server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK"); + ESP.restart(); + }, []() { + HTTPUpload& upload = server.upload(); + if (upload.status == UPLOAD_FILE_START) { + Serial.printf("Update: %s\n", upload.filename.c_str()); + if (!Update.begin(UPDATE_SIZE_UNKNOWN)) { //start with max available size + Update.printError(Serial); + } + } else if (upload.status == UPLOAD_FILE_WRITE) { + /* flashing firmware to ESP*/ + if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) { + Update.printError(Serial); + } + } else if (upload.status == UPLOAD_FILE_END) { + if (Update.end(true)) { //true to set the size to the current progress + Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize); + } else { + Update.printError(Serial); + } + } + }); + server.begin(); + + writeToOled("Ready."); + } +void loop(void) { + server.handleClient(); + delay(1); +}