Problem asynchronous web server with ESP32

Hi,

I am new in this type of projects and I need some advice about asynchronous web servers using the ESP32 because I have a problem connecting to the wifi.

I tried to do an asynchronous web server with an Sparkfun ESP32 Thing Plus and the Arduino IDE and I used this projet as reference: [u]https://techtutorialsx.com/2017/12/01/esp32-arduino-asynchronous-http-webserver/[/u] .

This is my code:

//Reference : https://techtutorialsx.com/2017/12/01/esp32-arduino-asynchronous-http-webserver/ #include "WiFi.h" #include "ESPAsyncWebServer.h" const char* ssid = "ssid"; const char* password =  "password"; AsyncWebServer server(80); void setup(){   Serial.begin(115200);   WiFi.begin(ssid, password);   Serial.println("Start");   while (WiFi.status() != WL_CONNECTED) {     delay(1000);     Serial.println("Connecting to WiFi...");   }   Serial.println("Success connecting");   Serial.println("IP Adress: ");   Serial.print(WiFi.localIP());   server.on("/hello", HTTP_GET, [](AsyncWebServerRequest *request){     request->send(200, "text/plain", "Hello World");   });   server.begin(); } 

Everytime I compile the code there is no errors but when I open the serial monitor I am stuck in "Connecting to Wifi..." I think my WiFi.status is never connected.

I made sure I had installed all the libraries I needed and all the settings in the Tools are good.

Thank you in advance for your help !

"when I open the serial monitor I am stuck in "Connecting to Wifi..."

did you add the appropriate ssid and password to connect to your network/router?

Thanks for your reply zoomkat,

I put the same ssid and password that I used in a code for a Soft Access Point with the ESP32 and the WiFi.h library, but is it the right thing to do ? Or should I change it because I am using the ESPAsyncWebServer.h ?

I read that it might be a problem with the http port so I also tried the code with a different port, instead of using "server (80)" I tried with "server(8080)" but it didn't work.

I still have this in the serial monitor :

mariafalher:
I put the same ssid and password that I used in a code for a Soft Access Point with the ESP32 and the WiFi.h library, but is it the right thing to do ?

Is that Access Point running in the same physical location? Maybe they are conflicting.

aarg:
Is that Access Point running in the same physical location? Maybe they are conflicting.

Thanks for the reply,

I used the Access Point code for a different project before doing this one so they are not running at the same time but I tried the two codes with the same ESP32.

Could it be that the SAP doesn't allow the connection even if the code is not running ?

The project I made with the SAP is this one :

//Reference: https://microcontrollerslab.com/esp32-soft-access-point-web-server-in-arduino-ide/ /*   #include "WiFi.h"   //Variables   #define LED1 13                //First light   #define LED2 33                //Second light   #define potPin 34              //Signal from the potentiometer   const char* ssid = "ESP32-SAP";   const char* password = "12345678";   //Server port   WiFiServer server(80);     String html = "<!DOCTYPE html> \   <html> \   <body> \   <center><h1>ESP32 Soft access point</h1></center> \   <center><h2>Web Server</h2></center> \   <form> \   <button name=\"LED1\" button style=\"color:green\" value=\"ON\" type=\"submit\">LED1 ON</button> \   <button name=\"LED1\" button style=\"color:red\" value=\"OFF\" type=\"submit\">LED1 OFF</button> \   <button name=\"LED2\" button style=\"color:green\" value=\"ON\" type=\"submit\">LED2 ON</button> \   <button name=\"LED2\" button style=\"color:red\" value=\"OFF\" type=\"submit\">LED2 OFF</button> \   </form> \   </body> \   </html>";   int potValue = 0;    //Initializa potentiometer value   void Connect_WiFi()   {   WiFi.begin(ssid, password);   while (WiFi.status() != WL_CONNECTED)   {     delay(100);   }   }   void setup()   {   Serial.begin(115200);   pinMode(LED1, OUTPUT);   pinMode(LED2, OUTPUT);   digitalWrite(LED1, LOW);   digitalWrite(LED2, LOW);   Serial.print("Setting soft access point mode");   WiFi.softAP(ssid, password);   IPAddress IP = WiFi.softAPIP();   Serial.print("AP IP address: ");   Serial.println(IP);   server.begin();   }   void loop()   {   potValue = analogRead(potPin);   //Serial.println(potValue);   WiFiClient client = server.available();   if (client)   {     String request = client.readStringUntil('\r');     if (request.indexOf("LED1=ON") != -1)digitalWrite(LED1, HIGH);     if (request.indexOf("LED1=OFF") != -1)digitalWrite(LED1, LOW);     if (request.indexOf("LED2=ON") != -1)digitalWrite(LED2, HIGH);     if (request.indexOf("LED2=OFF") != -1)digitalWrite(LED2, LOW);     client.print(html);     if(potValue <= 4095){     client.print("Analog Data:    ");     client.print(potValue);     client.print(" ");     client.print(" ");     }     request = "";   }   } */ 

