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
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.
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
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.
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.
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??????....
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.
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.