Wemos d1 mini продолжает сбрасывать настройки при использовании SIM800L

Я пытаюсь сделать небольшой проект с SIM800L с Wemos d1 mini. Это проект на основе DTMF. Проблема в том, что каждый раз, когда я звоню, d1 mini сбрасывается. Это мой первый проект с d1 mini. Последние несколько дней я гуглил, пытаясь найти решение. Но я потерпел неудачу. Буду очень признателен, если вы предоставите решение.

Я получаю следующие ошибки в последовательном мониторе:

 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
v00043b40
~ld

Я использую Arduino IDE. Версия: 1.8.8

Вот код моего проекта.

#include <SoftwareSerial.h>

#define rxPin D3
#define txPin D4
SoftwareSerial sim800L(rxPin, txPin);

#define RELAY_1 D7
#define RELAY_2 D8
boolean relay1_state = false;
boolean relay2_state = false;

//хранит входящие данные от sim800l
String buff;
String dtmf_cmd;
boolean is_call = false;
String ownerNumber = "xxxxxxxxxxxxxxx";

void setup()
{
  pinMode(RELAY_1, OUTPUT);
  pinMode(RELAY_2, OUTPUT);

  //Начать последовательную связь с (Serial Monitor)
  Serial.begin(115200);

  //Начать последовательную связь с (SIM800L)
  sim800L.begin(9600);
  Serial.println("Begin serial communication with (SIM800L)");
  delay(500);

  sim800L.println("AT"); //отправить AT
  delay(500);

  sim800L.println("AT+DDET=1"); // Включить DTMF
  delay(500);

  sim800L.println("AT+CLIP=1"); // Включить CallerID
  delay(500);
}

void loop()
{
  while (sim800L.available()) {
    buff = sim800L.readString();
    Serial.println("Raw: " + buff);

    if (is_call == true) {
      if (int index = buff.indexOf("+DTMF:") > -1 ) {
        index = buff.indexOf(":");
        dtmf_cmd = buff.substring(index + 1, buff.length());
        dtmf_cmd.trim();
        Serial.println("dtmf_cmd: " + dtmf_cmd);
        doAction();
      }
      if (buff.indexOf("NO CARRIER") > -1) {
        sim800L.println("ATH");
        is_call = false;
      }
    }
    if (buff.indexOf("RING") > -1) {

      // Теперь проверяем номер вызывающего абонента
      if (buff.indexOf("+CLIP:")) {
        unsigned int index, index1;

        index = buff.indexOf("\"");
        index1 = buff.indexOf("\"", index + 1);

        String temp = buff.substring(index + 2, index1);
        temp.trim();

        if (ownerNumber == "+" + temp) {
          Serial.println("Number matched");
          delay(2000);
          sim800L.println("ATA");
          is_call = true;
        } else {
          Serial.println("Number not matched");
        }
      }
    }
  }


  while (Serial.available())  {
    sim800L.println(Serial.readString());
  }
}


void doAction() {
  if (dtmf_cmd == "1") {
    relay1_state = !relay1_state;
    digitalWrite(RELAY_1, relay1_state);
    if (relay1_state == true)
    {
      Serial.println("Relay 1 has been ON");
    }
    else
    {
      Serial.println("Relay 1 has been OFF");
    }
  }
  else if (dtmf_cmd == "2") {
    relay2_state = !relay2_state;
    digitalWrite(RELAY_2, relay2_state);
    if (relay2_state == true)
    {
      Serial.println("Relay 2 has been ON");
    }
    else
    {
      Serial.println("Relay 2 has been OFF");
    }
  }
}

Настройки, которые в настоящее время имеет идентификатор Arduino

, 👍1

Обсуждение

Первая причина: 4, сброс сторожевого таймера. Добавьте yield() внутри вашего loop(), чтобы разрешить «дыхание» в каждом цикле., @hcheung

Я пробовал, ничего не изменилось., @S.k.joy