Esp8266 wifi error rst cause:4, boot mode:(3,7)

i have a python script using sockets sending data to my wemos d1 mini clone (esp8266). i noticed that even though the led is set to low its on actually. i dont know why it is crashing. i basically stole the code from when i used it for usb serial and tried to change things around for wifi communication. i can set up python as server or client sending messages i have both scripts at the ready for whatever works better on arduino

error is-

ets Jan 8 2013,rst cause:4, boot mode:(3,7)

wdt reset
load 0x4010f000, len 3460, room 16
tail 4
chksum 0xcc
load 0x3fff20b8, len 40, room 4
tail 4
chksum 0xc9
csum 0xc9
v00044680
~ld

code

#include <WiFi.h>
#include <AccelStepper.h>
#include <MultiStepper.h>
#define ENABLE 8
AccelStepper Motor1(1, 4, 3);
AccelStepper Motor2(1, 1, 2);
AccelStepper Motor3(1, 6, 7);
AccelStepper Motor4(1, 0, 5);
boolean newData = false;
const byte numChars = 26;
char receivedChars[numChars];
char tempChars[numChars];
int Motor1Data = 0;
int Motor2Data = 0;
int Motor3Data = 0;
int Motor4Data = 0;
int Motor1Receive = 15000;
int Motor2Receive = 15000;
int Motor3Receive = 15000;
int Motor4Receive = 15000;
char* ssid = "FoxFi";
char* password =  "password";
const uint16_t port = 1324;
const char* host = "192.168.0.165";
WiFiClient client;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Connecting to WiFi...");
  }
  
  Serial.print("WiFi connected with IP: ");
  Serial.println(WiFi.localIP());
  pinMode(ENABLE, OUTPUT);
  digitalWrite(ENABLE, LOW);
  Motor1.setMaxSpeed(20000);
  Motor2.setMaxSpeed(20000);
}
 
void loop() {
  WiFiClient client;
  if (!client.connect(host, port)) {
    Serial.println("Connection to host failed");
    delay(500);
    return;
  }
  Serial.println("Connected to server successful!");
  recvWithStartEndMarkers();
  Motor1.runSpeed();
  Motor2.runSpeed();
  Motor1Data = map(Motor1Receive, 0, 30000, -15000, 15000);
  Motor2Data = map(Motor2Receive, 0, 30000, -15000, 15000);
  if (newData == true) {
    strcpy(tempChars, receivedChars);
    parseData();
    if (Motor1Data > 2){
      Motor1.setSpeed(Motor1Data);
    }
    else if (Motor1Data < - 2){
      Motor1.setSpeed(Motor1Data);
    }
    else{
      Motor1.setSpeed(0);
    }
    if (Motor2Data > 2){
      Motor2.setSpeed(Motor2Data);
    }
    else if (Motor2Data < -2){
      Motor2.setSpeed(Motor2Data);
    }
    else{
      Motor2.setSpeed(0);
    }
    if (Motor3Data > 2){
      Motor3.setSpeed(Motor3Data);
    }
    else if (Motor3Data < - 2){
      Motor3.setSpeed(Motor3Data);
    }
    else{
      Motor3.setSpeed(0);
    }
    if (Motor2Data > 4){
      Motor4.setSpeed(Motor4Data);
    }
    else if (Motor4Data < -2){
      Motor4.setSpeed(Motor4Data);
    }
    else{
      Motor4.setSpeed(0);
    }
    newData = false;
  }
}

void recvWithStartEndMarkers() {
    static boolean recvInProgress = false;
    static byte ndx = 0;
    char startMarker = '<';
    char endMarker = '>';
    char PythonRead;
    while (client.available() > 0 && newData == false) {
        PythonRead = client.read();
        Serial.println(PythonRead);
        if (recvInProgress == true) {
            if (PythonRead != endMarker) {
                receivedChars[ndx] = PythonRead;
                ndx++;
                if (ndx >= numChars) {
                    ndx = numChars - 1;
                }
            }
            else {
                receivedChars[ndx] = '\0'; // terminate the string
                recvInProgress = false;
                ndx = 0;
                newData = true;
            }
        }

        else if (PythonRead == startMarker) {
            recvInProgress = true;
        }
    }
}

