Sensor MAX30102 adalah modul sensor optik yang digunakan untuk mengukur detak jantung (heart rate) dan oksigen dalam darah (SpO₂). Sensor ini sangat populer dalam aplikasi kesehatan portabel seperti smartwatch, gelang kebugaran, dan alat pemantau kesehatan pribadi.Berikut ini adalah code 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 :
Tujuan Utama Program
Menggunakan sensor APDS-9960 untuk membaca gesture tangan dan menampilkan hasilnya di Serial Monitor.
Header dan Inisialisasi
#include <Arduino.h>
#include <Wire.h>
#include <SparkFun_APDS9960.h>
Arduino.hadalah pustaka inti Arduino.Wire.huntuk komunikasi I2C.SparkFun_APDS9960.hadalah library khusus dari SparkFun untuk mengontrol sensor APDS-9960.
Deklarasi Pin dan Objek
#define APDS9960_INT 15
SparkFun_APDS9960 apds = SparkFun_APDS9960();
volatile int isr_flag = 0;
APDS9960_INTadalah pin digital yang terhubung ke pin interrupt dari sensor.apdsadalah objek sensor.isr_flagadalah flag untuk menandai kalau ada gesture terdeteksi (dipicu oleh interrupt).
Interrupt Service Routine (ISR)
void interruptRoutine() {
isr_flag = 1;
}
- Fungsi ini dijalankan saat interrupt terjadi (pin INT jatuh/rendah).
- Menandai bahwa gesture baru tersedia.
Handle Gesture
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");
}
}
}
- Mengecek apakah gesture tersedia.
- Jika ya, membaca dan mencetak arah gesture ke Serial Monitor.
⚙️ Setup
void setup() {
Serial.begin(9600);
pinMode(APDS9960_INT, INPUT);
// Info awal
Serial.println(F("--------------------------------"));
Serial.println(F("SparkFun APDS-9960 - GestureTest"));
Serial.println(F("--------------------------------"));
// Atur interrupt
attachInterrupt(digitalPinToInterrupt(APDS9960_INT), interruptRoutine, FALLING);
// Inisialisasi sensor
if ( apds.init() ) {
Serial.println(F("APDS-9960 initialization complete"));
} else {
Serial.println(F("Something went wrong during APDS-9960 init!"));
}
// Aktifkan sensor gesture
if ( apds.enableGestureSensor(true) ) {
Serial.println(F("Gesture sensor is now running"));
} else {
Serial.println(F("Something went wrong during gesture sensor init!"));
}
}
- Inisialisasi komunikasi serial, sensor, dan interrupt.
- Jika inisialisasi gagal, akan mencetak pesan error.
🔁 Loop
void loop() {
if ( isr_flag == 1 ) {
detachInterrupt(APDS9960_INT); // Nonaktifkan sementara interrupt
handleGesture(); // Proses gesture
isr_flag = 0; // Reset flag
attachInterrupt(digitalPinToInterrupt(APDS9960_INT), interruptRoutine, FALLING); // Aktifkan lagi interrupt
}
}
- Jika interrupt terjadi (
isr_flag == 1), proses gesture. - Interrupt sementara dinonaktifkan agar tidak terjadi gangguan saat membaca gesture.
Kesimpulan Singkat
Sensor APDS-9960 mendeteksi gesture tangan dan mengirim sinyal melalui interrupt pin. Program menggunakan interrupt untuk merespons gesture secara efisien tanpa terus-menerus polling. Gesture yang terdeteksi akan dicetak di Serial Monitor.
untuk diskusi bisa kontak dibawah ini :

Sosial media :





