de_botaniker
Published © GPL3+

Automatic Tropical Terrarium

This project is my journey of developing an automated terrarium for tropical plants.

BeginnerWork in progress1,065
Automatic Tropical Terrarium

Things used in this project

Hardware components

Arduino UNO
Arduino UNO
×1
Adafruit Data Logger Shield
×1
DHT22 temperature-humidity sensor
Adafruit DHT22 temperature-humidity sensor
×2
RGB LCD Shield Kit, 16x2 Character Display
RGB LCD Shield Kit, 16x2 Character Display
×1
Axial Fan, 12 V
Axial Fan, 12 V
×1
Relay (generic)
×2
Terrarium Moisting System
×1

Story

Read more

Code

terra_log_1.ino

Arduino
This is the beginning of coding for the terrarium. For now, the code is only supposed to read the temperature in the terrarium, compare it to the threshold and turn on a fan when the temp is above the threshold. However, for now the fan is not connected to a power supply. The only purpose is to log data about temperature and humidity to the SD card so I can learn about the climate in the terrarium first. Critical termperatures or humdities are not reached.
#include <DHT.h> // include library
#include <SPI.h>
#include <SD.h>
#include "RTClib.h"

const int chipSelect = 10;
const int relayPin1 = 8;
const int DHTPIN = 7;

#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);// Initialize DHT sensor
RTC_DS1307 rtc;

File myFile;
char dateBuffer[12];
/********************************/
void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  if (! rtc.begin()) {
    Serial.println("No RTC"); //Could not fint RTC
    Serial.flush();
    abort();
  }
  if (! rtc.isrunning()) {
    Serial.println("RTC off, set the time");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }
  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));


  Serial.print("Initializing SD card...");
  if (!SD.begin(chipSelect)) {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");
  if (SD.exists("terralog.txt")) {
    Serial.println("terralog.txt exists.");
  } else {
    Serial.println("terralog.txt doesn't exist.");
    Serial.println("Creating terraaaaa.txt");
    myFile = SD.open("terralog.txt", FILE_WRITE);
    myFile.close();
    if (SD.exists("terralog.txt")) {
      Serial.println("terralog.txt was successfully created.");
    } else {
      Serial.println("File creation failed.");
    }
  }

  pinMode(relayPin1, OUTPUT);
  dht.begin();

  Serial.println("date,time,temperature,humidity,fanState");
}

void loop()
{

  float h = dht.readHumidity();
  float t = dht.readTemperature();
  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  DateTime time = rtc.now();

  sprintf(dateBuffer, "%02u-%02u-%04u", time.day(), time.month(), time.year());
  Serial.print(dateBuffer);
  Serial.print(",");
  sprintf(dateBuffer, "%02u:%02u:%02u", time.hour(), time.minute(), time.second());
  Serial.print(dateBuffer);
  Serial.print(",");
  Serial.print(t);
  Serial.print(",");
  Serial.print(h);
  Serial.print(",");

  File myFile = SD.open("terralog.txt", FILE_WRITE);

  if (myFile) {
    sprintf(dateBuffer, "%02u-%02u-%04u", time.day(), time.month(), time.year());
    myFile.print(dateBuffer);
    myFile.print(",");
    sprintf(dateBuffer, "%02u:%02u:%02u", time.hour(), time.minute(), time.second());
    myFile.print(dateBuffer);
    myFile.print(",");
    myFile.print(t);
    myFile.print(",");
    myFile.print(h);
    myFile.print(",");
    myFile.close();
  }
  else {
    Serial.println("error opening terralog.txt");
  }
  if (t >= 27) {
    digitalWrite(relayPin1, HIGH);
    Serial.println("on");
    File myFile = SD.open("terralog.txt", FILE_WRITE);
    myFile.println("on");
    myFile.close();
  }
  else {
    digitalWrite(relayPin1, LOW);
    Serial.println("off");
    File myFile = SD.open("terralog.txt", FILE_WRITE);
    myFile.println("off");
    myFile.close();
  }

  delay(30000);

}

terra_log_fan_and_moisting_2

ABAP
This is a further developed code than the previous one.
I remade everything in a way I think is more optimized and more functional.
#include <DHT.h>
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"

//const int lightRelay = 12;
const int rainRelay = 11;
const int fanRelay = 8;
const int chipSelect = 10;
const int DHTPIN_1 = 5;
const int DHTPIN_2 = 6;

int fanState = 0;
int rainState = 0;

int maxTemp = 29;
int normTemp = 25;

int minHum = 96;

int i = 0;

LiquidCrystal_I2C lcd(0x27, 16, 2);

#define DHTTYPE DHT22
DHT dht_1(DHTPIN_1, DHTTYPE);
DHT dht_2(DHTPIN_2, DHTTYPE);
RTC_DS1307 rtc;

