#include <DHT.h>
#include <Servo.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <Fonts/FreeSerif9pt7b.h>

#define dht_pin 2
#define led_merah 5
#define led_kuning 4
#define led_biru 3
#define servoPin 6
#define buzzerPin 7
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define DHTTYPE DHT22

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
DHT dht(dht_pin, DHTTYPE);
Servo myServo;

void setup() {
  Serial.begin(115200);
  dht.begin();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  pinMode(buzzerPin, OUTPUT);
  pinMode(led_merah, OUTPUT);
  pinMode(led_kuning, OUTPUT);
  pinMode(led_biru, OUTPUT);
  myServo.attach(servoPin);
  myServo.write(0);
}

void loop() {
  delay(2000);
  display.setFont(&FreeSerif9pt7b);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 40);

  float h = dht.readHumidity();
  float suhu = dht.readTemperature();
  float f = dht.readTemperature(true);

  if (isnan(h) || isnan(suhu) || isnan(f)) {
    return;
  }

  float hif = dht.computeHeatIndex(f, h);
  float hic = dht.computeHeatIndex(suhu, h, false);

  if (suhu < 29) {
    digitalWrite(led_merah, LOW);
    digitalWrite(led_kuning, LOW);
    digitalWrite(led_biru, HIGH);
    display.println("SUHU RENDAH");
    display.display();
    noTone(buzzerPin);
    myServo.write(0);
  } else if (suhu <= 35 && suhu >= 29) {
    digitalWrite(led_merah, LOW);
    digitalWrite(led_kuning, HIGH);
    digitalWrite(led_biru, LOW);
    display.println("SUHU CUKUP");
    display.display();
    noTone(buzzerPin);
    myServo.write(0);
  } else if (suhu > 35) {
    digitalWrite(led_merah, HIGH);
    digitalWrite(led_kuning, LOW);
    digitalWrite(led_biru, LOW);
    display.println("SUHU PANAS");
    display.display();
    tone(buzzerPin, 1000, 200);  // Frekuensi 1000 Hz, durasi 200 ms
    delay(100);  // Jeda antara beep
    noTone(buzzerPin);
    myServo.write(90);
  } else {
    digitalWrite(led_merah, LOW);
    digitalWrite(led_kuning, LOW);
    digitalWrite(led_biru, LOW);
    display.println("    ");
    display.display();
    noTone(buzzerPin);
    myServo.write(0);
  }
}