-1

I am trying to incorporate IoT to my embedded system project. I would call it soft real-time embedded system project. But because of these 'LAZY' lines,

while (WiFi.status() != WL_CONNECTED) {
  delay(500);
  Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
// Start the server
server.begin();
Serial.println("Server started");
if (!client) {
  return;  // Wait until the client sends some data
}
Serial.println("new client");
while (!client.available()) {
  delay(1);
}

The rest of the embedded system project has become so slow. If I don't put any of those lines, there will be obnoxious side-effects. How can I run this code along my actual embedded system project and still get done the soft real-time job?

[Edited] Full code:

#include <ESP8266WiFi.h>

const char* ssid = "Linux"; // SSID i.e. Service Set Identifier is the name of your WIFI
const char* password = "0123456789"; // Your Wifi password, in case you have open network comment the whole statement.

int ledPin = 13; // GPIO13 or for NodeMCU you can directly write D7 
WiFiServer server(80); // Creates a server that listens for incoming connections on the specified port, here in this case port is 80.

void setup() {
  Serial.begin(115200);
  delay(10);

  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);

  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.print("Use this URL to connect: ");
  Serial.print("http://");
  Serial.print(WiFi.localIP()); //Gets the WiFi shield's IP address and Print the IP address of serial monitor
  Serial.println("/");

}

void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }

  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }

  // Read the first line of the request
  String request = client.readStringUntil('\r');
  Serial.println(request);
  client.flush();

  // Match the request

  int value = LOW;
  if (request.indexOf("/LED=ON") != -1)  {
    digitalWrite(ledPin, HIGH);
    value = HIGH;
  }
  if (request.indexOf("/LED=OFF") != -1)  {
    digitalWrite(ledPin, LOW);
    value = LOW;
  }

// Set ledPin according to the request
//digitalWrite(ledPin, value);

  // Return the response
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println(""); //  do not forget this one
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");

  client.print("Led pin is now: ");

  if(value == HIGH) {
    client.print("On");
  } else {
    client.print("Off");
  }
  client.println("<br><br>");
  client.println("<a href=\"/LED=ON\"\"><button>Turn On </button></a>");
  client.println("<a href=\"/LED=OFF\"\"><button>Turn Off </button></a><br />");  
  client.println("</html>");

  delay(1);
  Serial.println("Client disconnected");
  Serial.println("");

}
7
  • 3
    Write it as a finite state machine with none of those whiles and delays. – Majenko Oct 4 '17 at 11:30
  • Finite state machine? couldn't catch it. any example(s)? – Big Yan Oct 4 '17 at 11:34
  • Dual processors is another idea. – Code Gorilla Oct 4 '17 at 12:18
  • Are you running that code in loop? Are you starting the server in every loop execution? Post your complete sketch, because your code as is doesn't make sense. – user31481 Oct 4 '17 at 12:38
1

I tested your sketch on a NodeMCU 0.9 and it works fine. Response times is sub-second. I'm using Firefox on a Linux Mint as a client.

Test run

I added code to timed each loop execution. The average time is 20-30 ms per loop. It looks fine to me or is it to long for you?

I think using a ESP8266WebServer is overkill and probably will take more resources to run. Having used ESP8266WebServer, for a project with one or two pages, using your approach is just fine.

2
  • +Look Alterno Actually, my real code is not as short as it looks in this demo code. I am not allowed to post the real code for some privacy reasons of the company I work for. There is another soft real-time embedded project that should go along with this kind of IoT project. Therefore, any further advice? – Big Yan Oct 5 '17 at 13:39
  • 1
    @BigyanChapagain Nothing else I can do with the available information. The code you share run razonably fast (for me). The problem is elsewhere. – user31481 Oct 5 '17 at 14:05
-1

Try ESP8266WebServer instead. The following is an example included with the ESP8266 board package.

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

const char* ssid = "........";
const char* password = "........";

ESP8266WebServer server(80);

const int led = 13;

void handleRoot() {
  digitalWrite(led, 1);
  server.send(200, "text/plain", "hello from esp8266!");
  digitalWrite(led, 0);
}

void handleNotFound(){
  digitalWrite(led, 1);
  String message = "File Not Found\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 += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
  digitalWrite(led, 0);
}

void setup(void){
  pinMode(led, OUTPUT);
  digitalWrite(led, 0);
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  if (MDNS.begin("esp8266")) {
    Serial.println("MDNS responder started");
  }

  server.on("/", handleRoot);

  server.on("/inline", [](){
    server.send(200, "text/plain", "this works as well");
  });

  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP server started");
}

void loop(void){
  server.handleClient();
}
2
  • The fact is that ESP8266WebServer uses WiFiClient itself to implement the web server. So, if WiFiClient fails, then ESP8266WebServer will fails as well. Take a look at github.com/esp8266/Arduino/blob/master/libraries/… – user31481 Oct 5 '17 at 21:20
  • No evidence WiFiClient is slow.If you are doing something else in loop such as animating LEDs code like this brings loop to dead stop. while(!client.available()){ delay(1); } readStringUntil blocks for up to 1 second waiting for the terminator. Another loop killer. String request = client.readStringUntil('\r'); – gdsports Oct 9 '17 at 2:29

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.