#include "DHT.h" // Library untuk sensor DHT22
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Pin sensor dan aktuator
#define DHTPIN 2 // Pin data DHT22
#define DHTTYPE DHT22 // Jenis sensor DHT
#define pinLDR A0 // Pin analog untuk sensor LDR
// Pin LED indikator
#define ledBiru 7 // LED Biru: Kipas pendingin aktif (suhu tinggi)
#define ledMerah 6 // LED Merah: Pemanas aktif (suhu rendah)
#define ledKuning 5 // LED Kuning: Lampu penerangan aktif (gelap)
#define ledHijau 4 // LED Hijau: Pemberian pakan aktif
// Servo motor
#include <Servo.h>
Servo servoPakan;
Servo servoKipas; // Servo untuk kipas
#define pinServo 9 // Pin servo motor untuk pemberian pakan
#define pinKipas 10 // Pin servo motor untuk kipas
// Variabel suhu, kelembapan, dan nilai LDR
float suhu;
float kelembapan;
int nilaiLDR;
// Objek sensor DHT22
DHT dht(DHTPIN, DHTTYPE);
// OLED Display
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
// Inisialisasi pin LED sebagai OUTPUT
pinMode(ledBiru, OUTPUT);
pinMode(ledMerah, OUTPUT);
pinMode(ledKuning, OUTPUT);
pinMode(ledHijau, OUTPUT);
// Inisialisasi servo
servoPakan.attach(pinServo);
servoKipas.attach(pinKipas);
servoPakan.write(0); // Servo pakan di posisi awal (tertutup)
servoKipas.write(0); // Kipas dimatikan pada awalnya
// Inisialisasi komunikasi serial dan DHT22
Serial.begin(9600);
dht.begin();
Serial.println("Sistem Pengontrol Kandang Ayam Otomatis Siap!");
// Inisialisasi OLED Display
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
display.display();
Serial.println("Sistem Pengontrol Kandang Ayam Otomatis Siap!");
}
void loop() {
// Membaca data suhu dan kelembapan
suhu = dht.readTemperature(); // Baca suhu dalam Celsius
kelembapan = dht.readHumidity(); // Baca kelembapan
nilaiLDR = analogRead(pinLDR); // Baca nilai cahaya dari LDR
// Tampilkan data sensor ke Serial Monitor
Serial.print("Suhu: "); Serial.print(suhu); Serial.println(" °C");
Serial.print("Kelembapan: "); Serial.print(kelembapan); Serial.println(" %");
Serial.print("Nilai LDR: "); Serial.println(nilaiLDR);
// Tampilkan data ke OLED Display
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Data Sensor Kandang");
display.print("Suhu: "); display.print(suhu); display.println(" C");
display.print("Kelembapan: "); display.print(kelembapan); display.println(" %");
display.print("Cahaya: ");
if (nilaiLDR < 500) {
display.println("Gelap");
} else {
display.println("Terang");
}
display.display();
// --- Kontrol LED Berdasarkan Suhu ---
if (suhu > 30) { // Suhu tinggi, aktifkan kipas (LED Biru)
digitalWrite(ledBiru, HIGH);
digitalWrite(ledMerah, LOW);
Serial.println("Kipas Pendingin AKTIF");
}
else if (suhu < 20) { // Suhu rendah, aktifkan pemanas (LED Merah)
digitalWrite(ledMerah, HIGH);
digitalWrite(ledBiru, LOW);
Serial.println("Pemanas AKTIF");
}
else { // Suhu normal, matikan indikator suhu
digitalWrite(ledBiru, LOW);
digitalWrite(ledMerah, LOW);
Serial.println("Suhu NORMAL");
}
// --- Kontrol LED Berdasarkan Kondisi Cahaya (LDR) ---
if (nilaiLDR < 500) { // Kondisi gelap
digitalWrite(ledKuning, HIGH);
Serial.println("Lampu Kandang MENYALA");
}
else { // Kondisi terang
digitalWrite(ledKuning, LOW);
Serial.println("Lampu Kandang MATI");
}
// --- Kontrol Servo untuk Pemberian Pakan ---
if (millis() % 15000 < 1000) { // Servo aktif setiap 15 detik
digitalWrite(ledHijau, HIGH);
Serial.println("Pemberian Pakan AKTIF");
servoPakan.write(90); // Servo membuka wadah pakan
delay(1000); // Biarkan servo membuka selama 1 detik
servoPakan.write(0); // Servo kembali ke posisi semula
}
else {
digitalWrite(ledHijau, LOW);
}
// --- Kontrol Servo Kipas Berdasarkan Suhu ---
if (suhu > 40) { // Jika suhu lebih dari 40°C, kipas menyala
servoKipas.write(90); // Kipas bergerak ke posisi 90 derajat (menyala)
display.setCursor(0, 40);
display.print("Kipas: ON");
} else { // Jika suhu normal, kipas mati
servoKipas.write(0); // Kipas kembali ke posisi semula (0 derajat)
display.setCursor(0, 40);
display.print("Kipas: OFF");
}
// Delay agar data lebih mudah terbaca di Serial Monitor
delay(2000);
}