Ok lo intentaré conectar aunque no entiendo en diagrama disculpa, el sensor sale 2 cables uno a pin otra a gnd, dónde van los componentes gracias
A ver...
El esquema tiene un "cable" que va del sensor al pin, ¿de acuerdo?
En la unión del cable y el pin pones un capacitor de 100nF (que es lo mismo que 0.1uF) conectado a masa y en el mismo punto (o sea la unión del cable con el pin) una R de 10K a 3.3V.
Obviamente el otro cable del mc38 va a masa (o sea GND).
Así

Saludos cómo estás, estoy alimentando el esp con transformador 12v 2.0A conectado directo al conector Jack que trae la placa de expansión el v que da es de 5.03v
Hay alguna forma en sofware, codigo, brujeria algo (jajajajaja) que se pueda filtrar la comunicacion entre el pin y esp o es alguna señal que envia el esp que rebota y lo asume como pulso??.
Al no ser de manera constante y producirse aleatoriamente es difícil saber que está ocurriendo.
En caso de ruido eléctrico o rebote, el condensador que te sugerimos @MaximoEsfuerzo y yo recude ambos, pero aun así persiste. Puede ocurrir que la placa de expansión que usas tenga una mala soldadura o el cable en sí.
Me gustaría que probaras tu código sin nada que tuviera que ver con internet:
#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
}
Tal y como lo he puesto es como lo probé en el esp32 sin tener ruidos. Dado que tienes un println en la interrupción cada vez que se produzca un "ruido" debería mostrar algo. Prueba durante un par de horas y nos dices que muestra el terminal serie. Así podremos descartar que no sea algo que interfiere.
Yo te pedí que lo pusieras en AC no DC. Los 5.03V estan bien pero el ruido se puede deber a un mal filtrado o un problema en la fuente DC DC del shield (escudo) que estas usando.
En la misma posición de las puntas de medición en la que mediste 5.03V coloca en AC para ver que tensión de ripple o rizado existe.
Esa prueba ya la hicimos con @randyalexan. Yo le proporcioné un código simple, puso un pulsador y acusó el mismo problema a las horas.

¿Podría ser una remesa esp32 con fallos en la soldadura? Es que es muy raro... y por lo que veo esa foto, quizás por la perspectiva, parece no estar bien alineado.
Pero esta claro que es el shield.
Coloca por favor un alimentado con el cable USB de tu PC solamente SIN ESCUDO directo al esp32 y el pluviómetro si quieres, con el código que te proporcioné y dime si aparece el problema a las horas?
ohhhh ok no me fije bien, error mio, en AC esta fluctuante entre 0.028 hasta 0.040 aprox
saludos ok ok excelente ya lo prueba y confirmo
Hi,
Que tipo de tarjeta usas la pcb-9601 o la pcb-9602. La 9601 la salida tiene un contacto normalmente cerado con una resistencia de una 1K en serie con un TVS conectado en paralelo. La 9602 tiene dos contactos uno abierto y el otro cerado con una resistencia en serie y un TVS en paralelo a la resistencia. Otra cosa es que el output requiere de una resistemcia de "PULLUP". Consejo del fabricante:
"Remember to check if your IoT controller has a built-in pull-up resister"
pinMode(RAIN_PIN, INPUT_PULLUP);
Tiene R pull-up. ![]()
Saludos, les comento que hice la prueba de Víctor eliminando todo lo de internet y NO GENERO RUIDO se comporto como debería gracias, ahora el dilema es como hacer lo de internet sin que me vuelva a dar el fallo estaré buscando opciones para ver cuál funciona sin que genere el problema, de igual forma si alguno tiene como hacer, bienvenido será saludos gracias
saludos maximo, que debo hacer ??
saludos amigo taura, gracias por responder, pero no entendi nada, la placa que uso no tiene ningu tipo de informacion impresa?? gracias
Hi,
Yo hice un google para el MC-38 y encontre este link No se si es el que tu usas. Si es entonces el necesita un PULLUP en el pin de sallda,
@tauro0221 lo que te quise decir en #33 es que como activa la R pull-up del pin del ESP, ya tiene una R pull-up cumpliendo esa función.
Lo que sí sugerí, y creo que ahí estaría el punto de encuentro de nuestras ideas, es que agregue una R pull-up externa, y de menor valor que la interna de micro, y de paso un capacitor para filtrar ruidos y rebotes del interruptor.
Hi,
maximoesEsfuerzo; Si yo lo entendi que tu aconsejaste de anadirle un condensador de 1.pero aparentemente se me paso por alto lo de la resistencia. Como yo explique el que encontre decia lo del pullup pero no se si ese es el modulo que el usa. Si no me equivoco creo ellos estan usando un reed switch con magneto y si es asi estos producen ruidos. mi consejo para [randyalexan] es de que ponga el link donde el compro el modulo para tener una mejor idea de que puede estar causando el problema que el experimenta.
Saludos, ya le había colocado la R y seguía igual hasta el momento lo estoy probando funciona por funciona para ver en cuál me genera el fallo


