#include <Servo.h>
long t;
float dist, distV, distB, distBi;
boolean act; // Determina si se ha surtido agua.
Servo servo;
void setup()
{
pinMode(7, OUTPUT); // Trig de Sensor lateral de surtidor, permite surtir agua
pinMode(8, INPUT); // Echo de Sensor lateral de surtidor, permite surtir agua
servo.attach(6); // Pin del servo motor que indica cuando girar
pinMode(2, INPUT); // Echo Sensor superior de surtidor, regula no rebalsar, ya que apaga el motor
pinMode(3, OUTPUT); // Trig Sensor de superior de surtidor, regula no rebalsar, ya que apaga el motor
pinMode(4, INPUT); // OPCIONAL Echo Sensor superior de Bidon, mide altura, para reporte de Litros surtidos
pinMode(5, OUTPUT); // OPCIONAL Trig Sensor de superior de Bidon, mide altura, para reporte de Litros surtidos
act = false;
Serial.begin(9600);
}
void loop()
{
// lanzamos un pequeño pulso para activar el sensor
digitalWrite(7, HIGH);
delayMicroseconds(10);
digitalWrite(7, LOW);
// medimos el pulso de respuesta
t = (pulseIn(8, HIGH) / 2); // dividido por 2 por que es el
// tiempo que el sonido tarda
// en ir y en volver
// ahora calcularemos la distancia en cm
// sabiendo que el espacio es igual a la velocidad por el tiempo
// y que la velocidad del sonido es de 343m/s y que el tiempo lo
// tenemos en millonesimas de segundo
dist = float(t * 0.0343);
// y lo mostramos por el puerto serie una vez por segundo
Serial.println("La distancia es:");
Serial.println(dist);
if (dist >= 4 && dist <= 10) {
digitalWrite(3, HIGH);
delayMicroseconds(10);
digitalWrite(3, LOW);
t = (pulseIn(2, HIGH) / 2);
distV = float(t * 0.0343); // Distancia en altura de como se va llenando el vaso
Serial.print("Distancia de Llenado de vaso: ");
Serial.println(distV);
if (distV <= 7 || distV > 1500) { // Distancia al vaso menor o igual a 7, está muy cerca, se debe dejar de surtir, el nivel de agua está muy alto.
servo.write(-90);
Serial.println("Puede rebalsar, no debe surtir.");
if (act == true) {
Serial.println("Deja de surtir agua");
Serial.println(" Se puede rebalsar el vaso");
// Si antes estaba surtiendo, especificar, que ya no surte, y cuanto surtió.
act = false;
digitalWrite(5, HIGH);
delayMicroseconds(10);
digitalWrite(5, LOW);
t = (pulseIn(4, HIGH) / 2);
distB = float(t * 0.0343); // Distancia en altura de cuanto esta de vacío desde arriba el bidon. Al dejar de surtir
Serial.print("Se han surtido ");
Serial.print(((distB - distBi)*PI * 105));
Serial.println(" centímetros cúbicos de agua aproximadamente.");
} // Se detiene el surtido de agua.
} else {
// En este caso, se tiene, que el nivel de agua es insuficiente para rebalsar
if (act == false) {
// Verifico si antes no estaba surtiendo
act = true;
digitalWrite(5, HIGH);
delayMicroseconds(10);
digitalWrite(5, LOW);
t = (pulseIn(4, HIGH) / 2);
distBi = float(t * 0.0343); // Distancia en altura de cuanto esta de vacío desde arriba el bidon. Antes de surtir
Serial.println(" Comienza a surtir agua");
Serial.println("Se comienza a surtir");
} // Se comienza a surtir agua.
Serial.println("Debe surtir");
servo.write(90);
}
} else {
Serial.println(" No debe surtir, no hay vaso cerca");
servo.write(-90);
if (act == true) {
Serial.println("No hay vaso");
// Si antes estaba surtiendo, especificar, que ya no surte, y cuanto surtió.
act = false;
digitalWrite(5, HIGH);
delayMicroseconds(10);
digitalWrite(5, LOW);
t = (pulseIn(4, HIGH) / 2);
distB = float(t * 0.0343); // Distancia en altura de cuanto esta de vacío desde arriba el bidon. Al dejar de surtir
Serial.print("Se han surtido ");
Serial.print(((distB - distBi)*PI * 105));
Serial.println(" centimetros cubicos de agua aproximadamente");
} // Se detiene el surtido de agua.
}
delay(200);
}