이 프로젝트는 손동작을 이용해 RGB LED를 제어하는 방법을 보여줍니다. SparkFun APDS-9960 센서와 공통 캐소드 RGB LED가 필요합니다(공통 애노드 아님). I2C 프로토콜을 사용하는 이 센서는 5V 아두이노 보드와 4.7kΩ 저항과 함께 사용해야 합니다. 회로도대로 연결한 후 코드에서 커스텀 색상을 추가할 수 있습니다. 기본 제어 방식은 다음과 같습니다:
위로 스와이프: LED 켜기
아래로 스와이프: LED 끄기
오른쪽 스와이프: 다음 색상으로 변경
왼쪽 스와이프: 이전 색상으로 변경
이 코드는 다양한 다른 프로젝트에도 적용 가능합니다. 자유롭게 실험하며 멋진 프로젝트를 만들어보세요!
코드
아두이노 코드 C/C++
#include
#include
// 핀 정의
#define APDS9960_INT 2 // 인터럽트 핀이어야 함
// 상수
int red_pin = A0;
int green_pin = A1;
int blue_pin = A2;
int onOff_flag = 0;
int colorNumber = 0;
// 전역 변수
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;
void setup() {
pinMode(APDS9960_INT, INPUT);
Serial.begin(9600);
Serial.println(F("--------------------------------"));
Serial.println(F("SparkFun APDS-9960 - GestureTest"));
Serial.println(F("--------------------------------"));
attachInterrupt(0, interruptRoutine, FALLING);
if (apds.init()) {
Serial.println(F("APDS-9960 초기화 완료"));
} else {
Serial.println(F("APDS-9960 초기화 중 오류 발생!"));
}
if (apds.enableGestureSensor(true)) {
Serial.println(F("제스처 센서 실행 중"));
} else {
Serial.println(F("제스처 센서 초기화 중 오류 발생!"));
}
pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
analogWrite(A0, 0);
analogWrite(A1, 0);
analogWrite(A2, 0);
}
void loop() {
if (isr_flag == 1) {
detachInterrupt(0);
handleGesture();
isr_flag = 0;
attachInterrupt(0, interruptRoutine, FALLING);
}
if (onOff_flag == 1) {
switch (colorNumber) {
case 0: Serial.println("빨강"); analogWrite(red_pin, 255); analogWrite(green_pin, 0); analogWrite(blue_pin, 0); break;
case 1: Serial.println("베이비 블루"); analogWrite(red_pin, 255); analogWrite(green_pin, 153); analogWrite(blue_pin, 204); break;
case 2: Serial.println("다크 블루"); analogWrite(red_pin, 100); analogWrite(green_pin, 0); analogWrite(blue_pin, 170); break;
case 3: Serial.println("초록"); analogWrite(red_pin, 0); analogWrite(green_pin, 255); analogWrite(blue_pin, 0); break;
case 4: Serial.println("파랑"); analogWrite(red_pin, 0); analogWrite(green_pin, 0); analogWrite(blue_pin, 255); break;
case 5: Serial.println("보라"); analogWrite(red_pin, 191); analogWrite(green_pin, 0); analogWrite(blue_pin, 255); break;
}
} else {
analogWrite(red_pin, 0);
analogWrite(green_pin, 0);
analogWrite(blue_pin, 0);
}
delay(1000);
}
void interruptRoutine() { isr_flag = 1; }
void handleGesture() {
if (apds.isGestureAvailable()) {
switch (apds.readGesture()) {
case DIR_UP: Serial.println("위"); onOff_flag = 1; break;
case DIR_DOWN: Serial.println("아래"); onOff_flag = 0; break;
case DIR_LEFT: Serial.println("왼쪽");
if (onOff_flag == 1) {
colorNumber = (colorNumber > 0) ? colorNumber - 1 : 5;
Serial.println(colorNumber);
}
break;
case DIR_RIGHT: Serial.println("오른쪽");
if (onOff_flag == 1) {
colorNumber = (colorNumber < 5) ? colorNumber + 1 : 0;
Serial.println(colorNumber);
}
break;
case DIR_NEAR: Serial.println("가까이"); break;
case DIR_FAR: Serial.println("멀리"); break;
default: Serial.println("없음");
}
}
}