Chat here about code rewrites, mods, etc... with respect to the github project https://github.com/esp8266/Arduino

Moderator: igrr

User avatar
By PerlUser12
#75744 I have written an esp8266 Arduino code that should activate a 12 volt AC valve for an irrigation system but when I run the code I get a stack error. The Arduino I am using is the Wemos D1
Here is the code:

//insert of module's
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

MDNSResponder mdns;

// input of credentials
const char* ssid = "********";//
const char* password = "******";//

ESP8266WebServer server(80);

String webPage = "";

//setting of GPIO pins
int gpio4_pin = 12;//P4
int gpio2_pin = 4;//P3

IPAddress ip(192, 168, 2, 67); //
IPAddress gateway(192, 168, 2, 1);

IPAddress subnet(255, 255, 255, 0);

//creation of webserver
void setup(void) {
webPage += "<h1>WIFI Irrigation system Web Server</h1><p>Socket #1 <a href=\"socket1On\"><button>ON</button></a>&nbsp;<a href=\"socket1Off\"><button>OFF</button></a></p>";

// preparing GPIOs
pinMode(gpio4_pin, OUTPUT);
digitalWrite(gpio4_pin, LOW);
pinMode(gpio2_pin, OUTPUT);
digitalWrite(gpio2_pin, LOW);

//setting static ip
Serial.begin(115200);
Serial.println("Setting static ip to : ");
Serial.println(ip);
Serial.println("Connecting to the Internet...");
WiFi.config(ip, gateway, subnet);

WiFi.mode(WIFI_STA);

delay(1000);
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());

//begining of server
if (mdns.begin("esp8266", ip)) {
Serial.println("MDNS responder started");
}
digitalWrite(gpio2_pin, LOW);
digitalWrite(gpio4_pin, LOW);
server.on("/", []() {
server.send(200, "text/html", webPage);
});

//Valve loop here is where I am getting most of my errors
if (checkUrl("/server1on",server)){
server.on("/socket1On", [](){
server.send(200, "text/html", webPage);
digitalWrite(gpio4_pin, HIGH);
digitalWrite(gpio2_pin, LOW);
delay(1000);
digitalWrite(gpio2_pin, HIGH);
digitalWrite(gpio4_pin, LOW);
delay(1000);
digitalWrite(gpio4_pin, LOW);
digitalWrite(gpio2_pin, LOW);
delay(1000);
});

}

//End of valve loop

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

}


void loop(void) {
server.handleClient();
}

The side boolean function:
//side boolean function that finds and then checks the url so that we can see if its the one we want
boolean checkUrl(String ending, ESP8266WebServer s) {
int len = ending.length();
String url = s.uri();
String test = (url.substring(url.length()-len,url.length()));
Serial.println (test);
if(url.substring(url.length()-len,url.length()) == ending) {
return true;
} else return false;
}

and the stack error along with the translation:

3fff0380: ffffffff 3ffeea18 3ffee9f4 40207100
3fff0390: 00000004 3ffeea18 3ffee9f4 4020530d
3fff03a0: 3fff168c 0000000f 00000001 3ffef468
3fff03b0: 00000000 3fffdad0 3ffef470 00000030
3fff03c0: 00000000 3fffdad0 3ffef470 00000030
3fff03d0: 00000000 3fffdad0 3ffef470 3fff1674
3fff03e0: 0000000f 00000000 3fff165c 0000000f
3fff03f0: 00000001 3fff180c 0000000f 00000003
3fff0400: 3fff17f4 0000000f 0000000e 402031c4
3fff0410: 3ffeea34 00000000 3ffef480 00000000
3fff0420: 00000001 402037b4 3fff1714 3ffef480
3fff0430: 00000000 00000000 3ffee9f4 3ffef470
3fff0440: 000001a3 3ffeea18 3ffee9f4 40204433
3fff0450: 3ffe8608 00000000 000003e8 4302a8c0
3fff0460: 00000000 3fff190c 3fff0448 feefeffe
3fff0470: 3fffdad0 00000000 3ffef468 40202094
3fff0480: 3fffdad0 00000000 3ffef468 402076f4
3fff0490: feefeffe feefeffe 3ffef480 40100718

Decoding 8 results
0x40207100: String::String(String const&) at C:\Users\cat0005\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/WString.cpp line 519
0x4020530d: ESP8266WebServer::_parseRequest(WiFiClient&) at C:\Users\cat0005\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\ESP8266WebServer\src/Parsing.cpp line 123
0x402031c4: WiFiClient::~WiFiClient() at C:\Users\cat0005\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\ESP8266WiFi\src/WiFiClient.cpp line 149
0x402037b4: FunctionRequestHandler::canHandle(HTTPMethod, String) at C:\Users\cat0005\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\ESP8266WebServer\src/ESP8266WebServer.cpp line 299
0x40204433: ESP8266WebServer::handleClient() at C:\Users\cat0005\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\ESP8266WebServer\src/ESP8266WebServer.cpp line 299
0x40202094: loop at C:\Users\cat0005\Downloads\Arduino\GPIO_webserver_for_Hbridge/GPIO_webserver_for_Hbridge.ino line 129
0x402076f4: loop_wrapper at C:\Users\cat0005\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/core_esp8266_main.cpp line 56
0x40100718: cont_norm at C:\Users\cat0005\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/cont.S line 109
User avatar
By allenck
#76256 Try this:
Code: Select all//insert of module's
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
//#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

