Buenas tardes a todos.
Alberto, acabo de ver la bomba. ¿Las has comprado ya?. Te comento, funcionan a muchas revoluciones, parece una máquina de afeitar. Tengo un par por casa. Si quieres, te regalo una para que hagas pruebas, sin compromiso.
Yo hice un montaje con tres bombas como la que te comenté, quedó algo parecido a esto (falta una bomba, llegó defectuosa y me enviaron otra).
Comento el montaje:
Cada bomba perilstática va comentada a una salida de esta placa de mosfets comprada en Ebay:
http://www.emartee.com/product/42102/4%2...Compatible
Esta placa hace tiempo que la compré, hoy no la hubiese comprado, la habría construido yo. Con la placa,
Cada bomba la conecto a un pin analógico del Arduino (mediante la placa anterior), y en la regulo a 150-160 (de 255 que es el máximo PWM).
Los pulsadores los puse en cada bomba para de vez en cuando, testar la cantidad de abono que sale de cada bomba; los segundos de abonado coinciden tanto en manual como automático.
El código:
Código:
///////// XAVI LOPEZ 15 ENERO 2014
///////// PROYECTO ABONADOR 3 BOMBAS
///////// ACUARIO DULCE
#include "Wire.h"
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
#include <TimeAlarms.h>
#include <Time.h>
#include <DS1307RTC.h>
//////////////////////////////////
/// DEFINICION DE PINES ////
//////////////////////////////////
int motorMacros = 10; // BOMBA MACROS
int motorHierro = 9; // BOMBA HIERRO
int motorMicros = 3; // BOMBA MICROS
int Aireador = 5; // AIREADOR PARA MOVER LAS MEZCLAS
const int buttonMacros = 8; // PULSADOR BOMBA MACROS
const int buttonHierro = 4; // PULSADOR BOMBA HIERRO
const int buttonMicros = 7; // PULSADOR BOMBA MICROS
int buttonStateHierro = 0;
int buttonStateMicros = 0;
int buttonStateMacros = 0;
///////////////////////////////////
int tiempoMacros= 2000; // TIEMPO ABONADO MACROS
int tiempoMicros= 2000; // TIEMPO ABONADO MICROS
int tiempoHierro= 2000; // TIEMPO ABONADO HIERRO
///////////////////////////////////
int horMacros = 14; // HORA ABONADO MACROS
int minMacros = 30; // MINUTOS ABOMADO MACROS
int segMacros = 10; // SEGUNDOS ABONADO MACROS
///////////////////////////////////
int horMicros = 14; // HORA ABONADO MICROS
int minMicros = 31; // MINUTOS ABOMADO MICROS
int segMicros = 10; // SEGUNDOS ABONADO MICROS
///////////////////////////////////
int horHierro = 14; // HORA ABONADO HIERRO
int minHierro = 32; // MINUTOS ABONADO HIERRO
int segHierro = 10; // SEGUNDOS ABONADO HIERRO
//////////////////////////////////
/// VOID SETUP ////
//////////////////////////////////
void setup()
{
Wire.begin();
setSyncProvider(RTC.get);
pinMode(motorMacros, OUTPUT);
pinMode(motorHierro, OUTPUT);
pinMode(motorMicros, OUTPUT);
pinMode(Aireador, OUTPUT);
pinMode(buttonHierro, INPUT);
pinMode(buttonMicros, INPUT);
pinMode(buttonMacros, INPUT);
lcd.init();
lcd.backlight();
lcd.clear();
}
//////////////////////////////////
/// VOID LOOP ////
//////////////////////////////////
void loop()
{
/////////////////////////////////////////////////////////////
///////// ALARMAS BOMBAS /////////////////////////////
////// dowSunday, dowMonday, dowTuesday, dowWednesday, dowThursday, dowFriday, dowSaturday
//////////////////////////////////////////////////////////////////////////////////
Alarm.alarmRepeat(dowMonday,horMacros,minMacros,segMacros,BombaMacros); //// ABONO MACROS 3 VECES A LA SEMANA
Alarm.alarmRepeat(dowWednesday,horMacros,minMacros,segMacros,BombaMacros); //// LUNES, MIERCOLES Y VIERNES
Alarm.alarmRepeat(dowFriday,horMacros,minMacros,segMacros,BombaMacros);
//////////////////////////////////////////////////////////////////////////////////
Alarm.alarmRepeat(dowSaturday,horMicros,minMicros,segMicros,BombaMicros); //// ABONO MICROS 1 DIA A LA SEMANA, SABADO
//////////////////////////////////////////////////////////////////////////////////
Alarm.alarmRepeat(dowTuesday,horHierro,minHierro,segHierro,BombaHierro); ///// ABONO HIERRO 2 VECES A LA SEMANA
Alarm.alarmRepeat(dowThursday,horHierro,minHierro,segHierro,BombaHierro); ///// MARTES Y JUEVES
//////////////////////////////////////////////////////////////////////////////////
Pantalla();
Alarm.delay(1000);
Abonado_Manual();
}
//////////////////////////////////
/// VOID ABONADO_MANUAL ////
//////////////////////////////////
void Abonado_Manual()
{
buttonStateHierro = digitalRead(buttonHierro);
buttonStateMicros = digitalRead(buttonMicros);
buttonStateMacros = digitalRead(buttonMacros);
/////////////////////////////////////////////////
/// HIERRO
if (buttonStateHierro == HIGH)
{
BombaHierro();
}
/////////////////////////////////////////////////
//// MICROELEMENTOS
if (buttonStateMicros == HIGH)
{
BombaMicros();
}
/////////////////////////////////////////////////
// MACROELEMENTOS = MEZCLA POTASIO/NITRATO/FOSFATO
if (buttonStateMacros == HIGH)
{
BombaMacros();
}
}
//////////////////////////////////
/// VOID PANTALLA ////
//////////////////////////////////
void Pantalla()
{
lcd.setCursor(4,0);
if (hour() < 10) lcd.print("0");
lcd.print(hour());
printDigits(minute());
printDigits(second());
lcd.print(" ");
lcd.setCursor(3,1);
if (day() < 10) lcd.print("0");
lcd.print(day());
lcd.print(" ");
if (month() < 10) lcd.print("0");
lcd.print(month());
lcd.print(" ");
lcd.print(year());
}
void printDigits(int digits)
{
lcd.print(":");
if(digits < 10)
lcd.print("0");
lcd.print(digits);
}
/////////////////////////////////////////////
/////////// VOID BOMBAS ///////////
////////////////////////////////////////////
void BombaHierro()
{
lcd.setCursor(0,1);
lcd.print("ABONANDO HIERRO");
//analogWrite(Aireador, 50);
//delay(5000);
//analogWrite(Aireador, 0);
//delay(1000);
analogWrite(motorHierro, 170);
delay(tiempoHierro);
analogWrite(motorHierro, 0);
delay (1000);
lcd.setCursor(0,1);
lcd.print(" ");
}
////////////////////////////////////////////
void BombaMicros()
{
lcd.setCursor(0,1);
lcd.print("ABONANDO MICROS");
//analogWrite(Aireador, 50);
//delay(5000);
//analogWrite(Aireador, 0);
//delay(5000);
analogWrite(motorMicros, 170);
delay(tiempoMicros);
analogWrite(motorMicros, 0);
delay (1000);
lcd.setCursor(0,1);
lcd.print(" ");
}
////////////////////////////////////////////
void BombaMacros()
{
lcd.setCursor(0,1);
lcd.print("ABONANDO MACROS");
//analogWrite(Aireador, 50);
//delay(5000);
//analogWrite(Aireador, 0);
//delay(5000);
analogWrite(motorMacros, 160);
delay(tiempoMacros);
analogWrite(motorMacros, 0);
delay (1000);
lcd.setCursor(0,1);
lcd.print(" ");
}
////////////////////////////////////////////
Estoy seguro que el código se puede modificar. Medina, otro apasionado de los acuarios y Arduíno, me hizo ver que la botonera no responde correctamente, pero para el uso que le doy, ya me va bien.
Se me olvidaba, para mover las mezclas antes de abonar, desmonté un aireador a pilas y utilicé su motor:
Va conectado a los tres recipientes de abono.
Como comenté, no tengo formación en temas electrónica-programación, y el código es un copia-pega de varios ejemplos que corren por la red.
Saludos y que la comunidad Arduinera siga creciendo.