Introduction: Budget Seed/plant Propagator With Automatic Temperature Control

As a gardener I am stuck in winter. I do have a unheated poly-greenhouse, but that is not much use when it is freezing. The heated propagators in the shops are expensive and small; I wanted something bigger, with better controls and obviously affordable.

This is how I made my propagator:

List of materials I used:

  • 2 Ikea Samla storage boxes, 78x55x18 cm, € 7,99 / piece (but any watertight box will do)
  • Insulation material: foam board, left over, free, bubble wrap, also free
  • 5 meter/75 watt Silicone heating cable, farm shop, used for keeping chicks warm, € 13,75 Any other type of heating wire can be used; look for cables used in e.g. a terrarium. It is however essential that the cable is insulated to prevent electrical problems with moisture.
  • Sand, I used the 2 bags I already had laying around in the shed
  • MH1210W Thermostat, about € 6,30, Aliexpress.

Total investment: € 36,-

Update: I added a Arduino with some sensors to monitor the propagator.

Parts I used:

  • Arduino Uno (cheap clone)
  • Arduino Ethernet shield (to talk to www.thingspeak.com)
  • DHT22 temperature / Moisture sensor
  • Soil Moisture sensor
  • BMP180 barometer/thermometer to measure the outside temperature and (cool) airpressure

I had these parts around, and it seemed a nice addition. I have included the sketch I used below.

At IKEA I spotted the Samla series of storage boxes: very clear plastic, affordable and big enough for multiple seeding and cutting trays. Although they come with a lid I decided to use TWO boxes, with the top one upside down on the other as lid. This way there is have more air (climate) in the propagator and I will be able to grow bigger plants.

For bottom isolation I used a sheet of foam I already had; cut in pieces and handsomely put together with tape. Obviously you can use any other material. For top isolation I used bubble wrap.

Step 1: Setting Up the Basic Construction

this is pretty self-explanatory: create an isulating box big enough to hold the Samla box. I used foam sheet and tape, obviously there are better and more handsome solutions.

Step 2: Add the Heating and Electronics

Fill the box with approx. 5-6 cm of sand. I used sand I had left from fixing the driveway. Fine sand is better appearently.

Add the heating cable. Make sure the cable does NOT cross itself , does not touch the walls or touch another piece of wire. The 75 watt power is a wild guess. I will find out whether the heating capacity is large enough. Obviously the room temperature plays a crucial role here....

Carefully cover the wire with another 5-6 cm of sand. The sand will work as buffer and store heat.

Connect the thermostat; it took me a while to figure out how, I eventually used this tutorial and made a trial with a light. Success!

Warning: we are working with 230 volts close to water/moisture. If you don't know what you are doing: stop here.

Program the thermostat. The mh1210w, although cheap, is a wonderfully accurate piece of electronics. It is 0,5 degree celcius precise and one can program in a temperature trajectory. Mine is programmed to switch ON at 22 celcius and OFF at 24 celcius: ideal for propagating basil etc.

Put the sensor in the propagator, I suggest NOT to stick it in the sand, but to keep it a few centimeters above the sand in the air on a stick or something.

Step 3: Ready.....?

And here is the finished product, very much prototype-style but it works! I will make it look better in the future if I have too much time. I have also covered it in bubble-foil as insulation as the propagator is in the annex where the temperature is just above 2-3 celcius. It took approx. 14 hours to reach 24 celcius, so the 75 watt heating element is powerful enough to raise the temperature with 20-22 degrees!

So far I have sown sweet red pepper, Basil, Parsley, Littele Gem salad and Coriander.

Things to do/wishlist:

  • Add lights
  • Monitor the RV and temperature with an Arduino/Nodemcu
  • Add automatic watering & cooling (also Arduino stuff)

If anyone can help me with the automatic watering system: much obliged!

Step 4: First Results After Four Days!

Four days ago I added seeds to the propagator. Some crops are already growing and germinating! I see cress (green plate) Rocket salad (right back) and Basil (left front) This is promising. Now I will add light.

Step 5: Arduino Sketch for Monitoring and Talking to Thingpeak

The code below is based on work of others, I am not a programmer, but can do "cut-and-paste" programming. It works, and I am happy. Thinks to do: trigger actions based on what I measure e.g. run a pump. Eventually I would love to used this code in my greenhouse and/or veg garden. If you have ideas or knowledge: let me know!

