ESP32 error Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled

Hola Muchachos, tengo un problema que no me deja avanzar.

Necesito hacer un datalogger con un ESP32 que me capture los datos obtenidos por i2c de un sensor barometrico, y un conversor analogo digital ADS1115 y los envie a firebase.

El programa en cuestión:

#include <Wire.h>
#include <WiFi.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <Adafruit_ADS1X15.h>
#include <FirebaseESP32.h>
#include <addons/TokenHelper.h>
#include <addons/RTDBHelper.h>

#define SEALEVELPRESSURE_HPA (1013.25)

// WiFi configuration
#define WIFI_SSID "asdasd"
#define WIFI_PASSWORD "asdasd"

// Firebase configuration
#define API_KEY "asdasdasd"
#define DATABASE_URL "asdasd"
#define USER_EMAIL "asdasd"
#define USER_PASSWORD "asdasd"

// Pin configuration
#define VENTILADOR_PIN 2

FirebaseData fbdo; // Objeto para manejar la conexión con Firebase
FirebaseAuth auth;  // Objeto de autenticación para Firebase
FirebaseConfig config; // Configuración de Firebase

unsigned long sendDataPrevMillis = 0;
unsigned long delayTime;

Adafruit_BME280 bme; // Objeto para el sensor BME280
Adafruit_ADS1115 ads; // Objeto para el módulo ADS1115

// Callback para el estado del token
void tokenStatusCallback(bool isOk, uint8_t code) {
  if (!isOk) {
    Serial.printf("Error al generar token: %d\n", code);
  } else {
    Serial.println("Token generado correctamente");
  }
}

// Configuración inicial
void setup() {
  Serial.begin(115200);

  connectWiFi();     // Conectar a WiFi
  configFirebase();   // Configurar Firebase

  // Configuración del sensor barométrico
  Serial.println(F("BME280 test"));
  if (!bme.begin(0x76)) {
    Serial.println("No se pudo encontrar un sensor BME280 válido, ¡verifica la conexión!");
    while (1);
  }

  Serial.println("-- Prueba Predeterminada --");
  delayTime = 1000;
  Serial.println();

  pinMode(VENTILADOR_PIN, OUTPUT); // Definir el PIN para el ventilador
}

// Bucle principal
void loop() {
  // Lecturas del sensor y envío a Firebase
  sendSensorDataToFirebase();
  
  // Activar ventiladores
  float temperatura = bme.readTemperature();
  controlarSalida(temperatura > 28.0);

  delay(delayTime);
}

// Función para conectar a WiFi
void connectWiFi() {
  Serial.print("Conectando a Wi-Fi");
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(300);
  }
  Serial.println();
  Serial.print("Conectado con IP: ");
  Serial.println(WiFi.localIP());
}

// Función para configurar Firebase
void configFirebase() {
  config.api_key = API_KEY;
  auth.user.email = USER_EMAIL;
  auth.user.password = USER_PASSWORD;
  config.database_url = DATABASE_URL;
  config.token_status_callback = tokenStatusCallback;

  Firebase.begin(&config, &auth);
  Firebase.reconnectWiFi(true);
  Firebase.setDoubleDigits(5);
}

// Función para controlar la salida (ventilador)
void controlarSalida(bool estado) {
  digitalWrite(VENTILADOR_PIN, estado ? HIGH : LOW);
}

