BMP280 + Wemos D1 mini pro (Soft WDT reset)

Buenas!!!
Son nuevo en el foro y disculpas si hay algún tema abierto sobre esto y no lo pude encontrar. Al asunto!!!!
Tengo conectado un BMP280 tipo Adafruit con un Clon Chino de Wemos D1 mini pro.
Cuando utilizo el sketch de ejemplo para testear, lo detecta perfectamente en la dir 0x76 (con esto descarto error de cableado) pero al subirle cualquier otro para tomar los datos y presentarlo por la consola o enviarlos a internet (ThingSpeak), salta el WDT por soft con el vuelco en Stack. Antes de postear la info... será posible que no tolere la capacidad de mem para el bloque de la pila?

Sketch:

/**********************************************
 * Catalin Batrinu bcatalin@gmail.com 
 * Read temperature and pressure from BMP280
 * and send it to thingspeaks.com
**********************************************/

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <ESP8266WiFi.h>

#define BMP_SCK 13
#define BMP_MISO 12
#define BMP_MOSI 11 
#define BMP_CS 10

Adafruit_BMP280 bme; // I2C
// replace with your channel’s thingspeak API key,
String apiKey = "xxxxxxxxxxxxxxxxx";
const char* ssid = "Invitados";
const char* password = "";
const char* server = "api.thingspeak.com";
WiFiClient client;


/**************************  
 *   S E T U P
 **************************/
void setup() {
  Serial.begin(9600);
  Serial.println(F("BMP280 test"));
  
  if (!bme.begin()) {  
    Serial.println("Could not find a valid BMP280 sensor, check wiring!");
    while (1);
  }
  WiFi.begin(ssid, password);
  
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");  
}

  /**************************  
 *  L O O P
 **************************/
void loop() {
    Serial.print("T=");
    Serial.print(bme.readTemperature());
    Serial.print(" *C");
    
    Serial.print(" P=");
    Serial.print(bme.readPressure());
    Serial.print(" Pa");

    //Serial.print(" A= ");
    //Serial.print(bme.readAltitude(1013.25)); // this should be adjusted to your local forcase
    //Serial.println(" m");

    if (client.connect(server,80))  // "184.106.153.149" or api.thingspeak.com
    {
        String postStr = apiKey;
        postStr +="&field1=";
        postStr += String(bme.readTemperature());
        postStr +="&field2=";
        postStr += String(bme.readPressure());
        postStr += "\r\n\r\n";
        
        client.print("POST /update HTTP/1.1\n");
        client.print("Host: api.thingspeak.com\n");
        client.print("Connection: close\n");
        client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
        client.print("Content-Type: application/x-www-form-urlencoded\n");
        client.print("Content-Length: ");
        client.print(postStr.length());
        client.print("\n\n");
        client.print(postStr);    
    }
    client.stop(); 
    //every 20 sec   
    delay(20000);
}

Info de compilación:

. Variables and constants in RAM (global, static), used 29164 / 80192 bytes (36%)
║ SEGMENT BYTES DESCRIPTION
╠══ DATA 1516 initialized variables
╠══ RODATA 1248 constants
╚══ BSS 26400 zeroed variables
. Instruction RAM (IRAM_ATTR, ICACHE_RAM_ATTR), used 61059 / 65536 bytes (93%)
║ SEGMENT BYTES DESCRIPTION
╠══ ICACHE 32768 reserved space for flash instruction cache
╚══ IRAM 28291 code in IRAM
. Code in flash (default, ICACHE_FLASH_ATTR), used 255904 / 1048576 bytes (24%)
║ SEGMENT BYTES DESCRIPTION
╚══ IROM 255904 code in flash

Vuelco de Consola:
--------------- CUT HERE FOR EXCEPTION DECODER ---------------

Soft WDT reset

Exception (4):
epc1=0x4020108c epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000

stack>>>

ctx: cont
sp: 3ffffe40 end: 3fffffd0 offset: 0160
3fffffa0: feefeffe feefeffe feefeffe 3ffee8bc
3fffffb0: 3fffdad0 00000000 3ffee890 40204fa0
3fffffc0: feefeffe feefeffe 3fffdab0 40100f21
<<<stack<<<

--------------- CUT HERE FOR EXCEPTION DECODER ---------------
z9▒▒▒H▒BMP280 test ▒ P9▒
Could not find a valid BMP280 sensor, check wiring!

Decodificación por la herramienta ESP Exception Decoder:

