Módulo "PERISTALDUINO" de bombas peristalticas

28 Sep 2011
147
Leganés
Provincia
Madrid
Estoy haciendo ( o intentando hacer...) un módulo con 3 bombas peristálticas alimentadas a 6 voltios que he comprado en ebay, a unos 8.50 euros cada una.



Quiero que tenga un display para poder ver la información, aunque para no complicar el código con menús y botones los datos los voy a meter mediante código ya que tengo el ordenador al lado.
La información a mostrar es la hora, la fecha, y para cada bomba, la hora de activación, la cantidad a aditar y el estado On/Off.
Voy a utilizar una pantalla lcd i2c de 20x4 que tengo en un cajón, el módulo de reloj DS1307, y un arduino uno.

Me hecho una placa con todas algunas entradas y salidas, así como los mosfet para controlar los motores.

Éste es el esquema:

https://imageshack.us/photo/my-images/707/l3sr.jpg/

En la placa entra 6V, para alimentar los motores directamente y a un L7805 para convertirlo a los 5V que funciona el arduino. Los conectores X1-1 va al pin 9 del arduino que controla la bomba1, el x1-2 al pin10 para la bomba2, el x1-3 al pin11 para la bomba3, y el x1-4 va al GND del arduino.
Así mismo tiene la opción del cebado (sin necesidad del arduino) de cada bomba mediante un pulsador.

Este es la placa que he hecho con el programa "eagle" en su versión gratuita:

https://www.cadsoftusa.com/download-eagle/?language=en

https://imageshack.us/photo/my-images/13/x5ws.jpg/

La he pasado a una placa de cobre para circuitos impresos de una cara con la "técnica del toner y la plancha", y atacado con el salfuman y el agua oxigenada que en internet está muy explicada... aunque si alguien quiere lo pongo aquí.

El código del Arduino es este :


// Modulo para controlar 3 bombas peristáticas con lcd.
// tristan1412 (www.todomarino.com)
// versión 1.0 (2013)

#include "Wire.h"
#include <Wire.h> //
#define DS1307_I2C_ADDRESS 0x68 // Módulo reloj DS1307 address to 0x68
#include <LiquidCrystal_I2C.h> // libería lcd i2c
#include <DS1307new.h>
LiquidCrystal_I2C lcd(0x27,20,4); // LCD address to 0x27 de 20 columnas y 4 filas



//define los pines de las bombas
int bombaPin1 = 9; // Pin bomba 1
int bombaPin2 = 10; // Pin bomba 2
int bombaPin3 = 11; // Pin bomba 3


// ++++++++ BOMBA 1 MAGNESIO ++++++++
//int dayOfWeekB1=3; // Para activar sólo si se quiere aditar en un día de la semana determinado
int horaB1=12; // Hora de aditado bomba 1
int minB1=15; // minutos de aditado bomba 1
int segB1=00; // segundos de aditado bomba 1
int caudalB1 = 100; // Según caracteristicas del motor, tiene un caudal de 100 ml por minuto.
int cantB1 = 20; // Cantidad que se quiere aditar en cc.
int tiempoB1 = ((60 * cantB1 ) / caudalB1 )*1000 ; // Cálculo de los milisegundos que está la bomba 1 activa según la cantidad a aditar

// ++++++++ BOMBA 2 CALCIO ++++++++
//int dayOfWeekB2=6; // Para activar sólo si se quiere aditar en un día de la semana determinado
int horaB2=03; // Hora de aditado bomba 2
int minB2=00; // minutos de aditado bomba 2
int segB2=00; // segundos de aditado bomba 2
int caudalB2 = 100; // Según caracteristicas del motor, tiene un caudal de 100 ml por minuto.
int cantB2 = 37; // Cantidad que se quiere aditar en cc.
int tiempoB2 = ((60 * cantB2 ) / caudalB2 )*1000 ; // Cálculo de los milisegundos que está la bomba 2 activa según la cantidad a aditar

// ++++++++ BOMBA 3 KH ++++++++
//int dayOfWeekB3=1; // Para activar sólo si se quiere aditar en un día de la semana determinado
int horaB3=22; // Hora de aditado bomba 3
int minB3=30; // minutos de aditado bomba 3
int segB3=00; // segundos de aditado bomba 3
int caudalB3 = 100; // Según caracteristicas del motor, tiene un caudal de 100 ml por minuto.
int cantB3 = 12; // Cantidad que se quiere aditar en cc.
int tiempoB3 = ((60 * cantB3 ) / caudalB3 )*1000 ;// Cálculo de los milisegundos que está la bomba 3 activa según la cantidad a aditar



// Convierte números normales decimales a BCD (binario decimal codificado)
byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}

// Convierte BCD (binario decimal codificado) a números normales decimales
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}



