Budget Seed/plant Propagator With Automatic Temperature Control
by PetervdPol in Living > Gardening
4360 Views, 33 Favorites, 0 Comments
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.
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.
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.
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!
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.
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>