Problema al medir TDS mandando los datos a Firestore

Estoy usando una ESP32 para el desarrollo de un proyecto enfocado en la medicion de calidad del agua. Uso un sensor de pH (PH-4502-C), un sensor de temperatura DS18B20, un sensor ultrasónico y un medidor de TDS Keyestudio TDS V1.0
Tengo el problema de que al conectar todos los sensores y haciendo la logica para que las mediciones se manden a firestore de firebase el medidor de TDS deja de funcionar, prende pero no se reciben señales en la esp32. Si conecto todos los sensores pero no hago la funcionabilidad de mandarlos a firestore miden todos
Mi codigo es el siguiente:

#include <Firebase_ESP_Client.h>
#include <WiFi.h>
#include <addons/TokenHelper.h>
// #include <LiquidCrystal.h> // Libreria para la pantalla LCD
#include <OneWire.h>            // Libreria para la comunicación ONEWIRE
#include <DallasTemperature.h>  // Libreria para el sensor de temperatura

#define PIN_TEMPERATURA 2  // Pin para el sensor de temperatura
#define PIN_TDS 27         // Pin para el sensor de TDS
#define PIN_PH 35          // Pin para el sensor de pH

#define WIFI_SSID "<Clave de la red Wifi>"
#define WIFI_PASSWORD "<contraseña de la red Wifi>"

#define API_KEY "API DEL PROYECTO DE FIREBASE"
#define FIREBASE_PROJECT_ID "ID DEL PROYECTO DE FIREBASE"
#define USER_EMAIL "CORREO REGISTRADO EN FIREBASE"
#define USER_PASSWORD "CONTRASEÑA"

FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;

int samples = 10;               // Número de pruebas que se tomarán de pH
float adc_resolution = 4095.0;  //ESP 32 ADC Resolution

OneWire oneWire(PIN_TEMPERATURA);   // Se inicializa comunicación ONEWIRE
DallasTemperature temp1(&oneWire);  // Se inicializa en sensor de temperatura

float tdsValue = 0;

const char* tz = "CET-1CEST,M3.5.0,M10.5.0/3";
int DISTANCIA = 0;
int pinEco = 19;
int pinGatillo = 21;
long readUltrasonicDistance(int triggerPin, int echoPin) {
  //Iniciamos el pin del emisor de reuido en salida
  pinMode(triggerPin, OUTPUT);
  //Apagamos el emisor de sonido
  digitalWrite(triggerPin, LOW);
  //Retrasamos la emision de sonido por 2 milesismas de segundo
  delayMicroseconds(2);
  // Comenzamos a emitir sonido
  digitalWrite(triggerPin, HIGH);
  //Retrasamos la emision de sonido por 2 milesismas de segundo
  delayMicroseconds(10);
  //Apagamos el emisor de sonido
  digitalWrite(triggerPin, LOW);
  //Comenzamos a escuchar el sonido
  pinMode(echoPin, INPUT);
  // Calculamos el tiempo que tardo en regresar el sonido
  return pulseIn(echoPin, HIGH);
}

void setup() {
  pinMode(PIN_TDS, INPUT);

  Serial.begin(9600);
  Serial.println("Sensor de PH");
  Serial.println("Sensor de Temperatura");

  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(1000);
  }
  Serial.println("Conexión exitosa");
  Serial.print("Conectado con la IP: ");
  Serial.println(WiFi.localIP());

  config.api_key = API_KEY;

  auth.user.email = USER_EMAIL;
  auth.user.password = USER_PASSWORD;

  config.token_status_callback = tokenStatusCallback;

  Firebase.begin(&config, &auth);

  Firebase.reconnectWiFi(true);

  configTime(0, 0, "pool.ntp.org", "time.nist.gov");
  setenv("TZ", tz, 1);
  tzset();
}

// Método que devuelve el pH mediante el voltaje recibido
double ph(float voltage) {
  return 7 + ((1.65 - voltage) / 0.18);
}

