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
- Tangan bergerak di depan sensor.
- Sensor mendeteksi gesture → menarik pin INT ke LOW.
- Fungsi
interruptRoutine()
dijalankan →isr_flag = 1
. - Di
loop()
, program menangani gesture denganhandleGesture()
. - Gesture ditampilkan di Serial Monitor.
Rangkuman Fungsi Kode
Komponen | Fungsi |
---|---|
Wire.h | Komunikasi I2C dengan sensor |
SparkFun_APDS9960 | Library resmi dari SparkFun |
attachInterrupt(...) | Mengaktifkan interrupt saat gesture terdeteksi |
isr_flag | Flag 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 :