NATURAL SOUND JAV PROJECT
NATURAL SOUND JAV PROJECT
/*
* ============================================================
* ARDUINO UNO - 5 SENSOR + 5 LED PWM (UPDATE REAL-TIME)
* ============================================================
* Fitur:
* - Membaca 5 sensor setiap 1 detik.
* - Menampilkan semua nilai di Serial Monitor (9600 baud).
* - Menggerakkan LED secara linear sesuai nilai sensor.
* - Sensitif terhadap perubahan sekecil apapun (tanpa filter).
*
* Sensor:
* - Soil capacitive (A0)
* - MQ3 gas (A1)
* - LM35 suhu (A2)
* - DHT11 suhu & kelembapan (pin 2)
*
* LED PWM (kecerahan 0–255):
* - Soil → pin 3
* - DHT Suhu → pin 5
* - DHT Hum → pin 6
* - MQ3 → pin 9
* - LM35 → pin 10
* ============================================================
*/
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT11
const int soilPin = A0;
const int mq3Pin = A1;
const int lm35Pin = A2;
const int ledSoil = 3;
const int ledDHTTemp = 5;
const int ledDHTHum = 6;
const int ledMQ3 = 9;
const int ledLM35 = 10;
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
dht.begin();
pinMode(ledSoil, OUTPUT);
pinMode(ledDHTTemp, OUTPUT);
pinMode(ledDHTHum, OUTPUT);
pinMode(ledMQ3, OUTPUT);
pinMode(ledLM35, OUTPUT);
Serial.println("========================================");
Serial.println(" MONITORING REAL-TIME (setiap detik)");
Serial.println("========================================");
delay(1000);
}
void loop() {
// ---------- Baca sensor ----------
int soilRaw = analogRead(soilPin); // 0–1023
int mq3Raw = analogRead(mq3Pin); // 0–1023
int lm35Raw = analogRead(lm35Pin); // 0–1023
float h = dht.readHumidity(); // 0–100 %
float t = dht.readTemperature(); // °C
// Jika DHT gagal, set ke 0 dan beri peringatan
if (isnan(h) || isnan(t)) {
Serial.println("[WARNING] DHT11 error, nilai diset 0");
h = 0;
t = 0;
}
// Konversi LM35 ke suhu Celcius
float lm35Volt = lm35Raw * (5.0 / 1023.0);
float lm35Temp = lm35Volt * 100.0;
// ---------- Map ke PWM (0–255) secara linear ----------
int pwmSoil = map(soilRaw, 0, 1023, 0, 255);
pwmSoil = constrain(pwmSoil, 0, 255);
int pwmDHTTemp = map((int)t, 0, 50, 0, 255);
pwmDHTTemp = constrain(pwmDHTTemp, 0, 255);
int pwmDHTHum = map((int)h, 0, 100, 0, 255);
pwmDHTHum = constrain(pwmDHTHum, 0, 255);
int pwmMQ3 = map(mq3Raw, 0, 1023, 0, 255);
pwmMQ3 = constrain(pwmMQ3, 0, 255);
int pwmLM35 = map((int)lm35Temp, 0, 100, 0, 255);
pwmLM35 = constrain(pwmLM35, 0, 255);
// ---------- Tulis ke LED ----------
analogWrite(ledSoil, pwmSoil);
analogWrite(ledDHTTemp, pwmDHTTemp);
analogWrite(ledDHTHum, pwmDHTHum);
analogWrite(ledMQ3, pwmMQ3);
analogWrite(ledLM35, pwmLM35);
// ---------- Tampilkan semua data ke Serial Monitor ----------
Serial.println("----------------------------------------");
Serial.print("Soil : "); Serial.print(soilRaw);
Serial.print(" → PWM "); Serial.println(pwmSoil);
Serial.print("DHT Suhu: "); Serial.print(t, 1);
Serial.print("°C → PWM "); Serial.println(pwmDHTTemp);
Serial.print("DHT Hum : "); Serial.print(h, 1);
Serial.print("% → PWM "); Serial.println(pwmDHTHum);
Serial.print("MQ3 : "); Serial.print(mq3Raw);
Serial.print(" → PWM "); Serial.println(pwmMQ3);
Serial.print("LM35 : "); Serial.print(lm35Temp, 1);
Serial.print("°C → PWM "); Serial.println(pwmLM35);
Serial.println("----------------------------------------");
// ---------- Jeda 1 detik sebelum loop berikutnya ----------
delay(1000);
}
/*
* ====================================================================
* ARDUINO UNO - 5 SENSOR DENGAN POLA PEMBACAAN BERGANTIAN (500 ms)
* ====================================================================
* Konsep:
* - 5 sensor: Soil (A0), DHT11 suhu & hum (pin2), MQ3 (A1), LM35 (A2)
* - 5 LED PWM: Soil (3), DHT Suhu (5), DHT Hum (6), MQ3 (9), LM35 (10)
* - Setiap 500 ms, satu sensor dibaca (bergantian) sesuai urutan.
* - Urutan berubah setiap 5 kali pembacaan (2,5 detik) – total 50 variasi.
* - Serial Monitor mencetak data setiap kali pembacaan.
* - LED menyala dengan kecerahan sesuai nilai sensor terakhir.
* ====================================================================
*/
#include <DHT.h>
// ---------- PIN ----------
#define DHTPIN 2
#define DHTTYPE DHT11
const int soilPin = A0;
const int mq3Pin = A1;
const int lm35Pin = A2;
const int ledSoil = 3;
const int ledDHTTemp = 5;
const int ledDHTHum = 6;
const int ledMQ3 = 9;
const int ledLM35 = 10;
DHT dht(DHTPIN, DHTTYPE);
// ---------- VARIABEL GLOBAL ----------
const int NUM_SENSORS = 5;
const int NUM_SEQUENCES = 50;
// Indeks sensor: 0=Soil, 1=DHT Suhu, 2=DHT Hum, 3=MQ3, 4=LM35
int sequences[NUM_SEQUENCES][NUM_SENSORS];
int currentSeq = 0; // indeks urutan saat ini (0-49)
int step = 0; // langkah dalam urutan (0-4)
unsigned long lastReadTime = 0;
const long interval = 500; // 500 ms
// Nilai terakhir setiap sensor (untuk DHT dan lainnya)
int lastSoil = 0;
int lastMQ3 = 0;
int lastLM35 = 0;
float lastDHTTemp = 0;
float lastDHTHum = 0;
unsigned long lastDHTReadTime = 0;
const long dhtInterval = 1000; // baca DHT maksimal setiap 1 detik
// ---------- FUNGSI UNTUK MEMBANGUN 50 PERMUTASI ACAK ----------
void generateSequences() {
// Isi sequences dengan permutasi acak dari 0-4
int base[] = {0,1,2,3,4};
for (int i = 0; i < NUM_SEQUENCES; i++) {
// Salin base ke sequences[i]
for (int j = 0; j < NUM_SENSORS; j++) {
sequences[i][j] = base[j];
}
// Acak dengan Fisher-Yates
for (int j = NUM_SENSORS - 1; j > 0; j--) {
int r = random(j + 1);
int temp = sequences[i][j];
sequences[i][j] = sequences[i][r];
sequences[i][r] = temp;
}
}
}
// ---------- FUNGSI BACA SENSOR BERDASARKAN INDEKS ----------
void readSensor(int idx) {
switch(idx) {
case 0: { // Soil
lastSoil = analogRead(soilPin);
int pwm = map(lastSoil, 0, 1023, 0, 255);
pwm = constrain(pwm, 0, 255);
analogWrite(ledSoil, pwm);
Serial.print("Soil : "); Serial.print(lastSoil);
Serial.print(" → PWM "); Serial.println(pwm);
break;
}
case 1: { // DHT Suhu
// Baca DHT hanya jika sudah lewat interval
if (millis() - lastDHTReadTime >= dhtInterval) {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (!isnan(h) && !isnan(t)) {
lastDHTHum = h;
lastDHTTemp = t;
lastDHTReadTime = millis();
} else {
Serial.println("[DHT] Error, gunakan nilai terakhir");
}
}
// Gunakan nilai terakhir
int pwm = map((int)lastDHTTemp, 0, 50, 0, 255);
pwm = constrain(pwm, 0, 255);
analogWrite(ledDHTTemp, pwm);
Serial.print("DHT Suhu: "); Serial.print(lastDHTTemp, 1);
Serial.print("°C → PWM "); Serial.println(pwm);
break;
}
case 2: { // DHT Kelembaban
// Sama seperti case 1, tetapi gunakan lastDHTHum
if (millis() - lastDHTReadTime >= dhtInterval) {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (!isnan(h) && !isnan(t)) {
lastDHTHum = h;
lastDHTTemp = t;
lastDHTReadTime = millis();
} else {
Serial.println("[DHT] Error, gunakan nilai terakhir");
}
}
int pwm = map((int)lastDHTHum, 0, 100, 0, 255);
pwm = constrain(pwm, 0, 255);
analogWrite(ledDHTHum, pwm);
Serial.print("DHT Hum : "); Serial.print(lastDHTHum, 1);
Serial.print("% → PWM "); Serial.println(pwm);
break;
}
case 3: { // MQ3
lastMQ3 = analogRead(mq3Pin);
int pwm = map(lastMQ3, 0, 1023, 0, 255);
pwm = constrain(pwm, 0, 255);
analogWrite(ledMQ3, pwm);
Serial.print("MQ3 : "); Serial.print(lastMQ3);
Serial.print(" → PWM "); Serial.println(pwm);
break;
}
case 4: { // LM35
lastLM35 = analogRead(lm35Pin);
float volt = lastLM35 * (5.0 / 1023.0);
float temp = volt * 100.0;
int pwm = map((int)temp, 0, 100, 0, 255);
pwm = constrain(pwm, 0, 255);
analogWrite(ledLM35, pwm);
Serial.print("LM35 : "); Serial.print(temp, 1);
Serial.print("°C → PWM "); Serial.println(pwm);
break;
}
}
}
// ---------- SETUP ----------
void setup() {
Serial.begin(9600);
dht.begin();
pinMode(ledSoil, OUTPUT);
pinMode(ledDHTTemp, OUTPUT);
pinMode(ledDHTHum, OUTPUT);
pinMode(ledMQ3, OUTPUT);
pinMode(ledLM35, OUTPUT);
// Generate 50 urutan acak
randomSeed(analogRead(A5)); // seed dari pin kosong
generateSequences();
Serial.println("========================================");
Serial.println(" POLA PEMBACAAN SENSOR BERGANTIAN");
Serial.println(" 500 ms per sensor, 50 variasi urutan");
Serial.println("========================================");
delay(1000);
}
// ---------- LOOP ----------
void loop() {
unsigned long now = millis();
if (now - lastReadTime >= interval) {
lastReadTime = now;
// Ambil sensor yang harus dibaca dari urutan saat ini
int sensorIdx = sequences[currentSeq][step];
// Tampilkan header urutan dan langkah
Serial.print("[Urutan "); Serial.print(currentSeq+1);
Serial.print(" | Langkah "); Serial.print(step+1);
Serial.print(" dari 5] → ");
// Baca sensor dan update LED
readSensor(sensorIdx);
// Pindah ke langkah berikutnya
step++;
if (step >= NUM_SENSORS) {
step = 0;
// Pindah ke urutan berikutnya (50 variasi)
currentSeq++;
if (currentSeq >= NUM_SEQUENCES) {
currentSeq = 0; // loop kembali ke awal
}
// Tampilkan pergantian urutan
Serial.println("--- Ganti urutan ke " + String(currentSeq+1) + " ---");
}
}
}