// Función para enviar datos del sensor a Firebase
void sendSensorDataToFirebase() {
  Serial.print("Temperatura = ");
  Serial.print(bme.readTemperature());
  Serial.println(" *C");

  Serial.print("Presión = ");
  Serial.print(bme.readPressure() / 100.0F);
  Serial.println(" hPa");

  Serial.print("Approx. Altitud = ");
  Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
  Serial.println(" m");

  Serial.print("Humedad = ");
  Serial.print(bme.readHumidity());
  Serial.println(" %");

  Serial.print("Ventiladores = ");
  Serial.println(digitalRead(VENTILADOR_PIN));

  int16_t adc0, adc1, adc2, adc3;
  float volts0, volts1, volts2, volts3;

  adc0 = ads.readADC_SingleEnded(0);
  adc1 = ads.readADC_SingleEnded(1);
  adc2 = ads.readADC_SingleEnded(2);
  adc3 = ads.readADC_SingleEnded(3);
  
  volts0 = ads.computeVolts(adc0);
  volts1 = ads.computeVolts(adc1);
  volts2 = ads.computeVolts(adc2);
  volts3 = ads.computeVolts(adc3);

  Serial.print("Voltaje batería = ");
  Serial.print(volts0);
  Serial.println(" V");

  Serial.print("Corriente batería = ");
  Serial.print(volts1);
  Serial.println(" A");

  Serial.print("Voltaje control = ");
  Serial.print(volts2);
  Serial.println(" V");

  Serial.print("Voltaje IoT = ");
  Serial.print(volts3);
  Serial.println(" V");

  Serial.println("Datos impresos por Serial");

  if (Firebase.ready() && (millis() - sendDataPrevMillis > 15000 || sendDataPrevMillis == 0)) {
    sendDataPrevMillis = millis();

    // Enviar datos a Firebase
    Firebase.setFloat(fbdo, F("/sensor/temperatura"), bme.readTemperature());
    Firebase.setFloat(fbdo, F("/sensor/presion"), bme.readPressure() / 100.0F);
    Firebase.setFloat(fbdo, F("/sensor/altitud"), bme.readAltitude(SEALEVELPRESSURE_HPA));
    Firebase.setFloat(fbdo, F("/sensor/humedad"), bme.readHumidity());
    Firebase.setFloat(fbdo, F("/sensor/voltaje_batería"), volts0);
    Firebase.setFloat(fbdo, F("/sensor/corriente_batería"), volts1);
    Firebase.setFloat(fbdo, F("/sensor/voltaje_control"), volts2);
    Firebase.setFloat(fbdo, F("/sensor/voltaje_IoT"), volts3);
    
    Serial.println("Datos del sensor enviados a Firebase");
  }
}

acá es donde me arroja el error panic'ed.
Logré aislar el error y es cuando agrego "adc0 = ads.readADC_SingleEnded(0)" que el codigo no funciona.

El codigo que si me funciona con ambos sensores y me arroja los valores por serial es el siguiente:

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <Adafruit_ADS1X15.h>

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme;
Adafruit_ADS1115 ads;

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

  if (!bme.begin(0x76)) {
    Serial.println("No se pudo encontrar un sensor BME280 válido, ¡verifica la conexión!");
    while (1);
  }

  ads.begin();
  pinMode(2, OUTPUT);
}

void loop() {
  sendSensorData();

  float temperatura = bme.readTemperature();
  controlarSalida(temperatura > 28.0);

  delay(1000);
}

void controlarSalida(bool estado) {
  digitalWrite(2, estado ? HIGH : LOW);
}

void sendSensorData() {
  Serial.print("Temperatura = ");
  Serial.print(bme.readTemperature());
  Serial.println(" *C");

  Serial.print("Presión = ");
  Serial.print(bme.readPressure() / 100.0F);
  Serial.println(" hPa");

  Serial.print("Approx. Altitud = ");
  Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
  Serial.println(" m");

  Serial.print("Humedad = ");
  Serial.print(bme.readHumidity());
  Serial.println(" %");

  int16_t adc0, adc1, adc2, adc3;
  float volts0, volts1, volts2, volts3;

  adc0 = ads.readADC_SingleEnded(0);
  adc1 = ads.readADC_SingleEnded(1);
  adc2 = ads.readADC_SingleEnded(2);
  adc3 = ads.readADC_SingleEnded(3);
  
  volts0 = ads.computeVolts(adc0);
  volts1 = ads.computeVolts(adc1);
  volts2 = ads.computeVolts(adc2);
  volts3 = ads.computeVolts(adc3);

  Serial.print("Voltaje batería = ");
  Serial.print(volts0);
  Serial.println(" V");

  Serial.print("Corriente batería = ");
  Serial.print(volts1);
  Serial.println(" A");

  Serial.print("Voltaje control = ");
  Serial.print(volts2);
  Serial.println(" V");

  Serial.print("Voltaje IoT = ");
  Serial.print(volts3);
  Serial.println(" V");
  
  Serial.println("Datos impresos por Serial");
}

espero me puedan ayudar!

Saludos

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