//Oled Display
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

//Display
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

//Adafruit Sensor Library
#include <DHT.h>

DHT dht(3, DHT11);

//Define Pins
#define redPin 5
#define greenPin 6
#define bluePin 9
#define relayPin 7

//Timer
unsigned long interval = 1L * 60L * 60L * 1000L; //1 Hour
long prevTime = 0;
int hours = 0;

unsigned long waterDuration = 1.5L * 60L * 1000L; // 1.5 Minutes
long prevWater = 0;

long lightingDuration = 14; // 14 Hours
bool rgbOn = false;

//RGB brightness/values
int rValue = 255;
int gValue = 60;
int bValue = 255;

void lightOn() {
  analogWrite(redPin, rValue);
  analogWrite(greenPin, gValue);
  analogWrite(bluePin, bValue);
  rgbOn = true;
}

void lightOff() {
  analogWrite(redPin, 0);
  analogWrite(greenPin, 0);
  analogWrite(bluePin, 0);
  rgbOn = false;
}

void setup() {
  Serial.begin(9600);

  //Display
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  delay(2000);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.clearDisplay();
  display.display();

  //Relay
  pinMode(relayPin, OUTPUT);
  digitalWrite(relayPin, HIGH);

  //Leds
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  pinMode(bluePin, OUTPUT);

  //Temperature/Humidity Sensor
  dht.begin();
}

void loop() {
  if (millis() - prevTime > interval) {
    prevTime = millis();
    prevWater = millis();
    digitalWrite(relayPin, HIGH);
    ++hours;
    Serial.println(hours);
    if (hours == 23) {
      hours = 0;
    }
  }

  if (hours <= lightingDuration) {
    lightOn();
  } else if (rgbOn) {
    lightOff();
  }
  if (millis() - prevWater > waterDuration && digitalRead(relayPin) == HIGH) {
    digitalWrite(relayPin, LOW);
  }
  
  display.clearDisplay();
  display.setCursor(0, 0);
  display.println("Hydroponic Grow Box");
  display.print("Hour: ");
  display.println(hours);
  display.print("Temperature: ");
  display.print(dht.readTemperature(true));
  display.println(" F");
  display.print("Humidity: ");
  display.print(dht.readHumidity());
  display.println("%");
  display.print("Pump Status: ");
  display.println(digitalRead(relayPin) == LOW ? "Off" : "On");
  display.display();
}
