#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <Servo.h>
#define DHTPIN 2 // Pin yang terhubung ke sensor DHT22
#define DHTTYPE DHT22 // Jenis sensor DHT (DHT11, DHT22, DHT21)
#define BUZZER_PIN 8 // Pin untuk buzzer
#define LED_MODERATE_QUALITY 13
#define LED_GOOD_QUALITY 10
#define LED_POOR_QUALITY 11
#define BUTTON_PIN 7 // Pin untuk tombol push
#define SERVO_PIN 9 // Pin untuk servo
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C LCD
Servo myservo;
bool buttonState = false;
bool lastButtonState = false;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
void setup() {
Serial.begin(9600);
dht.begin();
lcd.init();
lcd.backlight();
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_GOOD_QUALITY, OUTPUT);
pinMode(LED_MODERATE_QUALITY, OUTPUT);
pinMode(LED_POOR_QUALITY, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
myservo.attach(SERVO_PIN);
myservo.write(0); // Inisialisasi servo ke posisi awal (kanopi terbuka)
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Suhu : ");
lcd.setCursor(0, 1);
lcd.print("Kelembaban: ");
}
void loop() {
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
if (isnan(temperature) || isnan(humidity)) {
lcd.setCursor(0, 1);
lcd.print("Gagal membaca");
delay(2000);
lcd.setCursor(0, 1);
lcd.print("sensor DHT22 ");
delay(2000);
return;
}
lcd.setCursor(11, 0);
lcd.print(temperature);
lcd.setCursor(11, 1);
lcd.print(humidity);
buttonState = digitalRead(BUTTON_PIN);
if (buttonState == LOW) {
resetArduino();
}
lastButtonState = buttonState;
if (temperature >= 10 && temperature <= 40 && humidity >= 40 && humidity <= 70) {
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(LED_GOOD_QUALITY, HIGH);
digitalWrite(LED_MODERATE_QUALITY, LOW);
digitalWrite(LED_POOR_QUALITY, LOW);
myservo.write(0);
} else if ((temperature >= 10 && temperature <= 30) || (humidity >= 45 && humidity <= 65)) {
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(LED_GOOD_QUALITY, LOW);
digitalWrite(LED_MODERATE_QUALITY, HIGH);
digitalWrite(LED_POOR_QUALITY, LOW);
myservo.write(90);
} else {
digitalWrite(BUZZER_PIN, HIGH);
digitalWrite(LED_GOOD_QUALITY, LOW);
digitalWrite(LED_MODERATE_QUALITY, LOW);
digitalWrite(LED_POOR_QUALITY, HIGH);
myservo.write(180);
}
delay(500); // Delay sebelum pembacaan selanjutnya
}
// Fungsi untuk melakukan reset Arduino
void resetArduino() {
asm volatile (" jmp 0");
}