How to make a grow box controller

021

While my existing system was working I decided to make an upgrade to the electronics on my old grow box controller specifically to have a much more industrial strength version that will run without problems for decades to come.  This version also is much safer…still probably not quite to a building code but much less worries to burning my garage down in the middle of the night.  Finally it is modular if there are problems in the future I can easily switch out electronics or sensors.

Well now I have attempted to justify my reasons this is what I used to put the whole thing together:

Parts List

If we had lawyers, they probably would want us to say this:
WARNING: I am not an electrician and do not pretend to be one.  I do not know the specific building electrical codes of your area, so please be sure your wiring is completed under the proper safety code for your area. As always, using high voltage electricity can result in self-electrocution or burn down your house if not done safely so if you are not comfortable doing this wiring please contact a qualified professional.

Putting it all together

On the electronics side overall the circuits are actually pretty simple and if using a breadboard definitely something that could be tackled by a beginner.  Though on the other side since this project is dealing with AC current I definitely would recommend caution (no hands unless power is unplugged) or have someone a little more comfortable with 120/220V help you out.

The Brains


I will be the first to admit that using an Arduino for this application is complete overkill for this application but it gives plenty of room for additions in the future.  For all intents and purpose you could have your grow box completely controlled from the Arduino own processing power though on my case the software and UI is more interesting part to me.  For this reason the Arduino code is actually very “dumb” basically just taking commands via the build in serial through USB and setting digital outputs to HIGH/LOW or reading analog inputs.

