#include <DHT.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
// Definisikan Pin
#define DHTPIN 15 // Pin untuk sensor DHT11
#define DHTTYPE DHT11 // Tipe DHT11
#define MQ135_PIN 34 // Pin analog untuk sensor MQ-135
#define RELAY_PIN 26 // Pin untuk relay kipas
#define BUZZER_PIN 25 // Pin untuk buzzer
#define RED_LED 14 // Pin untuk LED merah
#define GREEN_LED 12 // Pin untuk LED hijau
#define BLUE_LED 27 // Pin untuk LED biru
// Inisialisasi DHT
DHT dht(DHTPIN, DHTTYPE);
// Inisialisasi OLED (SSD1306, ukuran 128x64)
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Variabel Threshold
int airQualityThreshold = 200; // Threshold kualitas udara (perlu disesuaikan dengan kalibrasi)
int highTempThreshold = 30; // Threshold suhu tinggi (30 derajat Celsius)
void setup() {
Serial.begin(115200);
// Inisialisasi Pin
pinMode(MQ135_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(BLUE_LED, OUTPUT);
// Matikan relay, buzzer, dan LED pada awalnya
digitalWrite(RELAY_PIN, LOW);
noTone(BUZZER_PIN);
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, LOW);
digitalWrite(BLUE_LED, LOW);
// Inisialisasi DHT sensor
dht.begin();
// Inisialisasi OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Gagal memulai OLED"));
for(;;);
}
display.clearDisplay();
display.display();
}
void loop() {
// Membaca suhu dan kelembapan dari sensor DHT11
// Simulasikan suhu acak antara 20 - 40 derajat Celcius
float temperature = random(200, 400) / 10.0; // suhu acak antara 20.0 hingga 40.0
float humidity = random(30, 70); // kelembapan acak antara 30% hingga 70%
// Cek apakah sensor DHT11 bekerja
if (isnan(temperature) || isnan(humidity)) {
Serial.println(F("Gagal membaca dari sensor DHT11"));
return;
}
// Membaca kualitas udara dari sensor MQ-135
int airQuality = analogRead(MQ135_PIN);
Serial.print("Kualitas Udara: ");
Serial.println(airQuality);
// Tampilkan suhu, kelembapan, dan kualitas udara di OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Temp: ");
display.print(temperature);
display.println(" C");
display.print("Hum: ");
display.print(humidity);
display.println(" %");
display.print("Air Quality: ");
display.print(airQuality);
// Logika Kualitas Udara dan Suhu
if (airQuality > airQualityThreshold || temperature > highTempThreshold) {
// Kualitas udara atau suhu buruk
digitalWrite(RELAY_PIN, HIGH); // Aktifkan relay untuk menyalakan kipas
tone(BUZZER_PIN, 1000); // Nyalakan buzzer dengan frekuensi 1000 Hz
updateLED("Poor"); // LED merah untuk kualitas buruk
display.setCursor(0, 30);
display.print("Kualitas Udara Buruk!");
display.setCursor(0, 40);
display.print("Suhu Tinggi!");
Serial.println("Peringatan! Kualitas udara buruk atau suhu tinggi!");
} else {
// Kualitas udara atau suhu baik
digitalWrite(RELAY_PIN, LOW); // Matikan relay
noTone(BUZZER_PIN); // Matikan buzzer
updateLED("Good"); // LED hijau untuk kualitas baik
display.setCursor(0, 30);
display.print("Kualitas Udara Baik");
display.setCursor(0, 40);
display.print("Suhu Normal");
}
display.display();
delay(2000); // Delay 2 detik sebelum pembacaan berikutnya
}
// Fungsi untuk mengupdate warna LED berdasarkan status kualitas udara
void updateLED(String status) {
if (status == "Good") {
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, HIGH);
digitalWrite(BLUE_LED, LOW);
} else if (status == "Poor") {
digitalWrite(RED_LED, HIGH);
digitalWrite(GREEN_LED, LOW);
digitalWrite(BLUE_LED, LOW);
}
}