"I used the Access Point code for a different project before doing this one so they are not running at the same time but I tried the two codes with the same ESP32."

Have you been able to log into any network/router with various example codes?

I have been able to connect to the same network with different codes using the WiFi.h library only.

I think that when I use the AsyncWebServer instead of the WiFiServer I am not able to reach the server, but I am not sure why...

"I think that when I use the AsyncWebServer instead of the WiFiServer I am not able to reach the server, but I am not sure why... "

Is the AsyncWebServer made to be used with the ESP32? It seems in some instances the esp32 and esp8266 require different libraries.

Here is a working Access Point asynchronous webpage (AJAX) example for the ESP32:

#include <WiFi.h> #include <WiFiClient.h> #include <WiFiAP.h> const char MAIN_page[] PROGMEM = "<!DOCTYPE html>\n<html>\n<style>\nbody, html {\n  height: 100%;\n  margin: 0;\n  font-family: Arial;\n}\n\n/* Style tab links */\n.tablink {\n  background-color: #555;\n  color: white;\n  float: left;\n  border: none;\n  outline: none;\n  cursor: pointer;\n  padding: 14px 16px;\n  font-size: 17px;\n  width: 33.33%;\n}\n\n.tablink:hover {\n  background-color: #777;\n}\n\n.tabcontent {\n  color: white;\n  display: none;\n  padding: 100px 20px;\n  height: 100%;\n}\n\n#Home {background-color: white;}\n#PIDs {background-color: white;}\n#Console {background-color: white;}\n#About {background-color: white;}\n\n.card\n{\n    max-width: 400px;\n    min-height: 250px;\n    background: #02b875;\n    padding: 30px;\n    box-sizing: border-box;\n    color: #FFF;\n    margin:20px;\n    box-shadow: 0px 2px 18px -4px rgba(0,0,0,0.75);\n}\n\n#myProgress\n{\n  width: 100%;\n  background-color: #ddd;\n}\n\n#myBar\n{\n  width: 1%;\n  height: 30px;\n  background-color: #4CAF50;\n}\n\n/* Style the form - display items horizontally */\n.form-inline {\n  display: flex;\n  flex-flow: row wrap;\n  align-items: center;\n}\n\n/* Add some margins for each label */\n.form-inline label {\n  margin: 5px 10px 5px 0;\n}\n\n/* Style the input fields */\n.form-inline input {\n  vertical-align: middle;\n  margin: 5px 10px 5px 0;\n  padding: 10px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n\n/* Style the submit button */\n.form-inline button {\n  padding: 10px 20px;\n  background-color: dodgerblue;\n  border: 1px solid #ddd;\n  color: white;\n}\n\n.form-inline button:hover {\n  background-color: royalblue;\n}\n\n/* Add responsiveness - display the form controls vertically instead of horizontally on screens that are less than 800px wide */\n@media (max-width: 800px) {\n  .form-inline input {\n    margin: 10px 0;\n  }\n\n  .form-inline {\n    flex-direction: column;\n    align-items: stretch;\n  }\n}\n</style>\n\n<body>\n<button class=\"tablink\" onclick=\"openPage('Home', this, 'red')\" id=\"defaultOpen\">Home</button>\n<button class=\"tablink\" onclick=\"openPage('PIDs', this, 'green')\">PIDs</button>\n<button class=\"tablink\" onclick=\"openPage('Console', this, 'blue')\">Console</button>\n\n<div id=\"Home\" class=\"tabcontent\">\n  <h3>Home</h3>\n  <div class=\"card\">\n    <h4>ArduHUD</h4> \n    <h1>Speed: <span id=\"speed\">0</span></h1>\n    <div id=\"myProgress\">\n      <div id=\"myBar\"></div>\n    </div> \n  </div>\n</div>\n\n<div id=\"PIDs\" class=\"tabcontent\">\n  <h3>PIDs</h3>\n  <p>Some PIDs this fine day!</p>\n</div>\n\n<div id=\"Console\" class=\"tabcontent\">\n  <h3>Console</h3>\n  <form class=\"form-inline\" action=\"/action_page.php\">\n    <label for=\"email\">Email:</label>\n    <input type=\"email\" id=\"email\" placeholder=\"Enter email\" name=\"email\">\n    <button type=\"submit\">Submit</button>\n</form>\n</div>\n</body>\n\n<script>\nfunction openPage(pageName, elmnt, color)\n{\n  // Hide all elements with class=\"tabcontent\" by default */\n  var i, tabcontent, tablinks;\n  tabcontent = document.getElementsByClassName(\"tabcontent\");\n  for (i = 0; i < tabcontent.length; i++)\n  {\n    tabcontent[i].style.display = \"none\";\n  }\n\n  // Remove the background color of all tablinks/buttons\n  tablinks = document.getElementsByClassName(\"tablink\");\n  for (i = 0; i < tablinks.length; i++)\n  {\n    tablinks[i].style.backgroundColor = \"\";\n  }\n\n  // Show the specific tab content\n  document.getElementById(pageName).style.display = \"block\";\n\n  // Add the specific color to the button used to open the tab content\n  elmnt.style.backgroundColor = color;\n}\n\ndocument.getElementById(\"defaultOpen\").click();\n\nsetInterval(function()\n{\n  getSpeedData();\n  getRpmData();\n}, 1000);\n\n\nfunction getSpeedData()\n{\n  var xhttp = new XMLHttpRequest();\n  \n  xhttp.onreadystatechange = function()\n  {\n    if (this.readyState == 4 && this.status == 200)\n    {\n      document.getElementById(\"speed\").innerHTML = this.responseText;\n    }\n  };\n  \n  xhttp.open(\"GET\", \"speed\", true);\n  xhttp.send();\n}\n\n\nfunction move(width)\n{\n  var elem = document.getElementById(\"myBar\");\n  var id = setInterval(frame, 10);\n  \n  function frame()\n  {\n    if (width > 100)\n    {\n      width = 100;\n    }\n    else if (width < 0)\n    {\n      width = 0;\n    }\n    \n    console.log(width);\n    elem.style.width = width + \"%\";\n  }\n}\n\nfunction getRpmData()\n{\n  var xhttp = new XMLHttpRequest();\n  \n  xhttp.onreadystatechange = function()\n  {\n    if (this.readyState == 4 && this.status == 200)\n      {\n      move(parseInt(this.responseText), 10);\n    }\n  };\n  \n  xhttp.open(\"GET\", \"rpm\", true);\n  xhttp.send();\n}\n</script>\n</html>"; WiFiServer server(80); const char *ssid = "HUDuino"; void setup() {   pinMode(LED_BUILTIN, OUTPUT);   digitalWrite(LED_BUILTIN, HIGH);     Serial.begin(115200);   WiFi.softAP(ssid);   IPAddress myIP = WiFi.softAPIP();   Serial.println(myIP);   server.begin(); } void loop() {   serverProcessing(); } void serverProcessing() {   bool main = false;   bool speed_request = false;   bool rpm_request = false;     WiFiClient client = server.available();   if (client)   {     String currentLine = "";         while (client.connected())     {       if (client.available())       {         char c = client.read();         //Serial.write(c);         if (currentLine.endsWith("GET / HTTP"))           main = true;         else if (currentLine.endsWith("GET /speed HTTP"))           speed_request = true;         else if (currentLine.endsWith("GET /rpm HTTP"))           rpm_request = true;                 if (c == '\n')         {           if (!currentLine.length())           {             if (main)             {               client.println("HTTP/1.1 200 OK");               client.println("Content-type:text/html");               client.println();                       client.print(MAIN_page);               client.println();                     main = false;               break;             }             else if (speed_request)             {               client.println("HTTP/1.1 200 OK");               client.println("Content-type:text/html");               client.println();                       client.println(random(0, 100));               client.println();                     speed_request = false;               break;             }             else if (rpm_request)             {               client.println("HTTP/1.1 200 OK");               client.println("Content-type:text/html");               client.println();                       client.println(random(0, 100));               client.println();                     rpm_request = false;               break;             }             else             {               client.println("HTTP/1.1 200 OK");               client.println("Content-type:text/html");               client.println();                       client.print(MAIN_page);               client.println();               break;             }           }           else             currentLine = "";         }         else if (c != '\r')           currentLine += c;       }     }     client.stop();   } } 
1 Like