Here is the code for your grow box controller:

   1: /*

 

   2:  * GrowBox Arduino Interface

 

   3:  *

 

   4:  * Descriptions: Simple interface to digital and analog controls by passing serial inputs

 

   5:  *               For example: 

 

   6:  *                  "A1" to read analog value on pin 1

 

   7:  *                  "D1H" to set digital pin 1 to HIGH

 

   8:  */

 

   9: #include <OneWire.h>

 

  10:

 

  11: //1-wire

 

  12: OneWire  ds(8);  // on pin 8

 

  13: #define BADTEMP -1000

 

  14:

 

  15: //define unique sensor serial code

 

  16: byte temperature[8];

 

  17:

 

  19: #define PIN_VALUE 1          // numeric pin value (0 through 9) for digital output or analog input

 

  18: #define ACTION_TYPE 0        // 'D' for digtal write, 'A' for analog read

 

  20: #define DIGITAL_SET_VALUE 2  // Value to write (only used for digital, ignored for analog)

 

  21:

 

  22: int NUM_OF_ANALOG_READS = 2;

 

  23: char commandString[20];

 

  24:

 

  25: void setup()

 

  26: {

 

  27:   Serial.begin(9600);

 

  28:

 

  29:   setOneWireHex();

 

  30:

 

  31:   // Power control

 

  32:   for(int i=0; i<=7; i++)

 

  33:   {

 

  34:     pinMode(i, OUTPUT);        // sets the digital pins as output

 

  35:     digitalWrite(i, LOW);      // turn everything off

 

  36:   }

 

  37: }

 

  38:

 

  39: void loop()

 

  40: {

 

  41:   readStringFromSerial();

 

  42:

 

  43:   if (commandString[ACTION_TYPE] != 0)   {

 

  44:     int pinValue = commandString[PIN_VALUE] - '0';  // Convert char to int

 

  45:

 

  46:     if(commandString[ACTION_TYPE] == 'A')

 

  47:       Serial.println(analogRead(pinValue));

 

  48:     else if(commandString[ACTION_TYPE] == 'D') {

 

  49:       if(commandString[DIGITAL_SET_VALUE] == 'H')

 

  50:         digitalWrite(pinValue, HIGH);

 

  51:       else if(commandString[DIGITAL_SET_VALUE] == 'L')

 

  52:         digitalWrite(pinValue, LOW);

 

  53:

 

  54:       Serial.println("OK");

 

  55:     }

 

  56:     else if(commandString[ACTION_TYPE] == 'T') {

 

  57:       float temp = get_temp(temperature);

 

  58:

 

  59:       Serial.print(temp);

 

  60:       Serial.println("C");

 

  61:     }

 

  62:     else if(commandString[ACTION_TYPE] == '1') {

 

  63:       printOneWireHex();

 

  64:     }

 

  65:     else if(commandString[ACTION_TYPE] == 'V')   {

 

  66:       Serial.println("VERSION_1_0_0_0");

 

  67:     }

 

  68:     else if(commandString[ACTION_TYPE] == 'P') {

 

  69:       Serial.println("PONG");

 

  70:     }

 

  71:

 

  72:     // Clean Array

 

  73:     for (int i=0; i <= 20; i++)

 

  74:       commandString[i]=0;

 

  75:   }

 

  76:

 

  77:   delay(100);  // wait a little time

 

  78: }

 

  79:

 

  80:

 

  81: void readStringFromSerial() {

 

  82:   int i = 0;

 

  83:   if(Serial.available()) {

 

  84:     while (Serial.available()) {

 

  85:       commandString[i] = Serial.read();

 

  86:       i++;

 

  87:     }

 

  88:   }

 

  89: }

 

  90:

 

  91: void setOneWireHex() {

 

  92:     ds.reset_search();

 

  93:     ds.search(temperature);

 

  94: }

 

  95:

 

  96: void printOneWireHex() {

 

  97:   ds.reset_search();

 

  98:   if ( !ds.search(temperature)) {

 

  99:     Serial.print("NONE\n");

 

 100:   }

 

 101:   else {

 

 102:     ds.reset_search();

 

 103:

 

 104:     int sensor = 0;

 

 105:     while(ds.search(temperature))

 

 106:     {

 

 107:       Serial.print("S");

 

 108:       Serial.print(sensor);

 

 109:       Serial.print("=");

 

 110:       for(int i = 0; i < 8; i++) {

 

 111:         Serial.print(temperature[i], HEX);

 

 112:         Serial.print(".");

 

 113:       }

 

 114:       Serial.println();

 

 115:     }

 

 116:   }

 

 117:

 

 118:   ds.reset_search();

 

 119: }

 

 120:

 

 121: float get_temp(byte* addr)

 

 122: {

 

 123:   byte present = 0;

 

 124:   byte i;

 

 125:   byte data[12];

 

 126:

 

 127:   ds.reset();

 

 128:   ds.select(addr);

 

 129:   ds.write(0x44,1);         // start conversion, with parasite power on at the end

 

 130:

 

 131:   delay(1000);     // maybe 750ms is enough, maybe not

 

 132:   // we might do a ds.depower() here, but the reset will take care of it.

 

 133:

 

 134:   present = ds.reset();

 

 135:   ds.select(addr);

 

 136:   ds.write(0xBE);         // Read Scratchpad

 

 137:

 

 138:   for ( i = 0; i < 9; i++) { // we need 9 bytes

 

 139:     data[i] = ds.read();

 

 140:   }

 

 141:

 

 142:   int temp;

 

 143:   float ftemp;

 

 144:   temp = data[0];      // load all 8 bits of the LSB

 

 145:

 

 146:   if (data[1] > 0x80){  // sign bit set, temp is negative

 

 147:     temp = !temp + 1; //two's complement adjustment

 

 148:     temp = temp * -1; //flip value negative.

 

 149:   }

 

 150:

 

 151:   //get hi-rez data

 

 152:   int cpc;

 

 153:   int cr = data[6];

 

 154:   cpc = data[7];

 

 155:

 

 156:   if (cpc == 0)

 

 157:     return BADTEMP;

 

 158:

 

 159:   temp = temp >> 1;  // Truncate by dropping bit zero for hi-rez forumua

 

 160:   ftemp = temp - (float)0.25 + (cpc - cr)/(float)cpc;

 

 161:   //end hi-rez data

 

 162: //  ftemp = ((ftemp * 9) / 5.0) + 32; //C -> F

 

 163:

 

 164:   return ftemp;

 

 165: }

Copy and paste the above code into your Arduino software.   For the code above I used the OneHire.h library which is free to use and can be downloaded from here. To be able to use this library simply copy the contents to C:\arduino\hardware\libraries\OneWire. Now you should be able to Compile (CTRL+R) and upload the code to the board (CTRL+U)

Now with the software uploaded you can send some simple serial commands via its built in USB to serial adapter to interact with it.  The interface is are broken up into 1 to 4 character commands, which I will detail below

