이번엔 택트스위치로 LED의 밝기를 올리거나 낮추는 프로그램을 만들어보겠습니다.
/*
버튼 + RGB LED
=> 버튼 누른 횟수만큼 밝아지는 LED
*/
#define LED_RED 5
#define LED_GREEN 6
#define LED_BLUE 11
#define BUTTON_UP 13
#define BUTTON_DOWN 12
int currBtnup = 0;
int prevBtnup = 0;
int currBtndown = 0;
int prevBtndown = 0;
int ledValue = 0;
void setup() {
Serial.begin(9600);
pinMode(BUTTON_UP, INPUT);
pinMode(BUTTON_DOWN, INPUT);
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_BLUE, OUTPUT);
// LED 끈상태로 시작
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_BLUE, LOW);
}
void loop() {
//업버튼 구현
currBtnup = digitalRead(BUTTON_UP);
//버튼을 단 한번만 누르기 위한 코드
if (currBtnup != prevBtnup)
{
prevBtnup = currBtnup;
if (currBtnup == 1) {
Serial.println("up button clicked");
ledValue += 30;
// rgb max값인 255를 넘어갔을 때 0으로 돌아가지 않기 위한 코드
if(ledValue >= 240){ledValue = 240;}
Serial.print("ledValue :");
Serial.println(ledValue);
analogWrite(LED_RED, ledValue);
analogWrite(LED_GREEN, ledValue);
analogWrite(LED_BLUE, ledValue);
}
}
//다운버튼 구현
currBtndown = digitalRead(BUTTON_DOWN);
if (currBtndown != prevBtndown)
{
prevBtndown = currBtndown;
if (currBtndown == 1) {
Serial.println("down button clicked");
ledValue -= 30;
if(ledValue <= 0){ledValue = 0;}
Serial.print("ledValue :");
Serial.println(ledValue);
analogWrite(LED_RED, ledValue);
analogWrite(LED_GREEN, ledValue);
analogWrite(LED_BLUE, ledValue);
}
}
}
코드가 살짝 복잡해 보이는데요. 택트스위치를 누르게 되면 펄스에 의해서 또는 기계적인 진동이나 접촉에 의해서 여러번 눌린 것으로 나타나게 됩니다. 이를 해결하기 위해 currBtn과 prevBtn이라는 변수를 만들어 입력을 한번만 받게 만들어 줍니다.
한번 누를 때 ledValue를 +-30으로 설정해서 최대 240, 최소0으로 고정시켜줬는데요.
rgb는 0부터 255까지 범위의 값을 가지기 때문에 이를 초과하면 최소, 최대 값에 고정되지 않고 값이 넘어가버리기 때문에
if(ledValue >= 240){ledValue = 240;}
if(ledValue <= 0){ledValue = 0;}
위 코드를 업버튼 구현코드와 다운버튼 구현코드에 각각 넣어줬습니다.
버튼을 각각 3번씩 눌렀을 때 시리얼 모니터상에는 아래와 같이 표시됩니다.
Serial Monitor |
up button clicked ledValue :30 up button clicked ledValue :60 up button clicked ledValue :90 down button clicked ledValue :60 down button clicked ledValue :30 down button clicked ledValue :0 |
마지막으로 구현 영상입니다.