Bikin Penghitung Objek Otomatis Berbasis ESP32 dan Sensor IR Lengkap dengan OLED

Halo Sobat Maker! Pernah nggak sih kamu merasa capek atau pusing saat harus menghitung jumlah barang secara manual satu per satu? Selain menyita banyak waktu dan tenaga, cara manual ini sangat rentan terhadap human error, terutama jika volume barang sangat besar atau pergerakannya terlalu cepat. Nah, agar operasional kerja kamu menjadi jauh lebih praktis, presisi, dan efisien, solusinya adalah membuat proyek Smart Object Counter otomatis! Mirip dengan konsep dasar sistem keamanan berbasis sensor, proyek ini memanfaatkan mikrokontroler ESP32, sensor infrared obstacle, layar OLED 0.96 inci, LED indikator, serta active buzzer untuk menghitung objek melintas secara otomatis dan menampilkan datanya secara real-time.

Alat dan Bahan Project Smart Object Counter

Untuk merakit proyek ini, berikut adalah daftar komponen hardware beserta spesifikasi teknis lengkap yang dibutuhkan:

KomponenJumlahKeterangan
ESP321 unitMikrokontroler 32-bit dual-core 240 MHz, 520 KB SRAM, Wi-Fi & Bluetooth, tegangan 3.3V DC, 32 pin.
Sensor Infrared Obstacle1 unitTegangan 3.3V-5V DC, arus \ge 20 mA, jarak deteksi 2cm-30cm, sudut 35^\circ, frekuensi 38kHz, 3 pin (VCC, GND, OUT).
Layar OLED 0.96 inci1 unitResolusi 128×64 piksel, antarmuka I2C (SDA, SCL), daya 0.04-0.08W, tegangan 3.3V-5V DC.
LED Indikator Merah, Kuning, HijauMasing-masing 1 unitDiameter 5mm, 2 pin, arus 20mA. Tegangan kerja: Merah (1.8V-2.2V), Kuning (2.0V-2.4V), Hijau (2.2V-3.0V).
Resistor 220 Ohm3 unitSebagai hambatan pembatasi arus untuk ketiga LED.
Active Buzzer1 unitTegangan 3V-5V DC, arus < 30mA, tekanan suara \ge 85dB pada 10cm.

Skematik Rangkaian

Berikut adalah peta koneksi pin (wiring) antar komponen hardware yang dapat kamu ikuti saat merakit rangkaian:

  • Sensor IR Obstacle: VCC ke 3.3V/5V ESP32, GND ke GND ESP32, OUT ke GPIO 32 ESP32.
  • Layar OLED 0.96″ (I2C): VDD/VCC ke 3.3V/5V ESP32, GND ke GND ESP32, SDA ke GPIO 21 ESP32, SCL ke GPIO 22 ESP32.
  • LED Indikator (Anoda disambung Resistor 220 Ohm): LED Hijau ke GPIO 14 ESP32, LED Kuning ke GPIO 26 ESP32, LED Merah ke GPIO 27 ESP32, Katoda seluruh LED terhubung ke GND.
  • Active Buzzer: Pin Positif (+) ke GPIO 25 ESP32, Pin Negatif (-) ke GND.

Cara Kerja dan Logika Alur Sistem

Sistem ini bekerja berdasarkan pantulan cahaya tak terlihat dari sensor infrared obstacle. Transmitter pada sensor memancarkan cahaya inframerah. Ketika ada objek yang melintas dan memotong radar sensor, cahaya tersebut dipantulkan kembali dan ditangkap oleh komponen receiver. Pantulan ini menghasilkan sinyal digital yang langsung dikirimkan ke ESP32.

ESP32 berfungsi sebagai otak utama yang membaca sinyal digital tersebut. Setiap kali sinyal terdeteksi, ESP32 akan memproses data dengan menambah nilai hitungan (counter). Data tersebut kemudian diolah untuk menampilkan status sistem secara real-time melalui layar OLED, indikator LED, dan respon suara dari buzzer.

