#include <Arduino.h>
#include <DHT.h>
#include <Servo.h>
// DHT config
#define DHTPIN PB0
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Sensor & Aktuator pin
#define MQ4_PIN PA0 // Potensio gas
#define PH_PIN PA1 // Potensio pH
#define SOIL_PIN PA2 // Potensio kelembapan tanah
#define POMPA_PIN PB10 // LED pompa
#define FAN_PIN PB11 // LED kipas
#define SERVO_PIN PA3 // Servo
Servo myservo;
// Variabel waktu pompa
unsigned long pompaStartTime = 0;
unsigned long lastSoilCheckTime = 0;
bool pompaNyala = false;
bool cekTunda = false;
void setup() {
Serial.begin(9600);
dht.begin();
pinMode(MQ4_PIN, INPUT);
pinMode(PH_PIN, INPUT);
pinMode(SOIL_PIN, INPUT);
pinMode(POMPA_PIN, OUTPUT);
pinMode(FAN_PIN, OUTPUT);
myservo.attach(SERVO_PIN);
myservo.write(0); // Servo awal tutup
Serial.println("Sistem Monitoring Aktif...");
}
void loop() {
// Baca sensor
float suhu = dht.readTemperature();
int gasValue = analogRead(MQ4_PIN);
int phValue = analogRead(PH_PIN);
int soilValue = analogRead(SOIL_PIN);
// Konversi nilai
float gasPercentage = map(gasValue, 0, 4095, 0, 100);
float soilMoisture = map(soilValue, 0, 4095, 0, 100);
float ph = map(phValue, 0, 4095, 3, 10);
unsigned long currentMillis = millis();
// === Kontrol Gas Metana ===
if (gasPercentage > 12) {
myservo.write(90); // Servo buka 90 derajat
digitalWrite(FAN_PIN, HIGH); // LED kipas nyala
} else {
myservo.write(0); // Servo tutup
digitalWrite(FAN_PIN, LOW); // LED kipas mati
}
// === Kontrol Pompa & Soil Moisture ===
if (soilMoisture < 6 && !pompaNyala && !cekTunda) {
digitalWrite(POMPA_PIN, HIGH);
pompaStartTime = currentMillis;
pompaNyala = true;
}
if (pompaNyala && (currentMillis - pompaStartTime >= 2000)) { // 2 detik
digitalWrite(POMPA_PIN, LOW);
pompaNyala = false;
cekTunda = true;
lastSoilCheckTime = currentMillis;
}
if (cekTunda && (currentMillis - lastSoilCheckTime >= 10000)) { // 10 detik
soilValue = analogRead(SOIL_PIN);
soilMoisture = map(soilValue, 0, 4095, 0, 100);
if (soilMoisture < 6) {
digitalWrite(POMPA_PIN, HIGH);
pompaStartTime = currentMillis;
pompaNyala = true;
cekTunda = false;
} else if (soilMoisture >= 18) {
cekTunda = false; // stop loop pompa
} else {
lastSoilCheckTime = currentMillis; // reset timer cek ulang
}
}
// === Tampilkan Data di Serial Monitor ===
Serial.println("===============");
Serial.print("Suhu: "); Serial.print(suhu); Serial.println(" C");
Serial.print("Gas : "); Serial.print(gasPercentage); Serial.println(" %");
Serial.print("pH : "); Serial.println(ph, 1);
Serial.print("Kelembapan: "); Serial.print(soilMoisture); Serial.println(" %");
Serial.println("===============");
delay(1000);
}