// Parar el DS1307, pero esto tiene el efecto secundario de que los segundos se ponen a 0
// probablemente solo quiera usar esto para pruebas.
/*
void stopDs1307()
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(0);
Wire.send(0x80);
Wire.endTransmission();
}
*/


// 1) Sets the date and time on the ds1307
// 2) Starts the clock
// 3) Sets hour mode to 24 hour clock
// Assumes you're passing in valid numbers

void setDateDs1307(byte second, // 0-59
byte minute, // 0-59
byte hour, // 1-23
byte dayOfWeek, // 1-7
byte dayOfMonth, // 1-28/29/30/31
byte month, // 1-12
byte year) // 0-99

{
Wire.beginTransmission(DS1307_I2C_ADDRESS); // direccion 0x68 del ds1307
Wire.write(0); // inicia el puntero de la memoria del ds1307
Wire.write(decToBcd(second)); // 0 a bit 7 inicia el reloj
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour)); // Si usted quiere 12 hora am/pm usted tiene que poner el
// bit 6 (tambien tiene que cambiar readDateDs1307)

Wire.write(decToBcd(dayOfWeek));
Wire.write(decToBcd(dayOfMonth));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.endTransmission();
}


// Establece la fecha y el tiempo del ds1307
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{

// Resetea el registro puntero
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

// Alguno de estos necesitan enmascarar porque ciertos bits son bits de control

*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f); // Need to change this if 12 hour am/pm
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}

//++++++++++++++++++++++++++++++++++++++
// VOID SETUP()
//++++++++++++++++++++++++++++++++++++++


void setup()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
pinMode(bombaPin1, OUTPUT);
pinMode(bombaPin2, OUTPUT);
pinMode(bombaPin3, OUTPUT);

Wire.begin();
Serial.begin(9600);
lcd.init();
lcd.backlight();

/*
// Cambie estos valores a los que usted quiere poner su reloj.
// Usted probablemente solo quiere poner su reloj una vez y luego quitar
// la llamada de setDateDs1307.

// si desea poner en hora, escriba la hora, active esta parte y cargarla en el arduino
// luego,desactive y vuelva a cargarla en la placa
second = 00;
minute = 15;
hour = 19;
dayOfWeek = 3;
dayOfMonth = 28;
month = 8;
year = 13;

setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
*/

}


//++++++++++++++++++++++++++++++++++++++
// VOID LOOP()
//++++++++++++++++++++++++++++++++++++++

void loop()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

//imprime la hora en la pantalla

lcd.setCursor(0,0);
if (hour < 10) lcd.print("0");
lcd.print(hour, DEC);
lcd.print(":");
if (minute < 10) lcd.print("0");
lcd.print(minute, DEC);
lcd.print(":");
if (second < 10) lcd.print("0");
lcd.print(second, DEC);
lcd.print(" - ");
lcd.setCursor(11,0);

// Esto pone nombre del dia
switch (dayOfWeek)
{
case 1:
lcd.print("Lun");
break;
case 2:
lcd.print("Mar");
break;
case 3:
lcd.print("Mie");
break;
case 4:
lcd.print("Jue");
break;
case 5:
lcd.print("Vie");
break;
case 6:
lcd.print("Sab");
break;
case 7:
lcd.print("Dom");
break;
}

lcd.print(",");
if (dayOfMonth < 10) lcd.print("0");
lcd.print(dayOfMonth, DEC);
lcd.print("/");
if (month < 10) lcd.print("0");
lcd.print(month, DEC);
// lcd.print("/");
// lcd.print("20");
// if (year < 10) lcd.print("0");
// lcd.print(year, DEC);

// delay(1000);




//++++++++++++++++++++++++++++++++++++++
// Bomba-1 Magnesio
//++++++++++++++++++++++++++++++++++++++
lcd.setCursor(1,1);
lcd.print("1:Mg ");
if (horaB1 < 10) lcd.print("0");
lcd.print(horaB1);
lcd.print(":");
if (minB1 < 10) lcd.print("0");
lcd.print(minB1);
lcd.print("");
lcd.setCursor(12,1);
lcd.print(cantB1);
lcd.print("cc");
lcd.print("");
lcd.setCursor(17,1);
if((hour == horaB1)&&(minute == minB1)&&(second==segB1))
// activar la siguiente línea para aditar sólo un día determinado de la semana, en lugar de todos los días y anular la anterior línea
// if((dayOfWeek == dayOfWeekB1)(hour == horaB1)&&(minute == minB1)&&(second==segB1))
{
lcd.print(" ON");
ActivaBomba1 ();
}
else lcd.print("OFF");

//Serial.print("Bomba B1 (segundos) : ");
//Serial.println(tiempoB1/1000);