void parseData() {      // split the data into its parts

    char * strtokIndex; // this is used by strtok() as an index

    strtokIndex = strtok(tempChars,",");
    Motor1Receive = atoi(strtokIndex);
    
    strtokIndex = strtok(NULL, ",");
    Motor2Receive = atoi(strtokIndex);
    
    strtokIndex = strtok(NULL, ",");
    Motor3Receive = atoi(strtokIndex);

    strtokIndex = strtok(NULL, ",");
    Motor4Receive = atoi(strtokIndex);
}

That's not unusual.

Please remember to use code tags when posting code

i think i set it to code thanks

Cause 4 is a watchdog reset, I believe - you're probably stuck in a tight loop.

any idea on where that is or how to fix it? it worked on my nano while i was still using usb serial not wifi

Did you have the watchdog enabled on the Nano?

i dont actually know what a watchdog is but i didnt change the code much heres that old code


#include <AccelStepper.h>
#include <MultiStepper.h>
#define ENABLE1 9
#define ENABLE2 12
#define MODE0 8
#define MODE1 7
#define MODE2 6
#define RESET 5
#define SLEEP 4
AccelStepper Motor1(1, 3, 2);
AccelStepper Motor2(1, 11, 10);
boolean newData = false;
const byte numChars = 32;
char receivedChars[numChars];
char tempChars[numChars];
int Motor1Data = 0;
int Motor2Data = 0;
int Motor1Receive = 15000;
int Motor2Receive = 15000;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  pinMode(ENABLE1, OUTPUT);
  pinMode(ENABLE2, OUTPUT);
  pinMode(MODE0, OUTPUT);
  pinMode(MODE1, OUTPUT);
  pinMode(MODE2, OUTPUT);
  pinMode(RESET, OUTPUT);
  pinMode(SLEEP, OUTPUT);
  
  digitalWrite(ENABLE1, LOW);
  digitalWrite(ENABLE2, LOW);
  digitalWrite(RESET, HIGH);
  digitalWrite(SLEEP, HIGH);
  digitalWrite(MODE0, HIGH);
  digitalWrite(MODE1, HIGH);
  digitalWrite(MODE2, LOW);

  Motor1.setMaxSpeed(20000);
  Motor2.setMaxSpeed(20000);
}
 
void loop() {
  recvWithStartEndMarkers();
  Motor1.runSpeed();
  Motor2.runSpeed();
  Motor1Data = map(Motor1Receive, 0, 30000, -15000, 15000);
  Motor2Data = map(Motor2Receive, 0, 30000, -15000, 15000);
  if (newData == true) {
    strcpy(tempChars, receivedChars);
    parseData();
    if (Motor1Data > 2){
      Motor1.setSpeed(Motor1Data);
    }
    else if (Motor1Data < - 2){
      Motor1.setSpeed(Motor1Data);
    }
    else{
      Motor1.setSpeed(0);
    }
    if (Motor2Data > 2){
      Motor2.setSpeed(Motor2Data);
    }
    else if (Motor2Data < -2){
      Motor2.setSpeed(Motor2Data);
    }
    else{
      Motor2.setSpeed(0);
    }
    newData = false;
  }
}

void recvWithStartEndMarkers() {
    static boolean recvInProgress = false;
    static byte ndx = 0;
    char startMarker = '<';
    char endMarker = '>';
    char PythonRead;
    while (Serial.available() > 0 && newData == false) {
        PythonRead = Serial.read();
        if (recvInProgress == true) {
            if (PythonRead != endMarker) {
                receivedChars[ndx] = PythonRead;
                ndx++;
                if (ndx >= numChars) {
                    ndx = numChars - 1;
                }
            }
            else {
                receivedChars[ndx] = '\0'; // terminate the string
                recvInProgress = false;
                ndx = 0;
                newData = true;
            }
        }

        else if (PythonRead == startMarker) {
            recvInProgress = true;
        }
    }
}