zoomkat:
Is the AsyncWebServer made to be used with the ESP32? It seems in some instances the esp32 and esp8266 require different libraries.

I think the library is compatible with both of the ESP because the tutorial I used as reference and other websites I consulted used the ESP32-WROOM-32, the same ESP32 I am using.

Here are some of those websites:

Power_Broker:
Here is a working Access Point asynchronous webpage (AJAX) example for the ESP32: ...

Thank you very much Power_Broker,

I am able to connect to the server and have a web page.

Do you know if it is possible to send text files (.txt) with AJAX ?

My ultimate goal for this project is to be able to send a file to a web page via WiFi, that's why I choose to use the ESPAsyncWebServer.h but it seems to be more complicated than expected. :sweat_smile:

After a couple of tests I found a solution for the AsyncWebServer. In the code of the ESP32 AP, I replace the WiFi.begin for a WiFi.softAP and I put a WiFi.mode(WIFI_AP), until now it seems to work well :slight_smile:

Thank you all for your help.

The final code of the test is this:

#include <WiFi.h> #include <ESPAsyncWebServer.h> const char* ssid = "ESP32wifi"; const char* password = "12345679"; AsyncWebServer server(80); void setup() {   Serial.begin(115200);   delay(1000);   Serial.println("Start");     Serial.print("Connecting to : ");   Serial.println(ssid);     WiFi.mode(WIFI_AP);   WiFi.softAP(ssid, password);   //WiFi.begin(ssid, password); //Erase this part     Serial.println("Success");   server.on("/hello", HTTP_GET, [](AsyncWebServerRequest * request) {     request->send(200, "text/html", "<p>Hello world!</p>");   });   server.begin(); } void loop() { } 
1 Like