Green Tractor Talk banner

1 - 16 of 16 Posts

·
Premium Member
Joined
·
3,964 Posts
Discussion Starter #1
My wife and purchased a home with a man made koi pond. After taking care of aquariums for a few years I knew when we bought the house that the filtration system was going to need an upgraded. About a month ago I replaced the no name Chinese 3k GPH submerged pump when it died. I have used Lifegard Aquatics stuff on my aquariums before and I have been very happy with their products. I purchased one of their 1 hp Lifegard seahorse pump that has almost 5k GPH of flow to more accurately match the size of the pond. When I first plumbed it up I had water shooting out of the canister filter around the seal. That is when I noticed that the TetraPond BP4000 canister filter, which Tetra claims supports ponds up to 4,000 gallons only allows for 2,000 GPH of flow. Luckily the pump runs a water fall and the filter and the previous home owner had a UV sterilizer, which had it's own return back to the pond. So when I did the new plumbing to switch from a submerged to an above water pump I reconfigured the plumbing so that I could control the flow to the filter and the waterfall.

If you look at the upper left corner of the pic you can see the 2 ball valves.
IMG_1940.jpg

So next spring I plan to upgrade the filter and I'm looking for any and all suggestions and recommendations.

Here are a few more pictures of the pond.
IMG_1957.jpg IMG_1772.jpg IMG_1774.jpg
 

·
Administrator
Joined
·
20,730 Posts
Very cool! :drinks:
 

·
Premium Member
Joined
·
3,964 Posts
Discussion Starter #5
Well it is time to bring this thread back up to date. About two month or so my wife was on me to get the pond up and running for the summer. I was in no hurry as I knew we needed a filter upgrade and it was going to be expensive. I hate to have the talk with my wife about what things cost. Well about a month or so ago she told me to spend what ever it is going to take.

So when I was at the local aquarium shop getting our birds wings clipped I saw a filter for almost $400. It was not what I wanted or what I thought the pond needed but it was rated to flow 5200 gallons per hour. The 1hp pump that we bought last year was rated at 5000 so I thought it would be an ok match.

ImageUploadedByTapatalk1400967116.729510.jpg

I got it home and installed and I thought everything was going to be ok. About 2 hours I got it up and running I popped one of the latches and pushed the gasket out and was leaking all over the place. I was kinda pissed but I had not plumbed it to the water fall yet and figured that would take some the pressure off of the filter.

All was good for about 3 weeks until I tried to back flush it. The valve control is plastic and I broke the dial off.

ImageUploadedByTapatalk1400967081.362807.jpg

I called the aquarium store and asked what they could do to remedy the situation. I first brought up the latches, the sales person told me I was not alone and the manufacture redesigned the latches. I then explained about the cheap valve and how it broke. He told me he swap it out for me. I told him that was not going to work and asked what they could get that was better. He said that was about it. I asked if I could return it and he ok'd it.

The hint was the on to find a sand filter for a pool. I was able to find a 200# sand filter and 1 1/2hp pump for $225.

Last night I got it hooked up and running. The filter is so good that I back flushed it 2 times before bed. But it is clearing up the water. I think it will have to be back flushed quite a bit for the first week or so but after that it should be good to go. Thank god we have a spring to fill it back up I would hate to be paying for the water.

ImageUploadedByTapatalk1400966387.721723.jpg


Sent from my iPhone using Tapatalk
 

·
Administrator
Joined
·
20,730 Posts
Cool! I'd like to have a pond similar to that. I think it'd be fun to watch the koi, and feed them. Now you'll need to find a way to hide your filter where you can still access it and enjoy your pond. :drinks:
 

·
Registered
Joined
·
2,044 Posts
That is a nice looking pond, and filter setup!

I have to ask, do the dogs jump in it? :laugh:
 

·
Premium Member
Joined
·
3,964 Posts
Discussion Starter #8
The 2 dogs haven't been in it. The one likes the hose and the other likes to wade into the creek that runs in front of our house.

The filter is working almost to well. I'm flushing it morning and night. Thank god we have a clear running spring to refill it with. I guessing I'm dumping about 50gal a day in back flush water. That would get real expensive on city water.


Sent from my iPhone using Tapatalk
 

·
Premium Member
Joined
·
3,964 Posts
Discussion Starter #9
Building a Pump and UV Controller

So the pool pump and filter work really well, almost to well. I have to back flash the sand filter about once a day. This would get kinda expensive if I had to top it off with city water but luckily we have a spring on the hill above the pond and I use it to top off the pond.

This year I thought I would add a UV sterilizer to help with free floating algae and parasites. I picked up a 40w job from Amazon, made by Lifeguard Aquatics, a division of Pentair.

