
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:
| Komponen | Jumlah | Keterangan |
| ESP32 | 1 unit | Mikrokontroler 32-bit dual-core 240 MHz, 520 KB SRAM, Wi-Fi & Bluetooth, tegangan 3.3V DC, 32 pin. |
| Sensor Infrared Obstacle | 1 unit | Tegangan 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 inci | 1 unit | Resolusi 128×64 piksel, antarmuka I2C (SDA, SCL), daya 0.04-0.08W, tegangan 3.3V-5V DC. |
| LED Indikator Merah, Kuning, Hijau | Masing-masing 1 unit | Diameter 5mm, 2 pin, arus 20mA. Tegangan kerja: Merah (1.8V-2.2V), Kuning (2.0V-2.4V), Hijau (2.2V-3.0V). |
| Resistor 220 Ohm | 3 unit | Sebagai hambatan pembatasi arus untuk ketiga LED. |
| Active Buzzer | 1 unit | Tegangan 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:
| Pengujian | Kondisi Hardware | Tampilan OLED | Status Hasil |
| Sistem Pertama Nyala | LED Kuning ON | Counter = 0 & Status Standby | Berhasil |
| Objek Melintas Sensor | LED Hijau ON & Buzzer 1x | Counter bertambah 1 | Berhasil |
| Hitungan Mencapai Target | LED 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:
- 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).
- Penyimpanan Cadangan Data: Menambahkan modul MicroSD Card untuk mencatat dan menyimpan backup data hitungan secara lokal jika terjadi kegagalan sistem.
- 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.