File myFile;
char dateBuffer[12];
char sensBuffer[10];

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ;
  }

  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);

  if (! rtc.begin()) {
    error("No RTC");
    Serial.flush();
    abort();
  }

  if (! rtc.isrunning()) {
    error("RTC was off. Setting new time.");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }
  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  Serial.print(F("Initializing SD card..."));
  if (!SD.begin(chipSelect)) {
    error("SD initialization failed");
    while (1);
  }

  Serial.println(F("initialization done."));
  if (SD.exists(F("terralog.txt"))) {
    Serial.println(F("terralog.txt exists."));
  } else {
    Serial.println(F("terralog.txt doesn't exist."));
    Serial.println(F("Creating terraaaaa.txt"));
    myFile = SD.open("terralog.txt", FILE_WRITE);
    myFile.println("date,time,temp_1,temp_2,hum_1,hum_2,fanState, rainState,i");
    myFile.close();
    if (SD.exists("terralog.txt")) {
      Serial.println(F("terralog.txt was successfully created."));
    } else {
      Serial.println(F("File creation failed."));
    }
  }

  pinMode(fanRelay, OUTPUT);
  dht_1.begin();
  dht_2.begin();
  Serial.println(F("date,time,temp_1,temp_2,hum_1,hum_2,fanState,rainState,i"));
}

void loop() {
  float h_1 = dht_1.readHumidity();
  float t_1 = dht_1.readTemperature();
  if (isnan(h_1) || isnan(t_1)) {
    error("DHT 1");
    return;
  }
  float h_2 = dht_2.readHumidity();
  float t_2 = dht_2.readTemperature();
  if (isnan(h_2) || isnan(t_2)) {
    error("DHT 2");
    return;
  }

  DateTime time = rtc.now();
  lcd.setCursor(0, 0);
  lcd.print(t_1);
  lcd.print(", ");
  lcd.print(h_1);
  lcd.setCursor(0, 1);
  lcd.print(t_2);
  lcd.print(", ");
  lcd.print(h_2);

  sprintf(dateBuffer, "%02u-%02u-%04u", time.day(), time.month(), time.year());
  Serial.print(dateBuffer);
  Serial.print(",");
  sprintf(dateBuffer, "%02u:%02u:%02u", time.hour(), time.minute(), time.second());
  Serial.print(dateBuffer);
  Serial.print(F(","));
  Serial.print(t_1);
  Serial.print(F(","));
  Serial.print(t_2);
  Serial.print(F(","));
  Serial.print(h_1);
  Serial.print(F(","));
  Serial.print(h_2);
  Serial.print(F(","));

  File myFile = SD.open("terralog.txt", FILE_WRITE);
  if (!myFile) {
    error("logfile");
  }
  sprintf(dateBuffer, "%02u-%02u-%04u", time.day(), time.month(), time.year());
  myFile.print(dateBuffer);
  myFile.print(",");
  sprintf(dateBuffer, "%02u:%02u:%02u", time.hour(), time.minute(), time.second());
  myFile.print(dateBuffer);
  myFile.print(",");
  myFile.print(t_1);
  myFile.print(",");
  myFile.print(t_2);
  myFile.print(",");
  myFile.print(h_1);
  myFile.print(",");
  myFile.print(h_2);
  myFile.print(",");

  //
  // Temperature Control
  //

  if (t_1 >= maxTemp) {
    fanState = 1;
    digitalWrite(fanRelay, HIGH);
    Serial.print(fanState);
    myFile.print(fanState);
  }
  else if (t_1 < maxTemp && t_1 >= normTemp) {
    Serial.print(fanState);
    myFile.print(fanState);
  }
  else if (t_1 < normTemp) {
    fanState = 0;
    digitalWrite(fanRelay, LOW);
    Serial.print(fanState);
    myFile.print(fanState);
  }

  //
  // Rain Control
  //

  if (h_1 < 80 && fanState == 0) {
    if (i <= 4) {
      rainState = 1;
      digitalWrite(rainRelay, HIGH);
      i++;
    }
    else if (i > 4 && i <= 300) {
      rainState = 2;
      digitalWrite(rainRelay, LOW);
      i++;
    }
  }
  else {
    rainState = 0;
    i = 0;
  }
  Serial.print(",");
  Serial.print(rainState);
  Serial.print(",");
  Serial.print(i);
  
  myFile.println();
  myFile.close();
  Serial.println();
  delay(1000);
}

void error(char *str) {
  Serial.print(F("Fehler: "));
  Serial.println(str);
  lcd.clear();
  lcd.print("Error: ");
  lcd.print(str);
  delay(5000);
  lcd.clear();
  //while(1); //halt command
}

Credits

de_botaniker

de_botaniker

0 projects • 1 follower

Comments