2013. 12. 22. 14:00

푸시버튼은 눌렀을 때 인풋이 보드로 들어가는 가장 기본이 되는 센서입니다.

이 포스팅에서는 버튼을 눌렀을 때 LED에 불이 들어오는 동작을 통해 푸시버튼을 사용해 봅시다.

 

연관글 영역

 

 

1. 보드 구성

간단하면서도 간단하지 않은 배선입니다 ㅎㅎ

 

2번 핀을 스위치의 입력으로 사용합니다.

7번 핀을 LED 출력으로 사용합니다.

 

저항은 10k를 썼습니다.

 

 

2. 펌웨어 작성

스위치가 눌리면 LED가 들어오게 해야 하는데.....

직접 스위치에 배선하지 않고 아두이노에 연결하여 값을 받아 LED를 켜게 되면 문제가 하나 있습니다.

아두이노의 반복 주기에 따라 스위치값을 읽지 못하거나 생각했던것 보다 여러 번 작동할 수 있죠.

#define LED2
#define BTN 7
int m_nBtn = 0;

void setup()
{
    Serial.begin(9600);
    pinMode(LED, OUTPUT);
    pinMode(BTN, INPUT);
} 

void loop()
{
    m_nBtn = digitalRead(BTN);
    Serial.println(m_nBtn);
    if (HIGH == m_nBtn)
    {
        digitalWrite(LED, HIGH);
    }
    else
    {
        digitalWrite(LED, LOW);
    }
    
    delay(300);
}

 

딜래이를 더 주거나 덜 주거나 하여 스위치값을 어떻게 읽고 있는지 확인해 볼 수 있습니다.

 

 

3. 테스트

스위치를 눌러 봅시다.

 

 

4. 응용해 보기

푸시버튼을 누를 때마다 LED 값이 밝아지도록 해봅시다.

혹시 모르니 LED 핀을 3번으로 옮기고 다음과 같이 펌웨어를 작성합니다.

#define LED 3 
#define BTN 7 

int m_nBtn = 0;
int m_nCount = 0;
boolean m_bButton = false;
int m_nLed = 0;  

void setup()     
{      
    pinMode(LED, OUTPUT); 
    pinMode(BTN, INPUT);  
    Serial.begin(9600);   
}      
void loop()      
{      
    m_nBtn = digitalRead(BTN);
    if (HIGH == m_nBtn)   
    {  
        DataCount(true);  
    }  
    else         
    {  
        DataCount(false); 
    }  

    m_nLed = (m_nCount * 63);
    analogWrite(LED, m_nLed); 
    // analogWrite(LED, 128);
    Serial.println((String)m_nCount + " " + (String)m_nLed);
    delay(10);
}

void DataCount(boolean bPB)
{
    if ((true == bPB) && (false == m_bButton))
    {
        m_bButton = true;
        DataAdd();
    }
    else if ((false == bPB) && (true == m_bButton))
    {
        m_bButton = false;
    }
}

void DataAdd()
{
    ++m_nCount;
    if (5 <= m_nCount)
    {
        m_nCount = 0;
    }
}

 

이제 테스트해 봅시다.

 

 

마무리

처음에는 막막해도 이거 하나하고 나면 길이 보이기 시작합니다.

기초이면서도 중요하다는 것이죠 ㅎㅎㅎ