Alur logika status indikator pada sistem terbagi menjadi tiga mode:

  • Standby Mode: Saat alat baru dinyalakan atau tidak ada barang yang lewat (counter bernilai 0), LED Kuning menyala sebagai penanda bahwa sistem dalam posisi siaga dan siap digunakan.
  • Object Detected / Counting: Ketika ada objek melintas, sinyal sensor bernilai LOW. ESP32 secara otomatis menambah nilai hitungan (count = count + 1), LED Hijau menyala sejenak, buzzer berbunyi beep pendek 1 kali, dan layar OLED langsung memperbarui angka hitungan terbaru.
  • Target Reached: Saat akumulasi hitungan telah mencapai batas target yang ditentukan (misalnya 10 barang), LED Merah menyala, buzzer membunyikan alarm peringatan sebanyak 3 kali, dan layar OLED menampilkan teks “TARGET TERCAPAI”.

Pemrograman dan Kode Program ESP32

Berikut adalah kode program Arduino C/C++ lengkap yang diunggah ke mikrokontroler ESP32:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// PIN
const int irPin = 32;
const int buzzerPin = 25;
const int ledKuning = 26;
const int ledMerah = 27;
const int ledHijau = 14;

// VARIABLE
int count = 0;
const int target = 10;
bool detected = false;
bool targetTercapai = false;
unsigned long lastDetect = 0;

void setup() {
  Serial.begin(115200);

  pinMode(irPin, INPUT);
  pinMode(buzzerPin, OUTPUT);
  pinMode(ledMerah, OUTPUT);
  pinMode(ledKuning, OUTPUT);
  pinMode(ledHijau, OUTPUT);

  Wire.begin(21, 22);

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println("OLED gagal");
    while (true);
  }

  // STARTUP
  display.clearDisplay();
  display.drawRoundRect(0, 0, 128, 64, 10, WHITE);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(18, 12);
  display.println("ESP32");
  display.setTextSize(1);
  display.setCursor(23, 38);
  display.println("SMART COUNTER");
  display.drawRect(14, 52, 100, 6, WHITE);

  for (int i = 0; i < 96; i += 4) {
    display.fillRect(16, 54, i, 2, WHITE);
    display.display();
    delay(40);
  }
  delay(1000);
}

void loop() {
  int irValue = digitalRead(irPin);

  // DETEKSI BENDA
  if (irValue == LOW && detected == false) {
    count++;
    detected = true;
    lastDetect = millis();

    // Bunyi pendek setiap hitungan
    tone(buzzerPin, 1200);
    delay(80);
    noTone(buzzerPin);

    // Target tercapai
    if (count >= target && !targetTercapai) {
      targetTercapai = true;
      // Alarm 3 kali
      for (int i = 0; i < 3; i++) {
        tone(buzzerPin, 2000);
        delay(300);
        noTone(buzzerPin);
        delay(150);
      }
    }
  }

  Serial.print("Jumlah Barang = ");
  Serial.println(count);

  // Reset deteksi
  if (irValue == HIGH) {
    detected = false;
  }

  // LED STATUS
  digitalWrite(ledMerah, LOW);
  digitalWrite(ledKuning, LOW);
  digitalWrite(ledHijau, LOW);

  if (targetTercapai) {
    // Target tercapai
    digitalWrite(ledMerah, HIGH);
  } else if (millis() - lastDetect < 500) {
    // Sedang menghitung
    digitalWrite(ledHijau, HIGH);
  } else {
    // Standby
    digitalWrite(ledKuning, HIGH);
  }

  // OLED Display
  display.clearDisplay();
  display.drawRoundRect(0, 0, 128, 64, 8, WHITE);

  // Header
  display.fillRoundRect(0, 0, 128, 14, 6, WHITE);
  display.setTextColor(BLACK);
  display.setTextSize(1);
  display.setCursor(22, 3);
  display.print("SMART COUNTER");

  display.setTextColor(WHITE);

  // Target
  display.setTextSize(1);
  display.setCursor(5, 16);
  display.print("Target: ");
  display.print(target);

  // Counter besar
  display.setTextSize(4);
  if (count < 10)
    display.setCursor(55, 20);
  else if (count < 100)
    display.setCursor(40, 20);
  else
    display.setCursor(25, 20);
  display.print(count);

  // Status
  display.setTextSize(1);
  display.setCursor(5, 54);
  if (targetTercapai) {
    display.print("TARGET TERCAPAI");
  } else if (millis() - lastDetect < 500) {
    display.print("STATUS: COUNTING");
  } else {
    display.print("STATUS: STANDBY");
  }

  display.display();
  delay(50);
}