21MNvtXRz3L.jpg

I had one of the 20w jobs on my painted aquarium and it worked well. My only concern with using one on the pond was keeping the ballast dry, so I purchased a Bud Industries water tight box. Being that the ballast was about the size of a normal 4 tube T12 ballast I have to get a box that was long enough but that meant I had lots of extra space to fill it with other goodies.

81Sj-3UKn+L._SL1500_.jpg

It is not a good idea to have a UV filter lamp on without water flowing and I feared that the pump might lock up or I may lose a hose while I or my wife were not around and I would burn up an expensive lamp and quartz tube. So to take up some of the extra space in the box I decided to automate the pump and UV control. I have a couple of Arduino controllers that would work perfect for the task. They have 13 channels of digital input / output as well as 6 analog inputs for reading voltages from things such as pressure sensors.

2016-05-22 07.04.36.jpg

Here is the layout:

2016-05-11 18.23.36.jpg

The Arduino works on a 5v DC logic and most motor contractors and relays work on 12v DC or higher. So to enable the Arduino to drive enough current and voltage to the relays I needed to make a driver board. When the Arduino apples 5v to the transistors allowing 12V to flow through the coil of the relays allowing me to switch 120v of AC safely.

Here is the relay driver I made:

2016-05-22 07.04.22.jpg

I wanted to keep things simple and to what I had on hand, so when I wrote the code it has two modes, mode 0 runs the pump and UV and mode 1 just runs the pump to allow back-flushing the filter.

Below you can see that I wired up a shift register and a 7 segment display as well as 2 buttons, one selects the mode and the other is a start/stop button.

The bread board makes it nice to get things up and running but I'll need to get it soldered onto a proto board to make it more robust and reliable.

2016-05-23 10.09.05.jpg 2016-05-23 10.09.12.jpg

After tooling around on Amazon one night I realized I could get a 20 X 4 character LCD display for $10.

2016-05-23 09.07.58.jpg

I will probably nix the 7 segment display in favor of the larger display. Not only will I be able to display the mode but also the pressure reading from the pressure sensor. I also have seen amperage sensors and I might add one to monitor the pump motor directly.


Here is the relay board and the prototype of the Arduino laid out for testing:

2016-05-23 08.33.46.jpg

This is what I envision the final thing to look like. The relay board will be under the controller in the box.

2016-05-23 09.16.33.jpg


Here is a video of it in action on the bench being tested.


I plan to add to the controller in the future other sensors as well as a website interface so that I can data log the sensor info and enable remote control of pump and the UV. I may also add things like a low voltage light show to light up the pond at night.

Finally here is the code that is running on the Arduino if anyone is interested to see what it takes to make it work.

Code:
/* This is a sketch to run a pond pump and UV steralizer 
   Written by Mike James
*/


// constants won't change. They're used here to set pin numbers:
const byte latchPin =  4; // pin 12 on the 595
const byte dataPin  =  5; // pin 14 on the 595
const byte clockPin =  6; // pin 11 on the 595
const byte modePin  =  2; // the number of the mode pushbutton pin
const byte runPin   =  3; // the number of the start/stop push button pin
const byte pumpPin  = 11; // the number of the pump relay pin
const byte uvPin    = 12; // the number of the uv light relay pin
const byte ledPin   = 13; // the number of the LED pin




// Variables will change:
byte modeState = LOW;             // Holds the current Mode
byte modeButtonState;             // Current reading from Mode button
byte lastModeButtonState = HIGH;  // Last reading from Mode button


byte runState = LOW;              // Holds the current Run state (Set low so noting is running)
byte runButtonState;              // Current state of the Run button
byte lastRunButtonState = HIGH;   // Last State of the Run button


long lastDebounceTime;            // the last time the output pin was toggled
long debounceDelay = 40;          // the debounce time; increase if the output flickers


void setup() 
{
  // put your setup code here, to run once:
//  Serial.begin(9600);
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin,  OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(pumpPin,  OUTPUT);
  pinMode(uvPin,    OUTPUT);
  pinMode(ledPin,   OUTPUT);
  pinMode(modePin,  INPUT_PULLUP);
  pinMode(runPin,   INPUT_PULLUP);
}