Command Description
T Returns temperature from One Wire component
D4H Sets digital pin 4 to HIGH (ON) (replace 4 for alternate pin)
D4L Sets digital pin 4 to LOW (OFF) (replace 4 for alternate pin)
A1 Reads analog value from pin 1 (replace 1 for alternate pin)
PING Returns PONG which is used to confirmed controller is online
V Returns version which is some forethought into the PC application being able to support different versions of controller software

Using the build in serial monitor tool in Arduino.exe, my application, or you should be able to control your Arduino with this very simple command based interface

Now you can hook up some LEDs and watch them blink which is fun for a little while but if you want to add some grow box components read on….

Temperature Sensor

As you can see I have fully embraced the circuit schema on the back of a napkin idea.  These are the actual diagrams I crumpled up and stuffed in my pocket with several trips to the garage for some final soldering of various joints until everything was solid.

Below is the simple circuit required to get your 1Wire temperature sensor working.  I would recommend checking your documentation (if not labels on the chip) for the orientation to have 1 and 3 correct, if you have it wrong you should get some complete unrealistic number.  Hook ground up to pin1 on the DS18S20 and pin 2 hooked up to the digital input pin 8 on the Arduino with 5V with a 4.7K resister in between to step down the voltage.

If everything is hooked up correctly you should get the current room temperature in Celsius by sending command “T” to your Arduino.  If you prefer Fahrenheit uncomment line 162 and recompile and upload your changes, though if using my software I support both degree types and do the conversion in the the software.  To make sure everything working (or just to play with your new toy) put your fingers on the chip for a couple seconds and take another measurement unless you keep your house very warm the temperature should go up a couple of degrees

1WireSensorDiagram

Turning things on and off (Relays)

If you were smart enough to check the current requirements of your Solid State Relays (SSR) before you bought them you may be able to skip this whole circuit and simply hook the digital outputs to the 5V positive side and ground to the negative side of the SSR.

Unfortunately if you are like me and bought some SSRs that require more current draw than the Arduino (or any other IC chip) of 40mA then you will need to create the simple circuit below.

image

Basic idea is pretty simple, you are using the output from the digital pins to switch of the transistor which then allows the ground to complete the circuit with the thus turning on the relay.  As you can see there is a 1K resistor between the base (middle pin) of the transistor.  If you are not using a SSR relay (though recommend you do) you should add a 1N4004 diode between the positive/negative which protects the transistor from being damaged in case of a high voltage spike which can occur for a fraction of a second when the transistor switched off, this is also known as a back-EMF diode or fly back diode.

Now here you have a couple options.  If you are confident of our wiring skills you can do like I did and take a couple of sockets and hook up the neutral and ground in parallel.  Two save space and since I really didn’t need two separate plug-ins (nor its own plug) for each relay I removed the little metal bar between the two sockets so they could be switched on independently.  Now simply hook up hot to the left side of all your relays in parallel and then connect a wire from the right side of the relay to its own plug on the two sockets.

Now a less wiring intensive method is to simply take a 6 foot (small if you can find them) and cut the hot wire (usually the one with non-smooth wire) and attach each end of the wire to both sides of the relay.

Moisture Sensor

When it comes to a moisture sensor there are a few options.  First is the classic two galvanized nails, second is the cheap gypsum soil moisture sensor which I have written up in the provided link.

If you are using the other options you will need the simple circuit below.  Technically it is a voltage divider, but that doesn’t really matter.  Just hook up one end of your sensor to 5V and other sensor to ground with 10K resistor and also connected to analog pin 0.

SoilSensorDiagram

My custom PCB solution

378

I actually started the work to create my own PCB at least a few years back.  Played with if it off and on and finally pulled the trigger to get some boards printed up which I must say was very rewarding and pretty fun experience for just $20-30 of out of pocket cost.  This provides all the circuits I mention above with a bonus circuit to let me know when my water reservoir is running low.  I also installed a Ethernet socket not

I designed this to be an Ardunio which plugs directly on top of the Arduino.  In theory I could stack more functionality on top of if but haven’t though of anything cool to do here yet.

Don’t want to spend 10-20 hours creating your own PCB and then wait 2-3 weeks for it to arrive from Hong Kong?  Well you can do the same thing with a bread board which I show below.

