보통의 아두이노의 입력 카테고리(디지털, 아날로그)는 변수를 생성해 읽어드린 값을 저장해 줍니다.
또한, digitalRead() 함수는 지정한 디지털 입력핀의 값을 읽어옵니다. 읽어온 입력값은 HIGH(1) 또는 LOW(0) 두 가지 중 하나의 값입니다. 입력핀은 앞서 pinMode() 함수를 사용하여 입력모드로 설정되어 있어야합니다.
위에 제공한 예시 소스를 구성하고 업로드 후에 동작사항을 확인해 보세요.
내장 LED (LED_BUILTIN) 에 불이 들어오나요?
정상동작이 되지 않습니다. 이유는 바로 스위치의 특성 때문인데요.
채터링 [chattering]
스위치의 하드웨어 특성 중 하나인 채터링은 스위치를 눌렀을 때 스위치 연결 핀에 불안정한 신호가 발생하는 현상을 의미합니다. 이 채터링 현상은 스위치의 접촉이 닫히는 과정에서 발생할 수 있으며, 짧은 시간 동안 스위치 연결 핀이 빠르게 ON과 OFF를 반복하여 신호를 보낼 수 있습니다.
그럼 이러한 현상을 해결할 수 있는 방법은 무엇이 있을까요?
크게 2가지가 있습니다.
1. 디바운스[debounce] : 짧은 시간에 여러번 스위치의 상태를 확인하는 방법을 의미합니다. 2. 하드웨어 혹은 소프트웨어의 풀업[PULLUP] & 풀다운[PULLDOWN] 셋팅
우선 디바운스 설정 방법 입니다.
아두이노 스케치 프로그램에서 파일 -> 예제 -> 02.Digital -> Debounce 선택하시면 됩니다.
const int buttonPin = 2; // 버튼 핀 번호
const int ledPin = 13; // LED 핀 번호
boolean ledState = HIGH; // 현재 LED 상태를 초기 설정합니다. (켜진 상태)
boolean buttonState; // 현재 버튼 상태를 저장합니다. (기본적으로 LOW)
boolean lastButtonState = LOW;// 이전 버튼 상태를 저장합니다.
unsigned long lastDebounceTime = 0; // 버튼 디바운스를 위한 시간 변수
unsigned long debounceDelay = 50; // 디바운스 지연 시간 (50ms)
void setup() {
pinMode(buttonPin, INPUT); // 버튼 핀을 입력으로 설정합니다.
pinMode(ledPin, OUTPUT); // LED 핀을 출력으로 설정합니다.
digitalWrite(ledPin, ledState); // 초기 LED 상태를 설정합니다. (켜진 상태)
}
void loop() {
int reading = digitalRead(buttonPin); // 버튼 핀의 상태를 읽어옵니다.
if (reading != lastButtonState) { // 버튼 상태가 이전 상태와 다를 경우
lastDebounceTime = millis(); // 현재 시간을 기록합니다.
}
if ((millis() - lastDebounceTime) > debounceDelay) { // 디바운스 지연 시간이 경과한 경우
if (reading != buttonState) { // 버튼 상태가 이전 상태와 다를 경우
buttonState = reading; // 버튼 상태를 업데이트합니다.
if (buttonState == HIGH) { // 버튼이 눌린 상태일 경우
ledState = !ledState; // LED 상태를 반전시킵니다. (ON <-> OFF)
}
}
}
digitalWrite(ledPin, ledState); // LED 상태를 출력합니다.
lastButtonState = reading; // 이전 버튼 상태를 업데이트합니다.
}
다음으로 풀업 저항 설정 방법 입니다.
풀업 저항 설정 방법은 크게 2가지가 있습니다.
1. 하드웨어 셋팅
1. 스위치 입력단자(D7)번에 저항(10K ohm) 연결 후 2. 저항의 반대쪽은 5V 전압을 연결해주면 됩니다.
2. 소프트웨어 셋팅
const int switchPin = 7; // 스위치 연결핀
const int ledPin = 13; // LED 연결핀
void setup() {
pinMode(switchPin, INPUT_PULLUP); // 스위치핀을 입력으로
pinMode(ledPin, OUTPUT); // LED핀을 출력으로
Serial.begin(9600);
}
void loop() {
int switchState = digitalRead(switchPin); // 스위치핀 읽기
Serial.println(switchState);
if (switchState == HIGH) {
digitalWrite(ledPin, HIGH); // 스위치 ON시 LED 켜기
}
else {
digitalWrite(ledPin, LOW); // 스위치 OFF시 LED 끄기
}
}