void loop() 
{ 
  while (modeState == 0 && runState == 0) // Filter mode NOT Running
    { 
      segDisplay(modeState);
//      Serial.println("Checking for runState change\n");
      debounceRun();  // Check for change in runState
      
//      Serial.println("Checking for modeState change\n");
      debounceMode(); // Check for change in modeState
    } 
    
  while (modeState == 0 && runState == 1) // Filter mode Running
    {
      digitalWrite(ledPin, HIGH);
      filter(runState);
      
      while (runState == 1)
      {
//        Serial.println("Running filter Mode\n");
        segDisplay(10);
        delay(50);
        segDisplay(11);
        delay(50);
        debounceRun();
      }
      
      filter(runState);
      digitalWrite(ledPin, LOW);
      debounceRun();           // Check to see if runState has changed
    } // End of while
   
  while (modeState == 1 && runState == 0)   // Flush mode NOT Running
    {
      segDisplay(modeState);
//      Serial.println("Checking for runState change\n");
      debounceRun();  // Check for change in runState


//      Serial.println("Checking for modeState change\n");
      debounceMode(); // Check for change in modeState
    }


  while (modeState == 1 && runState == 1) // Flush mode Running
    {
      digitalWrite(ledPin, HIGH);
     filterFlush(runState);
      
      while (runState == 1)
      {
//        Serial.println("Running filterFlush Mode\n");
        segDisplay(10);
        delay(50);
        segDisplay(11);
        delay(50);
        debounceRun();
      }
      
      filterFlush(runState);
      digitalWrite(ledPin, LOW);
      debounceRun();           // Check to see if runState has changed
      
      
     } // End of while
  
} // end void loop   


// Methods
void debounceMode()   // Button Debounce for the Mode Select button.
{
  int reading = digitalRead(modePin);   // read the state of the switch into a local variable:
  
  if (reading != lastModeButtonState)   // If the switch changed, due to noise or pressing:
  {
    lastDebounceTime = millis();
  }


  if ((millis() - lastDebounceTime) > debounceDelay)  // Check if the debounce delay has elapsed
  {
    if (reading != modeButtonState)   // If the button state has changed:
    {
      modeButtonState = reading;      // Set the new reading to button state 


      if (modeButtonState == LOW)     // only toggle the modeState if the new button state is LOW
      {
        modeState = !modeState;       // Toggeling the modeState
      }
    }
  }
  lastModeButtonState = reading;      // Store the reading to the last state    
} // End debounceMode


void debounceRun()    // Button Debounce for the Run/Stop Button.
{
  int reading = digitalRead(runPin);  // read the state of the switch into a local variable:
  
  if (reading != lastRunButtonState)  // If the switch changed, due to noise or pressing:
  {
    lastDebounceTime = millis();
  }


  if ((millis() - lastDebounceTime) > debounceDelay)    // Check if the debounce delay has elapsed
  {
    if (reading != runButtonState)    // if the button state has changed:
    {
      runButtonState = reading;       // Set the new reading to button state


      if (runButtonState == LOW)      // only toggle the modeState if the new button state is LOW
      {
        runState = !runState;         // Toggeling the runState
      }
    }
  }
  
  lastRunButtonState = reading;       // Store the reading to the last state 
} // End debounceRun


void segDisplay(int digit)  // Shift the digit passed to a 7 segment display using a shift register.
{
  switch (digit)  // Check for the digit passed 
    {
      case 0:                                       // Write 0 to the display
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, MSBFIRST, 64);
        digitalWrite(latchPin, HIGH);
        break;
        
      case 1:
        digitalWrite(latchPin, LOW);                // Write 1 to the display
        shiftOut(dataPin, clockPin, MSBFIRST, 121);
        digitalWrite(latchPin, HIGH);
      break;
  
      case 2:
        digitalWrite(latchPin, LOW);                // Write 2 to the display
        shiftOut(dataPin, clockPin, MSBFIRST, 36);
        digitalWrite(latchPin, HIGH);
      break;
  
      case 3:
        digitalWrite(latchPin, LOW);                // Write 3 to the display
        shiftOut(dataPin, clockPin, MSBFIRST, 48);
        digitalWrite(latchPin, HIGH);
      break;
  
      case 4:
        digitalWrite(latchPin, LOW);                // Write 4 to the display
        shiftOut(dataPin, clockPin, MSBFIRST, 25);
        digitalWrite(latchPin, HIGH);
      break;
  
      case 5:
        digitalWrite(latchPin, LOW);                // Write 5 to the display
        shiftOut(dataPin, clockPin, MSBFIRST, 18);
        digitalWrite(latchPin, HIGH);
      break;
  
      case 6:
        digitalWrite(latchPin, LOW);                // Write 6 to the display
        shiftOut(dataPin, clockPin, MSBFIRST, 2);
        digitalWrite(latchPin, HIGH);
      break;
  
      case 7:
        digitalWrite(latchPin, LOW);                // Write 7 to the display
        shiftOut(dataPin, clockPin, MSBFIRST, 120);
        digitalWrite(latchPin, HIGH);
      break;
  
      case 8:
        digitalWrite(latchPin, LOW);                // Write 8 to the display
        shiftOut(dataPin, clockPin, MSBFIRST, 0);
        digitalWrite(latchPin, HIGH);
      break;
  
      case 9:
        digitalWrite(latchPin, LOW);                // Write 9 to the display
        shiftOut(dataPin, clockPin, MSBFIRST, 24);
        digitalWrite(latchPin, HIGH);
      break;


      case 10:
      digitalWrite(latchPin, LOW);                  // Write - to the display
        shiftOut(dataPin, clockPin, MSBFIRST, 63);
        digitalWrite(latchPin, HIGH);
        break;
        
    default:
        digitalWrite(latchPin, LOW);                // Turn display off
        shiftOut(dataPin, clockPin, MSBFIRST, 127);
        digitalWrite(latchPin, HIGH);
    }   // End switch block
  }    


