
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:

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:

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

Los resultados:

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