Virtual breadboard layout

VirtualBreadboard

If you are new to soldering or have no interest in learning I would definitely recommend this option.  Simply place the components in the holes and make connections with 18 gauge solid copper wire.  You should be able to pick a small breadboard for less than $7.

Various applications

Of course for my application, I am using this to integrate with my custom software solution to control my grow box.  Specifically soil sensor, temperature measurement, heater, lights, exhaust fan, and water pump.  So using the circuit mentioned above I ran the hot wire through each SSR with the remaining wires connected to the plug and eventually gets plugged into the wall.  Then simply hooked up the wire from the Ethernet cables to the low voltage side to turn the switches on/off.  So I would say this is a bit of an improvement over my last attempt…

Before

IMG_3777

After

019

Last I hooked the arduino up to my PC and used my custom software to control the temperature, water, and provide cool graphs as you can see below.

GrowBoxView

Sometimes life can get busy and you have limited time to keep an eye on your plants, for these times I also integrated with a custom Windows Phone 8 application which allows me to check the current state of the grow box using life tiles, water remotely (turn on/off lights/heater/fan as well), or even check out a current feed inside the grow box.

007 008

009011  010

Looks at the actual actual grow box…

003

008

2-liter bottle upside down tomato planter

DIY Upside down tomato planter

Though my first attempt at an upside down tomato planter worked out great, I have a habit of forgetting to water the plants everyday.  More commonly when we have decent rains when only the hanging tomato planters need to be watered.  So this year I have modified my design a little to make this a little easier.  As a bonus you can create this new version much quicker and minimal tools.

Materials required

  • Empty 2-liter bottle
  • Spray paint
  • Drill or hot nail
  • Chopstick or 1/4 in stick

033

Step 1 — Cut off bottom

034

There is a natural ridge at the bottom of the two liter bottle, simply cut at this ridge and remove the bottom.

Step 2 — Attach water reservoir

036

Take the removed bottom, flip it over, and insert it into the bottom of the bottle until flush with the top.

Step 3 — Drills Holes

First you need to drill a small hole in the bottom of the reservoir (the bottom you cut of)  Use the smallest drill bit you have, this will reduce the water flow coming into the planter during rainfall and/or manual watering.  With this reduced flow there should be much less soil loss during watering.

038

Second you need to drill two holes about 1/4 inch from the edge with a 1/4 inch drill bit.  It is a little difficult to get enough pressure against the plastic to make this hole without causing the plastic to collapse.  To take care of this place a small piece of wood on the floor and drill the holes from the inside.

041

Step 4 — Paint planter

042

You want to protect the roots from being exposed to direct sunlight so you need to cover the outside.  This can be done with contact paper, duct tape (as I have done in the past) or for a fast cleaner look just quickly add a quick coat of spray paint to the outside.  It is probably best to use paint that is made to adheres well to plastic, though in my case I had some nice multipurpose light green paint leftover from another project that with a few hard rains appears to be holding up well.
Step 5 — Secure with stick (chopstick) and fill with soil

DIY Upside down tomato planter #2

Now add your plant (tomatoes and peppers are my favorites) to the bottom (previously the top) of the planter by carefully pushing the roots through the hole or alternatively you can the plant out from the inside.  If your plant is too large to do this safely you may also cut a larger opening in the bottom, but I would recommend wrapping a sponge or coffee filter around the plant to assist in keeping the dirt in the planter.

Fill your planter with a mixture of 1 part perlite to 2 parts (potting mix, peat moss, coconut coir) with the top 1/2 inch being only (potting mix, peat moss, coconut coir)  After a couple of waterings, this 1/2 inch layer will compact and restrict the water flow for a slower and more distributed watering.

DIY Upside down tomato planter #3

Use the thinner end of your chopsticks to thread it through both holes and both sets of plastic, attach a piece of twine attached to bother ends, and hang wherever the plants can get some good full sunshine and you should have plenty of early tomatoes this summer.

How to make a grow box controller (Original)

