The pump is not PWM controllable, it is 0-5v Analog controlled.
Axe the factory controller add 0-10V Analog control 24VDC PWM module. Control with Apex, Problem solved. Detailed earlier in this thread
The pump is not PWM controllable, it is 0-5v Analog controlled.
:bounce3::bounce3::ape:FWIW...I've heard that it takes more than 50 units if you want to create 'surfing' waves in your swimming pool!
I will most certainly post my findings.
It's not always 24v. atmega328 is 5v PWM and I understand the Apex to be 10v. You are correct that PWM never changes the voltage.
I meant in this application it would always be 24v (which is what the power supply is) PWM can be ANY voltage at all, it's all about the frequency and duty cycle of the signal![]()
I meant in this application it would always be 24v (which is what the power supply is) PWM can be ANY voltage at all, it's all about the frequency and duty cycle of the signal![]()
So are we doing any harm to the pump / Driver using the Dimmer but keeping it above 12V ... Can the dimmer linked above safely handle the loads we are putting on it ?:deadhorse1:
Driving the pump with a 24v pwm signal is above and beyond the most efficient and fail safe way to be doing it. The stator and magnet combo was built around the field that would be generated by 24v, and should be near it's peak efficiency which means less heat, less wasted energy, and most likely the best for longevity of the pump. I've already seen a few posts with people having issues of the rotor lined up with the mounting magnets... lower voltage is only going to increase that problem (or may be what's causing it for some if they're using the adjustable supply)
If you want to ship 2 I would buy 2 from you and pay shipping...LMKi ordered 40 so i could get my 2 cheaper plus 1 for my brother. was thinking of putting 10 into a bathtub for my son to see how they do. i will sell the rest to the local reef club and who ever else wants a cheaper unit. came to 77 bucks a unit shipped to me.
#include <Arduino.h>
/*
Software para controlar bomba WP-40 - 1 canal
Arduino
Bomba WP-40
Transformador
Reset do Arduino faz a função Feed(Para a bomba por 5m) e reinicializa passados esses 5m.
*/
// constantes
//const int ModoFuncionamento = 1;
const int maxModos = 6;
const int buttonPin = 7;
const int buttonPinF = 8;
const int PWMPinLPF = 3;
const int PinLed1 = 10;
const int PinLed2 = 11;
const int PinLed3 = 12;
const int PinLed4 = 13;
// Variaveis:
int ModoFuncionamento = 1;
int ModoFuncionamentoAnt = 0;
int EstadoPulse = 0;
long previousMillis = 0;
unsigned long currentMillis = millis();
int buttonState = 0;
int buttonStateF = 0;
int ValPoten = 0;
//Inicio Funções
void limpaLeds()
{
digitalWrite(PinLed1, LOW);
digitalWrite(PinLed2, LOW);
digitalWrite(PinLed3, LOW);
digitalWrite(PinLed4, LOW);
}
void activaLeds()
{
switch (ModoFuncionamento){
case 1:
digitalWrite(PinLed1, HIGH);
break;
case 2:
digitalWrite(PinLed2, HIGH);
break;
case 3:
digitalWrite(PinLed3, HIGH);
break;
case 4:
digitalWrite(PinLed4, HIGH);
break;
case 5:
digitalWrite(PinLed1, HIGH);
digitalWrite(PinLed2, HIGH);
break;
case 6:
digitalWrite(PinLed1, HIGH);
digitalWrite(PinLed4, HIGH);
break;
case 7:
digitalWrite(PinLed1, HIGH);
digitalWrite(PinLed2, HIGH);
digitalWrite(PinLed3, HIGH);
digitalWrite(PinLed4, HIGH);
break;
}
}
void verificaPushButton()
{
buttonState = digitalRead(buttonPin);
buttonStateF = digitalRead(buttonPinF);
}
void timer(long milliSegundos)
{
int sai = 0;
if(buttonState == HIGH){
return;
}
do {
currentMillis = millis();
verificaPushButton();
if(currentMillis - previousMillis > milliSegundos) {
previousMillis = currentMillis;
sai = 1;
}
} while (buttonState == LOW && buttonStateF == LOW && sai == 0);
}
/*
Modo a utilizar dentro do ReefCrazy - Faz nX Pulse
*/
void PulseSingle(int Imax, int Imin, int MiliSegundos, int NrTimes)
{
int Contador = 0;
int sai = 0;
// Imax = Imax - ((ValPoten * 255)/1023)
// Imin = Imin - ((ValPoten * 255)/1023)
if(buttonState == HIGH || buttonStateF == HIGH){
return;
}
do {
Contador = Contador + 1;
analogWrite(PWMPinLPF, Imax);
timer(MiliSegundos);
if(buttonState == HIGH || buttonStateF == HIGH){
return;
}
analogWrite(PWMPinLPF, Imin);
timer(MiliSegundos);
if(buttonState == HIGH || buttonStateF == HIGH){
return;
}
}
while (Contador <= NrTimes && buttonState == LOW);
}
/* Pulse(Imax, Imin, MilSegundos) - Modo 1
Recebe de entrada:
Imax: Intensidade máxima do Pulse
Imin: Intensidade Minima depois do pulse
MilSegundos: Nr de MiliSegundos de intervalo entre intesidade Máxima e Minima
O Objectivo é variar directo, sem incremento gradual entre a velocidade máxima e velocidade minima pelo nr de segundos indicado
Ex:
Pulse(255, 100, 500)
A Bomba deveria começar a cerca de 40%(100/255) durante 0,5 Segundos, em seguida faz 100% durante 0,5 Segundos
*/
void Pulse(int Imax, int Imin, int MiliSegundos)
{
if(buttonState == HIGH || buttonStateF == HIGH){
return;
}
PulseSingle(Imax, Imin, MiliSegundos, 5);
}
/* RampUp(IntMin, IntMax, Increm, Percent) - Modo 2
Recebe de entrada:
IntMin: Intensidade Inicial
IntMax: Intensidade Final
Increm: Nr de MiliSegundos de intervalo entre intesidade
O Objectivo é variar directo com incremento gradual entre a intensidade minima e máxima, com Increm segundos de intervalo entre o incremento
Ex:
RampUp(50, 225, 500, 15)
A Bomba faria:
Começa nos 20% e fica durante 0,5 Seg
Incrementa 15 ao PWM(65/255) ficando a 25% durante 0,5 Seg
Vai incrementando 5% durante 0,5 Seg até chegar a 88%(225/255)
*/
void RampUp(int IntMin, int IntMax, int Increm, int Percent) {
int ValorPwm = IntMin;
// IntMax = IntMax - ((ValPoten * 255)/1023);
// IntMin = IntMin - ((ValPoten * 255)/1023);
// ValorPwm = IntMin;
if(buttonState == HIGH || buttonStateF == HIGH){
return;
}
analogWrite(PWMPinLPF, ValorPwm);
do
{
currentMillis = millis();
if(currentMillis - previousMillis > Increm) {
previousMillis = currentMillis;
if(ValorPwm > IntMax) {
ValorPwm = IntMax;
}
analogWrite(PWMPinLPF, ValorPwm);
ValorPwm = ValorPwm + Percent;
}
verificaPushButton();
if(buttonState == HIGH || buttonStateF == HIGH){
return;
}
}
while(ValorPwm < IntMax && ValorPwm >= IntMin);
}
/* RampDown(IntMin, IntMax, Increm, Percent) - Modo 2
Recebe de entrada:
IntMin: Intensidade Inicial
IntMax: Intensidade Final
Increm: Nr de MiliSegundos de intervalo entre intesidade
O Objectivo é variar directo com incremento gradual entre a intensidade minima e máxima, com Increm segundos de intervalo entre o incremento
Ex:
RampUp(50, 225, 500, 15)
A Bomba faria:
Começa nos 20% e fica durante 0,5 Seg
Incrementa 15 ao PWM(65/255) ficando a 25% durante 0,5 Seg
Vai incrementando 5% durante 0,5 Seg até chegar a 88%(225/255)
*/
void RampDown(int IntMin, int IntMax, int Increm, int Percent) {
int ValorPWM = IntMax;
if(buttonState == HIGH || buttonStateF == HIGH){
return;
}
// IntMax = IntMax - ((ValPoten * 255)/1023);
// IntMin = IntMin - ((ValPoten * 255)/1023);
// ValorPWM = IntMax;
analogWrite(PWMPinLPF, ValorPWM);
do
{
currentMillis = millis();
if(currentMillis - previousMillis > Increm) {
previousMillis = currentMillis;
if(ValorPWM < IntMin) {
ValorPWM = IntMin;
}
analogWrite(PWMPinLPF, ValorPWM);
ValorPWM = ValorPWM - Percent;
}
verificaPushButton();
if(buttonState == HIGH || buttonStateF == HIGH){
return;
}
}
while(ValorPWM <= IntMax && ValorPWM > IntMin);
}
/* ReefCrazy(IntMin, IntMax, SegMud) - Modo 3
Recebe de Entrada:
Intensidade Minima: Intensidade minima a que a bomba Roda
Intensidade Máxima: Intensidade Máxima a que a bomba roda
Segundos entre as mudanças: Segundos até mudança de modo aleatório
*/
void ReefCrazy(int IntMin, int IntMax, int SegMud)
{
int RNumber = random(IntMin, IntMax);
int MidleR = (IntMin + IntMax) / 2;
if(buttonState == HIGH || buttonStateF == HIGH){
return;
}
if(RNumber > (MidleR - 20) && RNumber < (MidleR + 20)) {
PulseSingle(240, 100, 500, 3);
}
if(RNumber > MidleR) {
RampDown(IntMin, MidleR, 500, 15);
}
else
{
RampUp(MidleR, IntMax, 500, 15);
}
RNumber = random(IntMin, IntMax);
MidleR = (IntMin + IntMax) / 2;
}
/* Modo 4
Sem parametros de entrada, sobe dos 0 aos 125PWM, faz Pulse 2X, continua a subir aos 255;
Começa a descer dos 255 até 125, faz pulse, e continua até 0;
*/
void JumpingHorse()
{
if(buttonState == HIGH || buttonStateF == HIGH){
return;
}
RampUp(100, 175, 200, 5);
PulseSingle(255, 150, 500, 2);
RampUp(175, 255, 200, 5);
RampDown(175, 255, 200, 5);
PulseSingle(255, 150, 500, 2);
RampDown(100, 175, 200, 5);
}
/* Modo 5
- Nutrient Export Mode(5 Pulses a 0,5s, muito pequenos, mais 5 maiores, pulse grande para fazer onda, e o processo de pulses inverso).
*/
void NutrientZero()
{
if(buttonState == HIGH || buttonStateF == HIGH){
return;
}
RampUp(125, 240, 300, 15);
timer(1000);
RampDown(125, 240, 300, 15);
PulseSingle(125, 225, 500, 8);
}
/* Modo Desligar - Modo 6 Para fazer por exemplo manutenção ao aquario, fica preparado para quem usar botão*/
void Desligar()
{
if(buttonState == HIGH || buttonStateF == HIGH){
return;
}
analogWrite(PWMPinLPF, 0);
}
void alimentar(long milliSegundos)
{
if(buttonState == HIGH || buttonStateF == HIGH){
return;
}
analogWrite(PWMPinLPF, 0);
timer(milliSegundos);
}
void setup()
{
// Inicializa PWM
Serial.begin(9600);
pinMode(PWMPinLPF, OUTPUT);
pinMode(PinLed1, OUTPUT);
pinMode(PinLed2, OUTPUT);
pinMode(PinLed3, OUTPUT);
pinMode(PinLed4, OUTPUT);
pinMode(buttonPin, INPUT);
pinMode(buttonPinF, INPUT);
previousMillis = millis();
limpaLeds();
activaLeds();
}
void loop(){
if(buttonState == HIGH){
if(ModoFuncionamento >= maxModos) {
ModoFuncionamento = 1;
} else {
ModoFuncionamento = ModoFuncionamento + 1;
}
limpaLeds();
activaLeds();
buttonState = LOW;
delay(200);
} else {
verificaPushButton();
}
//Verifica estado de FEED
if(buttonStateF == HIGH){
if(ModoFuncionamento == 7)
{
ModoFuncionamento = ModoFuncionamentoAnt;
} else {
ModoFuncionamentoAnt = ModoFuncionamento;
ModoFuncionamento = 7;
}
limpaLeds();
activaLeds();
buttonStateF = LOW;
delay(200);
}
if (ModoFuncionamento == 1) {
Pulse(255, 150, 300);
}
if (ModoFuncionamento == 2) {
RampUp(100, 245, 500, 15);
RampDown(100, 245, 500, 15);
}
if (ModoFuncionamento == 3) {
ReefCrazy(100, 245, 500);
}
if (ModoFuncionamento == 4) {
JumpingHorse();
}
if (ModoFuncionamento == 5) {
NutrientZero();
}
if (ModoFuncionamento == 6) {
Desligar();
}
if (ModoFuncionamento == 7) {
alimentar(300000);
ModoFuncionamento = ModoFuncionamentoAnt;
limpaLeds();
activaLeds();
}
}
Sorry for the late reply, having some trouble with my wife's keyboard...
Here you go, i received some PMs asking for somethings, so i think i should post everything!
WP-40 has 3 wires connecting the controller to the pump:
- 24V
- -24V(or GND)
- va
The first two should connect directly from the power suply, the problem is the va! What the hell could this be?
It is the dimming channel! wich works with 0-5V analog signal, where 0 means the pump is stopped and 5V means full power(well not quite, the pump only starts around 2V more or less). This could be controlled through a Arduino PWM signal, wich goes from 0-256(where 0 means 0V and 256 would mean 5V)!
After understanding this, i tried to control just the va wire and it worked.
So, i did a full controler with leds and buttons to control the pump, here you go.
Material:
- Arduino Uno(that's the one i had lying somewhere in the house);
- 4 Leds;
- 4 220ohms resistor to connecto to the leds;
- 2 Push Buttons NO(Normally Open);
- 2 10k Resistors to wire to the pushbuttons;
I also tried a Low Pass Filter(Wish is a circuit to convert the Digital PWM signal to an analog signal), but with 1K Resistor and 4.7uF capacitor the max output voltage was 3.8V, wich is not enough...
So forget about the low pass filter and connect straight to the pump from the PWM!
If you dont want buttons nor leds, you can control the pump just with an arduino(just connect the PWM to va wire and Arduino GND to -24V of the pump) but you wouldn't have the ability to change mode through a simple button.
I'm working on a way to control max power trough a potentiometer, but its not finished yet.
Here is the code, most of the comments are in Portuguese, but i can give you some hints and try to help whoever have some doubts.
Code:#include <Arduino.h> /* Software para controlar bomba WP-40 - 1 canal Arduino Bomba WP-40 Transformador Reset do Arduino faz a função Feed(Para a bomba por 5m) e reinicializa passados esses 5m. */ // constantes //const int ModoFuncionamento = 1; const int maxModos = 6; const int buttonPin = 7; const int buttonPinF = 8; const int PWMPinLPF = 3; const int PinLed1 = 10; const int PinLed2 = 11; const int PinLed3 = 12; const int PinLed4 = 13; // Variaveis: int ModoFuncionamento = 1; int ModoFuncionamentoAnt = 0; int EstadoPulse = 0; long previousMillis = 0; unsigned long currentMillis = millis(); int buttonState = 0; int buttonStateF = 0; int ValPoten = 0; //Inicio Funções void limpaLeds() { digitalWrite(PinLed1, LOW); digitalWrite(PinLed2, LOW); digitalWrite(PinLed3, LOW); digitalWrite(PinLed4, LOW); } void activaLeds() { switch (ModoFuncionamento){ case 1: digitalWrite(PinLed1, HIGH); break; case 2: digitalWrite(PinLed2, HIGH); break; case 3: digitalWrite(PinLed3, HIGH); break; case 4: digitalWrite(PinLed4, HIGH); break; case 5: digitalWrite(PinLed1, HIGH); digitalWrite(PinLed2, HIGH); break; case 6: digitalWrite(PinLed1, HIGH); digitalWrite(PinLed4, HIGH); break; case 7: digitalWrite(PinLed1, HIGH); digitalWrite(PinLed2, HIGH); digitalWrite(PinLed3, HIGH); digitalWrite(PinLed4, HIGH); break; } } void verificaPushButton() { buttonState = digitalRead(buttonPin); buttonStateF = digitalRead(buttonPinF); } void timer(long milliSegundos) { int sai = 0; if(buttonState == HIGH){ return; } do { currentMillis = millis(); verificaPushButton(); if(currentMillis - previousMillis > milliSegundos) { previousMillis = currentMillis; sai = 1; } } while (buttonState == LOW && buttonStateF == LOW && sai == 0); } /* Modo a utilizar dentro do ReefCrazy - Faz nX Pulse */ void PulseSingle(int Imax, int Imin, int MiliSegundos, int NrTimes) { int Contador = 0; int sai = 0; // Imax = Imax - ((ValPoten * 255)/1023) // Imin = Imin - ((ValPoten * 255)/1023) if(buttonState == HIGH || buttonStateF == HIGH){ return; } do { Contador = Contador + 1; analogWrite(PWMPinLPF, Imax); timer(MiliSegundos); if(buttonState == HIGH || buttonStateF == HIGH){ return; } analogWrite(PWMPinLPF, Imin); timer(MiliSegundos); if(buttonState == HIGH || buttonStateF == HIGH){ return; } } while (Contador <= NrTimes && buttonState == LOW); } /* Pulse(Imax, Imin, MilSegundos) - Modo 1 Recebe de entrada: Imax: Intensidade máxima do Pulse Imin: Intensidade Minima depois do pulse MilSegundos: Nr de MiliSegundos de intervalo entre intesidade Máxima e Minima O Objectivo é variar directo, sem incremento gradual entre a velocidade máxima e velocidade minima pelo nr de segundos indicado Ex: Pulse(255, 100, 500) A Bomba deveria começar a cerca de 40%(100/255) durante 0,5 Segundos, em seguida faz 100% durante 0,5 Segundos */ void Pulse(int Imax, int Imin, int MiliSegundos) { if(buttonState == HIGH || buttonStateF == HIGH){ return; } PulseSingle(Imax, Imin, MiliSegundos, 5); } /* RampUp(IntMin, IntMax, Increm, Percent) - Modo 2 Recebe de entrada: IntMin: Intensidade Inicial IntMax: Intensidade Final Increm: Nr de MiliSegundos de intervalo entre intesidade O Objectivo é variar directo com incremento gradual entre a intensidade minima e máxima, com Increm segundos de intervalo entre o incremento Ex: RampUp(50, 225, 500, 15) A Bomba faria: Começa nos 20% e fica durante 0,5 Seg Incrementa 15 ao PWM(65/255) ficando a 25% durante 0,5 Seg Vai incrementando 5% durante 0,5 Seg até chegar a 88%(225/255) */ void RampUp(int IntMin, int IntMax, int Increm, int Percent) { int ValorPwm = IntMin; // IntMax = IntMax - ((ValPoten * 255)/1023); // IntMin = IntMin - ((ValPoten * 255)/1023); // ValorPwm = IntMin; if(buttonState == HIGH || buttonStateF == HIGH){ return; } analogWrite(PWMPinLPF, ValorPwm); do { currentMillis = millis(); if(currentMillis - previousMillis > Increm) { previousMillis = currentMillis; if(ValorPwm > IntMax) { ValorPwm = IntMax; } analogWrite(PWMPinLPF, ValorPwm); ValorPwm = ValorPwm + Percent; } verificaPushButton(); if(buttonState == HIGH || buttonStateF == HIGH){ return; } } while(ValorPwm < IntMax && ValorPwm >= IntMin); } /* RampDown(IntMin, IntMax, Increm, Percent) - Modo 2 Recebe de entrada: IntMin: Intensidade Inicial IntMax: Intensidade Final Increm: Nr de MiliSegundos de intervalo entre intesidade O Objectivo é variar directo com incremento gradual entre a intensidade minima e máxima, com Increm segundos de intervalo entre o incremento Ex: RampUp(50, 225, 500, 15) A Bomba faria: Começa nos 20% e fica durante 0,5 Seg Incrementa 15 ao PWM(65/255) ficando a 25% durante 0,5 Seg Vai incrementando 5% durante 0,5 Seg até chegar a 88%(225/255) */ void RampDown(int IntMin, int IntMax, int Increm, int Percent) { int ValorPWM = IntMax; if(buttonState == HIGH || buttonStateF == HIGH){ return; } // IntMax = IntMax - ((ValPoten * 255)/1023); // IntMin = IntMin - ((ValPoten * 255)/1023); // ValorPWM = IntMax; analogWrite(PWMPinLPF, ValorPWM); do { currentMillis = millis(); if(currentMillis - previousMillis > Increm) { previousMillis = currentMillis; if(ValorPWM < IntMin) { ValorPWM = IntMin; } analogWrite(PWMPinLPF, ValorPWM); ValorPWM = ValorPWM - Percent; } verificaPushButton(); if(buttonState == HIGH || buttonStateF == HIGH){ return; } } while(ValorPWM <= IntMax && ValorPWM > IntMin); } /* ReefCrazy(IntMin, IntMax, SegMud) - Modo 3 Recebe de Entrada: Intensidade Minima: Intensidade minima a que a bomba Roda Intensidade Máxima: Intensidade Máxima a que a bomba roda Segundos entre as mudanças: Segundos até mudança de modo aleatório */ void ReefCrazy(int IntMin, int IntMax, int SegMud) { int RNumber = random(IntMin, IntMax); int MidleR = (IntMin + IntMax) / 2; if(buttonState == HIGH || buttonStateF == HIGH){ return; } if(RNumber > (MidleR - 20) && RNumber < (MidleR + 20)) { PulseSingle(240, 100, 500, 3); } if(RNumber > MidleR) { RampDown(IntMin, MidleR, 500, 15); } else { RampUp(MidleR, IntMax, 500, 15); } RNumber = random(IntMin, IntMax); MidleR = (IntMin + IntMax) / 2; } /* Modo 4 Sem parametros de entrada, sobe dos 0 aos 125PWM, faz Pulse 2X, continua a subir aos 255; Começa a descer dos 255 até 125, faz pulse, e continua até 0; */ void JumpingHorse() { if(buttonState == HIGH || buttonStateF == HIGH){ return; } RampUp(100, 175, 200, 5); PulseSingle(255, 150, 500, 2); RampUp(175, 255, 200, 5); RampDown(175, 255, 200, 5); PulseSingle(255, 150, 500, 2); RampDown(100, 175, 200, 5); } /* Modo 5 - Nutrient Export Mode(5 Pulses a 0,5s, muito pequenos, mais 5 maiores, pulse grande para fazer onda, e o processo de pulses inverso). */ void NutrientZero() { if(buttonState == HIGH || buttonStateF == HIGH){ return; } RampUp(125, 240, 300, 15); timer(1000); RampDown(125, 240, 300, 15); PulseSingle(125, 225, 500, 8); } /* Modo Desligar - Modo 6 Para fazer por exemplo manutenção ao aquario, fica preparado para quem usar botão*/ void Desligar() { if(buttonState == HIGH || buttonStateF == HIGH){ return; } analogWrite(PWMPinLPF, 0); } void alimentar(long milliSegundos) { if(buttonState == HIGH || buttonStateF == HIGH){ return; } analogWrite(PWMPinLPF, 0); timer(milliSegundos); } void setup() { // Inicializa PWM Serial.begin(9600); pinMode(PWMPinLPF, OUTPUT); pinMode(PinLed1, OUTPUT); pinMode(PinLed2, OUTPUT); pinMode(PinLed3, OUTPUT); pinMode(PinLed4, OUTPUT); pinMode(buttonPin, INPUT); pinMode(buttonPinF, INPUT); previousMillis = millis(); limpaLeds(); activaLeds(); } void loop(){ if(buttonState == HIGH){ if(ModoFuncionamento >= maxModos) { ModoFuncionamento = 1; } else { ModoFuncionamento = ModoFuncionamento + 1; } limpaLeds(); activaLeds(); buttonState = LOW; delay(200); } else { verificaPushButton(); } //Verifica estado de FEED if(buttonStateF == HIGH){ if(ModoFuncionamento == 7) { ModoFuncionamento = ModoFuncionamentoAnt; } else { ModoFuncionamentoAnt = ModoFuncionamento; ModoFuncionamento = 7; } limpaLeds(); activaLeds(); buttonStateF = LOW; delay(200); } if (ModoFuncionamento == 1) { Pulse(255, 150, 300); } if (ModoFuncionamento == 2) { RampUp(100, 245, 500, 15); RampDown(100, 245, 500, 15); } if (ModoFuncionamento == 3) { ReefCrazy(100, 245, 500); } if (ModoFuncionamento == 4) { JumpingHorse(); } if (ModoFuncionamento == 5) { NutrientZero(); } if (ModoFuncionamento == 6) { Desligar(); } if (ModoFuncionamento == 7) { alimentar(300000); ModoFuncionamento = ModoFuncionamentoAnt; limpaLeds(); activaLeds(); } }
At this point there are 7 modes:
Pulse - WaveMaker;
Ramp - increase the speed at fullspeed and then decrease;
ReefCrazy - Should mimic Vortech ReefCrest;
JumpingHorse - Just a mode i created where speed get to half, the pulses and then again, to max speed, and the other way down.
Nutrient Zero - Should mimic Vortech Nutrient Export
Then there is feedmode wich stops the pump for 5 minutes
and turn off that turns off the pump for maintenance of the tank.
Attached is a scheme(not technically designed), of the future controller(with the potentiometer already included, but the code its not adapted yet).
![]()
If you should have any doubts or thinkings be free to PM me, the deal is i'm not able to PM because i dont have yet 10 posts... but ill try to have them in a couple of days and try to anwser by then!
I think it is usefull info, so, be free to use it.
Although some comments are in portuguese, if you can read the code, you'll be able to understand it.
The picture is also designed to use only one power suplly, but its not tested the(this last part).
The test was Arduino + Leds + Pushbuttons(and respective resistors), with 24V Power suply to the pump, and arduino connected to the computer. So you should always test if the signal coming from arduinos PWM and GND is 5V when PWM = Max(256), so you wont burn the pumps internal circuit.
I've read people lowering the pumps power through Voltage, but that might burn the pump, or shorten its life...
As soon as i have the full circuit(one power supply and the potentiometer) done i'll post some aditions
All the best.