#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <Servo.h>

#define DEBUG false   //if card code learning then true else false
#define Serial if(DEBUG)Serial

#define Trash_Button      2
#define servo_Trash       7

#define Fan_Button        3
#define Fan_Relay         4

#define Backlight_Button  5
#define Backlight_Led     6

#define DHTPIN            8
#define DHTTYPE           DHT22

#define I2C_ADDR          0x27
#define LCD_COLUMNS       20
#define LCD_LINES         4

#define DEBOUNCE_DELAY    20

#define SERVO_MAX_ANGLE   160
#define SERVO_MIN_ANGLE   10

Servo servo;
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
DHT dht(DHTPIN, DHTTYPE);

uint8_t Fan_Status = 0, Fan_lastStatus = 0;
uint8_t Backlight_Status = 0, Backlight_lastStatus = 0;
uint8_t Trash_Status = 0, Trash_lastStatus = 0, servo_Angle;


uint16_t now_Time, last_Time = 0, interval = 2000;
uint8_t dht_Read_Enable = 1;
float h, t;


void setup()
{
  Serial.begin(115200);

  pinMode(Trash_Button, INPUT);
  pinMode(Fan_Button, INPUT);
  pinMode(Backlight_Button, INPUT);

  pinMode(Fan_Relay, OUTPUT);
  digitalWrite(Fan_Relay, LOW);

  servo.attach(servo_Trash);
  servo.write(SERVO_MIN_ANGLE);

  lcd.init();
  lcd.backlight();

  dht.begin();

}

/*
 * Çöp kutusu için zaman konulabilir.
 */
void loop()
{
  now_Time = millis();
  if (now_Time - last_Time >= interval)
  {
    last_Time = now_Time;
    dht_Read_Enable = 1;
  }

  if (dht_Read_Enable = 1)
  {
    h = dht.readHumidity();
    t = dht.readTemperature();
    dht_Read_Enable = 0;

    if (isnan(h) || isnan(t))
    {
      Serial.println(F("Failed to read from DHT sensor!"));
      lcd.setCursor(0, 0);
      lcd.print("Failed to read");
      lcd.setCursor(0, 1);
      lcd.print("from DHT sensor!");
      return;
    }
  }

  if (digitalRead(Fan_Button) == 0 && Fan_lastStatus == 0)
  {
    delay(DEBOUNCE_DELAY);
    while(digitalRead(Fan_Button) == 0)
    {
      Fan_Status = 1;
    }
  }
  else if (digitalRead(Fan_Button) == 0 && Fan_lastStatus == 1)
  {
    delay(DEBOUNCE_DELAY);
    while(digitalRead(Fan_Button) == 0)
    {
      Fan_Status = 0;
    }
  }
  Fan_lastStatus = Fan_Status;

  if (digitalRead(Trash_Button) == 0 && Trash_lastStatus == 0)
  {
    delay(DEBOUNCE_DELAY);
    while(digitalRead(Trash_Button) == 0)
    {
      Trash_Status = 1;
      servo_Angle = SERVO_MAX_ANGLE;
    }
  }
  else if (digitalRead(Trash_Button) == 0 && Trash_lastStatus == 1)
  {
    delay(DEBOUNCE_DELAY);
    while(digitalRead(Trash_Button) == 0)
    {
      Trash_Status = 0;
      servo_Angle = SERVO_MIN_ANGLE;
    }
  }
  Trash_lastStatus = Trash_Status;

  if (digitalRead(Backlight_Button) == 0 && Backlight_lastStatus == 0)
  {
    delay(DEBOUNCE_DELAY);
    while(digitalRead(Backlight_Button) == 0)
    {
      Backlight_Status = 1;
    }
  }
  else if (digitalRead(Backlight_Button) == 0 && Backlight_lastStatus == 1)
  {
    delay(DEBOUNCE_DELAY);
    while(digitalRead(Backlight_Button) == 0)
    {
      Backlight_Status = 0;
    }
  }
  Backlight_lastStatus = Backlight_Status;


  digitalWrite(Fan_Relay, Fan_Status);
  servo.write(servo_Angle);
  digitalWrite(Backlight_Led, Backlight_Status);

  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.println(F("°C "));


  //Temperature
  lcd.setCursor(0, 0);
  lcd.print("T:");
  lcd.setCursor(2, 0);
  lcd.print(t);
  lcd.setCursor(7, 0);
  lcd.print((char)(223));//Degrees Symbol
  lcd.setCursor(8, 0);
  lcd.print("C");

  //Humdity
  lcd.setCursor(11, 0);
  lcd.print("H:");
  lcd.setCursor(13, 0);
  lcd.print(h);
  lcd.setCursor(17, 0);
  lcd.print("%");

  //Trash Status
  lcd.setCursor(0, 1);
  lcd.print("Trash is ");
  lcd.setCursor(9, 1);

  if (Trash_Status == 1)
  {
    lcd.print("ON ");
  }
  else
  {
    lcd.print("OFF");
  }

  //Fan Status
  lcd.setCursor(0, 2);
  lcd.print("Fan is ");
  lcd.setCursor(7, 2);

  if (Fan_Status == 1)
  {
    lcd.print("ON ");
  }
  else
  {
    lcd.print("OFF");
  }

  //Back Light Status
  lcd.setCursor(0, 3);
  lcd.print("Backlight is ");
  lcd.setCursor(13, 3);

  if (Backlight_Status == 1)
  {
    lcd.print("ON ");
  }
  else
  {
    lcd.print("OFF");
  }
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
servo1:GND
servo1:V+
servo1:PWM
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL
NOCOMNCVCCGNDINLED1PWRRelay Module
relay1:VCC
relay1:GND
relay1:IN
relay1:NC
relay1:COM
relay1:NO
dht1:VCC
dht1:SDA
dht1:NC
dht1:GND
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
btn3:1.l
btn3:2.l
btn3:1.r
btn3:2.r
r1:1
r1:2
r2:1
r2:2
r3:1
r3:2
led1:A
led1:C
r4:1
r4:2
led2:A
led2:C
r5:1
r5:2
NOCOMNCVCCGNDINLED1PWRRelay Module
relay2:VCC
relay2:GND
relay2:IN
relay2:NC
relay2:COM
relay2:NO