Project tutorial
Air Garden

Air Garden © GPL3+

An aeroponic planter for indoor gardening and improved air purification.

  • 3,490 views
  • 2 comments
  • 20 respects

Components and supplies

Necessary tools and machines

3drag
3D Printer (generic)

Apps and online services

About this project

Air Garden

Keeping Close to Nature

We love plants and make every effort to spend as much time around plants and nature as possible, and it wasn't until our living and working situations required us to spend more time in apartments and offices that we realized just how important plants and nature were to our well being.

When researching why a reduction in time spent around nature affected us in such a negative way, we found numerous publications describing the therapeutic benefits of the presence of plants as well as studies associating them with diverse and significant health benefits ranging from reduced risk of cardiovascular disease and diabetes to greater overall happiness.

Air Purification

We have no doubt that that keeping plants nearby has benefits, but we were also curious about the exact cause of those benefits and how we could maximize them. This brought us to a set of studies detailed in a NASA reportas well as other publications that looked specifically at the air purification properties of keeping plants in an indoor environment.

Some of the results that stood out to us were the conclusions that indoor plants were found reduce the levels of several airborne toxin commonly found in modern indoor living and work spaces and that the vast majority of the reduction took place within the root and soil portions of the plants.

A Low Maintenance Planter

We were also able to find several examples of systems designed to leverage plant air purification, particularly in the workplace. However, such system tend to be costly, high maintenance, and potentially very messy.

We found that we could reduce many of the drawbacks using an aeroponic irrigation system. In addition minimizing the amount of water and soil needed and potential for leaks and contamination, an aeroponic system also greatly reduces the risk of disease spreading between plants.

Ultrasonic Humidifier

In order to efficiently distribute water and nutrients to our plants regardless of the shape or size of the planter, we place a small inexpensive ultrasonic humidifier into a 3D-printed enclosure so that it would fit in the base of the planter and allow air to flow inside so that it could be pushed through the vaporized fluid and into the interior of the planter.

Base Component

The enclosure can be printed using the files provided to assemble the system as shown below.

Assembled Base

Control System

In order to ensure that our humidifier provides just the right amount of nutrients to our plants, we programmed a control circuit to monitor a moisture sensor and automatically activate and deactivate the humidifier whenever necessary as well as allow the user to make adjust if needed given the types of plants or their environment.

Control Components

The control system can be assembled using the parts shown and the provided Arduino code.

Accurately Detecting Moisture Levels

While our control system includes all of the necessary components to keep our plants healthy in ideal conditions, in practice we found that our standard conduction based moisture sensor (as well as all other sensors we tested) was too vulnerable to a number of environmental factors and not reliable enough to keep the plants healthy long term.

Assembled Control Box

Planter Design

The body of the planter is designed so that the root and soil of the plants are exposed to the vaporized nutrients in the interior of the planter while the leaves and flower extend outward. We used plastic tubes, which can be fitted with plant baskets by cutting slits across a tube and then using a heat gun to soften the plastic and bend one side of the a slit outward and the other inward until the the plant basket can rest on the rim as shown below.

Planter Components

A 3D-printed ring around the rim of the plant basket allows it to rest conveniently on the rim on plant port on the planter so the baskets of plants can be easily added or removed.

Planter Assembly

The planter supports a wide variety of plants and planting mediums, some of our favorites are shown below.

Plants

Lighting

With out plants in place and the humidifier providing water nutrients and we manage to build a system that could keep our plants health and all we had to do was refill the water and fertilizer solution about once a month! Never had plant care been so easy! However, this only held true when the the planter was positioned near a window so that all of the plants received direct sunlight.

With the goal of creating a no maintenance planter that could be used by anyone anywhere we decided to add a lighting system. We could have easily positioned an off the self grow light at the entire planter, however we found that grow lights, even LEDs, use a lot of power. So we designed a lighting system we could control with our existing control board and programmed it to eliminate any wasted power.

Using an array of narrow field LED grow light directed at each individual plant, and light sensors to prevent illumining plants that were already exposed to sunlight, we adjusted the power and activation times to provide the minimum light needed to keep the plants healthy.

Air Garden Planter

As a result, we were able to leave out planter in a room with no sunlight and enjoy our healthy plants anywhere we wanted.

