aleixj
Published © CC BY

Automated greenhouse with Arduino

Small greenhouse that requires little human intervention for its correct operation. It has a heating, ventilation, irrigation and SD system.

IntermediateShowcase (no instructions)5,862
Automated greenhouse with Arduino

Things used in this project

Hardware components

SparkFun Bmp180
×1
Soil moisture Sensor Module V1.2
×1
Relay Module (Generic)
×1
water pump
×1
Heater
×1
Axial Fan, 12 VDC
Axial Fan, 12 VDC
×1
plastic tube
×1
Jumper wires (generic)
Jumper wires (generic)
×1
Wood
×1
SparkFun Snappable Protoboard
SparkFun Snappable Protoboard
×1
Arduino UNO
Arduino UNO
×1
hinge
×1
Greenhouse plastic
×1
DataLogger Module Data Recorder Shield
×1

Hand tools and fabrication machines

Drill / Driver, Cordless
Drill / Driver, Cordless
Welder

Story

Read more

Code

Source Code

Arduino
#include <SFE_BMP180.h>
#include <Wire.h>
SFE_BMP180 pressure;
#define ALTITUDE 88.0 // 

//relays
#define pinRelayHeater 2
#define pinRelayIrrigation 3
#define pinRelayFan 4

//analog humidity sensor
#define pinHumidity A0

// Values
#define heaterThreshold 9
#define fanThreshold 30
#define humidityThreshold 30
#define irrigationTime 2500
byte HeaterSd = 0;
byte fanSd = 0;
byte pumpSd = 0;

//sd
#include <SPI.h>
#include <SD.h>
const int chipSelect = 10;
//Millis
unsigned long MillisSD = 0;
unsigned long MillisIrrigation = 0;

//RTC
#include "RTClib.h"
RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};



//*************************void setup*************************

void setup()
{
  Serial.begin(57600);
  Serial.println("REBOOT");
  pinMode(pinRelayHeater, OUTPUT);
  pinMode(pinRelayIrrigation, OUTPUT);
  pinMode(pinRelayFan, OUTPUT);
  pinMode (pinHumidity, INPUT);

  //temperature sensor
  if (pressure.begin())
    Serial.println("Temperature sensor is working");
  else
  {
    // Temperature sensor failed, check connections
    Serial.println("Temperature sensor failed\n");
    while (1); // Pause
  }

  //RTC
  while (!Serial); // wait for serial port to connect. Needed for native USB

  if (! rtc.begin()) {
    Serial.println("RTC could not be found");
    Serial.flush();
    abort();
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC off");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }

  //sd
  if (!SD.begin(chipSelect)) {
    Serial.println("Error SD");
    while (1); //Pause
  }
}

//**************************void loop**************************

void loop()
{
  //**************Temperature**************
  //*****Ambient sensor (temperature, pressure)*****
  char status;
  double T, P, p0;

  status = pressure.startTemperature();
  if (status != 0)
  {
    delay(status);

    status = pressure.getTemperature(T);
    if (status != 0)
    {
      status = pressure.startPressure(3);
      if (status != 0)
      {
        delay(status);
        status = pressure.getPressure(P, T);
        if (status != 0)
        {
          p0 = pressure.sealevel(P, ALTITUDE);
        }
        else Serial.println("error retrieving pressure measurement\n");
      }
      else Serial.println("error starting pressure measurement\n");
    }
    else Serial.println("error retrieving temperature measurement\n");
  }
  else Serial.println("error starting temperature measurement\n");


  //*****Temperature control*****
  //Heater
  if (T <= heaterThreshold) {
    digitalWrite(pinRelayHeater, HIGH);
    HeaterSd = 1;
  }
  else if (T >= (heaterThreshold + 1)) {
    digitalWrite(pinRelayHeater, LOW);
  }
  else {
    HeaterSd = 1;
  }

  //Fan
  if (T >= (fanThreshold - 1)) {
    digitalWrite(pinRelayFan, HIGH);
    fanSd = 1;
  }
  else if (T <= fanThreshold) {
    digitalWrite(pinRelayFan, LOW);
  }
  else {
    fanSd = 1;
  }


  //**************Humitat**************
  int AnalogHumidity;
  int HumidityPercentage;

  AnalogHumidity = analogRead(pinHumidity);
  HumidityPercentage = map(AnalogHumidity, 775, 326, 0, 100); // manually calibrated

  Serial.print("Analog: ");
  Serial.print(AnalogHumidity);
  Serial.print(" Percentage: ");
  Serial.println(HumidityPercentage);

  //*****Irrigation system*****

  if (((millis() - MillisIrrigation) >= 120000)) {
    MillisIrrigation = millis();
    if (HumidityPercentage <= humidityThreshold) {
      digitalWrite(pinRelayIrrigation, HIGH);
      delay (irrigationTime);
      digitalWrite(pinRelayIrrigation, LOW);
      pumpSd = 1;
    }
  }

  //**************RTC i SD**************
  DateTime now = rtc.now();

  //sd
  File dataFile = SD.open("datalog.txt", FILE_WRITE);

  //Monitor serie
  Serial.print(now.day(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.year(), DEC);
  Serial.print(" (");
  Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
  Serial.print(") ");
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.Minutee(), DEC);
  Serial.print(':');
  Serial.println(now.second(), DEC);
  Serial.print("temperature");
  Serial.println(T);


  int Minute = now.Minutee();
  int Hour = now.hour();
  int Second = now.second();
  int Day = now.day();
  int Month = now.month();
  int Year = now.year();

  if (dataFile) {
    if (((millis() - MillisSD) >= 60000)) {
      // Day/Month/Year Hour:Minute:Second, temperature(C), Pressure(mb), Relative Pressure(mb), Humidity(%), heater, fan, water pump

      MillisSD = millis();
      dataFile.print(Day);
      dataFile.print("/");
      dataFile.print(Month);
      dataFile.print("/");
      dataFile.print(Year);
      dataFile.print(" ");
      dataFile.print(Hour);
      dataFile.print(":");
      dataFile.print(Minute);
      dataFile.print(":");
      dataFile.print(Second);
      dataFile.print(", ");
      dataFile.print(T);
      dataFile.print(", ");
      dataFile.print(P);
      dataFile.print(", ");
      dataFile.print(p0);
      dataFile.print(", ");
      dataFile.print(HumidityPercentage);

      dataFile.print(", ");
      dataFile.print(HeaterSd);
      dataFile.print(", ");
      dataFile.print(fanSd);
      dataFile.print(", ");
      dataFile.println(pumpSd);

      fanSd = 0;
      HeaterSd = 0;
      pumpSd = 0;
    }
    dataFile.close();
  }
}

Credits

aleixj
0 projects • 2 followers

Comments