//++++++++++++++++++++++++++++++++++++++
// Bomba-2 Calcio
//++++++++++++++++++++++++++++++++++++++
lcd.setCursor(1,2);
lcd.print("2:Ca ");
if (horaB2 < 10) lcd.print("0");
lcd.print(horaB2);
lcd.print(":");
if (minB2 < 10) lcd.print("0");
lcd.print(minB2);
lcd.print("");
lcd.setCursor(12,2);
lcd.print(cantB2);
lcd.print("cc");
lcd.print("");
lcd.setCursor(17,2);
if((hour == horaB2)&&(minute == minB2)&&(second==segB2))
// activar la siguiente línea para aditar sólo un día determinado de la semana, en lugar de todos los días y anular la anterior línea
// if((dayOfWeek == dayOfWeekB2)(hour == horaB2)&&(minute == minB2)&&(second==segB2))
{
lcd.print(" ON");
ActivaBomba2 ();
}
else lcd.print("OFF");

//Serial.print("Bomba B2 (segundos) : ");
//Serial.println(tiempoB2/1000);




//++++++++++++++++++++++++++++++++++++++
// Bomba-3 Kh
//++++++++++++++++++++++++++++++++++++++
lcd.setCursor(1,3);
lcd.print("3:Kh ");
if (horaB3 < 10) lcd.print("0");
lcd.print(horaB3);
lcd.print(":");
if (minB3 < 10) lcd.print("0");
lcd.print(minB3);
lcd.print("");
lcd.setCursor(12,3);
lcd.print(cantB3);
lcd.print("cc");
lcd.print("");
lcd.setCursor(17,3);
if((hour == horaB3)&&(minute == minB3)&&(second==segB3))
// activar la siguiente línea para aditar sólo un día determinado de la semana, en lugar de todos los días y anular la anterior línea
// if((dayOfWeek == dayOfWeekB3)(hour == horaB3)&&(minute == minB3)&&(second==segB3))
{
lcd.print(" ON");
ActivaBomba3 ();
}
else lcd.print("OFF");

//Serial.print("Bomba B3 (segundos) : ");
//Serial.println(tiempoB3/1000);

}


//++++++++++++++++++++++++++++++++++++++
// Funciones para activar las bombas
//++++++++++++++++++++++++++++++++++++++




void ActivaBomba1 (){
analogWrite(bombaPin1, 255); // Arranca bomba1.
delay(tiempoB1);
analogWrite(bombaPin1, 0); // Apaga bomba1.
}

void ActivaBomba2 (){
analogWrite(bombaPin2, 255); // Arranca bomba2.
delay(tiempoB2);
analogWrite(bombaPin2, 0); // Apaga bomba2.
}


void ActivaBomba3 (){
analogWrite(bombaPin3, 255); // Arranca bomba3.
delay(tiempoB3);
analogWrite(bombaPin3, 0); // Apaga bomba3.
}




El "inconveniente" que tiene es que mientras están funcionando las bombas los segundos se paran, aunque se actualiza a la hora real cuando las bombas dejan de funcionar.

Para saber el tiempo que tiene que funcionar cada bomba, he puesto en el código una variable de flujo del motor por segundo y la cantidad que quiero aditar en cc., y así calculo los milisegundos que tiene que funcionar. De esta manera se puede configurar para cualquier bomba.

https://imageshack.us/photo/my-images/443/hg8b.jpg/

Aunque está sin terminar todavía, lo estoy metiendo todo en una caja de madera que compré en las tiendas de los chinos. Me queda pintarla y fijar todo.

He hecho algunas pruebas y de momento funciona bien. La pena es que no he hecho ninguna foto del proceso, pero en el siguiente prometo hacerlo.
En cuanto llegue a casa hago más fotos

https://imageshack.us/photo/my-images/62/mxzh.jpg/

A ver si véis algún error o algo a modificar, ya que estoy empezando con el arduino y no controlo mucho.

Si alguien está interesado en los archivos del "eagle" que me lo diga y los pongo aquí.

Un saludo a todos
 
Última edición:
31 Jul 2012
16
Barcelona Capital
Provincia
Barcelona
Hola compañero.
Sigo tu post, a ver donde llegas. Siento no poder ayudarte, pero mis conocimientos de Arduino son limitados.

Te pongo el enlace a otro montaje de bombas perilstaticas con Arduino, por si te es de ayuda:



Saludos
 
6 Mar 2012
138
Vigo
Provincia
Pontevedra
Hola tristan,

Despues de ver tu proyecto me voy a animar a ampliar la instalacion mia de mi arduino que actualmente esta controlando luz y temperatura.

He visto por el esquema que usas diodos in4933 entre los pines de la masa. Yo en vez de usar motores de 6V voy a usar de 12V.

Ya he pillado los IRFZ44N

¿tendria que usar los mismos diodos in4933? yo de electronica y sus conceptos lo basico de todo

gracias!!
 
Última edición:
4 Sep 2013
133
Manresa
Provincia
Barcelona
Hola, podrías dar mas detalles del conexionado con arduino y el modulo lcd que utilizas y el de reloj?
 
Arriba