#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <Servo.h>
// Definisi pin dan jenis sensor
#define DHTPIN 2
#define DHTTYPE DHT22
#define TRIG_PIN 6 // Pin TRIG sensor ultrasonik
#define ECHO_PIN 7 // Pin ECHO sensor ultrasonik
#define SERVO_PIN 10
#define RED_PIN 3 // Pin warna merah pada RGB LED
#define GREEN_PIN 5 // Pin warna hijau pada RGB LED
#define BLUE_PIN 6 // Pin warna biru pada RGB LED
#define BUZZER_PIN 11 // Pin buzzer
#define BUTTON_PIN 12 // Pin tombol
// Inisialisasi objek
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Inisialisasi LCD I2C
Servo servo;
const int ldrPin = A0; // Pin sensor cahaya LDR
const int fanPin = 9; // Pin kontrol kipas
const int ledPin = 8; // Pin LED
const int relayPin = 4; // Pin kontrol relay
bool buzzerActive = false; // Status buzzer
void setup() {
Serial.begin(9600);
pinMode(fanPin, OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(relayPin, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT); // Set buzzer pin as output
pinMode(BUTTON_PIN, INPUT_PULLUP); // Set button pin as input (not using pull-up resistor)
dht.begin();
lcd.init();
lcd.backlight();
servo.attach(SERVO_PIN);
}
void loop() {
// Membaca data suhu dan kelembaban dari sensor DHT
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// Membaca intensitas cahaya dari sensor LDR
int lightIntensity = analogRead(ldrPin);
// Membaca jarak dari sensor ultrasonik
long duration, distance;
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = duration * 0.034 / 2;
// Menampilkan data ke serial monitor
Serial.print("Suhu: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("Kelembaban: ");
Serial.print(humidity);
Serial.println(" %");
Serial.print("Intensitas Cahaya: ");
Serial.println(lightIntensity);
Serial.print("Jarak: ");
Serial.print(distance);
Serial.println(" cm");
// Menampilkan data ke LCD
lcd.setCursor(0, 0);
lcd.print("Suhu: ");
lcd.print(temperature);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Kelembaban: ");
lcd.print(humidity);
lcd.print("%");
// Kontrol kipas berdasarkan suhu
// Kontrol LED berdasarkan intensitas cahaya
if (lightIntensity < 300) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
// Kontrol relay dan servo berdasarkan suhu
if (distance > 30) {
digitalWrite(relayPin, HIGH); // Aktifkan relay
Serial.println("Relay ON");
servo.write(90); // Buka servo saat relay aktif
} else {
digitalWrite(relayPin, LOW); // Nonaktifkan relay
Serial.println("Relay OFF");
servo.write(0); // Tutup servo saat relay mati
}
// Kontrol RGB LED berdasarkan kelembaban
if (temperature < 20 ) {
// Suhu sedang, biru
analogWrite(RED_PIN, 0);
analogWrite(GREEN_PIN, 0);
analogWrite(BLUE_PIN, 255);
} else if (temperature >= 20 && temperature < 40) {
// Suhu rendah, merah
analogWrite(RED_PIN, 255);
analogWrite(GREEN_PIN, 0);
analogWrite(BLUE_PIN, 0);
} else {
// Suhu tinggi, hijau
analogWrite(RED_PIN, 0);
analogWrite(GREEN_PIN, 255);
analogWrite(BLUE_PIN, 0);
// Aktifkan buzzer jika suhu di atas 40 derajat
if (!buzzerActive) {
tone(BUZZER_PIN, 1000); // Mainkan suara buzzer
buzzerActive = true;
}
}
// Matikan buzzer jika suhu turun di bawah 40 derajat
if (temperature < 40 && buzzerActive) {
noTone(BUZZER_PIN); // Matikan suara buzzer
buzzerActive = false;
}
// Hentikan buzzer jika tombol ditekan
if (digitalRead(BUTTON_PIN) == LOW) {
noTone(BUZZER_PIN); // Matikan suara buzzer
buzzerActive = false;
}
delay(2000); // Jeda 2 detik sebelum pengulangan berikutnya
}