#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
// DHT22 setup
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Pin lainnya
#define LED_LIGHT 3
#define LED_PUMP 4
#define SERVO_PIN 5
#define BUZZER 6
#define BUTTON_PIN 7
// Sensor analog
#define SOIL_PIN A0
#define LDR_PIN A1
// LCD setup
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Servo setup
Servo roofServo;
// Variabel mode
bool manualMode = false;
void setup() {
Serial.begin(9600);
dht.begin();
lcd.init();
lcd.backlight();
pinMode(LED_LIGHT, OUTPUT);
pinMode(LED_PUMP, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
roofServo.attach(SERVO_PIN);
roofServo.write(0); // atap tertutup awal
lcd.setCursor(0, 0);
lcd.print("Smart Greenhouse");
delay(2000);
lcd.clear();
}
void loop() {
// Cek tombol untuk mode manual
if (digitalRead(BUTTON_PIN) == LOW) {
manualMode = !manualMode;
lcd.clear();
lcd.print(manualMode ? "Manual Mode" : "Auto Mode");
delay(500);
}
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
int soilValue = analogRead(SOIL_PIN); // 0-1023
int lightValue = analogRead(LDR_PIN); // 0-1023
// Tampilkan data di serial monitor
Serial.print("Temp: "); Serial.print(temperature);
Serial.print("C Hum: "); Serial.print(humidity);
Serial.print("% Soil: "); Serial.print(soilValue);
Serial.print(" Light: "); Serial.println(lightValue);
// Tampilkan di LCD
lcd.setCursor(0, 0);
lcd.print("T:"); lcd.print(temperature); lcd.print("C ");
lcd.print("H:"); lcd.print(humidity); lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("S:"); lcd.print(soilValue);
lcd.print(" L:"); lcd.print(lightValue);
if (!manualMode) {
// Mode otomatis
// Kontrol pompa air
if (soilValue > 600) {
digitalWrite(LED_PUMP, HIGH);
} else {
digitalWrite(LED_PUMP, LOW);
}
// Kontrol lampu cahaya
if (lightValue < 500) {
digitalWrite(LED_LIGHT, HIGH);
} else {
digitalWrite(LED_LIGHT, LOW);
}
// Atap otomatis buka jika suhu terlalu panas
if (temperature > 30) {
roofServo.write(90);
digitalWrite(BUZZER, HIGH);
} else {
roofServo.write(0);
digitalWrite(BUZZER, LOW);
}
} else {
// Mode manual: semua mati kecuali dikontrol manual
digitalWrite(LED_PUMP, LOW);
digitalWrite(LED_LIGHT, LOW);
roofServo.write(0);
digitalWrite(BUZZER, LOW);
}
delay(1000);
}