MDNSResponder mdns;

// input of credentials
const char* ssid = "*********";//
const char* password = "********";//

//ESP8266WebServer server(80);
WiFiServer server( 80 );
volatile int relayState = 0;      // Relay state.

String webPage = "";

//setting of GPIO pins
//int ESP8266_GPIO4 = 12;//P4
int ESP8266_GPIO4 = 4;//P4
//int gpio2_pin = 4;//P3
int gpio2_pin = 2;//P3

//creation of webserver
void setup(void) {
  webPage += "<h1>WIFI Irrigation system Web Server</h1><p>Socket #1 <a href=\"socket1On\"><button>ON</button></a>&nbsp;<a href=\"socket1Off\"><button>OFF</button></a></p>";
 
  // preparing GPIOs
  pinMode(ESP8266_GPIO4, OUTPUT);
  digitalWrite(ESP8266_GPIO4, LOW);
  pinMode(gpio2_pin, OUTPUT);
  digitalWrite(gpio2_pin, LOW);
 
  //setting static ip
  Serial.begin(74880);
  //Serial.println("Setting static ip to : ");
  //Serial.println(ip);
  //Serial.println("Connecting to the Internet...");
  Serial.println( "Connecting to: " + String( ssid ) );
  //WiFi.config(ip, gateway, subnet);
 
  // Set WiFi mode to station (as opposed to AP or AP_STA).
  WiFi.mode(WIFI_STA);
 
  delay(1000);
  //Serial.begin(74880);
  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());
 
  //begining of server
//  if (mdns.begin("esp8266", ip)) {
//   Serial.println("MDNS responder started");
//  }
  digitalWrite(gpio2_pin, LOW);
  digitalWrite(ESP8266_GPIO4, LOW);
 
 
 
  server.begin();
  Serial.println("HTTP server started");

}

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

  String s = "<h1>WIFI Irrigation system Web Server</h1><p>Socket #1 <a href=\"socket1On\"><button>ON</button></a>&nbsp;<a href=\"socket1Off\"><button>OFF</button></a></p>";

if ( req.indexOf( "OPTIONS" ) != -1 ) {
    s += "Allows: GET, OPTIONS";
 
  } else if ( req.indexOf( "GET" ) != -1 ) {
    if ( req.indexOf( "socket1On" ) != -1 ) {
      // relay on!
      s += "relay on!";
      relayState = 1;
      digitalWrite( ESP8266_GPIO4, 1 ); // Relay control pin.
     
    } else if ( req.indexOf( "socket1Off" ) != -1 ) {
      // relay off!
      s += "relay off!";
      relayState = 0;
      digitalWrite( ESP8266_GPIO4, 0 ); // Relay control pin.
     
    }
    else if ( req.indexOf( "relay" ) != -1 ) {
      if ( relayState == 0 )
        // relay off!
        s += "relay off!";
      else
        // relay on!
        s += "relay on!";
 
    }
    #if 0
    else if ( req.indexOf( "io" ) != -1 ) {
      if ( digitalRead( ESP8266_GPIO5 ) == 0 )
        s += "input io is:0!";
      else
        s += "input io is:1!";
     
    } else if ( req.indexOf( "MAC" ) != -1 ) {
      uint8_t mac[WL_MAC_ADDR_LENGTH];
      WiFi.softAPmacAddress( mac );
      String macID = String( mac[WL_MAC_ADDR_LENGTH - 5], HEX) + String( mac[WL_MAC_ADDR_LENGTH - 4], HEX) +
                     String( mac[WL_MAC_ADDR_LENGTH - 3], HEX) + String( mac[WL_MAC_ADDR_LENGTH - 2], HEX) +
                     String( mac[WL_MAC_ADDR_LENGTH - 1], HEX) + String( mac[WL_MAC_ADDR_LENGTH], HEX);
      macID.toUpperCase();
      s += "MAC address: " + macID;
 
    }
    #endif
    else
      s += "Invalid Request.<br> Try: open/close/relay/io/MAC";
 
  } else
    s = "HTTP/1.1 501 Not Implemented\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\n";
         
  client.flush();
  s += "</html>\n";
 
  // Send the response to the client.
  client.print( s );
  delay( 1 );
  Serial.println( "Client response sent." );
 
}

void loop(void) {
  //server.handleClient();
  WiFiClient client = server.available();
  if ( client )
    GetClient( client );
}