Portenta H7 problema en pines digitales

Hola, estoy intentando leer unos caudalimetros para que me indiquen un estado alto si hay caudal y un estado bajo si esta parado. Mi sorpresa es que con solo conectar el caudalimetro estando parado, obtengo 50 pulsos. Me pasa en todas las entradas, incluso conectando un cable suelto a algun pin, me cuenta 50 pulsos.

este es mi codigo:


// Pines de los caudalímetros en el Portenta H7
#define SensorCaudal1 PC_6  // Caudalímetro 1
#define SensorCaudal2 PJ_11 // Caudalímetro 2
#define SensorCaudal3 PG_7  // Caudalímetro 3
#define SensorCaudal4 PK_1  // Caudalímetro 4   PWM5


// Variables para contar pulsos de cada caudalímetro
volatile unsigned int pulsos1 = 0;
volatile unsigned int pulsos2 = 0;
volatile unsigned int pulsos3 = 0;
volatile unsigned int pulsos4 = 0;

// Variables para almacenar el estado de cada caudalímetro (1 = hay flujo, 0 = no hay flujo)
int estadoCaudal1 = 0;
int estadoCaudal2 = 0;
int estadoCaudal3 = 0;
int estadoCaudal4 = 0;

unsigned long tiempoLectura = 1000;  // Tiempo en milisegundos para verificar el flujo

void setup() {
  // Configuramos los pines de los caudalímetros como entradas
  pinMode(SensorCaudal1, INPUT_PULLUP);
  pinMode(SensorCaudal2, INPUT_PULLUP);
  pinMode(SensorCaudal3, INPUT_PULLUP);
  pinMode(SensorCaudal4, INPUT_PULLUP);

  // Configuramos las interrupciones para cada caudalímetro
  attachInterrupt(digitalPinToInterrupt(SensorCaudal1), contarPulsos1, FALLING);
  attachInterrupt(digitalPinToInterrupt(SensorCaudal2), contarPulsos2, FALLING);
  attachInterrupt(digitalPinToInterrupt(SensorCaudal3), contarPulsos3, FALLING);
  attachInterrupt(digitalPinToInterrupt(SensorCaudal4), contarPulsos4, FALLING);

  // Iniciamos la comunicación serie para ver los datos en el monitor serie
  Serial.begin(115200);
}

void loop() {
  // Llamamos a la función que realiza la lectura de los caudalímetros
  LecturaCaudalimetros();
  
  // Esperamos unos segundos antes de realizar la siguiente lectura
  delay(2000);  // Puedes ajustar el tiempo de espera
}

// Función que lee los caudalímetros
void LecturaCaudalimetros() {
  unsigned long tiempoInicioLectura = millis();

  // Reiniciamos los contadores de pulsos antes de empezar la medición
  pulsos1 = 0;
  pulsos2 = 0;
  pulsos3 = 0;
  pulsos4 = 0;

  // Realizamos la medición durante el tiempo especificado
  while (millis() - tiempoInicioLectura < tiempoLectura) {
    // Continuamos contando pulsos
  }

  // Verificamos el estado de cada caudalímetro después del tiempo de medición
  estadoCaudal1 = (pulsos1 > 0) ? 1 : 0;
  estadoCaudal2 = (pulsos2 > 0) ? 1 : 0;
  estadoCaudal3 = (pulsos3 > 0) ? 1 : 0;
  estadoCaudal4 = (pulsos4 > 0) ? 1 : 0;

  // Mostrar los estados de los caudalímetros en la consola
  Serial.print("Estado Caudalímetro 1: ");
  Serial.println(estadoCaudal1);
  Serial.print("Pulsos Caudalímetro 1: ");
   Serial.println(pulsos1);
  Serial.print("Estado Caudalímetro 2: ");
  Serial.println(estadoCaudal2);
  Serial.print("Pulsos Caudalímetro 2: ");
   Serial.println(pulsos2);
  Serial.print("Estado Caudalímetro 3: ");
  Serial.println(estadoCaudal3);
  Serial.print("Pulsos Caudalímetro 3: ");
   Serial.println(pulsos3);
  Serial.print("Estado Caudalímetro 4: ");
  Serial.println(estadoCaudal4);
  Serial.print("Pulsos Caudalímetro 4: ");
   Serial.println(pulsos4);
}

// Funciones de interrupción para contar los pulsos de cada caudalímetro
void contarPulsos1() {
  pulsos1++;
}

void contarPulsos2() {
  pulsos2++;
}

void contarPulsos3() {
  pulsos3++;
}

void contarPulsos4() {
  pulsos4++;
}

Has visto con el osciloscopio (si tienes) que esta pasando en cada salida de los caudalímetros?
Si no es el caso, empecemos con algunos trucos.
Coloca en alguna línea un capacitor de 0.1uF cerámico y veamos si hay cambios en el coportamiento.
Que tipo de salida tiene el caudalímetro? Danos referencia a cuál estas usando?
Es como un reed switch, es un sensor efecto hall?

Hola surbyte, gracias por la respuesta.

Para poner en situación, estoy utilizando un Arduino portenta H7, Un portenta mid carrier y un módulo 4g pro. Los caudalimetros son los FS400.

Estoy usando un conversor de niveles adafruit para los caudalimetros.

Un módulo ads1115 con un conversor de niveles I2C para medir en modo diferencial la tensión de una batería 18650 y un sensor de presión de agua de dfrobot que trabaja a 5v.

También tengo 2 módulos tb6612 de adafruit para disparar 4 electroválvulas DC 9v latch.

El problema que tengo con los caudalimetros es que recibo pulsos en los pines aunque coloque un simple cable en el pin correspondiente al caudalimetro.

En concreto para una lectura de 1sg tengo siempre 50 pulsos. Creo que debe de ser ruido eléctrico.

Voy a poner los capacitor en las entradas como me indica surbyte para ver si se reduce el número de pulsos.

En caso de reducir los pulsos a un número bajo, puedo poner un umbral mínimo para indicar si se está regando o no.

Ya os cuento.

Saludos.

¿Que tipo de caudalimetro estás usando? Por ejemplo si son de contacto seco es esperable ese comportamiento y si es una salida a transistores¿Has unido las masas?

Bueno, ya he encontrado el problema. Se trataba de la fuente de alimentación. Al realizar lecturas durante 1 segundo y darme siempre 50 pulsos he sospechado que son los pulsos de los 50Hz de la tensión de red. He alimentado el proyecto con una batería y el problema se ha solucionado. Como el equipo se alimentara con batería supongo que no tendré problemas de falsas lecturas,.

Gracias por vuestro tiempo y vuestra ayuda.

Saludos.

Mal filtrado?

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