#include <DHT.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define DHTPIN 2     // Pin data DHT11 terhubung ke pin 2
#define DHTTYPE DHT11   // Tipe sensor DHT (DHT11)

DHT dht(DHTPIN, DHTTYPE);

#define LIGHT_SENSOR_PIN A1 
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1 // Reset pin tidak terhubung

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define LIGHT_SENSOR_PIN A1 


const int buttonPin1 = 10; // Pin untuk tombol 1
const int buttonPin2 = 9; // Pin untuk tombol 2
const int buttonPin3 = 8; // Pin untuk tombol 3

const int ledPin1 = 13;    // Pin untuk lampu 1
const int ledPin2 = 12;    // Pin untuk lampu 2
const int ledPin3 = 11;    // Pin untuk lampu 3

void setup() {
  {
  Serial.begin(9600);
  
    float h = dht.readHumidity();     // Baca kelembaban
  float t = dht.readTemperature();  // Baca suhu dalam Celsius
  
  // Periksa apakah pembacaan sukses
  if (isnan(h) || isnan(t)) {
    Serial.println(F("Gagal membaca dari sensor DHT"));
    return;
  }
  
  display.display();
  delay(2000);
  display.clearDisplay();
  
  dht.begin();
  }
  {
  pinMode(buttonPin1, INPUT_PULLUP); // Mengatur pin tombol sebagai input dengan resistor pull-up
  pinMode(buttonPin2, INPUT_PULLUP);
  pinMode(buttonPin3, INPUT_PULLUP);

  pinMode(ledPin1, OUTPUT); // Mengatur pin lampu sebagai output
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);

  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
}
}

void loop() {
  // Membaca status tombol
  {
 delay(2000);  // Tunggu 2 detik antara pembacaan
  
  float h = dht.readHumidity();     // Baca kelembaban
  float t = dht.readTemperature();  // Baca suhu dalam Celsius
  
  // Periksa apakah pembacaan sukses
  if (isnan(h) || isnan(t)) {
    Serial.println(F("Gagal membaca dari sensor DHT"));
    return;
  }

  // Bersihkan layar
  display.clearDisplay();

  // Tampilkan hasil pembacaan di layar OLED
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0,0);
  display.println(F("Sensor DHT11"));
  display.setTextSize(2);
  display.setCursor(0,10);
  display.print(F("Humidity: "));
  display.print(h);
  display.println(F("%"));
  display.setCursor(0,30);
  display.print(F("Temperature: "));
  display.print(t);
  display.println(F("°C"));
  display.display();
  
  // Tampilkan hasil pembacaan di Serial Monitor
  Serial.print(F("Kelembaban: "));
  Serial.print(h);
  Serial.print(F("%\t"));
  Serial.print(F("Suhu: "));
  Serial.print(t);
  Serial.println(F("°C"));
}
{
  int buttonState1 = digitalRead(buttonPin1);
  int buttonState2 = digitalRead(buttonPin2);
  int buttonState3 = digitalRead(buttonPin3);

  // Menyalakan atau mematikan lampu 1 sesuai dengan status tombol 1
  if (buttonState1 == LOW) {
    digitalWrite(ledPin1, HIGH); // Menyalakan lampu 1
  } else {
    digitalWrite(ledPin1, LOW); // Mematikan lampu 1
  }

  // Menyalakan atau mematikan lampu 2 sesuai dengan status tombol 2
  if (buttonState2 == LOW) {
    digitalWrite(ledPin2, HIGH); // Menyalakan lampu 2
  } else {
    digitalWrite(ledPin2, LOW); // Mematikan lampu 2
  }
  if (buttonState3 == LOW) {
    digitalWrite(ledPin3, HIGH); // Menyalakan lampu 3
  } else {
    digitalWrite(ledPin3, LOW); // Mematikan lampu 3
  }
// LDR
  // reads the input on analog pin (value between 0 and 4095)
  int analogValue = analogRead(LIGHT_SENSOR_PIN);

  Serial.print("Analog Value = ");
  Serial.print(analogValue);   // the raw analog reading

  // We'll have a few threshholds, qualitatively determined
  if (analogValue < 40) {
    Serial.println(" => Dark");
  } else if (analogValue < 800) {
    Serial.println(" => Dim");
  } else if (analogValue < 2000) {
    Serial.println(" => Light");
  } else if (analogValue < 3200) {
    Serial.println(" => Bright");
  } else {
    Serial.println(" => Very bright");
  }

  delay(500);
}
}