Problema con esp32 con placa de expansión como eliminar el ruido que genera al conectar un pluviometro de pulso, trabaja un sensor magnético mc 38

Saludos a todos, el problema que tengo es que hice una estación METEOROLÓGICA, tiene temperatura, humedad, gsp, presión, pluviometro de balancín, atmosférica, hace envío por telegram, todo funciona bien el problema se presenta con el pluviometro que genera ruido y marca una lectura que no debe ser, he colocado resistencia entre pin y gnd y nada, ya no se que hacer y el pluviometro es el mas importante que necesito que mida bien


Esa es una de las placas que estoy utilizando
, ahhhhh también e probado con 4 esp32 y sigue dando la lectura

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

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.

Sube el código, un esquema de las conexiones (no de fritzing, por favor) y hojas de datos de los sensores (al menos del pluviómetro) sino es difícil ayudarte, sería adivinar y ver si hay suerte.

El esquema puedes hacerlo a mano y subir una foto, lo importante es que se entienda.

Y el código adjúntalo de acuerdo a las Normas del Foro, punto 7. Es para tu beneficio.


```cpp
#include <WiFi.h>  
#include "WiFiClientSecure.h"  
#include "UniversalTelegramBot.h"  
#include <SD.h>  
#include <SPI.h>  
#include <Wire.h>  
#include <WiFiUdp.h>  
#include <NTPClient.h>  
#include <TimeLib.h>  

#define BOT_TOKEN "........................................."  // TOKEN DEL BOT DE TELEGRAM  
#define CHAT_ID "...................................."  // ID DEL CHAT DE GRUPO O INDIVIDUAL DE TELEGRAM  
#define RAIN_PIN 27 // Pin PARA PLUVIOMETRO  
#define SD_CS_PIN 5  // Pin DE LA TARJETA MICRO SD  
#define ESP_ID "Estac.Ruido02"  // NOMBRE DE LA ESTACION  

WiFiClientSecure client;  
UniversalTelegramBot bot(BOT_TOKEN, client);  

WiFiUDP ntpUDP;  
NTPClient timeClient(ntpUDP, "pool.ntp.org", -4 * 3600, 60000);  

volatile int contadorPulsos = 0;  // Contador de pulsos (declarado como volatile)  
float lluviaTotal = 0.0;           // Total de lluvia en mm  
float lluviaActual = 0.0;          // Total de lluvia en 1 hora en mm  
const float mmPorPulso = 0.2;      // RESOLUCIÓN DEL PLUVIÓMETRO (0.2 mm)  

unsigned long tiempoAnterior = 0;   // Variable para almacenar el tiempo anterior  
const unsigned long intervaloReset = 14400000; // Tiempo para grabar en SD en milisegundos (24 horas)  
unsigned long lastPulseTime = 0;   // Tiempo del último pulso  
const unsigned long debounceDelay = 200; // Tiempo de debounce en milisegundos  
unsigned long lastInterruptTime = 0; // Variable para controlar el tiempo de interrupción  
unsigned long currentMillis;         // Variable para el tiempo actual  
const unsigned long intervaloTelegram = 3660000; // Intervalo para enviar mensajes a Telegram (1 hora)  
unsigned long lastTelegramSendTime = 0; // Último tiempo de envío a Telegram  
unsigned long lastLluviaActualTime = 0; // Last time lluviaActual was calculated  

String fechaUltimaActualizacion;  

// Función de interrupción para el sensor de lluvia  
void IRAM_ATTR contarPulsos() {  
    unsigned long interruptTime = millis(); // Obtener el tiempo de la interrupción  

    // Verificar el tiempo de debounce  
    if (interruptTime - lastInterruptTime > debounceDelay) {  
        contadorPulsos++; // Incrementar el contador de pulsos cada vez que cambia de estado  
        Serial.println("Pulsos contados: " + String(contadorPulsos)); // Mostrar en consola  
        lastInterruptTime = interruptTime; // Actualizar el tiempo de la última interrupción  
    }  
}  

void contarPulsosTask(void * parameter) {  
    pinMode(RAIN_PIN, INPUT_PULLUP);  // Configura el pin del pluviómetro  
    attachInterrupt(digitalPinToInterrupt(RAIN_PIN), contarPulsos, CHANGE); // Configura la interrupción para detectar cambios en ambos estados  
    
    while (true) {  
        vTaskDelay(100); // Espera un poco para aliviar el uso de CPU  
    }  
}  

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

    // Crear la tarea para el conteo de pulsos en el núcleo 1  
    xTaskCreatePinnedToCore(  
        contarPulsosTask,     // Nombre de la función  
        "ConteoPulsos",       // Nombre de la tarea  
        10000,                // Tamaño de stack  
        NULL,                 // Parámetro de tarea  
        1,                    // Prioridad de la tarea  
        NULL,                 // Handle de la tarea  
        1                     // Núcleo al que se asigna la tarea  
    );  

    if (!SD.begin(SD_CS_PIN)) {  
        Serial.println("Fallo en la inicialización de la tarjeta SD.");  
    } else {  
        Serial.println("Tarjeta SD inicializada correctamente.");  
    }  

    WiFi.begin("El Grillo", "Rakata32771890");  // Usuario y clave de internet dentro de comillas  
    while (WiFi.status() != WL_CONNECTED) {  
        delay(3000);  
        Serial.println("Conectando a WiFi...");  
    }  
    Serial.println("Conectado a la red WiFi");  

    client.setInsecure();  
    timeClient.begin();  
    lastLluviaActualTime = millis(); // Inicializar el tiempo de la lluvia actual  
}  

void loop() {  
    currentMillis = millis(); // Obtener tiempo actual  

    // Comprobamos si ha pasado una hora para calcular la lluvia actual  
    if (currentMillis - lastLluviaActualTime >= 3600000) { // 60 minutos  
        lluviaActual = (float)contadorPulsos * mmPorPulso; // calcular lluvia de la última hora  
        lluviaTotal += lluviaActual; // acumular la lluvia total  
        contadorPulsos = 0; // Resetear el valor de contadorPulsos  
        Serial.printf("Lluvia última hora: %.2f mm, Total 24Hrs: %.2f mm\n", lluviaActual, lluviaTotal);  
        lastLluviaActualTime = currentMillis; // actualizar último tiempo de lluvia actual  
    }  

    timeClient.update();  
    unsigned long epochTime = timeClient.getEpochTime();
        fechaUltimaActualizacion = String(year(epochTime)) + "-" +  
                                String(month(epochTime)) + "-" +  
                                String(day(epochTime));  

    String horaEstimada = timeClient.getFormattedTime();  
    String fechaHora = fechaUltimaActualizacion + " " + horaEstimada;  

    // Guardar la lluvia en SD con fecha  
    unsigned long tiempoActual = millis();  
    if (tiempoActual - tiempoAnterior >= intervaloReset) {  
        File dataFile = SD.open("/lluvia.txt", FILE_APPEND);  
        if (dataFile) {  
            dataFile.println(fechaHora + " - Precipitaciones en 24hrs: " + String(lluviaTotal) + " mm");  
            dataFile.close();  
            Serial.println("Datos guardados en SD.");  
        } else {  
            Serial.println("Error al abrir el archivo para guardar datos.");  
        }  
        lluviaTotal = 0;  
        tiempoAnterior = tiempoActual;  
    }  

    // Envío a Telegram solo si ha pasado el intervalo  
    if (currentMillis - lastTelegramSendTime >= intervaloTelegram) {  
        String message = String("ID: ") + ESP_ID + "\n" + String("🌧️ Lluvia última hora: ") + String(lluviaActual, 1) + " mm\n" +  
                         String("🌧️ Lluvia total en 24Hrs: ") + String(lluviaTotal, 1) + " mm";  

        Serial.println("Enviando mensaje a Telegram...");  
        bot.sendMessage(CHAT_ID, message, "Markdown");  
        lastTelegramSendTime = currentMillis; // Actualizar el tiempo del último mensaje enviado  
    }  

    delay(200); // Un pequeño delay para evitar un uso excesivo de CPU  
}

saludos estimados, el esquema de conexion del pluviometro es salen dos cables del pluviometro del sensor magnetico (mc-38) 1 cable al pin 27 y otro cable a GND.. la placa es como la foto (esp-wroom-32 con placa de expancion), la misma conexion la hice con un esp32 c3, esp32 s conectado directo a los pines y sigue dando ruido, ya puse resistencia de 10kentre el cable y el gnd y no resulto, gracias de antemano por la ayuda un saludo,,, ahhhh soy super nuevo en esta comunidad si cometo algun error hagamelo saber para aprender y corregir gracias

Para ser más claros, ¿cuando se produce un cambio de la cazoleta en vez de un pulso se producen varios?

saludos, gracias por contestar, lo que genera ruido es el pluviometro¡¡. los otros sensores funcion bien

Si es un sensor mc-38 de los de puertas y ventanas poco "ruido" puede ser. Explica como lo has conectado y el efecto que produce.

el esquema de conexion del pluviometro es: salen dos cables del pluviometro del sensor magnetico (mc-38) 1 cable al pin 27 y otro cable a GND, despues de 1 hora marca como si hubiese u pulso un conteo, y esto no sucede porque tengo el pluviometro en la mesa de trabajo

Yo no veo nada raro en el código, quizás que la funcion xTaskCreatePinnedToCore haga algo raro, pero lo dudo.
Prueba a colocar un condensador cerámico de 100nF entre el pin 27 y GND, debería limitar el ruido.

ok, ya lo coloque, ya esta en preriodo de prueba en 1 hora le avisare gracias

Primero no funcionaba con tu pin 2, (aclaro que me preguntó por privado), y ahora lo cambiaste al pin 27 y continúa la falla.
Les sugerí poner un simple pulsador y luego de horas, también acusaba varios disparos no realizados.
Para aportar algo, yo quité el doble uso de núcleo y el problema también se manifestaba, eso antes de cambiar de pin y antes de detectar que su bornera tenía un falso contacto.

Así, que el problema persiste @randyalexan ?

Un saludo estimado gracias por las ayudas, te conento que hice los cambios y no resultaron todavia es presente el ruido...¡¡

saludos victorjam no resulto lo del condendor genero ruido igual

Voy a probar yo también en un esp32... sin nada solo he dejado el código de la interrupción y poco mas sin hardware añadido... veré si produce ruido en las próximas horas.

ok excelente victor gracias, te comento que deje conectado un esp sin el pluviometro pero deje los demas sensor y hasta el momento no genero ruido, peroal momento que conecto el pluviometro lo genera, es algo en los sensores magnetico que tienen los pluvio que hacen que genere ruido, porque tengo 2 pluvion nueevos de caja y generaron y dos viejos y tambien generaron ruido, la solucion creo que es como eliminar el ruido de un sensor magnetico??????....

En dos horas no me ha producido ruido.

Quizás convendría ver una foto del pluviómetro, sensores y la ubicación. Parece como si el pin hiciera de "antena" y ante cualquier perturbación (luz fluorescente, frigorifico, etc) actuara.

Si dispones de algún optoacoplador puedes probar a ponerlo lo mas cercano del esp32 y que sea este el que active el pin.

voy a buscar ese optocoplador, pero no se como se conecta?

Como alimentas el esp32?
Coloca una foto, o lo haces solo con tu PC. En ese caso necesito que hagas una prueba.
Toma un tester (multímetro) colócalo en AC y mide con el mejor rango la tensión que indique entre pin GND y 5V del ESP32.

Hay algo que no cuentas o no ves o simplemente desconoces..
Por favor intenta dar toda la información alrededor del esp32.
A ninguno de nosotros nos ha ocurrido lo que tu describes, no descreemos de tu problema pero si no nos relatas bien todo lo que rodea al ESP32 nosotros no podemos pensar en soluciones.

Prueba agregando un capacitor y resistencia a la entrada

De paso obtienes un circuito antirrebotes del reed-switch. :wink: