Dispensador de líquidos

Autores: Sergio López Elvira, Iván Gutiérrez Aguilera y Adrián Rubio Garrido

Planteamiento

El proyecto consiste en un dispensador de líquidos, que estaría orientado a usarse en festividades o locales de restauración y ocio. Permitiría automatizar el proceso y ser más eficaz midiendo la cantidad de líquido, algo que, a cualquier dueño de un negocio que usará este tipo de dispositivos le podría interesar. 

El proyecto se compone por dos líquidos de la primera mezcla y dos líquidos de la segunda mezcla. A través de una pantalla, el usuario vería las opciones disponibles para servir. Para interactuar con la máquina para elegir y servir, el usuario usará un joystick. 

A continuación se explica la forma en la que el usuario interactuaría con el dispositivo. El proceso de utilización consiste en 2 fases.

  • En la primera fase, el usuario deberá escoger qué líquido de la primera mezcla quiere servir en su vaso. Como se ha mencionado anteriormente, para comunicarse con la máquina, usará el joystick. Si mueve el joystick hacia los lados, se moverá entre las dos opciones de líquido de la primera mezcla. Si mantiene el joystick hacia abajo, se servirá el líquido. Una vez se haya servido la cantidad que considere el usuario, moverá el joystick hacia arriba para pasar a la segunda fase. 
  • En la segunda fase, la dinámica es similar a la primera, pero existe una diferencia. Como en la anterior, el usuario deberá usar el joystick para seleccionar qué líquido quiere de la segunda mezcla. Pero en este caso, al bajar el joystick, el usuario no controla cuánta cantidad se sirve del líquido. Será la máquina la que rellenará el vaso con el líquido seleccionado y detectará cuándo parar para no derramar la bebida. 

Material y costes

Una vez expuesto el funcionamiento general del sistema, se va a desarrollar el funcionamiento de los diferentes módulos y piezas. Se han utilizado los siguientes módulos y piezas provistos por la universidad puesto que venían en la caja de Arduino:

  • Placa Arduino UNO. En esta se carga el software para que el proyecto pueda funcionar.
  • Tabla de prototipo. En ella se materializan todas las conexiones y dependencias entre los diferentes módulos.
  • Pantalla LCD. Se utiliza para comunicarse con el usuario.
  • Joystick. Se utiliza para que el usuario pueda navegar por la interfaz de la pantalla e interactuar con las bombas de agua.
  • Sensor ultrasonido. Se usa para medir la distancia de la máquina al líquido en el vaso.
  • Cables y resistencias. Se utilizan para establecer las conexiones entre los diferentes módulos.

Por otro lado se va a nombrar y explicar la función de los materiales que han sido comprados para la realización del proyecto:

  • Bombas de agua. Cuando se les suministra la energía, hacen la fuerza necesaria para empujar el líquido.
  • Relés. Sirven para controlar la energía que les llega a las bombas de agua. Se controla por software, cuando se va a servir la bebida, se activa el relé correspondiente a la bebida seleccionada.
  • Tubo PVC. Se utiliza para transmitir el líquido.
  • Pilas. Se utilizan para alimentar cada una de las bombas.
  • Caja. Se emplea para montar todo el proyecto dentro

Esquema de conexiones

Problemas

Una vez con la idea establecida, se empezó a evaluar cada módulo por separado, programando pequeños códigos que se acerquen al funcionamiento en el proyecto. Todos los módulos reaccionaron de forma satisfactoria, excepto la pantalla LCD y los relés, que llevaron más tiempo. 

Las problemáticas con ambos módulos se resumen en confusiones cuando se conectaron en la tabla de prototipo. La pantalla, al contar con muchas conexiones, fue común que algún cable se soltará o no terminará de hacer contacto, provocando resultados inesperados.  

Con los relés ocurrió algo parecido. Al no conectarlos bien en una primera instancia, el software no funcionó. Al intentar apagar las bombas de agua por software, estas no reaccionaban, simplemente se quedaban encendidas y seguían funcionando. 

Y derivado del empaquetado, al montar el proyecto surgieron otros problemas. Al enchufar las bombas de agua al circuito, el grupo se dio cuenta de que había problemas de alimentación. Por esto, se necesitó incorporar una pila para alimentar solo las bombas de agua. 

Otro problema que no tiene que ver con la parte electrónica fue el empaquetado. El proyecto cuenta con muchos módulos y conexiones. Además, el proyecto necesita tener cierta distribución espacial para que pueda funcionar. Un ejemplo de esto es el ultrasonidos, que debe apuntar hacia el vaso. Debido a esto, se ha tenido problemas con el empaquetado, ya que había veces en las que los cables no tenían la suficiente longitud o la disposición de los módulos en el espacio no permitían que la máquina funcionara correctamente. 

Además, al hacer funcionar todos los módulos en conjunto dentro del circuito, la pantalla LCD daba problemas. No se imprimía lo que debía aparecer y salían símbolos desconocidos. Buscando información, parecía que este problema tenía que ver con los relés, que, al manipular la tensión del circuito, provocaba problemas con la alimentación de la pantalla LCD. Aun así, este problema se solventó mediante software, limpiando la pantalla y reescribiéndola más a menudo. 

Y finalmente, el último problema fue la disposición de los líquidos. Esto también viene derivado del empaquetado. Esto no ha sido un problema de electrónica, sino de física. No se conseguía que el líquido subiera por los tubos correctamente. Esto viene por diferentes factores. Tubos demasiado largos, botellas muy pequeñas en las que la bomba se queda encajada y no coge fuerza, el recorrido del tubo no ayudaba al líquido a recorrer su camino con velocidad, etc. 

Vídeo caso ejemplo

Vídeo explicativo completo

Código

#include <LiquidCrystal.h> 

 
 

//Crear el objeto LCD con los números correspondientes (rs, en, d4, d5, d6, d7) 

LiquidCrystal lcd(13, 12, 8, 9, 10, 11); 

 
 

const int pinJoyX = A0; 

const int pinJoyY = A1; 

const int pinJoyButton = 3; 

 
 

const int bombaGine = 7; 

const int bombaRon = 6; 

const int bombaCoca = 5; 

const int bombaFanta = 4; 

 
 

const int EchoPin = A4; 

const int TriggerPin = A5; 

 
 

int bebida = 0; 

 
 

int liquid = 0; 

 
 

int dist = 0; 

 
 
 

void setup() { 

  pinMode(pinJoyButton, INPUT_PULLUP);  //activar resistencia pull up 

 
 

  pinMode(bombaGine, OUTPUT); 

  pinMode(bombaRon, OUTPUT); 

  pinMode(bombaCoca, OUTPUT); 

  pinMode(bombaFanta, OUTPUT); 

 
 

  pinMode(TriggerPin, OUTPUT); 

  pinMode(EchoPin, INPUT); 

 
 

  // Inicializar el LCD con el número de  columnas y filas del LCD 

  lcd.begin(16, 2); 

  // Limpiamos la pantalla 

  lcd.clear(); 

  Serial.begin(9600); 

 
 

  lcd.setCursor(0, 0); 

  lcd.print("DISPENSADOR"); 

  delay(2000); 

  lcd.clear(); 

  lcd.setCursor(0, 0); 

  lcd.print("ALCOHOL:"); 

 
 

  // digitalWrite(bombaGine, LOW); 

  // digitalWrite(bombaRon, LOW); 

  // digitalWrite(bombaCoca, LOW); 

  // digitalWrite(bombaFanta, LOW); 

} 

 
 

void loop() { 

  Serial.println(ping(TriggerPin, EchoPin)); 

 
 

  int Xvalue = 0; 

  int Yvalue = 0; 

  bool buttonValue = false; 

 
 

  //leer valores 

  Xvalue = analogRead(pinJoyX); 

  delay(100);  //es necesaria una pequeña pausa entre lecturas analógicas 

  Yvalue = analogRead(pinJoyY); 

  buttonValue = digitalRead(pinJoyButton); 

 
 

  //Serial.print("X"); 

  //Serial.println(Xvalue); 

  //Serial.print("y"); 

  //Serial.println(Yvalue); 

 
 
 

  if (Xvalue < 100) { 

 
 

    if (liquid == 0) { 

      lcd.clear(); 

      lcd.setCursor(0, 0); 

      lcd.print("ALCOHOL:"); 

      lcd.setCursor(3, 1); 

      lcd.print("Ginebra");  //Seleccion 

      bebida = 1; 

 
 

    } else { 

      lcd.clear(); 

      lcd.setCursor(0, 0); 

      lcd.print("MEZCLA:"); 

      lcd.setCursor(3, 1); 

      lcd.print("CocaCola");  //Seleccion 

      bebida = 3; 

    } 

 
 
 

  } else if (Xvalue > 900) { 

 
 
 

    if (liquid == 0) { 

      lcd.clear(); 

      lcd.setCursor(0, 0); 

      lcd.print("ALCOHOL:"); 

      lcd.setCursor(5, 1); 

      lcd.print("Ron");  //Seleccion 

      bebida = 2; 

 
 

    } else { 

      lcd.clear(); 

      lcd.setCursor(0, 0); 

      lcd.print("MEZCLA:"); 

      lcd.setCursor(5, 1); 

      lcd.print("Fanta");  //Seleccion 

      bebida = 4; 

    } 

 
 
 

  } else if (Yvalue < 100) { 

 
 

    if (liquid == 0) { 

      lcd.clear(); 

      lcd.setCursor(0, 0); 

      lcd.print("Cambiando...");  //Pasar de alcohol a liquido 

      liquid = 1; 

      delay(1000); 

      lcd.clear(); 

      lcd.setCursor(0, 0); 

      lcd.print("MEZCLA:"); 

    } else { 

      lcd.clear(); 

      lcd.setCursor(0, 0); 

      lcd.print("MEZCLA:"); 

    } 

 
 
 

  } else if (Yvalue > 900) { 

 
 

    if (liquid == 0) { 

      lcd.clear(); 

      lcd.setCursor(0, 0); 

      lcd.print("ALCOHOL:"); 

      lcd.setCursor(3, 1); 

      lcd.print("Sirviendo...");  //Echar liquido 

 
 

      if (bebida == 1) { 

        digitalWrite(bombaGine, HIGH); 

      } else if (bebida == 2) { 

        digitalWrite(bombaRon, HIGH); 

      } 

 
 

    } else { 

      lcd.clear(); 

      lcd.setCursor(0, 0); 

      lcd.print("MEZCLA:"); 

      lcd.setCursor(3, 1); 

      lcd.print("Sirviendo...");  //Aceptar liquido 

 
 

      if (bebida == 3) { 

        digitalWrite(bombaCoca, HIGH); 

 
 

      } else if (bebida == 4) { 

        digitalWrite(bombaFanta, HIGH); 

      } 

    } 

 
 
 

  } else if (buttonValue == false) { 

    lcd.clear(); 

    lcd.setCursor(0, 0); 

    lcd.print("Reiniciando..."); 

 
 

    liquid = 0; 

    bebida = 0; 

 
 

    digitalWrite(bombaGine, LOW); 

    digitalWrite(bombaRon, LOW); 

    digitalWrite(bombaCoca, LOW); 

    digitalWrite(bombaFanta, LOW); 

 
 

    delay(1000); 

    lcd.clear(); 

    lcd.setCursor(0, 0); 

    lcd.print("DISPENSADOR"); 

    delay(2000); 

    lcd.clear(); 

    lcd.setCursor(0, 0); 

    lcd.print("ALCOHOL:"); 

 
 

  } else if (Yvalue < 900) { 

    digitalWrite(bombaGine, LOW); 

    digitalWrite(bombaRon, LOW); 

    lcd.begin(16, 2); 

 
 

    if (liquid == 0) { 

      lcd.clear(); 

      lcd.setCursor(0, 0); 

      lcd.print("ALCOHOL:"); 

      if (bebida == 1) { 

        lcd.setCursor(3, 1); 

        lcd.print("Ginebra"); 

      } else if (bebida == 2) { 

        lcd.setCursor(5, 1); 

        lcd.print("Ron"); 

      } 

 
 
 

    } else { 

      lcd.clear(); 

      lcd.setCursor(0, 0); 

      lcd.print("MEZCLA :"); 

      if (bebida == 3) { 

        lcd.setCursor(3, 1); 

        lcd.print("CocaCola"); 

      } else if (bebida == 4) { 

        lcd.setCursor(5, 1); 

        lcd.print("Fanta"); 

      } 

    } 

  } 

 
 

  if (ping(TriggerPin, EchoPin) <= 7) { 

    digitalWrite(bombaCoca, LOW); 

    digitalWrite(bombaFanta, LOW); 

    lcd.begin(16, 2); 

    lcd.clear(); 

    lcd.setCursor(0, 0); 

    lcd.print("MEZCLA:"); 

  } 

} 

 
 

int ping(int TriggerPin, int EchoPin) { 

  long duration, distanceCm; 

 
 

  digitalWrite(TriggerPin, LOW);  //para generar un pulso limpio ponemos a LOW 4us 

  delayMicroseconds(4); 

  digitalWrite(TriggerPin, HIGH);  //generamos Trigger (disparo) de 10us 

  delayMicroseconds(10); 

  digitalWrite(TriggerPin, LOW); 

 
 

  duration = pulseIn(EchoPin, HIGH);  //medimos el tiempo entre pulsos, en microsegundos 

 
 

  distanceCm = duration * 10 / 292 / 2;  //convertimos a distancia, en cm 

  return distanceCm; 

} 

 

También te podría gustar...

1 respuesta

  1. Hugo Ramos dice:

    Hola, me gustaria saber donde comprasteis los materiales utilizados para este proyecto, tanto las bombas de agua, los relés y las pilas. Ya que voy a intentar recrear vuestro proyecto para mi trabajo final de ciclo.
    Muchas gracias,
    Hugo

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *