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