Proyecto medidor de caudal canal abierto

Buenos dias,

quisiera que me colaboraran con que formula debo de usar para asociarlo con las lecturas de altura de un sensor ultrasonico HC-SR04, para sacar la formula de caudal.

muchas gracias

Sitúa el sensor en el centro de recipiente a medir.

Mide la altura máxima y minina, recipiente vació de agua, recipiente lleno de agua, con esos datos y el dato principal cuanto liquido coge en el recipiente.

VACÍO LLENO 100 ML

11,41 cm 2,20 cm 9,26 cm

Calculando el nivel de líquido

Con los datos obtenidos en la fase anterior, con el recipiente en vacío, lleno y con 100 ml, ya podemos obtener una fórmula para el sensor de nivel de agua con Arduino. Las medidas obtenidas nos indican la cantidad de espacio vacío que hay en el recipiente. Vamos a comenzar cambiando el rango para llevarlo a 0 eliminando el offset de 2,20 cm. Es como si el líquido estuviera a 0 cm cuando el recipiente está cero.

VACÍO LLENO 100 ML

11,41 cm 2,20 cm 9,26 cm
9,21 cm 0 cm 7,06 cm

El siguiente paso es calcular cuanto ocupa 100 ml de líquido en nuestro recipiente. Esto se hace restando la distancia cuando está vacío menos la distancia cuando tiene 100 ml.

9,21 - 7,06 = 2,15 cm / 100 ml

Esta medida nos dice que cada 2,15 cm hay 100 ml de líquido. Con esto ya es sencillo calcular cuanto líquido hay dentro del recipiente. Vamos a hacerlo con un ejemplo. Supongamos que el sensor de ultrasonidos nos da un distancia de 7,11 cm. Ese sería el espacio vacío pero nosotros queremos saber cuanto espacio queda lleno. Lo calculamos restando la distancia en vacío menos la distancia obtenida.

11,41 - 7,11 = 4,30 cm

Como sabemos que cada 2,15 cm hay 100 ml, aplicando una simple regla de 3 sabremos la cantidad de líquido que tenemos.

2,15 cm -> 100 ml
4,30 cm -> X ml

4,30x100
X = -------------- =200ml
200 ml

Pues ya tenemos la base matemática para calcular el nivel de líquido en nuestro recipiente, ahora solo nos queda aplicar dichos cálculos en nuestro sketch.

// Incluímos la libreria externa para poder utilizarla
#include <LiquidCrystal.h> // Entre los símbolos <> buscará en la carpeta de librerías configurada
// Lo primero is inicializar la librería indicando los pins de la interfaz
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// Definimos las constantes
#define COLS 16 // Columnas del LCD
#define ROWS 2 // Filas del LCD
// Configuramos los pines del sensor Trigger y Echo
const int PinTrig = 7;
const int PinEcho = 6;
// Constante velocidad sonido en cm/s
const float VelSon = 34000.0;
// Número de muestras
const int numLecturas = 100;
// Distancia a los 100 ml y vacío
const float distancia100 = 2.15;
const float distanciaVacio = 11.41;
float lecturas[numLecturas]; // Array para almacenar lecturas
int lecturaActual = 0; // Lectura por la que vamos
float total = 0; // Total de las que llevamos
float media = 0; // Media de las medidas
bool primeraMedia = false; // Para saber que ya hemos calculado por lo menos una
void setup()
{
// Iniciamos el monitor serie para mostrar el resultado
Serial.begin(9600);
// Ponemos el pin Trig en modo salida
pinMode(PinTrig, OUTPUT);
// Ponemos el pin Echo en modo entrada
pinMode(PinEcho, INPUT);
// Inicializamos el array
for (int i = 0; i < numLecturas; i++)
{
lecturas[i] = 0;
}
// Configuramos las filas y las columnas del LCD en este caso 16 columnas y 2 filas
lcd.begin(COLS, ROWS);
}
void loop()
{
// Eliminamos la última medida
total = total - lecturas[lecturaActual];
iniciarTrigger();
// La función pulseIn obtiene el tiempo que tarda en cambiar entre estados, en este caso a HIGH
unsigned long tiempo = pulseIn(PinEcho, HIGH);
// Obtenemos la distancia en cm, hay que convertir el tiempo en segudos ya que está en microsegundos
// por eso se multiplica por 0.000001
float distancia = tiempo * 0.000001 * VelSon / 2.0;
// Almacenamos la distancia en el array
lecturas[lecturaActual] = distancia;
// Añadimos la lectura al total
total = total + lecturas[lecturaActual];
// Avanzamos a la siguiente posición del array
lecturaActual = lecturaActual + 1;
// Comprobamos si hemos llegado al final del array
if (lecturaActual >= numLecturas)
{
primeraMedia = true;
lecturaActual = 0;
}
// Calculamos la media
media = total / numLecturas;
// Solo mostramos si hemos calculado por lo menos una media
if (primeraMedia)
{
float distanciaLleno = distanciaVacio - media;
float cantidadLiquido = distanciaLleno * 100 / distancia100;
int porcentaje = (int) (distanciaLleno * 100 / distanciaVacio);
// Mostramos en la pantalla LCD
lcd.clear();
// Cantidada de líquido
lcd.setCursor(0, 0);
lcd.print(String(cantidadLiquido) + " ml");
// Porcentaje
lcd.setCursor(0, 1);
lcd.print(String(porcentaje) + " %");
Serial.print(media);
Serial.println(" cm");
Serial.print(cantidadLiquido);
Serial.println(" ml");
}
else
{
lcd.setCursor(0, 0);
lcd.print("Calculando: " + String(lecturaActual));
}
delay(500);
}
// Método que inicia la secuencia del Trigger para comenzar a medir
void iniciarTrigger()
{
// Ponemos el Triiger en estado bajo y esperamos 2 ms
digitalWrite(PinTrig, LOW);
delayMicroseconds(2);
// Ponemos el pin Trigger a estado alto y esperamos 10 ms
digitalWrite(PinTrig, HIGH);
delayMicroseconds(10);
// Comenzamos poniendo el pin Trigger en estado bajo
digitalWrite(PinTrig, LOW);
}

Mas información sobre este proyecto Luis del Valle Hernández