void parseData() {      // split the data into its parts

    char * strtokIndex; // this is used by strtok() as an index

    strtokIndex = strtok(tempChars,",");
    Motor1Receive = atoi(strtokIndex);
    
    strtokIndex = strtok(NULL, ",");
    Motor2Receive = atoi(strtokIndex);
}

ESP8266 is in the title name, why not use the ESP8266 WiFI driver?

ESP8266WiFi library — ESP8266 Arduino Core documentation (arduino-esp8266.readthedocs.io)

#include <ESP8266WiFi.h>

void setup()
{
  Serial.begin(115200);
  Serial.println();

  WiFi.begin("network-name", "pass-to-network");

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

  Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {}

Notice the ESP8266 does NOT use the WIFi library?

i switched out the library now it says esp8266 library is not used

What does "it" really say?

Not used: C:\Users(me)\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\libraries\ESP8266WiFi

Used: C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi

Let me rephrase - what does the compiler actually say?
All of it.

C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src\ESP8266WiFiMulti.cpp: In function 'wl_status_t waitWiFiConnect(uint32_t)':
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src\ESP8266WiFiMulti.cpp:89:5: error: 'esp_delay' was not declared in this scope
89 | esp_delay(connectTimeoutMs,
| ^~~~~~~~~
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src\ESP8266WiFiMulti.cpp: In member function 'int8_t ESP8266WiFiMulti::startScan()':
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src\ESP8266WiFiMulti.cpp:241:5: error: 'esp_delay' was not declared in this scope
241 | esp_delay(WIFI_SCAN_TIMEOUT_MS,
| ^~~~~~~~~
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src\ESP8266WiFiScan.cpp: In member function 'int8_t ESP8266WiFiScanClass::scanNetworks(bool, bool, uint8, uint8*)':
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src\ESP8266WiFiScan.cpp:100:9: error: 'esp_suspend' was not declared in this scope
100 | esp_suspend( { return !ESP8266WiFiScanClass::_scanComplete && ESP8266WiFiScanClass::_scanStarted; });
| ^~~~~~~~~~~
In file included from C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src\WiFiServerSecureBearSSL.cpp:37:
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src/include/ClientContext.h: In member function 'int ClientContext::connect(ip_addr_t*, uint16_t)':
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src/include/ClientContext.h:148:9: error: 'esp_delay' was not declared in this scope
148 | esp_delay(_timeout_ms, this { return this->_connect_pending; }, 1);
| ^~~~~~~~~
In file included from C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src\WiFiUdp.cpp:41:
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src/include/UdpContext.h: In member function 'bool UdpContext::sendTimeout(const ip_addr_t*, uint16_t, esp8266::polledTimeout::timeoutTemplate<false, esp8266::polledTimeout::YieldPolicy::DoNothing, esp8266::polledTimeout::TimePolicy::TimeUnit<esp8266::polledTimeout::TimePolicy::TimeSourceCycles, 1000> >::timeType)':
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src/include/UdpContext.h:414:13: error: 'esp_yield' was not declared in this scope
414 | esp_yield();
| ^~~~~~~~~
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src\ESP8266WiFiSTA-WPS.cpp: In member function 'bool ESP8266WiFiSTAClass::beginWPSConfig()':
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src\ESP8266WiFiSTA-WPS.cpp:77:5: error: 'esp_suspend' was not declared in this scope
77 | esp_suspend( { return _wps_config_pending; });
| ^~~~~~~~~~~
In file included from C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src\WiFiServer.cpp:38:
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src/include/ClientContext.h: In member function 'int ClientContext::connect(ip_addr_t*, uint16_t)':
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src/include/ClientContext.h:148:9: error: 'esp_delay' was not declared in this scope
148 | esp_delay(_timeout_ms, this { return this->_connect_pending; }, 1);
| ^~~~~~~~~
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src/include/ClientContext.h: In member function 'size_t ClientContext::_write_from_source(const char*, size_t)':
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src/include/ClientContext.h:489:13: error: 'esp_delay' was not declared in this scope
489 | esp_delay(_timeout_ms, this { return this->_send_waiting; }, 1);
| ^~~~~~~~~
In file included from C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src\WiFiClientSecureBearSSL.cpp:45:
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src/include/ClientContext.h: In member function 'int ClientContext::connect(ip_addr_t*, uint16_t)':
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src/include/ClientContext.h:148:9: error: 'esp_delay' was not declared in this scope
148 | esp_delay(_timeout_ms, this { return this->_connect_pending; }, 1);
| ^~~~~~~~~
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src/include/ClientContext.h: In member function 'size_t ClientContext::_write_from_source(const char*, size_t)':
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src/include/ClientContext.h:489:13: error: 'esp_delay' was not declared in this scope
489 | esp_delay(_timeout_ms, this { return this->_send_waiting; }, 1);
| ^~~~~~~~~
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src/include/ClientContext.h: In member function 'size_t ClientContext::_write_from_source(const char*, size_t)':
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src/include/ClientContext.h:489:13: error: 'esp_delay' was not declared in this scope
489 | esp_delay(_timeout_ms, this { return this->_send_waiting; }, 1);
| ^~~~~~~~~
In file included from C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src\WiFiClient.cpp:41:
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src/include/ClientContext.h: In member function 'int ClientContext::connect(ip_addr_t*, uint16_t)':
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src/include/ClientContext.h:148:9: error: 'esp_delay' was not declared in this scope
148 | esp_delay(_timeout_ms, this { return this->_connect_pending; }, 1);
| ^~~~~~~~~
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src/include/ClientContext.h: In member function 'size_t ClientContext::_write_from_source(const char*, size_t)':
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src/include/ClientContext.h:489:13: error: 'esp_delay' was not declared in this scope
489 | esp_delay(_timeout_ms, this { return this->_send_waiting; }, 1);
| ^~~~~~~~~
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src\ESP8266WiFiGeneric.cpp: In member function 'bool ESP8266WiFiGenericClass::mode(WiFiMode_t)':
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src\ESP8266WiFiGeneric.cpp:442:9: error: 'esp_delay' was not declared in this scope
442 | esp_delay(timeoutValue, m { return wifi_get_opmode() != m; }, 5);
| ^~~~~~~~~
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src\ESP8266WiFiGeneric.cpp: In member function 'int ESP8266WiFiGenericClass::hostByName(const char*, IPAddress&, uint32_t)':
C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi\src\ESP8266WiFiGeneric.cpp:626:9: error: 'esp_delay' was not declared in this scope
626 | esp_delay(timeout_ms, { return _dns_lookup_pending; }, 1);
| ^~~~~~~~~
Multiple libraries were found for "ESP8266WiFi.h"
Used: C:\Users\me\Documents\Arduino\libraries\ESP8266WiFi
Not used: C:\Users\me\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\libraries\ESP8266WiFi
exit status 1
Error compiling for board LOLIN(WEMOS) D1 mini (clone).

i sent the library in documents that was causing problems to the recycle bin now it compiles

it uploads and i get

 ets Jan  8 2013,rst cause:4, boot mode:(3,6)

wdt reset
load 0x4010f000, len 3460, room 16 
tail 4
chksum 0xcc
load 0x3fff20b8, len 40, room 4 
tail 4
chksum 0xc9
csum 0xc9
v000450f0
~ld

My speculation, but the '8266 loop has to loop quickly or it will WDT (2.5 sec.?).
If it lingers in some function for instance. This is where yield() should be placed. I guess it's a "cheap way out", but I don't know what the better way is.

such as where it tries to connect to wifi? because i dont get anything in serial monitor other than the watchdog. how would i use yield()

yield is everywhere now just to be safe still watchdog error

It would be in a place (or places) in loop().
I found out about it doing with an NTP clock and I went into a long, long millis-based 'wake-up' where it would bomb (which is where I put it).

Sounds desperate.

What happens if you add as the first line in loop()
Serial.println("Got Here");

I'm not a WiFi maven, but my NTP clock includes were/are --
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>