IMG_3777
While my existing system was working I decided to make an upgrade to the electronics on my old system for several reasons:

  • I needed to add more automated external controls (heater, fans, water pump) with my existing design this was entirely possible though was starting to get a little clunky.
  • The existing controller (PS2 Controller, parallel port with various wires to control relays) worked but was not exactly compact.
  • Wanted a modular design so if I needed to debug some issue I could simply unplug the USB and power and bring it out of the box in the garage for needed work
  • Ability for others to create so I can share my software without forcing people to hack PS2 controllers to get to work
  • Ability to use components like 1Wire temperature sensors (others to come) and Arduino
  • Just for the fun of it

Well now I have attempted to justify my reasons this is what I used to put the whole thing together:

Parts List

If we had lawyers, they probably would want us to say this:
WARNING: I am not an electrician and do not pretend to be one.  I do not know the specific building electrical codes of your area, so please be sure your wiring is completed under the proper safety code for your area. As always, using high voltage electricity can result in self-electrocution or burn down your house if not done safely so if you are not comfortable doing this wiring please contact a qualified professional.

Putting it all together

On the electronics side overall the circuits are actually pretty simple and if using a breadboard definitely something that could be tackled by a beginner.  Though on the other side since this project is dealing with AC current I definitely would recommend caution (no hands unless power is unplugged) or have someone a little more comfortable with 120/220V help you out.

The Brains


