Esp8266 - serial monitor - código basura

Tengo un esp8266 D1 mini con un relay 5vdc de 1 canal y un sensor de temperatura ds18b20.
el relay esta conectado de esta forma:
Señal: D1
Positivo: 5V
GND: G

sensor de temperatura
Señal: D2
positivo: 3v3
Gnd: G (junto con el gnd de relay)

mi objetivo es controlar el relay por medio de wifi y hacerlo desde cualquier sitio con puertos abiertos desde mi router

el sensor de temperatura debe analizar cada minuto y enviar los datos a thingspeak para luego monitorear desde mi telefono.

tengo el siguiente codigo en arduino, no soy tan bueno es mi primer proyecto y al momento de compilar no arroja ningun error, pero al subir el codigo a la placa esp8266 tira errores en el monitor de serial, el sensor lo tenia conectado en D6 de la placa, pero me tiró error asi que lo cambié a D2 y levantó en primera instancia luego quizé probar nuevamente y me tira error, voy a adjuntar el codigo y posteriormente el error que me da en el monitor de serial

la api key es publico, no hay problema con ello. lo que necesito es saber como solucionar el problema de que se resetea a veces dando loop de codigo inentendible

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

String apiKey = "YZHH259D230T6I1L";     //  Poner la apikey que te da ThingSpeak
const char* ssid = "WIRELESS";                   // WRITE YOUR WIFI SSID
const char* password = "XXXXXXXXX";     // WRITE YOUR WIFI PASSWORD
const char* web_password = "XXXXX"; // WRITE SOMETHING SECURE AND RANDOM

// Pin definitions
const int temperaturePin = D2;  // Pin where the DS18B20 is connected

const int relayPin = D1;
byte mac[6];                     // the MAC address of your Wifi shield

IPAddress ip(172, 16, 1, 176);
IPAddress subnet(255, 255, 255, 0);
IPAddress gateway(172, 16, 1, 1);
IPAddress dns(8, 8, 8, 8); // Dirección DNS de Google

ESP8266WebServer server(8085);

const int led = 13;

#define ONE_WIRE_BUS D2   // D2 es el pin donde se conecta el sensor DS18B20

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

WiFiClient client;

float tempC = 0;  // Variable to hold temperature in Celsius

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);
  pinMode(relayPin, OUTPUT);
  digitalWrite(led, 0);
  Serial.begin(115200);
  sensors.begin();
  WiFi.mode(WIFI_STA);
  WiFi.config(ip, gateway, subnet, dns);
  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());
  WiFi.macAddress(mac);
  Serial.print("MAC: ");
  Serial.print(mac[5],HEX);
  Serial.print(":");
  Serial.print(mac[4],HEX);
  Serial.print(":");
  Serial.print(mac[3],HEX);
  Serial.print(":");
  Serial.print(mac[2],HEX);
  Serial.print(":");
  Serial.print(mac[1],HEX);
  Serial.print(":");
  Serial.println(mac[0],HEX);

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

  server.on("/", handleRoot);

  server.on("/shortpresspowerbutton", [](){
    if(server.arg(0) == web_password) {
      digitalWrite(relayPin, HIGH); // turn on relay with voltage HIGH
      delay(200);              // pause
      digitalWrite(relayPin, LOW);  // turn off relay with voltage LOW
      delay(500);              // pause
      server.send(200, "text/plain", "Button pressed");
    } else {
      server.send(200, "text/plain", "Button not pressed");
    }
  });
  server.on("/longpresspowerbutton", [](){
      if(server.arg(0) == web_password) {
      digitalWrite(relayPin, HIGH); // turn on relay with voltage HIGH
      delay(5000);              // pause
      digitalWrite(relayPin, LOW);  // turn off relay with voltage LOW
      delay(500);              // pause
      server.send(200, "text/plain", "Button pressed");
    } else {
      server.send(200, "text/plain", "Button not pressed");
    }
  });
  server.on("/ultralongpresspowerbutton", [](){
      if(server.arg(0) == web_password) {
      digitalWrite(relayPin, HIGH); // turn on relay with voltage HIGH
      delay(9000);              // pause
      digitalWrite(relayPin, LOW);  // turn off relay with voltage LOW
      delay(500);              // pause
      server.send(200, "text/plain", "Button pressed");
    } else {
      server.send(200, "text/plain", "Button not pressed");
    }
  });

  server.onNotFound(handleNotFound);

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

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

  // Read temperature data
  sensors.requestTemperatures();  
  float temperature = sensors.getTempCByIndex(0);

  // Check if readings are valid
  if (temperature != -127.00) {
    // Build the request string
    String url = "/update?api_key=";
    url += apiKey;
    url += "&field1=";
    url += String(temperature);
    url += "&field2=";

    // Make the HTTP request to ThingSpeak
    if (client.connect("api.thingspeak.com", 80)) {
      Serial.println("Sending data to ThingSpeak");
      client.println("GET " + url + " HTTP/1.1");
      client.println("Host: api.thingspeak.com");
      client.println("Connection: close");
      client.println();
      delay(1000);
    }
    else {
      Serial.println("Failed to connect to ThingSpeak");
    }

    // Print values to serial monitor
    Serial.print("Temperature: ");
    Serial.print(temperature);
    Serial.println(" °C");
  }
  else {
    Serial.println("Error reading sensor data");
  }

  // Wait for 1 minute  before sending the next request
  delay(60000);
}

la api key es publico, no hay problema con ello. lo que necesito es saber como solucionar el problema de que se resetea a veces dando loop de codigo inentendible

