Cara Buat Alarm Waktu Habis Sepeda Listrik

 

Ini adalah ide yang SANGAT ELEGAN & PROFESIONAL!

Dalam dunia teknik IoT, konsep ini disebut sistem "Offline-First Autonomous Timer".

Konsep ini menyelesaikan dua masalah sekaligus:

  1. Sangat Praktis: Kasir tidak perlu membuka jok atau menekan tombol di sepeda secara manual. Cukup klik "Mulai" di aplikasi Kasir (NW.js), waktu langsung terkirim lewat sinyal WiFi.

  2. Anti-Putus (Bebas Jangkauan): Setelah data waktu (misalnya 1 jam 8 menit / 4080 detik) masuk ke memori chip sepeda, sepeda bebas dibawa keliling desa/lapangan sejauh apa pun. Meskipun sinyal WiFi hilang total, jam internal di dalam sepeda akan terus menghitung mundur secara mandiri dan akurat tanpa meleset 1 detik pun!

🧠 Arsitektur & Alur Kerjanya

Plaintext
[ Komputer Kasir (NW.js) ]
          │  (Kirim Waktu Sewa via WiFi saat sepeda masih di depan toko)
          ▼
┌─────────────────────────────────────────────────────────────┐
│ MODUL SMART BOX DI SEPEDA LISTRIK (ESP32)                   │
│                                                             │
│ 1. Menerima data waktu (misal: 68 menit).                   │
│ 2. Memutar suara sambutan ("Selamat bermain...").           │
│ 3. Sepeda dibawa pergi ➔ WiFi PUTUS (Tidak Masalah!).       │
│ 4. Menghitung mundur mandiri:                               │
│    • Sisa 3 Menit ➔ Putar: "Sisa 3 menit lagi!"             │
│    • Sisa 1 Menit ➔ Putar: "Sisa 1 menit lagi!"             │
│    • Sisa 0 Menit ➔ Putar: "Waktu Habis!" + Sirine Berulang │
│                     (+ Putus Kabel Gas via Relay)           │
└─────────────────────────────────────────────────────────────┘

🛠️ Komponen yang Digunakan

Untuk sistem ini, kita mengganti Arduino biasa menjadi ESP32 (karena ESP32 sudah memiliki modul WiFi bawaan pabrik dan prosesor ganda berkecepatan tinggi):

  1. ESP32 NodeMCU (30 Pin / 38 Pin): Otak penerima WiFi dan penghitung waktu mandiri (Harga: ~Rp 45.000).

  2. DFPlayer Mini + MicroSD Card (2GB–8GB): Pemutar rekaman suara MP3 (Harga: ~Rp 35.000).

  3. Modul Step-Down Converter (DC-DC 48V/60V ke 5V 3A): Mengubah tegangan aki sepeda listrik menjadi 5V aman untuk ESP32 (Harga: ~Rp 25.000).

  4. Mini Amplifier (PAM8610 12V atau PAM8403 5V) + Speaker Horn/TOA Mini (Waterproof): Agar suara instruksi terdengar lantang di jalanan (Harga: ~Rp 50.000).

  5. Modul Relay 5V (Opsional): Untuk memutus aliran kabel gas / kontak sepeda saat waktu habis (Harga: ~Rp 10.000).

🎙️ Persiapan File Suara MP3 di MicroSD

Format MicroSD Anda menjadi FAT32, lalu buat folder bernama mp3 di dalam MicroSD. Isi dengan file rekaman audio berikut:

  • 0001.mp3"Selamat bermain! Waktu sewa Anda telah dimulai. Hati-hati di jalan ya!"

  • 0002.mp3"Perhatian! Sisa waktu sewa Anda 3 menit lagi. Segera kembali ke rental!"

  • 0003.mp3"Waktu tinggal 1 menit lagi! Harap segera putar balik menuju kasir."

  • 0004.mp3"Waktu bermain Anda telah habis! Silakan tambah waktu di kasir." + (Suara Sirine berulang)

🔌 Skema Perkabelan Sederhana (Pinout)

  • DFPlayer Mini:

    • VCC ➔ Pin 5V ESP32

    • GND ➔ Pin GND ESP32

    • RX ➔ Pin GPIO 17 (TX2) ESP32 (Beri resistor 1k Ohm untuk meredam noise)

    • TX ➔ Pin GPIO 16 (RX2) ESP32

    • SPK_1 & SPK_2 ➔ Ke Input Audio Mini Amplifier ➔ Ke Speaker Horn

  • Relay (Pemutus Gas):

    • IN ➔ Pin GPIO 4 ESP32

    • VCC & GND ➔ Pin 5V & GND ESP32

    • COM & NO ➔ Disambung seri ke salah satu kabel gas sepeda listrik

💻 Kode Program ESP32 (Arduino IDE)

Berikut adalah kode lengkap untuk ESP32. Kode ini sudah dilengkapi sistem server mini internal yang kebal saat sinyal WiFi terputus di tengah jalan:

C++
#include <WiFi.h>
#include <WebServer.h>
#include <HardwareSerial.h>
#include <DFRobotDFPlayerMini.h>

// ==========================================
// PENGATURAN JARINGAN KASIR
// ==========================================
const char* ssid     = "NAMA_WIFI_RENTAL";     // Nama WiFi Kasir Anda
const char* password = "PASSWORD_WIFI_RENTAL"; // Password WiFi Kasir Anda