Exception 4: Level1Interrupt: Level-1 interrupt as indicated by set level-1 bits in the INTERRUPT register PC: 0x4020108c EXCVADDR: 0x00000000 Decoding stack results 0x40204fa0: loop_wrapper() at C:\Users\dinanno.pablo\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\cores\esp8266*core_esp8266_main.cpp* line 255

Aclaración:
Para uso del ESP Exception decoder, tuve que hacer un downgrade a la versión IDE 1.8.19 desde la 2.2.1 pero el sketch posteado se corrió bajo ambas y con el mismo resultado.
Bueno, creo que eso es todo y reitero las disculpas por si no estoy posteando la información correctamente.
Saludos y mil gracias por la ayuda
Pablo

la excepción supongo que es por esa línea. es normal que salte en un while(1);
Puedes postear un código que sí te funcione?
p.d.: puedes poner esto para desactivar el "perro guardián" pero no te lo aconsejo: ESP.wdtDisable();

Para mantener el while() en lugar de desactivar el WDT lo haría así

while (1) {
  yield();
}

para que se puedan ejecutar los procesos que corren en segundo plano.

Agrego:

La librería Adafruit_BMP280, por defecto, trabaja con otra dirección

#define BMP280_ADDRESS (0x77) /**< The default I2C address for the sensor. */

Entonces en lugar de

bme.begin();

deberías usar

bme.begin(BMP280_ADDRESS_ALT, BMP280_CHIPID);

ya que

#define BMP280_ADDRESS_ALT (0x76)    /**< Alternative I2C address for the sensor. */

Ten en cuenta que por defecto

#define BMP280_CHIPID (0x58)  /**< Default chip ID. */

Esperemos que no sea otro escollo.

Otra opción, que me parece más sencilla, es editar el archivo Adafruit_BMP280.h e intercambiar la definición de ambas direcciones y listo.

1 Like

Hola DanX3, gracias...
Voy a revisar los sketchs que tengo para ver si es necesario intervenir este procedimiento realmente.
Pablo

Hola MaximoEsfuerzo
Esa línea que me marcás se me pasó.... creo porque forcé la dirección dado el mismo mensaje de "revise el cableado bla bla bla bla....." lo rehago y veo.

Paso un sketch para escanear el i2c por medio del cual obtuve esa dirección del módulo:

SKETCH

:

// --------------------------------------
// i2c_scanner
//
// Version 1
//    This program (or code that looks like it)
//    can be found in many places.
//    For example on the Arduino.cc forum.
//    The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
//     Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26  2013
//    V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
//    by Arduino.cc user Krodal.
//    Changes by louarnold removed.
//    Scanning addresses changed from 0...127 to 1...119,
//    according to the i2c scanner by Nick Gammon
//    https://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
// Version 6, November 27, 2015.
//    Added waiting for the Leonardo serial communication.
// 
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//

#include <Wire.h>


void setup()
{
  Wire.begin();

  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}


void loop()
{
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4) 
    {
      Serial.print("Unknown error at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");

  delay(5000);           // wait 5 seconds for next scan
}

Salida de consola

Scanning...

I2C device found at address 0x76 !

doneScanning...
I2C device found at address 0x76 !
done

A este sketch de búsqueda de la dirección, lo considero uno por el cual el módulo funciona correctamente. De todas maneras voy a subirle otro con solo un script para el DHT22 modelo AW2302 y veremos que pasa y más tarde lo cuelgo.
Saludos
Pablo

Creo que no me entendiste...

Tu módulo tiene dirección 0x76, perfecto, nadie lo discute, pero la librería, por defecto, se comunica con el sensor en la dirección 0x77 entonces no va a encontrar tu sensor.
Por eso debes usar

bme.begin(BMP280_ADDRESS_ALT, BMP280_CHIPID);

en lugar de simplemente

bme.begin();

Si amigo claro que lo entendí.... solo aclaraba para que quedará sin dudas que el sketch de testeo del canal i2c corría sin errores (DanX3 lo solicitó) y la dirección fuera esa.
Ahora bien, paso a decirte que hecha la modificación que sugeriste:

Parte del código posteado inicialmente y sus líneas para ubicarlo

34  if (!bme.begin(BMP280_ADDRESS_ALT, BMP280_CHIPID)) {  
35     Serial.println("Could not find a valid BMP280 sensor, check wiring!");
36   while (1);
37  }

se solucionó y salió volando el dato.
Muchas gracias kapo!!!!

salida de consola:

Connecting to 2.4G_B5F0

.......

WiFi connected

T=29.05 *C P=99221.61 Pa A= 176.61 m

T=29.04 *C P=99217.81 Pa A= 176.93 m

Mil gracias y doy por cerrado el caso