Memuat
Project
  • Klien:   Matchaboy AAR
  • Mobile App
  • Tanggal:   Jul 2026

Matchaboy POS: Kasir Matcha Berbasis Deteksi Kamera

Sampul project Matchaboy POS: Kasir Matcha Berbasis Deteksi Kamera

Aplikasi kasir Android untuk kedai Matchaboy AAR. Kasir mengarahkan kamera ke tray cup matcha, aplikasi membaca varian dan jumlahnya lalu menghitung total, semuanya tanpa internet.

Dashboard
Scan deteksi live

Latar belakang

Matchaboy AAR menjual matcha dalam enam varian yang bentuk cup-nya nyaris sama: Original, Vanilla, Choco, Taro, Pistachio, dan Red Velvet. Bedanya cuma warna isi dan stiker. Saat ramai, kasir harus memeriksa tray satu per satu, mengingat varian mana saja yang ada di situ, lalu menjumlahkan harganya. Gampang keliru kalau satu tray isinya campuran. Kedai juga belum punya catatan transaksi yang rapi, jadi tidak ada angka penjualan harian yang bisa dilihat pemiliknya.

Solusi

Saya membangun aplikasi kasir Android yang memakai kamera sebagai alat hitung. Kasir mengarahkan kamera ke tray, model YOLOv8 yang tertanam di aplikasi membaca tiap cup dan menandainya dengan kotak berwarna plus nama varian dan angka keyakinan, langsung di atas live preview. Tombol jepret baru aktif setelah ada cup yang terbaca, jadi kasir tidak bisa menjepret layar kosong.

Begitu dijepret, aplikasi mengelompokkan deteksi per varian, mengambil harga dari basis data SQLite di HP, lalu menampilkan rincian per varian beserta totalnya. Kasir memeriksa, memperbaiki kalau ada yang meleset, lalu menyimpan. Dari beranda sampai transaksi tersimpan hanya empat langkah.

Tidak ada server di belakangnya. Model, harga, dan riwayat transaksi semua tersimpan di HP, jadi aplikasi tetap jalan saat sinyal di kedai hilang.

Fitur utama

  • Deteksi cup secara real time lewat YOLOView, dengan kotak dan label digambar di atas preview tiap frame
  • Tombol jepret yang terkunci sampai ada cup terdeteksi
  • Rincian pesanan otomatis: jumlah cup per varian, harga satuan, subtotal, dan total
  • Koreksi manual di layar Konfirmasi untuk menambah, mengurangi, atau menghapus item
  • Penyimpanan transaksi dengan kode unik berformat TRX-YYYYMMDD-NNN
  • Riwayat transaksi dengan filter tanggal dan halaman detail per transaksi
  • Manajemen produk untuk mengubah nama, kode, dan harga keenam varian
  • Ringkasan harian di beranda berisi jumlah transaksi dan pendapatan hari itu

Tantangan teknis

Masalah pertama datang dari overlay. Plugin ultralytics_yolo sudah punya penggambar kotak bawaan, tapi warnanya tidak bisa diatur per kelas dan labelnya sering tenggelam di atas cup yang terang. Saya matikan lewat setShowOverlays(false) lalu menggambar sendiri dengan CustomPainter: tiap varian dapat warna pekat sendiri dan labelnya ditaruh di atas pil berwarna dengan teks putih, jadi selalu terbaca. Yang sempat merepotkan, kotak yang pas di layar Scan malah meleset di layar Hasil Deteksi. Penyebabnya live preview memotong frame dengan BoxFit.cover sementara foto hasil ditampilkan utuh dengan BoxFit.contain. Saya buat overlay-nya menerima parameter fit dan menghitung skala serta offset sendiri, sehingga satu widget yang sama dipakai di dua layar dan kotaknya tetap pas.

Masalah kedua soal kepercayaan pada model. Cahaya di kedai cenderung redup dan cup bisa saling menutupi, jadi deteksi tidak selalu benar. Daripada memaksa kasir menerima apa pun hasil model, saya buat layar Konfirmasi yang bisa diedit sebelum disimpan. Keyakinan rata-rata tiap varian tetap ditulis ke kolom confidence_score, jadi kalau ada transaksi yang janggal saya bisa menelusuri seberapa yakin model waktu itu. Kalau ada label kelas yang tidak punya produk padanan di basis data, layar Hasil Deteksi memunculkan banner peringatan, bukan diam-diam melewatkannya.

Sisanya urusan basis data. Harga produk bisa berubah, dan kalau transaksi lama hanya menyimpan product_id, menaikkan harga akan ikut mengubah total struk yang sudah lewat. Jadi unit_price dan subtotal ikut disimpan di transaction_items. Kode transaksi dihitung dari jumlah transaksi pada hari yang sama, dan pembuatan kode itu saya letakkan di dalam db.transaction yang sama dengan proses insert-nya supaya urutannya tidak bentrok. Foreign key saya aktifkan lewat PRAGMA foreign_keys = ON karena SQLite mematikannya secara default.

Satu keputusan kecil yang banyak menolong: product_code di tabel produk saya samakan persis dengan label kelas model. Pemetaan dari hasil deteksi ke harga akhirnya cukup satu query, tanpa tabel perantara atau daftar pemetaan di kode.

Peran saya

Saya mengerjakan aplikasinya sendirian: merancang skema tiga tabel berelasi, mengintegrasikan model ke Flutter, membuat kesepuluh layar, menulis overlay deteksi, mengatur format Rupiah dan tanggal Indonesia, sampai menangani izin kamera beserta layar cadangan kalau izinnya ditolak.

Hasil dan pengembangan selanjutnya

Pengujian langsung di kedai berjalan sesuai harapan. Satu cup pistachio di atas timbangan terbaca dengan keyakinan 97 persen, lalu tercatat rapi sebagai transaksi TRX-20260705-003 lengkap dengan rincian per varian.

Ada beberapa hal yang belum selesai. Model baru mengenali enam varian, sehingga Sereal, Cookies, dan Biscoff masih harus ditambahkan lewat tombol Tambah item. Build release juga masih memakai kunci debug. Berikutnya saya ingin menambah laporan penjualan per rentang tanggal beserta ekspor datanya, dan melatih ulang model supaya varian baru ikut terbaca.

Teknologi

Flutter Dart YOLOv8 TensorFlow Lite SQLite Android

Project serupa

Siap mewujudkan ide Anda? Saya siap membantu

© 2026 Axa Rajandrya. Seluruh hak cipta dilindungi.

+
+