Soft WDT reset Esp8266

Tengo un proyecto con el esp pero funciona uno par de minutos y después se bloquea y reinicia, estoy tratando de hacer un dimmer digital alguien por favor que me oriente para corregir este error, este el código

Tengo entendido que es una especie de proteccion del microcontrolador.....

COMO DATO IMPORTANTO EL PROGRAMA SOLO FALLA CUANDO CONTECTO EL OPTOACOPLADOR DONDE HAGO LA DETECCION DE CRUCE POR CERO

#include <ESP8266WiFi.h>;
#include <FirebaseESP8266.h>

#define FIREBASE_HOST "" // Enlace del proyecto de Firebase
#define FIREBASE_AUTH ""// Token de autorización
#define paso0 D5
#define disparo D6

#define WIFI_SSID ""
#define WIFI_PASSWORD ""

int Valorpote=0;
int ValorSalida=0;
int TiempoSemiciclo= 10000;
int tiempoDisparo=800;

FirebaseData objeto;

void setup() {
Serial.begin(115200); //Tasa de baudios predeterminada para NodeMCU
// Conectarse a la red WiFi
Serial.println();
Serial.println();
Serial.print("Conectado a ");
Serial.println(WIFI_SSID);
WiFi.begin(WIFI_SSID,WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi conectado");
Serial.println("Direccion IP: ");
Serial.println(WiFi.localIP());

Firebase.begin(FIREBASE_HOST,FIREBASE_AUTH);

pinMode(paso0,INPUT);
pinMode(disparo,OUTPUT);

}

ICACHE_RAM_ATTR void Zero_Cross(){
if(ValorSalida>0){

delayMicroseconds(ValorSalida);
digitalWrite(disparo,HIGH);
delayMicroseconds(800);
digitalWrite(disparo,LOW);
}
else {
digitalWrite(disparo,LOW);
}

}

void loop() {
yield();
if (Firebase.get(objeto,"/Dimmer/Dimmer")) {
if (objeto.dataType() == "string") {
String D1 = objeto.stringData();
if (D1=="0"){
Valorpote=0;
Serial.println(Valorpote);
ValorSalida=0;
Serial.println(ValorSalida);
}
else if (D1=="1"){
Valorpote=1;
Serial.println(Valorpote);
ValorSalida=600;
Serial.println(ValorSalida);
}
else if (D1=="2"){
Valorpote=2;
Serial.println(Valorpote);
ValorSalida=2000;
Serial.println(ValorSalida);
}
else if (D1=="3"){
Valorpote=3;
Serial.println(Valorpote);
ValorSalida=3000;
Serial.println(ValorSalida);
}
else if (D1=="4"){
Valorpote=4;
Serial.println(Valorpote);
ValorSalida=5000;
Serial.println(ValorSalida);
}
else if (D1=="5"){
Valorpote=5;
Serial.println(Valorpote);
ValorSalida=8000;
Serial.println(ValorSalida);
} }}
ICACHE_RAM_ATTR attachInterrupt( digitalPinToInterrupt(paso0),Zero_Cross, RISING);

        }

Hola
Por favor, vuelva a hacer su publicación colocando su código en etiquetas </>.
ArduinoForum

RV mineirin

1 Like

Hola @mauro_utn
Creo que el problema con tu boceto es porque
la función que crea la interrupción y define la rutina de interrupción se define continuamente porque está dentro de la función loop ().
Pruebe con el dibujo a continuación.

RV mineirin

#include <ESP8266WiFi.h>;
#include <FirebaseESP8266.h>

#define FIREBASE_HOST "" // Enlace del proyecto de Firebase
#define FIREBASE_AUTH ""// Token de autorización
#define paso0 D5
#define disparo D6

#define WIFI_SSID ""
#define WIFI_PASSWORD ""

int Valorpote = 0;
int ValorSalida = 0;
int TiempoSemiciclo = 10000;
int tiempoDisparo = 800;

FirebaseData objeto;

void setup() {
  Serial.begin(115200); //Tasa de baudios predeterminada para NodeMCU
  // Conectarse a la red WiFi
  Serial.println();
  Serial.println();
  Serial.print("Conectado a ");
  Serial.println(WIFI_SSID);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi conectado");
  Serial.println("Direccion IP: ");
  Serial.println(WiFi.localIP());

  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);

  pinMode(paso0, INPUT);
  pinMode(disparo, OUTPUT);
  ICACHE_RAM_ATTR attachInterrupt( digitalPinToInterrupt(paso0), Zero_Cross, RISING);

}

ICACHE_RAM_ATTR void Zero_Cross() {
  if (ValorSalida > 0) {

    delayMicroseconds(ValorSalida);
    digitalWrite(disparo, HIGH);
    delayMicroseconds(800);
    digitalWrite(disparo, LOW);
  }
  else {
    digitalWrite(disparo, LOW);
  }

}

void loop() {
  yield();
  if (Firebase.get(objeto, "/Dimmer/Dimmer")) {
    if (objeto.dataType() == "string") {
      String D1 = objeto.stringData();
      if (D1 == "0") {
        Valorpote = 0;
        Serial.println(Valorpote);
        ValorSalida = 0;
        Serial.println(ValorSalida);
      }
      else if (D1 == "1") {
        Valorpote = 1;
        Serial.println(Valorpote);
        ValorSalida = 600;
        Serial.println(ValorSalida);
      }
      else if (D1 == "2") {
        Valorpote = 2;
        Serial.println(Valorpote);
        ValorSalida = 2000;
        Serial.println(ValorSalida);
      }
      else if (D1 == "3") {
        Valorpote = 3;
        Serial.println(Valorpote);
        ValorSalida = 3000;
        Serial.println(ValorSalida);
      }
      else if (D1 == "4") {
        Valorpote = 4;
        Serial.println(Valorpote);
        ValorSalida = 5000;
        Serial.println(ValorSalida);
      }
      else if (D1 == "5") {
        Valorpote = 5;
        Serial.println(Valorpote);
        ValorSalida = 8000;
        Serial.println(ValorSalida);
      }
    }
  }
}

Hola lo probe pero no, salio el mismo error en el codigo serial

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

No se si lo llegaste a leer por ahi tenga algo que ver pero noto que cuando no energizo la parte de deteccion de cruce por cero, osea que no energizo el optoocoplador el programa corre si detenerse pero pero cuando conecto el opto al la red y emppieza a hacer la deteccion se al rato se reinicia el programa

Porque en una interrupción tienes un retardo de 800 + 8000 uSeg?
Eso es una barbaridad!!
Lo enfatizo porque es el peor uso que le puedes dar a una interrupcion.
Una interrupción es VELOZ, entras y sales.
Estas casi hasta un máximo de 8.8 mseg de 1.4 a 8.8 mseg máximo.

El ESP se reinicia porque se activa el watchdog. Es obvio que asi pase.
Debes hacer eso mismo en tu loop no en la ISR.
La forma de hacerlo es con un flag.
cuando se da la condición

if(ValorSalida>0){
  flag = true;
else
  flag = false;

y en tu loop entonces si

if (flag) {
delayMicroseconds(ValorSalida);  // y esto puede ser 8000 microsegundos
  digitalWrite(disparo,HIGH);
  delayMicroseconds(800);
  digitalWrite(disparo,LOW);
}
else {
   digitalWrite(disparo,LOW);
}