// === PIN DEFINISI ===
// Sensor
#define MQ2_PIN 36 // VP (Sensor Gas MQ2)
#define PH_PIN 39 // VN (Potensiometer sebagai sensor pH)
#define TRIG_PIN 16 // Trig HC-SR04
#define ECHO_PIN 17 // Echo HC-SR04
// Relay (dan LED sebagai aktuator)
#define RELAY1 18 // Untuk MQ2
#define RELAY2 19 // Untuk pH rendah
#define RELAY3 21 // Untuk pH tinggi
#define RELAY4 22 // Untuk HC-SR04 (jarak)
// === THRESHOLD SENSOR (dalam satuan umum) ===
#define MQ2_THRESHOLD_PPM 800 // Gas > 5 ppm
#define PH_LOW_THRESHOLD 5.5 // pH terlalu rendah
#define PH_HIGH_THRESHOLD 8.0 // pH terlalu tinggi
#define DIST_THRESHOLD 75 // Jarak maksimum (cm)
#define MAX_HEIGHT_CM 150 // tinggi penempatan sensor jarak
// Variabel untuk sensor jarak
long duration;
float jarak, tinggi_air;
void setup() {
Serial.begin(115200);
// Relay sebagai output
pinMode(RELAY1, OUTPUT);
pinMode(RELAY2, OUTPUT);
pinMode(RELAY3, OUTPUT);
pinMode(RELAY4, OUTPUT);
// Matikan semua relay di awal
digitalWrite(RELAY1, LOW);
digitalWrite(RELAY2, LOW);
digitalWrite(RELAY3, LOW);
digitalWrite(RELAY4, LOW);
// HC-SR04
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
}
void loop() {
// === Baca sensor analog ===
int gasRaw = analogRead(MQ2_PIN);
int phRaw = analogRead(PH_PIN);
// === Konversi ke satuan umum ===
float gasPPM = gasRaw * 1000.0 / 4095.0; // MQ2: 0–1000 ppm
float pH = phRaw * 14.0 / 4095.0; // pH: skala 0–14
// === Baca sensor jarak (HC-SR04) ===
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH, 30000); // Timeout 30ms
jarak = duration * 0.034 / 2;
// Hitung tinggi air
tinggi_air = MAX_HEIGHT_CM - jarak;
if (tinggi_air < 0) tinggi_air = 0; // hindari negatif
// === Tampilkan ke Serial Monitor ===
Serial.print("Kadar Amonia (ppm): "); Serial.print(gasPPM, 2);
Serial.print(" | pH: "); Serial.print(pH, 2);
Serial.print(" | Tinggi Air (cm): "); Serial.println(tinggi_air);
// === Logika Aktuator ===
digitalWrite(RELAY1, gasPPM > MQ2_THRESHOLD_PPM ? HIGH : LOW);
digitalWrite(RELAY2, pH < PH_LOW_THRESHOLD ? HIGH : LOW);
digitalWrite(RELAY3, pH > PH_HIGH_THRESHOLD ? HIGH : LOW);
digitalWrite(RELAY4, (tinggi_air < (MAX_HEIGHT_CM - DIST_THRESHOLD) && tinggi_air > 0) ? HIGH : LOW);
delay(500); // jeda pembacaan
}