I will be the first to admit that using an Arduino for this application is complete overkill for this application but it gives plenty of room for additions in the future.  For all intensive purposes you could have your grow box completely controlled from the Arduino own processing power though on my case the software and UI is more interesting part to me.  For this reason the Arduino code is actually very “dumb” basically just taking commands via the build in serial through USB and setting digital outputs to HIGH/LOW or reading analog inputs.
Here is the code for your grow box controller:

   1: /*

 

   2:  * GrowBox Arduino Interface

 

   3:  *

 

   4:  * Descriptions: Simple interface to digital and analog controls by passing serial inputs

 

   5:  *               For example: 

 

   6:  *                  "A1" to read analog value on pin 1

 

   7:  *                  "D1H" to set digital pin 1 to HIGH

 

   8:  */

 

   9: #include <OneWire.h>

 

  10:

 

  11: //1-wire

 

  12: OneWire  ds(8);  // on pin 8

 

  13: #define BADTEMP -1000

 

  14:

 

  15: //define unique sensor serial code

 

  16: byte temperature[8];

 

  17:

 

  19: #define PIN_VALUE 1          // numeric pin value (0 through 9) for digital output or analog input

 

  18: #define ACTION_TYPE 0        // 'D' for digtal write, 'A' for analog read

 

  20: #define DIGITAL_SET_VALUE 2  // Value to write (only used for digital, ignored for analog)

 

  21:

 

  22: int NUM_OF_ANALOG_READS = 2;

 

  23: char commandString[20];

 

  24:

 

  25: void setup()

 

  26: {

 

  27:   Serial.begin(9600);

 

  28:

 

  29:   setOneWireHex();

 

  30:

 

  31:   // Power control

 

  32:   for(int i=0; i<=7; i++)

 

  33:   {

 

  34:     pinMode(i, OUTPUT);        // sets the digital pins as output

 

  35:     digitalWrite(i, LOW);      // turn everything off

 

  36:   }

 

  37: }

 

  38:

 

  39: void loop()

 

  40: {

 

  41:   readStringFromSerial();

 

  42:

 

  43:   if (commandString[ACTION_TYPE] != 0)   {

 

  44:     int pinValue = commandString[PIN_VALUE] - '0';  // Convert char to int

 

  45:

 

  46:     if(commandString[ACTION_TYPE] == 'A')

 

  47:       Serial.println(analogRead(pinValue));

 

  48:     else if(commandString[ACTION_TYPE] == 'D') {

 

  49:       if(commandString[DIGITAL_SET_VALUE] == 'H')

 

  50:         digitalWrite(pinValue, HIGH);

 

  51:       else if(commandString[DIGITAL_SET_VALUE] == 'L')

 

  52:         digitalWrite(pinValue, LOW);

 

  53:

 

  54:       Serial.println("OK");

 

  55:     }

 

  56:     else if(commandString[ACTION_TYPE] == 'T') {

 

  57:       float temp = get_temp(temperature);

 

  58:

 

  59:       Serial.print(temp);

 

  60:       Serial.println("C");

 

  61:     }

 

  62:     else if(commandString[ACTION_TYPE] == '1') {

 

  63:       printOneWireHex();

 

  64:     }

 

  65:     else if(commandString[ACTION_TYPE] == 'V')   {

 

  66:       Serial.println("VERSION_1_0_0_0");

 

  67:     }

 

  68:     else if(commandString[ACTION_TYPE] == 'P') {

 

  69:       Serial.println("PONG");

 

  70:     }

 

  71:

 

  72:     // Clean Array

 

  73:     for (int i=0; i <= 20; i++)

 

  74:       commandString[i]=0;

 

  75:   }

 

  76:

 

  77:   delay(100);  // wait a little time

 

  78: }

 

  79:

 

  80:

 

  81: void readStringFromSerial() {

 

  82:   int i = 0;

 

  83:   if(Serial.available()) {

 

  84:     while (Serial.available()) {

 

  85:       commandString[i] = Serial.read();

 

  86:       i++;

 

  87:     }

 

  88:   }

 

  89: }

 

  90:

 

  91: void setOneWireHex() {

 

  92:     ds.reset_search();

 

  93:     ds.search(temperature);

 

  94: }

 

  95:

 

  96: void printOneWireHex() {

 

  97:   ds.reset_search();

 

  98:   if ( !ds.search(temperature)) {

 

  99:     Serial.print("NONE\n");

 

 100:   }

 

 101:   else {

 

 102:     ds.reset_search();

 

 103:

 

 104:     int sensor = 0;

 

 105:     while(ds.search(temperature))

 

 106:     {

 

 107:       Serial.print("S");

 

 108:       Serial.print(sensor);

 

 109:       Serial.print("=");

 

 110:       for(int i = 0; i < 8; i++) {

 

 111:         Serial.print(temperature[i], HEX);

 

 112:         Serial.print(".");

 

 113:       }

 

 114:       Serial.println();

 

 115:     }

 

 116:   }

 

 117:

 

 118:   ds.reset_search();

 

 119: }

 

 120:

 

 121: float get_temp(byte* addr)

 

 122: {

 

 123:   byte present = 0;

 

 124:   byte i;

 

 125:   byte data[12];

 

 126:

 

 127:   ds.reset();

 

 128:   ds.select(addr);

 

 129:   ds.write(0x44,1);         // start conversion, with parasite power on at the end

 

 130:

 

 131:   delay(1000);     // maybe 750ms is enough, maybe not

 

 132:   // we might do a ds.depower() here, but the reset will take care of it.

 

 133:

 

 134:   present = ds.reset();

 

 135:   ds.select(addr);

 

 136:   ds.write(0xBE);         // Read Scratchpad

 

 137:

 

 138:   for ( i = 0; i < 9; i++) { // we need 9 bytes

 

 139:     data[i] = ds.read();

 

 140:   }

 

 141:

 

 142:   int temp;

 

 143:   float ftemp;

 

 144:   temp = data[0];      // load all 8 bits of the LSB

 

 145:

 

 146:   if (data[1] > 0x80){  // sign bit set, temp is negative

 

 147:     temp = !temp + 1; //two's complement adjustment

 

 148:     temp = temp * -1; //flip value negative.

 

 149:   }

 

 150:

 

 151:   //get hi-rez data

 

 152:   int cpc;

 

 153:   int cr = data[6];

 

 154:   cpc = data[7];

 

 155:

 

 156:   if (cpc == 0)

 

 157:     return BADTEMP;

 

 158:

 

 159:   temp = temp >> 1;  // Truncate by dropping bit zero for hi-rez forumua

 

 160:   ftemp = temp - (float)0.25 + (cpc - cr)/(float)cpc;

 

 161:   //end hi-rez data

 

 162: //  ftemp = ((ftemp * 9) / 5.0) + 32; //C -> F

 

 163:

 

 164:   return ftemp;

 

 165: }

Copy and paste the above code into your Arduino software.   For the code above I used the OneHire.h library which is free to use and can be downloaded from here. To be able to use this library simply copy the contents to C:\arduino\hardware\libraries\OneWire. Now you should be able to Compile (CTRL+R) and upload the code to the board (CTRL+U)

Now with the software uploaded you can send some simple serial commands via its built in USB to serial adapter to interact with it.  The interface is are broken up into 1 to 4 character commands, which I will detail below