void filter(int input)
{
//  Serial.println("Entered the filter method\n");
 if (input == HIGH)   // Start pump and UV
 {
//  Serial.println("Starting pump\n");
  pump(input);


//  Serial.println("Waiting 20s before turning on UV filter\n");
  delay(10000);


//  Serial.println("Turning on UV\n");
  uv(input);
 }
 
 if (input == LOW)    // Stop uv and pump
 {
  segDisplay(modeState);
//  Serial.println("Turning off UV\n");
  uv(input);


//  Serial.println("Waiting 20s before turning off pump\n");
  delay(10000);


//  Serial.println("Stoping pump\n");
  pump(input);
 }
}


void filterFlush(int input)
{
  pump(input);
}


// Devices 
void pump(int input)
{
  if (input == HIGH) digitalWrite(pumpPin, HIGH);
  if (input == LOW) digitalWrite(pumpPin, LOW);
}


void uv(int input)
{
  if (input == HIGH) digitalWrite(uvPin, HIGH);
  if (input == LOW) digitalWrite(uvPin, LOW);
}
 

·
Registered
Joined
·
113 Posts
You lost me at, "I wanted to keep things simple..." :lol: Nice work!
 

·
Premium Member
Joined
·
3,964 Posts
Discussion Starter #12
So I've got the controller about licked. Today I started to redo the waterfall.



The fish were really interested in what I was doing.
 

·
Registered
Joined
·
223 Posts
Awesome.

You look like the type of guy that would enjoy AvE's channel on youtube, if you don't follow him already. Guaranteed laughs with some technical bits.
 

·
Registered
Joined
·
2,178 Posts
Awesome work. The pond / waterfall looks fantastic! :thumbup1gif:

Is it a lot of work keeping the leaves out of the pond? I put in a waterfall / short stream a couple years ago as a spousal compromise for the putting green I wanted. We went pondless because I read about the amount of work keeping the leaves out of the pond from all the trees we have and the koi ponds around here are buffet's for all the heron in the area. (and I didn't want another hobby.)

Great work on the controller too! I have wanted to get an arduino or rasberry pi controller for a while to mess with for some halloween props we use on a haunted trail we do for the kids. But we always had more than enough parent volunteers to dress as zombies to work the props to terrorize the teens so automation hasn't been needed.
 

·
Premium Member
Joined
·
3,964 Posts
Discussion Starter #15 (Edited)
Awesome work. The pond / waterfall looks fantastic! :thumbup1gif:

Is it a lot of work keeping the leaves out of the pond?
There are a lot of leaves along with grass clippings that end up in the bottom. I knew we had issues when we first moved in. If you stuck a stick down to the bottom and moved it around the bubbles that came to the surface smelled bad enough to gag a maggot. My first goal was to clarify the water. The sand filter was an awesome improvement. Once I could see the bottom I got a wide mouth leaf net and started to drag the bottom. I would take as many swipes as I could before the water got so cloudy I could not see again. I would then let the filter clean the water again. It took me most of the second summer that we owned the house to get the muck out of the bottom. But now it is not to bad I just clean up the leaves each spring. This year I might get a leaf net to cover it over in the fall.

Last night I got the LCD screen working and it sensing the pressure. I have to week the program a little bit but is is kind of working.

2016-06-07 16.58.11.jpg
 

·
Premium Member
Joined
·
3,964 Posts
Discussion Starter #16
I tried to take a couple of pictures to show how clear the water is just after a couple of days running the UV.

2016-06-08 15.41.14.jpg 2016-06-08 15.41.35.jpg 2016-06-08 15.41.40.jpg

In the last photo you can see the pipe coming from the left is the pickup for the filter and next to it is a hide-out for the fish made of 8" corrugated drain zipped tied together in a tic-tac-toe shape these are sitting on the bottom about 5' deep.
 
1 - 16 of 16 Posts
Top