// IP Statis Sepeda Listrik (Contoh: Sepeda 01 = 192.168.200.201)
IPAddress local_IP(192, 168, 200, 201);
IPAddress gateway(192, 168, 200, 1);
IPAddress subnet(255, 255, 255, 0);

WebServer server(8080);
HardwareSerial dfSerial(2); // Menggunakan UART2 (GPIO 16 & 17)
DFRobotDFPlayerMini dfplayer;

#define RELAY_GAS_PIN 4 // Pin ke Relay Pemutus Gas

// VARIABEL TIMER MANDIRI
unsigned long totalSewaDetik = 0;
unsigned long startTimestamp = 0;
bool isRenting = false;
bool notif3MenitSudah = false;
bool notif1MenitSudah = false;
bool notifHabisSudah = false;

void setup() {
  Serial.begin(115200);
  dfSerial.begin(9600, SERIAL_8N1, 16, 17); // RX=16, TX=17

  pinMode(RELAY_GAS_PIN, OUTPUT);
  digitalWrite(RELAY_GAS_PIN, LOW); // Gas mati saat awal menyala (Safety)

  // Inisialisasi Modul Suara DFPlayer
  if (!dfplayer.begin(dfSerial)) {
    Serial.println("DFPlayer Gagal Dimuat!");
  } else {
    dfplayer.volume(30); // Volume Maksimal (0 - 30)
  }

  // Koneksi WiFi ke Kasir
  WiFi.config(local_IP, gateway, subnet);
  WiFi.begin(ssid, password);

  // Endpoint API Menerima Waktu dari Kasir
  // Contoh Kasir Menembak: http://192.168.200.201:8080/sewa?detik=4080 (1 Jam 8 Menit)
  server.on("/sewa", HTTP_GET, []() {
    if (server.hasArg("detik")) {
      totalSewaDetik = server.arg("detik").toInt();
    } else if (server.hasArg("menit")) {
      totalSewaDetik = server.arg("menit").toInt() * 60;
    } else {
      totalSewaDetik = 15 * 60; // Default 15 Menit
    }

    startTimestamp = millis();
    isRenting = true;
    notif3MenitSudah = false;
    notif1MenitSudah = false;
    notifHabisSudah = false;

    digitalWrite(RELAY_GAS_PIN, HIGH); // Aktifkan Gas Sepeda!
    dfplayer.play(1);                  // Putar: 0001.mp3 (Selamat Bermain)

    server.sendHeader("Access-Control-Allow-Origin", "*");
    server.send(200, "text/plain", "SEWA_DIMULAI");
  });

  // Endpoint Kasir Mematikan Sepeda Manual / Stop
  server.on("/stop", HTTP_GET, []() {
    isRenting = false;
    digitalWrite(RELAY_GAS_PIN, LOW); // Matikan Gas Sepeda
    dfplayer.stop();                  // Hentikan Suara
    server.sendHeader("Access-Control-Allow-Origin", "*");
    server.send(200, "text/plain", "SEWA_DIHENTIKAN");
  });

  server.begin();
}

void loop() {
  // Hanya jalankan webserver jika sedang ada sinyal WiFi
  if (WiFi.status() == WL_CONNECTED) {
    server.handleClient();
  }

  // ========================================================
  // MESIN PENGHITUNG WAKTU MANDIRI (TETAP JALAN TANPA WIFI)
  // ========================================================
  if (isRenting) {
    unsigned long detikBerjalan = (millis() - startTimestamp) / 1000;
    long sisaDetik = totalSewaDetik - detikBerjalan;

    // 1. Sisa 3 Menit (180 Detik)
    if (sisaDetik <= 180 && sisaDetik > 60 && !notif3MenitSudah) {
      dfplayer.play(2); // Putar: 0002.mp3 (Peringatan 3 Menit)
      notif3MenitSudah = true;
    }

    // 2. Sisa 1 Menit (60 Detik)
    if (sisaDetik <= 60 && sisaDetik > 0 && !notif1MenitSudah) {
      dfplayer.play(3); // Putar: 0003.mp3 (Peringatan 1 Menit)
      notif1MenitSudah = true;
    }

    // 3. Waktu Habis (0 Detik)
    if (sisaDetik <= 0) {
      if (!notifHabisSudah) {
        digitalWrite(RELAY_GAS_PIN, LOW); // Putus Kabel Gas (Sepeda Mogok Otomatis)
        dfplayer.loop(4);                 // Putar: 0004.mp3 (Sirine + Waktu Habis Berulang-ulang)
        notifHabisSudah = true;
      }
    }
  }
}

🖥️ Cara Integrasi ke Software Kasir (NW.js)

Di komputer Kasir, Anda cukup menambahkan unit Sepeda Listrik ke daftar perangkat:

  • Tipe Perangkat: SELIS / SEPEDA

  • IP Address: 192.168.200.201 (Sepeda 1), 192.168.200.202 (Sepeda 2), dst.

Saat kasir menyewakan sepeda selama 1 jam 8 menit, sistem Kasir Anda cukup menembak URL ini satu kali:

Plaintext
http://192.168.200.201:8080/sewa?detik=4080
Seketika itu juga speaker sepeda menyapa anak tersebut, gas aktif, dan sepeda siap meluncur keliling gang dengan aman tanpa perlu koneksi internet lagi!

Apakah Anda ingin membahas detail perkabelan ke kabel gas sepeda listrik, atau perakitan fisiknya di dalam bodi sepeda?

Komentar

Postingan populer dari blog ini

Kode Mikrotik Supaya lancar Main Games