Pustaka Wire.h digunakan untuk mengontrol komunikasi I2C antara ESP32 dan OLED, Adafruit_SSD1306.h menangani driver layar, sedangkan Adafruit_GFX.h menyediakan fungsi dasar grafis untuk menggambar bentuk seperti drawRoundRect dan fillRoundRect. Kamu bisa dengan mudah mengubah batas hitungan target sesuai kebutuhan dengan mengganti nilai pada variabel const int target = 10;. Pada fungsi setup(), pin GPIO dikonfigurasi sebagai input sensor IR dan output untuk LED serta buzzer. Di dalam fungsi loop(), program terus membaca sinyal irValue. Penggunaan millis() - lastDetect < 500 berfungsi sebagai pengatur waktu (timer) non-blocking untuk menjaga LED Hijau menyala dan menampilkan teks "STATUS: COUNTING" selama 500ms setiap kali barang terdeteksi tanpa menghentikan eksekusi program utama.

Hasil Pengujian dan Analisis Kinerja

Setelah kode berhasil kamu upload ke ESP32, saatnya kita melakukan pengujian hardware! Pengujian dilakukan untuk memastikan keakuratan pembacaan sensor dan respon indikator secara real-time. Berikut adalah ringkasan hasil pengujian sistem:

PengujianKondisi HardwareTampilan OLEDStatus Hasil
Sistem Pertama NyalaLED Kuning ONCounter = 0 & Status StandbyBerhasil
Objek Melintas SensorLED Hijau ON & Buzzer 1xCounter bertambah 1Berhasil
Hitungan Mencapai TargetLED Merah ON & Buzzer Alarm 3x“TARGET TERCAPAI”Berhasil

Kesimpulan dan Tips Pengembangan

Sistem Smart Object Counter berbasis ESP32 ini terbukti beroperasi secara akurat dan stabil dalam memproses data pencacahan barang secara real-time. Dengan diterapkannya alat ini, risiko kesalahan hitung akibat faktor manusia (human error) dapat diminimalkan serta efisiensi pemantauan jumlah barang di lingkungan produksi maupun operasional harian dapat meningkat secara signifikan.

Untuk pengembangan sistem lebih lanjut, kamu bisa menerapkan beberapa fitur tambahan berikut:

  1. Pembedaan Nada Buzzer: Membedakan bunyi frekuensi buzzer untuk hitungan sukses dan bunyi alarm khusus saat terjadi kondisi error (misalnya jika terdapat objek yang macet di depan sensor).
  2. Penyimpanan Cadangan Data: Menambahkan modul MicroSD Card untuk mencatat dan menyimpan backup data hitungan secara lokal jika terjadi kegagalan sistem.
  3. Integrasi IoT: Memanfaatkan konektivitas Wi-Fi bawaan ESP32 untuk menghubungkan alat ke Google Sheets atau database IoT agar proses pemantauan dapat dilakukan secara jarak jauh.

Related Post

Leave a Reply

Your email address will not be published. Required fields are marked *

Mau Cetak PCB Custom? Cek Biaya