void loop() {
  int measuringstds = 0;  // Variable donde se guardaran las muestras de TDS
  for (int i = 0; i < samples; i++) {
    measuringstds += analogRead(PIN_TDS);
    delay(10);
  }
  float averageVoltage = (3.3 / adc_resolution * measuringstds / samples);

  //temperature compensation formula: fFinalResult(25^C) = fFinalResult(current)/(1.0+0.02*(fTP-25.0));
  float compensationCoefficient = 1.0 + 0.02 * (25.0 - 25.0);
  //temperature compensation
  float compensationVoltage = averageVoltage / compensationCoefficient;

  //convert voltage value to tds value
  tdsValue = (133.42 * compensationVoltage * compensationVoltage * compensationVoltage - 255.86 * compensationVoltage * compensationVoltage + 857.39 * compensationVoltage) * 0.5;


  Serial.print("TDS Value:");
  Serial.print(tdsValue);
  Serial.println("ppm");
  struct tm timeinfo;
  if (getLocalTime(&timeinfo)) {
    char timeString[20];
    strftime(timeString, sizeof(timeString), "%Y-%m-%d %H:%M:%S", &timeinfo);

    String documentPath = "depositos/WL041216";
    FirebaseJson json;
    json.set("fields/agua_contenida/mapValue/fields/nivelTDS_agua/doubleValue", tdsValue);

    int measurings = 0;  // Variable donde se guardaran las muestras de pH
    for (int i = 0; i < samples; i++) {
      measurings += analogRead(PIN_PH);  // Lectura del sensor de pH
      delay(10);
    }

    // Se promedian las muestras para obtener el voltaje
    float voltage = (3.3 / adc_resolution * measurings / samples);


    Serial.print("pH= ");
    Serial.println(ph(voltage));  // Se manda el voltaje para obtener el pH

    /* Se obtiene la temperatura */
    temp1.requestTemperatures();
    float temper = temp1.getTempCByIndex(0);
    /****************************/

    if (temper != DEVICE_DISCONNECTED_C)  // Verificar si se hizo la medición
    {
      Serial.print("Temperatura: ");
      Serial.print(temper);
      Serial.println(" °C");
      json.set("fields/agua_contenida/mapValue/fields/nivelTemp_agua/doubleValue", temper);

      double pH = ph(voltage);  // Se manda el voltaje para obtener el pH
      json.set("fields/agua_contenida/mapValue/fields/nivelpH_agua/doubleValue", pH);

      DISTANCIA = 0.01723 * readUltrasonicDistance(pinGatillo, pinEco);
      //Mostramos la disstancia
      Serial.println(DISTANCIA);
      //Si la distancia es menor a 20 encendemos el led
      delay(10);
      double cantAgua = DISTANCIA;
      json.set("fields/agua_contenida/mapValue/fields/cantidad_agua/doubleValue", cantAgua);

      Serial.print("TDS Value:");
      Serial.print(tdsValue);
      Serial.println("ppm");
      if (pH < 5.5 || tdsValue > 500) {
        json.set("fields/agua_contenida/mapValue/fields/estado_agua/booleanValue", false);
      } else {
        json.set("fields/agua_contenida/mapValue/fields/estado_agua/booleanValue", true);
      }
      json.set("fields/agua_contenida/mapValue/fields/ultimaActualizacion_agua/stringValue", timeString);
    } else {
      Serial.println("Error: No se pudo leer la temperatura");
    }
    if (Firebase.Firestore.patchDocument(&fbdo, FIREBASE_PROJECT_ID, "", documentPath.c_str(), json.raw(), "agua_contenida")) {
      Serial.println("Datos enviados correctamente");
    } else {
      Serial.println("Error al enviar los datos");
      Serial.println(fbdo.errorReason());
    }
  }

  delay(5000);
}

Pregunta a tu Profesor

He trasladado su tema de una categoría de idioma inglés del foro a la categoría International > Español @edw_przd.

En adelante por favor usar la categoría apropiada a la lengua en que queráis publicar. Esto es importante para el uso responsable del foro, y esta explicado aquí la guía "How to get the best out of this forum".
Este guía contiene mucha información útil. Por favor leer.

De antemano, muchas gracias por cooperar.

Ya pero nadamas me dice que le cheque o que quite el sensor

Qué raro lo que comentas porque es un sensor analógico. La medición no debería fallar.
Dices no recibir señales en el ESP32.
Supongo que querras decir que esto

Serial.print("TDS Value:");
  Serial.print(tdsValue);
  Serial.println("ppm");

no arroja ningún dato.
Previo a eso tomas samples = 10 valores, podrias mostrar el promedio o la suma.
Tal vez tengas un problema de timecast o sea..
Esta operación

float averageVoltage = (3.3 / adc_resolution * measuringstds / samples);

podría estar provocando un overflow en enteros y luego al convertir a float termina siendo 0.
Solo es una presunción.
Desarma la operación, mostrando resultados parciales para ver donde se produce el error.

Imprimo lo que toma el analogRead y el valor es 0 quiere decir que a la esp32 no entra ninguna señal, este problema solo pasa cuando pongo la configuración de firebase, si no hago esta logica de mandar datos, los sensores en conjunto miden incluyendo el de TDS

Imposible o no tanto.
cambia el pin del TDS

#define PIN_TDS 27         // Pin para el sensor de TDS

Seguro la librería lo usa como Chip Select u algo.

Lo he cambiado a diferentes pines y sigue marcando el analogRead como 0, incluso he conectado otro sensor al pin 27 mientras los demás igual estan conectados y si mide, el unico que no mide es el de TDS . Repito, este problema solo es cuando ocupo Firebase.

Sube un esquema con todas las conexiones.
¿Cómo alimentas el ESP y los sensores?

Pero por que o para qué un esquema si dice que le funciona cuando no usa la libreria Firebase.
Publica por favor el código que usas donde si lees datos del TDS sin usar la librería, a ver si encontramos algo y como no tengo la razón tmb publica el esquema por favor.

Porque me interesa ver qué y cómo lo tiene conectado y alimentado porque me palpito un problema de falta de corriente ya que el problema ocurre justamente cuando se activa el wifi.

No veo cuál es el problema y por qué te molestaría.

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