Cara Memprogram Sensor Gesture APDS9960 Pada ESP32

Cara Memprogram Sensor Gesture APDS9960 Pada ESP32

APDS-9960 adalah sebuah sensor gesture, warna, cahaya, dan proximity (jarak dekat) 4-in-1 yang sangat populer digunakan di proyek Arduino, robotika, dan wearable. Sensor ini mampu mengenali gerakan tangan (gesture) seperti kiri, kanan, atas, bawah, serta membaca warna, cahaya sekitar, dan mendeteksi keberadaan objek dekat.Berikut ini adalah kode untuk memprogramnya :

#include <Arduino.h>

#include <Wire.h>
#include <SparkFun_APDS9960.h>

#define APDS9960_INT 15
SparkFun_APDS9960 apds = SparkFun_APDS9960();
volatile int isr_flag = 0;

 
void interruptRoutine() {
isr_flag = 1;
}
 
void handleGesture() {
if ( apds.isGestureAvailable() ) {
switch ( apds.readGesture() ) {
case DIR_UP:
Serial.println("UP");
break;
case DIR_DOWN:
Serial.println("DOWN");
break;
case DIR_LEFT:
Serial.println("LEFT");
break;
case DIR_RIGHT:
Serial.println("RIGHT");
break;
case DIR_NEAR:
Serial.println("NEAR");
break;
case DIR_FAR:
Serial.println("FAR");
break;
default:
Serial.println("NONE");
}
}
}
 



void setup()
{
Serial.begin(9600);
pinMode(APDS9960_INT, INPUT);
Serial.println();
Serial.println(F("--------------------------------"));
Serial.println(F("SparkFun APDS-9960 - GestureTest"));
Serial.println(F("--------------------------------"));
attachInterrupt(digitalPinToInterrupt(APDS9960_INT), interruptRoutine, FALLING);
if ( apds.init() ) {
Serial.println(F("APDS-9960 initialization complete"));
} else {
Serial.println(F("Something went wrong during APDS-9960 init!"));
}
if ( apds.enableGestureSensor(true) ) {
Serial.println(F("Gesture sensor is now running"));
} else {
Serial.println(F("Something went wrong during gesture sensor init!"));
}

}
void loop(){
if( isr_flag == 1 ) {
detachInterrupt(APDS9960_INT);
handleGesture();
isr_flag = 0;
attachInterrupt(digitalPinToInterrupt(APDS9960_INT), interruptRoutine, FALLING);
}


}

Berikut ini adalah penjelasan dari kode di atas :

Fungsi Utama Kode Ini

  • Menggunakan sensor APDS-9960 untuk mendeteksi gesture seperti: UP, DOWN, LEFT, RIGHT, NEAR, FAR.
  • Menggunakan interrupt untuk merespons perubahan sinyal dari pin INT sensor (non-blok).
  • Gesture akan dicetak ke Serial Monitor saat terdeteksi.

1. Inisialisasi Library dan Objek

#include <Wire.h>
#include <SparkFun_APDS9960.h>

#define APDS9960_INT 15
SparkFun_APDS9960 apds = SparkFun_APDS9960();
volatile int isr_flag = 0;
  • Menggunakan library SparkFun_APDS9960 untuk komunikasi I2C ke sensor.
  • Pin GPIO 15 digunakan sebagai input interrupt dari sensor.
  • isr_flag akan digunakan untuk menandai bahwa interrupt terjadi (gesture siap dibaca).

2. Interrupt Routine

void interruptRoutine() {
  isr_flag = 1;
}
  • Fungsi ini akan dipanggil secara otomatis saat pin INT berubah ke LOW (FALLING).
  • Tidak boleh lama-lama di interrupt — hanya men-set flag.

3. Fungsi handleGesture()

void handleGesture() {
  if (apds.isGestureAvailable()) {
    switch (apds.readGesture()) {
      case DIR_UP: Serial.println("UP"); break;
      case DIR_DOWN: Serial.println("DOWN"); break;
      case DIR_LEFT: Serial.println("LEFT"); break;
      case DIR_RIGHT: Serial.println("RIGHT"); break;
      case DIR_NEAR: Serial.println("NEAR"); break;
      case DIR_FAR: Serial.println("FAR"); break;
      default: Serial.println("NONE");
    }
  }
}
  • Fungsi ini membaca gesture dari sensor jika tersedia.
  • Menerjemahkan gesture ke teks dan menampilkannya ke Serial Monitor.

4. Fungsi setup()

void setup() {
  Serial.begin(9600);
  pinMode(APDS9960_INT, INPUT);
  attachInterrupt(digitalPinToInterrupt(APDS9960_INT), interruptRoutine, FALLING);
  
  if (apds.init()) {
    Serial.println("APDS-9960 initialization complete");
  } else {
    Serial.println("Something went wrong during APDS-9960 init!");
  }

  if (apds.enableGestureSensor(true)) {
    Serial.println("Gesture sensor is now running");
  } else {
    Serial.println("Something went wrong during gesture sensor init!");
  }
}
  • Inisialisasi komunikasi serial dan sensor.
  • Konfigurasi pin APDS9960_INT sebagai input.
  • Pasang interrupt pada pin INT → akan aktif saat sensor mendeteksi gesture (FALLING edge).

5. Fungsi loop()

void loop() {
  if (isr_flag == 1) {
    detachInterrupt(APDS9960_INT);  // Hentikan interrupt sementara
    handleGesture();                // Proses gesture
    isr_flag = 0;                   // Reset flag
    attachInterrupt(digitalPinToInterrupt(APDS9960_INT), interruptRoutine, FALLING);  // Aktifkan kembali
  }
}
  • Program menunggu flag isr_flag yang menandakan ada gesture.
  • Jika isr_flag == 1:
    • Nonaktifkan interrupt untuk mencegah gangguan saat pembacaan.
    • Panggil handleGesture() untuk membaca gesture.
    • Reset flag.
    • Aktifkan kembali interrupt.

Alur Kerja Singkat

  1. Tangan bergerak di depan sensor.
  2. Sensor mendeteksi gesture → menarik pin INT ke LOW.
  3. Fungsi interruptRoutine() dijalankan → isr_flag = 1.
  4. Di loop(), program menangani gesture dengan handleGesture().
  5. Gesture ditampilkan di Serial Monitor.

Rangkuman Fungsi Kode

KomponenFungsi
Wire.hKomunikasi I2C dengan sensor
SparkFun_APDS9960Library resmi dari SparkFun
attachInterrupt(...)Mengaktifkan interrupt saat gesture terdeteksi
isr_flagFlag penanda bahwa gesture siap dibaca
handleGesture()Membaca gesture dan mencetak hasilnya

Catatan Tambahan

  • Pastikan sensor menggunakan tegangan 3.3V (bukan 5V), atau gunakan level shifter.
  • Pin APDS9960_INT harus mendukung interrupt (di ESP32, sebagian besar pin bisa).
  • Gesture hanya terdeteksi dengan gerakan yang jelas dan jarak 10–20 cm.

untuk diskusi bisa kontak dibawah ini :

Sosial media :

Apa itu ESP32?