Command Description
T Returns temperature from One Wire component
D4H Sets digital pin 4 to HIGH (ON) (replace 4 for alternate pin)
D4L Sets digital pin 4 to LOW (OFF) (replace 4 for alternate pin)
A1 Reads analog value from pin 1 (replace 1 for alternate pin)
PING Returns PONG which is used to confirmed controller is online
V Returns version which is some forethought into the PC application being able to support different versions of controller software

Using the build in serial monitor tool in Arduino.exe, my application, or you should be able to control your Arduino with this very simple command based interface

Now you can hook up some LEDs and watch them blink which is fun for a little while but if you want to add some grow box components read on….

Temperature Sensor

As you can see I have fully embraced the circuit schema on the back of a napkin idea.  These are the actual diagrams I crumpled up and stuffed in my pocket with several trips to the garage for some final soldering of various joints until everything was solid.

Below is the simple circuit required to get your 1Wire temperature sensor working.  I would recommend checking your documentation (if not labels on the chip) for the orientation to have 1 and 3 correct, if you have it wrong you should get some complete unrealistic number.  Hook ground up to pin1 on the DS18S20 and pin 2 hooked up to the digital input pin 8 on the Arduino with 5V with a 4.7K resister in between to step down the voltage.

If everything is hooked up correctly you should get the current room temperature in Celsius by sending command “T” to your Arduino.  If you prefer Fahrenheit uncomment line 162 and recompile and upload your changes, though if using my software I support both degree types and do the conversion in the the software.  To make sure everything working (or just to play with your new toy) put your fingers on the chip for a couple seconds and take another measurement unless you keep your house very warm the temperature should go up a couple of degrees

1WireSensorDiagram

Turning things on and off (Relays)

If you were smart enough to check the current requirements of your Solid State Relays (SSR) before you bought them you may be able to skip this whole circuit and simply hook the digital outputs to the 5V positive side and ground to the negative side of the SSR.

Unfortunately if you are like me and bought some SSRs that require more current draw than the Arduino (or any other IC chip) of 40mA then you will need to create the simple circuit below.

image

Basic idea is pretty simple, you are using the output from the digital pins to switch of the transistor which then allows the ground to complete the circuit with the thus turning on the relay.  As you can see there is a 1K resistor between the base (middle pin) of the transistor.  If you are not using a SSR relay (though recommend you do) you should add a 1N4004 diode between the positive/negative which protects the transistor from being damaged in case of a high voltage spike which can occur for a fraction of a second when the transistor switched off, this is also known as a back-EMF diode or fly back diode.

Now here you have a couple options.  If you are confident of our wiring skills you can do like I did and take a couple of sockets and hook up the neutral and ground in parallel.  Two save space and since I really didn’t need two separate plug-ins (nor its own plug) for each relay I removed the little metal bar between the two sockets so they could be switched on independently.  Now simply hook up hot to the left side of all your relays in parallel and then connect a wire from the right side of the relay to its own plug on the two sockets.

Now a less wiring intensive method is to simply take a 6 foot (small if you can find them) and cut the hot wire (usually the one with non-smooth wire) and attach each end of the wire to both sides of the relay.

Moisture Sensor

When it comes to a moisture sensor there are a few options.  First is the classic two galvanized nails, second is the cheap gypsum soil moisture sensor which I have written up in the provided link.  Lastly if my personal favorite the Vegetronix soil sensor.

If you use the Vegetronix hookup is simple no circuit needed simply hook up the 5V to red, bare wire to ground, and black to analog pin 1.

If you are using the other options you will need the simple circuit below.  Technically it is a voltage divider, but that doesn’t really matter.  Just hook up one end of your sensor to 5V and other sensor to ground with 10K resistor and also connected to analog pin 0.

SoilSensorDiagram

Cheap soldered solution

IMG_3778

If I could do it over I probably should have just bought a small breadboard.  I did most of my prototyping with my larger breadboard but got cheap when I was at Radio Shack The Shack and just got this prototype board for half the price.

Virtual breadboard layout

VirtualBreadboard

If you are new to soldering or have no interest in learning I would definitely recommend this option.  Simply place the components in the holes and make connections with 18 gauge solid copper wire.  You should be able to pick a small breadboard for less than $7.

Various applications

