// ESP32-S3 + HC-SR04 + Relay + Counter + LED indikator
// Mode:
// - LED berkedip 1x setiap benda terdeteksi
// - LED berkedip tiap detik saat jeda 15 detik
// - Counter tampil di serial, terus bertambah tanpa reset
const int TRIG_PIN = 10;
const int ECHO_PIN = 11; // Gunakan pembagi tegangan untuk ECHO
const int RELAY_PIN = 5;
const int LED_PIN = 7;
const bool RELAY_ACTIVE_LOW = true;
const float DETECTION_DISTANCE_CM = 5.0;
const unsigned long MEASURE_INTERVAL_MS = 200;
const unsigned long DETECTION_COOLDOWN_MS = 1000;
const unsigned long WORK_PERIOD_MS = 60000; // 1 menit kerja
const unsigned long PAUSE_PERIOD_MS = 15000; // 15 detik jeda
// Variabel sistem
unsigned long lastMeasure = 0;
unsigned long lastDetectionTime = 0;
unsigned long lastCycleStart = 0;
bool objectPreviouslyDetected = false;
bool inPause = false;
unsigned int counterBarang = 0;
void setup() {
Serial.begin(115200);
delay(200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
// Inisialisasi kondisi awal
if (RELAY_ACTIVE_LOW) digitalWrite(RELAY_PIN, HIGH);
else digitalWrite(RELAY_PIN, LOW);
digitalWrite(LED_PIN, LOW);
lastCycleStart = millis();
Serial.println("=== Sistem Pembacaan Ultrasonik ESP32-S3 Aktif ===");
}
float measureDistanceCm() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
unsigned long duration = pulseIn(ECHO_PIN, HIGH, 30000UL);
if (duration == 0) return -1.0;
return (duration * 0.0343f) / 2.0f;
}
void setRelay(bool on) {
digitalWrite(RELAY_PIN, RELAY_ACTIVE_LOW ? !on : on);
}
void kedipLED(int durasi = 200) {
digitalWrite(LED_PIN, HIGH);
delay(durasi);
digitalWrite(LED_PIN, LOW);
}
void loop() {
unsigned long now = millis();
// === CEK JEDA SETIAP 1 MENIT ===
if (!inPause && (now - lastCycleStart >= WORK_PERIOD_MS)) {
inPause = true;
Serial.println("=== Memulai Jeda 15 Detik ===");
for (int i = PAUSE_PERIOD_MS / 1000; i > 0; i--) {
Serial.printf("Memberi Jeda (%d)\n", i);
kedipLED(200); // LED berkedip setiap hitungan mundur
delay(1000);
}
Serial.println("=== Jeda Selesai, Melanjutkan Pembacaan ===\n");
lastCycleStart = millis();
inPause = false;
}
if (inPause) return; // hentikan pembacaan selama jeda
// === PEMBACAAN SENSOR ===
if (now - lastMeasure >= MEASURE_INTERVAL_MS) {
lastMeasure = now;
float distance = measureDistanceCm();
if (distance < 0) {
objectPreviouslyDetected = false;
return;
}
// === DETEKSI BENDA BARU ===
if (distance <= DETECTION_DISTANCE_CM) {
if (!objectPreviouslyDetected && (now - lastDetectionTime > DETECTION_COOLDOWN_MS)) {
counterBarang++;
Serial.println("Barang terdeteksi!");
Serial.printf("Counter Barang: %u\n\n", counterBarang);
// Aktifkan relay sebentar
setRelay(true);
kedipLED(); // LED berkedip sekali
delay(200);
setRelay(false);
objectPreviouslyDetected = true;
lastDetectionTime = now;
}
} else {
objectPreviouslyDetected = false;
}
}
}