<p>/*<br> Arduino --> ThingSpeak Channel via Ethernet</p><p>  The ThingSpeak Client sketch is designed for the Arduino and Ethernet.
 This sketch updates a channel feed with an analog input reading via the
 ThingSpeak API (https://thingspeak.com/docs)
 using HTTP POST. The Arduino uses DHCP and DNS for a simpler network setup.
 The sketch also includes a Watchdog / Reset function to make sure the
 Arduino stays connected and/or regains connectivity after a network outage.
 Use the Serial Monitor on the Arduino IDE to see verbose network feedback
 and ThingSpeak connectivity status.
 
 Getting Started with ThingSpeak:
 
   * Sign Up for New User Account - https://thingspeak.com/users/new
   * Create a new Channel by selecting Channels and then Create New Channel
   * Enter the Write API Key in this sketch under "ThingSpeak Settings"
 
 Arduino Requirements:
 
   * Arduino with Ethernet Shield or Arduino Ethernet
   * Arduino 1.0+ IDE
   
  Network Requirements:
   * Ethernet port on Router    
   * DHCP enabled on Router
   * Unique MAC Address for Arduino
 
 Created: October 17, 2011 by Hans Scharler (http://www.nothans.com)
 
 Additional Credits:
 Example sketches from Arduino team, Ethernet by Adrian McEwen
 
*/</p><p>#include <SPI.h><spi.h>
#include <Ethernet.h><ethernet.h>
#include <DHT.h><dht.h>
#include <Wire.h><wire.h>
#include <Adafruit_BMP085.h><adafruit_bmp085.h></adafruit_bmp085.h></wire.h></dht.h></ethernet.h></spi.h></p><p>// Local Network Settings
byte mac[] = { 0xD4, 0x28, 0xB2, 0xFF, 0xA0, 0xA1 }; // Must be unique on local network</p><p>// ThingSpeak Settings
const char* server = "api.thingspeak.com";
// char thingSpeakAddress[] = "api.thingspeak.com";
String writeAPIKey = "XXXXXXXXXXXXXXXXXXXX";
const int updateThingSpeakInterval = 30 * 1000;      // Time interval in milliseconds to update ThingSpeak (number of seconds * 1000 = interval)</p><p>//DHT22
#define DHTPIN 2     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino</p><p>//BMP180
Adafruit_BMP085 bmp;</p><p>//Soil Moisture Sensor
int sensorPin = 0;    // select the input pin for the potentiometer
int SoilMoisture = 0;  // variable to store the value coming from the sensor
 </p><p>// Variable Setup
long lastConnectionTime = 0; 
boolean lastConnected = false;
int failedCounter = 0;</p><p>// Initialize Arduino Ethernet Client
EthernetClient client;</p><p>void setup()
{
  // Start Serial for debugging on the Serial Monitor
  Serial.begin(9600);</p><p>//BMP180
bmp.begin();
  
  
  // Start Ethernet on Arduino
  startEthernet();
}</p><p>void loop()</p><p>{</p><p>//read Soil Moisture Sensor
  SoilMoisture = analogRead(sensorPin);    
  delay(1000);          </p><p>float m = analogRead(sensorPin);</p><p>// read DHT Sensor
float h = dht.readHumidity();
float t = dht.readTemperature();</p><p>// read BMP180
float t2 = bmp.readTemperature();
float p= bmp.readPressure();</p><p>if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Einde DHT Sensor
  
if (client.connect(server,80)) { // "184.106.153.149" or api.thingspeak.com
String postStr = writeAPIKey;
postStr +="&field1=";
postStr += String(t);
postStr +="&field2=";
postStr += String(h);
postStr +="&field3=";
postStr += String(t2);
postStr +="&field4=";
postStr += String(p);
postStr +="&field5=";
postStr += String(m);</p><p>postStr += "\r\n\r\n\r\n\r\n\r\n";</p><p>client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: "+writeAPIKey+"\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(postStr.length());
client.print("\n\n");
client.print(postStr);</p><p>Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" degrees Celcius Humidity: ");
Serial.print(h);
Serial.print(" Baro Temp: ");
Serial.print(t2);
Serial.print(" Pressure: ");
Serial.print(p);
Serial.print(" Soil moisture = " );                       
  Serial.println(SoilMoisture);    
  
Serial.println("% send to Thingspeak");
}
client.stop();
  
  // Check if Arduino Ethernet needs to be restarted
  if (failedCounter > 3 ) {startEthernet();}
  
  lastConnected = client.connected();
}</p><p>void updateThingSpeak(String tsData)
{
 // if (client.connect(thingSpeakAddress, 80))
 if (client.connect(server, 80))
  {         
    client.print("POST /update HTTP/1.1\n");
    client.print("Host: api.thingspeak.com\n");
    client.print("Connection: close\n");
    client.print("X-THINGSPEAKAPIKEY: "+writeAPIKey+"\n");
    client.print("Content-Type: application/x-www-form-urlencoded\n");
    client.print("Content-Length: ");
    client.print(tsData.length());
    client.print("\n\n");</p><p>    client.print(tsData);
    
    lastConnectionTime = millis();
    
    if (client.connected())
    {
      Serial.println("Connecting to ThingSpeak...");
      Serial.println();
      
      failedCounter = 0;
    }
    else
    {
      failedCounter++;
  
      Serial.println("Connection to ThingSpeak failed ("+String(failedCounter, DEC)+")");   
      Serial.println();
    }
    
  }
  else
  {
    failedCounter++;
    
    Serial.println("Connection to ThingSpeak Failed ("+String(failedCounter, DEC)+")");   
    Serial.println();
    
    lastConnectionTime = millis(); 
  }
}</p><p>void startEthernet()
{
  
  client.stop();</p><p>  Serial.println("Connecting Arduino to network...");
  Serial.println();  </p><p>  delay(1000);
  
  // Connect to network amd obtain an IP address using DHCP
  if (Ethernet.begin(mac) == 0)
  {
    Serial.println("DHCP Failed, reset Arduino to try again");
    Serial.println();
  }
  else
  {
    Serial.println("Arduino connected to network using DHCP");
    Serial.println();</p><p>  
  }
  
  delay(20000);
}</p>
Indoor Gardening Contest 2016

Participated in the
Indoor Gardening Contest 2016

Green Electronics Contest 2016

Participated in the
Green Electronics Contest 2016