Of course for my application, I am using this to integrate with my custom software solution to control my grow box (will be having private/public beta soon).  Specifically soil sensor, temperature measurement, heater, lights, exhaust fan, and water pump.

Controller

Though there is definitely no reason you can use this same setup for other application.

A couple of ideas:

  • Home automation (turn on/off lights, turn on coffee machine)
  • Attic fan
  • Hydroponic system

Going Forward

I would like to convert this into an Arduino shield.  For those new to Arduino I will go with Arduino’s description, “Shields are boards to be mounted on top of the Arduino board and that extend the functionality of Arduino to control different devices, acquire data, etc”
So basic idea is you just plug it into the top the Arduino and hook up a couple wires to some terminal blocks and you have a nice clean solution.  Creating these printed circuit boards get much cheaper the higher the quantity.  I am considering doing a run of these if I get enough interest so if you may be interested in one of these send me a mail in “Contact” in the header.

Finish outdoor seed planting with coffee grounds

It has been a blessing that the competition for free coffee grounds at the Starbucks at my work has increased now the weather warmed up and I have freed from the temptation to grab yet another free shiny silver bag of grounds.  The reason is, I have put four bags in my compost, worked generous amounts into my vegetable garden and I still have six bags left.  Now I am looking at inventive ways to use the rest up.  I tried mixing with perlite to make a cheap potting soil (failed still no room for roots) but I believe I have come across one success I thought I would share.

When you are finished planting seeds outdoors apply a thin layer of coffee grounds.  This will deter slugs from going after your new seedlings and keep cats from mistaking your nicely loosened and raked soil for their kitty litter. 

I have done this for my larger seed plants (peas, garlic, onions, cilantro) but for the small seed plants (carrots, lettuce, spinach) I used the coffee grounds as a seed covering.

So far the results are great.  All of my peas/garlic/onions/spinach have sprouted with no signs of pests (four-legged nor zero-legged).

Growing seedlings with compostable coffee cups

image

Occasionally at work I get a craving for some hot chocolate.  When I do, I reach for a company provided compostable coffee cup (I know I should bring in my own cup, but I did say “occasionally”).  When I am done with my delicious beverage, I simply dispose of them in the proper “compostable” reciprocal.  Last week was different, with my recent frustration with the durability of some of my newspaper pots, I got the idea to extend the life of these cups a little longer and grow some seedlings in them.

This particular type of cup breaks down in 47 days, unless you happen to leave one half filled with liquid overnight on your desk, in that case they magically breaks down a few minutes after you walk out the door.  I am planning on growing my tomatoes and peppers in these cups and plant them directly into the soil.  To help with more freedom in root growth I will cut out the bottom of the cup.  I will let you know how it works.

Now if your work does not use these cups, never fear many coffee shops are featuring these same type of cups with the purchase of an overpriced hot beverage.

Computerized grow box update

IMG_0286

Haven’t mentioned the computerized grow box for a while, so think it is a good time for an update.  The moisture sensor corroded away, but have plans to make a much more beefier one.  With the exception of the hard drive failure, the basic functionality of the computerized grow box has been excellent and the plants have been thriving.  The only physical improvement I have made is adding some particle board to the top and side (salvaged from packaging material from some furniture we ordered) of the grow box.  This helps retain heat and allows the access panel to stay put without requiring tape and/or bags of coffee grounds propped against it.  I also mounted the LCD panel securely to the top of the box.

IMG_0287

They say as your paycheck increases, somehow your expenses follow suit.  I have a feeling same concept applies for grow boxes.  As the computerized grow box is about four times bigger than my PC grow box it has quickly getting pretty crowded waiting for the time I can move my summer vegetables outside.  I am planning on doing some reorganization this weekend to clean things up a little bit but still going to be pretty tight quarters. 

IMG_0288

The current inventory in the grow box are 12 tomato plants (was 18 but gave six away at a recent gardening talk), 2 cucumber plants (had one fatality from Peat/WonderSoil experiment, looks like Peat lost), 6 pepper plants (need transplanting), and a cilantro plant which was the source of my first harvest of the year.

Now just hoping Punxsutawney Phil is wrong and we really don’t have six more weeks of winter, though with the snow we got two days ago and the current temperature outside, I think he might be right.

IKE