Tugas Akhir - Sistem Kasir Bank Sampah dengan integrasi IoT (Timbangan Digital + Kamera Deteksi Sampah)
- Login untuk Admin dan Kasir
- Role-based access control
- Middleware protection
- Statistik Real-time:
- Total transaksi hari ini
- Total sampah terkumpul (kg)
- Saldo kas bank sampah
- Grafik Cash Flow (30 hari terakhir)
- CRUD Master Data:
- Harga Sampah (Waste Prices)
- Data Customer
- Data User (Admin & Kasir)
- Live Scale Display (Timbangan Digital)
- Polling real-time setiap 1 detik
- Status indicator (Stable/Stabilizing/Waiting)
- Simulasi IoT untuk development
- Shopping Cart System
- Add/Remove items
- Auto-calculate subtotal
- Customer selection
- Checkout & Print
- Generate transaction code otomatis
- Update cash flow
- Cetak struk PDF (DomPDF)
- Riwayat Transaksi
POST /api/iot/update-reading- Update data dari timbangan & kameraPOST /api/iot/reset-scale- Reset/tare timbanganGET /api/iot/device/{id}/status- Cek status device
- Backend: Laravel 11
- Database: MySQL
- Frontend: Blade Templates + Tailwind CSS 4
- JavaScript: Vanilla JS (AJAX polling)
- PDF Generation: DomPDF
- Chart: Chart.js
Pastikan sudah terinstal:
- PHP >= 8.2
- Composer
- MySQL
- Node.js & NPM
# Install PHP dependencies
composer install
# Install Node dependencies
npm install# Copy .env.example
cp .env.example .env
# Generate application key
php artisan key:generateEdit .env dan sesuaikan konfigurasi database:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=smart_waste_bank
DB_USERNAME=root
DB_PASSWORD=# Buat database terlebih dahulu di MySQL
# mysql -u root -p
# CREATE DATABASE smart_waste_bank;
# Jalankan migration
php artisan migrate
# Jalankan seeder (data dummy)
php artisan db:seedData Dummy yang dibuat:
- 1 Admin:
admin/admin123 - 1 Kasir:
kasir/kasir123 - 2 Jenis Sampah: PET (Rp 3.000/kg), NON-PET (Rp 1.500/kg)
- 2 Customer contoh
- 1 IoT Device: SCALE-001
npm run buildphp artisan serveAplikasi akan berjalan di: http://localhost:8000
- Buka browser:
http://localhost:8000/login - Login sebagai:
- Admin:
admin/admin123 - Kasir:
kasir/kasir123
- Admin:
Setelah login sebagai admin, Anda bisa:
- Lihat statistik di dashboard
- Kelola harga sampah di menu "Harga Sampah"
- Tambah/edit/hapus customer di menu "Customer"
- Kelola user (admin/kasir) di menu "Users"
Karena alat IoT belum tersambung, gunakan form simulasi:
- Masuk ke halaman Kasir
- Di panel "Live Scale", lihat kotak kuning "DEVELOPER MODE"
- Isi:
- Berat: Contoh
1.5(kg) - Jenis Sampah: Pilih
PETatauNON-PET
- Berat: Contoh
- Klik tombol "Simulate"
- Data akan muncul di display timbangan
- Pilih Customer dari dropdown
- Input data timbangan (via simulasi)
- Tunggu status berubah menjadi "π’ Stable"
- Klik "π Lock & Add to Cart"
- Item masuk ke keranjang (panel kanan)
- Ulangi langkah 2-5 untuk menambah item lain
- Klik "β CHECKOUT"
- Modal sukses muncul
- Klik "π¨οΈ Cetak Struk" untuk download PDF
- Setelah checkout berhasil, klik tombol "Cetak Struk"
- File PDF akan terbuka di tab baru
- Format struk include: No. Transaksi, Tanggal, Kasir, Customer, Detail Items, Total
POST /api/iot/update-reading
Request Body (JSON):
{
"device_id": "SCALE-001",
"detected_class": "PET",
"weight_value": 1.5,
"is_stable": true
}Response:
{
"success": true,
"message": "Reading updated successfully",
"timestamp": "2026-02-05T10:30:00Z"
}- ESP32/Arduino mengirim HTTP POST request ke endpoint di atas
- Body JSON berisi data dari:
- Load Cell (HX711) β
weight_value - Camera + TensorFlow Lite β
detected_class - Algoritma Stabilitas β
is_stable
- Load Cell (HX711) β
- Web akan auto-update via AJAX polling setiap 1 detik
Contoh Code ESP32 (Arduino IDE):
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
const char* ssid = "YOUR_WIFI";
const char* password = "YOUR_PASSWORD";
const char* serverUrl = "http://192.168.1.100:8000/api/iot/update-reading";
void sendToServer(float weight, String wasteClass, bool isStable) {
HTTPClient http;
http.begin(serverUrl);
http.addHeader("Content-Type", "application/json");
StaticJsonDocument<200> doc;
doc["device_id"] = "SCALE-001";
doc["detected_class"] = wasteClass;
doc["weight_value"] = weight;
doc["is_stable"] = isStable;
String jsonString;
serializeJson(doc, jsonString);
int httpResponseCode = http.POST(jsonString);
http.end();
}id,username,password,full_name,role(admin/kasir)
waste_type(PK),price_per_kg,updated_at
id,customer_code,full_name,phone_number,address,total_transactions
id,transaction_code,cashier_id,customer_id,total_amount,created_at
id,transaction_id,waste_type,weight,price_per_kg,subtotal
id,date,type(DEBIT/KREDIT),amount,description,current_balance
device_id(PK),status,detected_class,weight_value,is_stable
id,device_id,detected_class,weight_value,is_stable,updated_at
- Primary Green:
#2D5016 - Secondary Green:
#4A7C2C - Light Green:
#7FB069 - Cream Background:
#FFFBF5 - Wood Brown:
#8B4513
- Font: Default system sans-serif (clear & readable)
- Heading: Bold weights
- Body: Regular weights
- Rounded corners untuk modern look
- Shadow effects untuk depth
- Gradient backgrounds pada cards
- Icon-first design (emoji + SVG icons)
# Reset database
php artisan migrate:fresh --seed# Rebuild assets
npm run build# Install DomPDF jika belum
composer require barryvdh/laravel-dompdfchmod -R 775 storage bootstrap/cache- Real IoT hardware integration (ESP32 + Load Cell + Camera)
- Machine Learning model training untuk klasifikasi sampah
- Laporan PDF (Harian, Bulanan, Tahunan)
- Export data ke Excel
- Notifikasi email untuk transaksi
- Dashboard customer (tracking poin)
- Multi-device support (multiple scales)
- Real-time notification (WebSocket/Pusher)
Nama: [Nama Mahasiswa]
NIM: [NIM]
Prodi: [Program Studi]
Universitas: [Nama Universitas]
Tugas Akhir: Sistem Kasir Bank Sampah Berbasis IoT
Tahun: 2026
This project is for educational purposes (Tugas Akhir).
- Laravel Framework
- Tailwind CSS
- Chart.js
- DomPDF
- IoT Community
Happy Coding! πΏβ»οΈ