wdt reset
load 0x4010f000, len 3424, room 16 
tail 0
chksum 0x2e
load 0x3fff20b8, len 40, room 8 
tail 0
chksum 0x2b
csum 0x2b
v00050a00
~ld
   n r  n| l l`bbrl nB nl` rl l  
 ets Jan  8 2013,rst cause:4, boot mode:(3,6)

wdt reset
load 0x4010f000, len 3424, room 16 
tail 0
chksum 0x2e
load 0x3fff20b8, len 40, room 8 
tail 0
chksum 0x2b
csum 0x2b
v00050a00
~ld

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

load 0x4010f000, len 3424, room 16 
tail 0
chksum 0x2e
load 0x3fff20b8, len 40, room 8 
tail 0
chksum 0x2b
csum 0x2b
v00050a00
~ld


--------------- CUT HERE FOR EXCEPTION DECODER ---------------

Exception (2):
epc1=0x3ffe9148 epc2=0x00000000 epc3=0x00000000 excvaddr=0x3ffe9148 depc=0x00000000

>>>stack>>>

ctx: sys
sp: 3fffee20 end: 3fffffb0 offset: 0150
3fffef70:  40000e19 000509f7 bff00000 0000bfff  
3fffef80:  00000005 aa55aa55 000000ed 401055dd  
3fffef90:  401055e3 bff00000 0000bfff 2c000000  
3fffefa0:  4010000d bff00000 000509f7 401000ab  
3fffefb0:  40232688 3fffef4c 40232641 3ffffee8  
3fffefc0:  3fffffd0 00000000 00000000 feefeffe  
3fffefd0:  feefeffe feefeffe feefeffe feefeffe  
3fffefe0:  feefeffe feefeffe feefeffe feefeffe  
3fffeff0:  feefeffe feefeffe feefeffe feefeffe  
3ffff000:  feefeffe feefeffe feefeffe feefeffe  

tengo los baudios a 115200 tanto el arduino como en el codigo.

agradecería su ayuda

El problema son los delays demasiado largos que has puesto.
El 8266 necesita hacer tareas en segundo plano (por ej. mantener la conexión wifi) y los delays no permiten que se realicen, por lo que pasado unos milisegundos el watchdog resetea (WDT reset) el controlador porque interpreta que el micro se "colgó".

Mi ESP se bloquea al correr el programa. ¿Como lo resuelvo? — documentación de ESP8266 Arduino Core - 2.4.0 (esp8266-arduino-spanish.readthedocs.io)

Pero, por que cuando prueba en otra red y en otro ordenador, me va perfecto sin errores, manteniendo los mismos delays, mismo codigo a excepto de la configuración wifi, la cual esta bien configurada en ambos casos, envia datos a cada minuto al server thingspeak y ejecuta el relay

el error pasa cuando cambio de pc a una laptop, e instalado las mismas librerias y drivers , he probado en 2 laptops y es el mismo incidente.

Si pruebas en otra red te funciona el código?
Pero tu ESP se conecta a internet por DHCP o por IP estática?
Puedes revisar en la red que si te funciona que iP tienes, en lo que reviso tu código parece ser un error de red, ya que tu forma de declarar la MAC se me hace un poco rara

byte mac[6];                     // the MAC address of your Wifi shield

IPAddress ip(172, 16, 1, 176);
IPAddress subnet(255, 255, 255, 0);
IPAddress gateway(172, 16, 1, 1);
IPAddress dns(8, 8, 8, 8); // Dirección DNS de Google

Por eso quisiera saber si puedes entrar al router de la red que si conecta el ESP y mostrar la tabla de ARP o de DHCP para visualizar con que MAC y con que IP se registra el ESP8266 o sino prueba obteniendo la MAC de tu esp8266 con este código

#include <ESP8266WiFi.h>
 
void setup(){
 
   Serial.begin(115200);
   delay(500);
 
   Serial.println();
   Serial.print("MAC: ");
   Serial.println(WiFi.macAddress());
 
}
 
void loop(){}

Voy a intentarlo, el día de mañana me iré al lugar a intentar la recomendación.

una consulta adicional, cuando desconecto el esp8266 de la pc, y la quiero conectar a la fuente de alimentacion 5vdc, el código no se ejecuta porque ni siquiera se conecta a la red wifi como cliente

Como estas conectando el ESP8266, según las imagenes que anexas se trata de la tarjeta WeMos D1 mini :face_with_raised_eyebrow: :dizzy_face: según lo que escribes imagino que lo alimentas directamente a 5VDC, cuando claramente si ves la imagen a continuación se muestra que el PIN +5V es una salida de 5VDC cuando lo conectes via USB y a mi parecer esta placa no tiene pines de entrada VIN y solo puede ser energizada via USB

Es energizada via usb, pero ya me fije que si la alimentas con 5vdc por usb no va a ejecutar el código, lo que hice fue revisar bajarle el voltaje a 3.3v por usb allí si levanta y ejecuta lo que le pongas.

queda pendiente el día de mañana revisar el tema de la mac.

cabe resaltar que no tengo acceso al router debido a que es un red empresarial la cual pasa por switches router y demas, , solo tengo un punto de acceso por la cual mediante un ap saco mas con otros segmentos de ip

El D1Mini se puede alimentar directamente del puerto USB o por el pin 5V o por el pin 3V3 (todas O exclusivas).

El pin 5V está (mal) identificado en la foto como USB porque está conectado directamente a los 5V del mismo (no tiene diodo de protección como por ej. el Nano), entonces no se puede alimentar por el pin 5V y conectar a USB al mismo tiempo (al menos sin correr riesgo de quemar el puerto del computador).

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.