The goal of Air Garden is to provide the benefits of exposure to indoor plants to as many people as possible by reducing the work needed to keep the plants alive and healthy. Additionally, Air Garden is designed to maximize the air purification capabilities of houseplants by circulating air though the root and soil portions.

Mobile App

By adding a Bluetooth shield to our Arduino control circuit we were able to create a mobile app that we could pair to the planter in order to monitor and make adjustments in order to provide an improved UI when compared to our digital display and push buttons.

Code

aergrow_mini_2_2_ino.inoArduino
/*
Air Planter

Humidifier control for Air Planter


 A2  = Sensor Measurement pin
 D6 to relay
 A4 SDA
 A5 SCL
 D2 Enter Button
 D3 Escape Button

*/

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
const int moisture = A2; //reads voltage from soil sensor
const int powerpin = 11; //provides power to voltage divider
const int groundpin = 12; //ground for voltage divider, reverses after measurement
const int relaypin = 6; //powers relay
const int enterButton= 2; // pin 7 to ground
const int escButton = 3;  // pin 8 to ground

int vacOn = 0; // "1" indicaated vacation mode is on
int moisture_val;
byte count = 0;
byte screenRefresh ;
byte wet_val;
byte high_val;
byte oldWet; //high wet value stored in eeprom 1.
byte buttonState = 0;
int lowLevel = 0; // counter for moisture dropping while humidifier is on
//--------------------------------------------------------------------
byte offset = 15; // (epprom 2) 10 for moist plants, 50 for plants that need drying, 20 normal
byte readingRate = 30; //(eeprom 3)time between sensor readings in minutes
int highRaw = 900; // raw reading for sensor saturated with water. stored in eeprom 5 and 6
//---------------------------------------------------------------------------
unsigned long lastMillis = 0; // holds the last read millis()
unsigned long previousMillis = 0; //used for flashing led routine
unsigned long currentMillis = 0;
unsigned long onMillis = 0; //used for blinking display
unsigned long offMillis = 0; //used for blinking display

unsigned long interval; // sampling interval
long  testInterval = 0; //allows for immediate moisture measurement
//const long interval = 3000; //used for testing
byte calHours = 12; //(eeprom 4)
unsigned long cal_period = 3600000 * calHours; //defines cal period (12hrs = 43200000)
//#####################################################################################
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //FOR BLUE DISPLAY
//LiquidCrystal_I2C lcd(0x20, 4, 5, 6, 0, 1, 2, 3, 7, NEGATIVE); //for alternate IIC display
//LiquidCrystal_I2C lcd(0x20, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //FOR YELLOW DISPLAY LCM1602
//#####################################################################
//---------------------------------------------------------------------

void setup()
{
 pinMode(powerpin,OUTPUT);
 pinMode(groundpin,OUTPUT);
 pinMode (relaypin,OUTPUT);
 pinMode(moisture,INPUT);
 pinMode (enterButton,INPUT);
 pinMode (escButton,INPUT);
 digitalWrite(enterButton, HIGH); //enable pull-up resistor
 digitalWrite(escButton,HIGH);//enable pull-up resitor
 
 digitalWrite(relaypin, HIGH); //turns on humidifier
  
 lcd.begin(16,2);
 lcd.backlight();
 lcd.clear();
  lcd.setCursor(0,0);
  lcd.print ("Aergrow 2.2");
  lcd.setCursor(0,1);
  lcd.print("std sensor ");
 
 delay (2000);
 
  
 if (EEPROM.read(10) != 2) //runs if no data in eeprom or program was reset in Settings
 {
 EEPROM.write(2, offset);
 EEPROM.write(3, readingRate);
 EEPROM.write(4, calHours);
 byte hiByte = highByte(highRaw);
 byte loByte = lowByte(highRaw);
 EEPROM.write(6, hiByte);
 EEPROM.write(7, loByte);
 EEPROM.write(8, 0);
 EEPROM.write(10, 2);
 }
 else //uses data stored in eeprom
 {
 oldWet = EEPROM.read(1);
 offset = EEPROM.read(2);
 vacOn = EEPROM.read(8);
 readingRate = EEPROM.read(3);
 calHours = EEPROM.read(4);
  byte hByte = EEPROM.read(6);
 byte lByte =EEPROM.read(7);
 highRaw = word(hByte, lByte);
 }
  if (EEPROM.read(8) == 1)
  {
    vacationOn();
  }
  else if (oldWet > 5 && digitalRead(enterButton) == HIGH) //calibration will be skipped if data in eeprom or left button is pushed
 {EEPROM.write(1,oldWet);
  wet_val = oldWet;
  high_val = oldWet;
 moisture_val = readSensor (); //takes reading and outputs moisture_val
 }
 
 else
 {
   calibrating();
 }
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print ("Initializing");
  lcd.setCursor(0,1);
  lcd.print("high value = ");
  lcd.setCursor(13,1);
  lcd.print(high_val);
   
 lastMillis = millis(); // do this last in setup
 delay (1);
 }


