Arduino IoT: Tutorial Medidor de Agua Inteligente

Arduino Honduras Santiapps Marcio Valenzuela

Tutorial Medidor de Agua Inteligente Parte I

 

En este tutorial exploraremos mas sensores, pero aplicados.  En nuestro proyecto usamos un flujo metro construido a partir de un sensor Hall Effect para medir el flujo de agua por un conducto.

Se mira asi:

Arduino IoT: Tutorial Medidor de Flujo by Santiapps Marcio Valenzuela
Arduino IoT: Tutorial Medidor de Flujo de Agua by Santiapps

El codigo:

byte statusLed = 13;
byte sensorInterrupt = 0; // 0 = digital pin 2
byte sensorPin = 2;
// El sensor hall-effect emite ~ 4.5 pulses/sec/litre/min 
float calibrationFactor = 4.5;
volatile byte pulseCount;
float flowRate;
unsigned int flowMilliLitres;
unsigned long totalMilliLitres;
unsigned long oldTime;
void setup(){

Serial.begin(38400);
// Usarmos una LED como salida
pinMode(statusLed, OUTPUT);
digitalWrite(statusLed, HIGH);
pinMode(sensorPin, INPUT);
digitalWrite(sensorPin, HIGH);
pulseCount = 0;
flowRate = 0.0;
flowMilliLitres = 0;
totalMilliLitres = 0;
oldTime = 0;

// Configuramos para que dispare con FALLING state (HIGH a LOW)
attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
}
void loop(){
if((millis() - oldTime) > 1000) { // Only process counters once per second
// Dishabilitamos el interrupt al calcular flujo y enviar
detachInterrupt(sensorInterrupt);
// Calculamos ms transcurridos desde la ultima ejecucion para escalar el resultado. Aplicamos el factor calibrationFactor para escalar el resultado en base al # de pulsos/sec de medición (litres/minute en este caso) proveniente del sensor
flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
// Usar el tiempo de esta ejecucion porque deshabilitamos el interrupt por ende los millis() no funcionaran pero aun asi se retornara el valor justo antes que se deshabilito
oldTime = millis();
// Dividir el flujo en litres/minute por 60 para determinar cuantos L han pasado por el sensor en el intervalo de 1 sec y luego multiplicamos por 1000 para convertir a mL.
flowMilliLitres = (flowRate / 60) * 1000;
// Sumamos los mL pasados en este segundo al total cumulativo
totalMilliLitres += flowMilliLitres;
unsigned int frac;
// Imprimir el flujo para este intervalo de 1 segundo en litres / minute
Serial.print("Flujo: ");
Serial.print(int(flowRate)); // Imprimir el entero
Serial.print("."); // Imprimir el decimal
// Determinar la fraction. El 10 multiplicador nos da 1 decimal.
frac = (flowRate - int(flowRate)) * 10;
Serial.print(frac, DEC) ; // Imprimir la parte fraccional
Serial.print("L/min");
// Imprimir L fluidos en este segundo
Serial.print(" Liquido Fluido reciente: "); // Separador
Serial.print(flowMilliLitres);
Serial.print("mL/Sec");
// Imprimir cumulativo de L fluidos desde el inicio
Serial.print(" Cantidad total fluido: "); // Separador
Serial.print(totalMilliLitres);
Serial.println("mL");
// Resetear el pulse counter para iniciar de nuevo
pulseCount = 0;
// Habilitar el interrupt nuevamente
attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
}
}
void pulseCounter(){
// Incrementar pulse counter
pulseCount++;
}

Y la connexion es sencilla:

Arduino IoT: Tutorial Medidor de Flujo de Agua by Santiapps Marcio Valenzuela
Arduino IoT: Tutorial Medidor de Flujo de Agua

Lo conectamos a una salida de agua como una bañera:

Arduino IoT: Tutorial Medidor de Flujo de Agua by Santiapps Marcio Valenzuela
Arduino IoT: Tutorial Medidor de Flujo de Agua

Los resultados:

Arduino IoT: Tutorial Medidor de Flujo de Agua by Santiapps Marcio Valenzuela
Arduino IoT: Tutorial Medidor de Flujo de Agua

Esto fue durante ~ 10 segundos.  Vamos a incorporar esto a nuestro proyecto de casa inteligente.