#include "DHT.h"
// ==========================================
// PENGATURAN MODE TAMPILAN
// 1 = Mode Dashboard (Rapi, untuk manusia/pengujian)
// 0 = Mode CSV (Mentah, untuk ditarik ke MATLAB)
// ==========================================
#define MODE_MONITORING 1
// --- Definisi Pin Sensor Suhu ---
#define DHTPIN 8
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// --- Definisi Pin Ultrasonik ---
#define TRIG_X 2
#define ECHO_X 3
#define TRIG_Y 4
#define ECHO_Y 5
#define TRIG_Z 6
#define ECHO_Z 7
// --- Definisi Pin Sensor Cahaya ---
#define LDR_PIN A0
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(TRIG_X, OUTPUT); pinMode(ECHO_X, INPUT);
pinMode(TRIG_Y, OUTPUT); pinMode(ECHO_Y, INPUT);
pinMode(TRIG_Z, OUTPUT); pinMode(ECHO_Z, INPUT);
// Jika dalam mode CSV, cetak header tabel satu kali saja
if (MODE_MONITORING == 0) {
Serial.println("Waktu(ms),Suhu(C),JarakX(cm),JarakY(cm),JarakZ(cm),Cahaya(Raw)");
}
}
void loop() {
unsigned long currentTime = millis();
// 1. Baca Suhu untuk Kompensasi (Kecepatan Suara)
float tempC = dht.readTemperature();
if (isnan(tempC)) {
tempC = 25.0; // Suhu default jika sensor gagal/tercabut
}
// Hitung kecepatan suara aktual (cm/us)
float speedOfSound = (331.3 + (0.606 * tempC)) * 100.0 / 1000000.0;
// 2. Baca Jarak (Jeda 50ms antar sensor untuk mencegah pantulan silang)
float distX = measureDistance(TRIG_X, ECHO_X, speedOfSound);
delay(50);
float distY = measureDistance(TRIG_Y, ECHO_Y, speedOfSound);
delay(50);
float distZ = measureDistance(TRIG_Z, ECHO_Z, speedOfSound);
delay(50);
// 3. Baca Intensitas Cahaya
int lightValue = analogRead(LDR_PIN);
// 4. Tampilkan Data ke Serial Monitor
if (MODE_MONITORING == 1) {
// --- TAMPILAN DASHBOARD RAPI ---
Serial.println("=========================================");
Serial.println(" MONITORING AKUISISI DATA RUANGAN ");
Serial.println("=========================================");
Serial.print(" Uptime Alat : ");
Serial.print(currentTime / 1000.0, 1); // Konversi ke detik dengan 1 desimal
Serial.println(" s");
Serial.print(" Suhu Ruangan : ");
Serial.print(tempC, 1);
Serial.println(" C");
Serial.println("-----------------------------------------");
Serial.println(" Dimensi Ruangan (Kompensasi Aktif) :");
Serial.print(" [X] Panjang : ");
if(distX > 0) { Serial.print(distX, 2); Serial.println(" cm"); }
else { Serial.println("Out of Range / Error"); }
Serial.print(" [Y] Lebar : ");
if(distY > 0) { Serial.print(distY, 2); Serial.println(" cm"); }
else { Serial.println("Out of Range / Error"); }
Serial.print(" [Z] Tinggi : ");
if(distZ > 0) { Serial.print(distZ, 2); Serial.println(" cm"); }
else { Serial.println("Out of Range / Error"); }
Serial.println("-----------------------------------------");
Serial.print(" Intensitas Cahaya : ");
Serial.print(lightValue);
Serial.println(" (Raw ADC)");
Serial.println("=========================================\n");
} else {
// --- TAMPILAN CSV UNTUK MATLAB ---
Serial.print(currentTime); Serial.print(",");
Serial.print(tempC); Serial.print(",");
Serial.print(distX); Serial.print(",");
Serial.print(distY); Serial.print(",");
Serial.print(distZ); Serial.print(",");
Serial.println(lightValue);
}
// Jeda sebelum siklus berikutnya (total siklus jadi ~1 detik)
delay(850);
}
// Fungsi pembacaan ultrasonik
float measureDistance(int trigPin, int echoPin, float speedOfSound) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH, 30000);
if (duration == 0) return -1.0;
float distance = (duration / 2.0) * speedOfSound;
return distance;
}