//#########################################################################
void loop()
{

  assignButton();

  boolean relaypinVal = digitalRead(relaypin);

  int highCount = (600 / readingRate); // (eeprom 5) cycles before watering stopsv 10 hrs. total
  int safety = (offset * 2);
  unsigned long cal_period = 3600000 * calHours;
  interval = (readingRate * 60000);
  currentMillis = millis();

  if (lastMillis > currentMillis)
  {
    lastMillis = currentMillis;
  }

  if (wet_val < (high_val - 10) && vacOn == 0)
  {
    calibrating();
  }
  //------------------------------------------------------
  if (currentMillis > lastMillis + testInterval)
  {
    moisture_val = readSensor(); //takes reading and outputs moisture_val
    lastMillis = currentMillis;
    testInterval = interval;
    screenRefresh = 1;

    if (relaypinVal == HIGH)// Is humidifier on?
    {
      count++;
    }
    else
    {
      count = 0;
    }
    lowLevel = 0;
    
    //----------------------------------------------------------------

    if (moisture_val <= (wet_val - offset))
      digitalWrite (relaypin, HIGH); //TURNS ON HUMIDIFIER
    if (moisture_val >= wet_val) //checks if moisture value returned to close to wet value
    {
      digitalWrite(relaypin, LOW); //turns off humidifier
      wet_val =(wet_val +((moisture_val- wet_val)/2));
      EEPROM.write(1, wet_val);
      count = 0;
    }
    if (moisture_val >= (wet_val - (offset / 5))) //checks if moisture value returned to close to wet value
    {
      digitalWrite(relaypin, LOW); //turns off humidifier
      count = 0;
    }
    
    //------------------------------------------------------------------

    if ((count > highCount) && (moisture_val >= (wet_val - (offset /2))) && (moisture_val >= 40)) //allows 18 watering cycles
    {
     if (moisture_val < wet_val)  
     { wet_val =(moisture_val +((wet_val-moisture_val)/2));
      EEPROM.write(1, wet_val);}
      count = 0;  // resets counter
      digitalWrite(relaypin, LOW); //turns off humidifier
    }
  }

//-------------------------------------------------------------
  if (screenRefresh == 1)
  {

    if ((((count > highCount) && (moisture_val <= (wet_val - (offset / 2))) && (moisture_val >= 20)) || lowLevel > 10 ) && vacOn == 0)
      displayCheck();

    else if (moisture_val > 10 && (moisture_val < (wet_val - safety) || moisture_val < (high_val / 2)) && vacOn == 0 && testInterval > 500)
      displayCaution();

    else if (moisture_val <= 10)
      displayWarning();

    else if (vacOn == 1)
    { vacationOn();
      screenRefresh = 0;
    }

    else
    {
      displayInfo();
      screenRefresh = 0;
    }
  }
}

Custom parts and enclosures

Schematics

Design
Planter image 4 ars7fpkf09 2aa2t3dj2i
Diagram
Planter image 5 wxyjhooave nuggye4cld

Comments

Similar projects you might like

Smart Garden - Alexa consults & automates your garden

Project in progress by Alex Winiarski

  • 823 views
  • 2 comments
  • 4 respects

An Urban Garden Monitor

Project tutorial by James Yu

  • 1,977 views
  • 0 comments
  • 4 respects

Air Surfer

Project tutorial by Anton

  • 32,460 views
  • 27 comments
  • 162 respects

Smart Garden

Project showcase by patel Dipen

  • 30,333 views
  • 16 comments
  • 73 respects

Wooden Chest Air Quality Monitor

Project tutorial by Fillbee

  • 2,144 views
  • 2 comments
  • 10 respects
Add projectSign up / Login