#include "DHTesp.h"
#include <Adafruit_SSD1306.h>
#include <Wire.h>
// Konfigurasi pin
#define DHTPIN 2 // Pin data DHT11
#define SOIL_MOISTURE_PIN 34 // Pin sensor kelembaban tanah
#define LDR_PIN 35 // Pin sensor cahaya (LDR)
#define RELAY_PIN 25 // Pin relay pompa air
#define LED_PIN 26 // Pin LED
#define OLED_RESET -1 // Reset pin OLED (jika diperlukan)
#define BUTTON_PIN 32 // Pin tombol
// Objek untuk sensor dan display
DHTesp dht;
Adafruit_SSD1306 display(128, 64, &Wire, OLED_RESET);
// Variabel global
int displayState = 0; // 0: Nama Perangkat, 1: Suhu & Kelembaban, 2: Intensitas Cahaya, 3: Kelembaban Tanah
int lastButtonState = HIGH;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
void setup() {
Serial.begin(115200);
dht.setup(DHTPIN, DHTesp::DHT11);
pinMode(SOIL_MOISTURE_PIN, INPUT);
pinMode(LDR_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
digitalWrite(RELAY_PIN, HIGH); // Matikan pompa air saat awal
// Inisialisasi OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Pastikan alamat I2C benar, biasanya 0x3C atau 0x3D
Serial.println(F("SSD1306 allocation failed"));
for (;;); // Hentikan program jika inisialisasi gagal
}
display.clearDisplay();
display.display();
Serial.println(F("OLED initialized successfully"));
}
// Fungsi-fungsi klasifikasi
String klasifikasiCahaya(int lux) {
if (lux <= 10) return "Malam";
else if (lux <= 1000) return "Pagi/Mendung";
else if (lux <= 10000) return "Siang";
else return "Siang Sangat Terang";
}
String klasifikasiKelembabanTanah(int kelembaban) {
if (kelembaban <= 49) return "Kering";
else if (kelembaban <= 70) return "Normal";
else return "Basah";
}
String klasifikasiSuhu(float suhu) {
if (suhu >= 18 && suhu <= 24) return "Dingin";
else if (suhu <= 30) return "Hangat";
else return "Panas";
}
String klasifikasiKelembabanUdara(float kelembaban) {
if (kelembaban < 30) return "Sangat Rendah";
else if (kelembaban <= 50) return "Rendah";
else if (kelembaban <= 70) return "Nyaman";
else if (kelembaban <= 90) return "Tinggi";
else return "Sangat Tinggi";
}
void loop() {
// Baca data sensor DHT11
TempAndHumidity data = dht.getTempAndHumidity();
if (isnan(data.temperature) || isnan(data.humidity)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
float suhu = data.temperature;
float kelembaban_udara = data.humidity;
// Baca data sensor kelembaban tanah dan sensor cahaya
int kelembaban_tanah = analogRead(SOIL_MOISTURE_PIN);
int intensitas_cahaya = analogRead(LDR_PIN);
// Klasifikasi data
String klasifikasi_cahaya = klasifikasiCahaya(intensitas_cahaya);
String klasifikasi_kelembaban_tanah = klasifikasiKelembabanTanah(kelembaban_tanah);
String klasifikasi_suhu = klasifikasiSuhu(suhu);
String klasifikasi_kelembaban_udara = klasifikasiKelembabanUdara(kelembaban_udara);
// Kontrol aktuator (pompa dan LED)
digitalWrite(LED_PIN, klasifikasi_cahaya == "Malam" ? HIGH : LOW);
digitalWrite(RELAY_PIN, klasifikasi_kelembaban_tanah == "Kering" ? LOW : HIGH);
// Deteksi tombol dengan debounce
int reading = digitalRead(BUTTON_PIN);
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading == LOW && lastButtonState == HIGH) {
displayState = (displayState + 1) % 4; // Perubahan state 0, 1, 2, 3
Serial.print("Display state changed to: ");
Serial.println(displayState);
}
}
lastButtonState = reading;
// Tampilkan data pada OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
switch(displayState) {
case 0:
display.println("SMART GREENHOUSE");
break;
case 1:
display.printf("Suhu: %.1f C (%s)\n", suhu, klasifikasi_suhu.c_str());
display.printf("Kelembaban: %.1f %% (%s)\n", kelembaban_udara, klasifikasi_kelembaban_udara.c_str());
break;
case 2:
display.printf("Cahaya: %d (%s)\n", intensitas_cahaya, klasifikasi_cahaya.c_str());
break;
case 3:
display.printf("Kelembaban Tanah: %d (%s)\n", kelembaban_tanah, klasifikasi_kelembaban_tanah.c_str());
break;
}
display.display();
delay(1000);
}