아두이노 > 스위치 엣지 검출

TODAY19 TOTAL237,713
사이트 이용안내
Login▼/회원가입
포럼 동영상강좌 회원가입


BASIC4MCU 후원업체 최신 정보

BASIC4MCU | 아두이노 | 아두이노 | 스위치 엣지 검출

페이지 정보

작성자 master 작성일2018-03-17 11:44 조회692회 댓글0건

본문

	

 

 

// DateTime : 2018-03-17 오전 11:08:21
// by Ok-Hyun Park
int buttonPin=8;
int ledPin=13;
//
int old_key=0,new_key=0;
//
void setup(){
  pinMode(ledPin,OUTPUT);
  pinMode(buttonPin,INPUT_PULLUP);
}
//
void loop(){
  new_key=digitalRead(buttonPin);
  if(old_key!=new_key){
    old_key=new_key;
    if(new_key==LOW){ // 하강엣지
      digitalWrite(ledPin,HIGH);
    }
    else{ // 상승엣지
      digitalWrite(ledPin,LOW);
    }
  }
}

old_key 변수를 하나 더 추가해서 

if(old_key!=new_key){ 

두 변수가 달라졌을 때만 실행 합니다. 

즉, 상승엣지와 하강엣지를 체크하기 위한 예제입니다. 

엣지 검출은 중요한데요

키를 계속 누르고 있더라도 한 번만 실행 시킬 때 유용합니다.

 

회로에서는 누를 때 스위치가 0이 되도록 회로가 구성되어 있으므로

하강엣지만 사용하면 되겠습니다.

 

 

// DateTime : 2018-03-17 오전 11:13:17
// by Ok-Hyun Park
int buttonPin=8;
int ledPin=13;
//
int old_key=0,new_key=0;
//
void setup(){
  pinMode(ledPin,OUTPUT);
  pinMode(buttonPin,INPUT_PULLUP);
}
//
void loop(){
  new_key=digitalRead(buttonPin);
  if(old_key!=new_key){
    old_key=new_key;
    if(new_key==LOW){ // 하강엣지
      digitalWrite(ledPin,!digitalRead(ledPin)); // LED 출력 토글
    }
  }
}

 

digitalWrite(ledPin,!digitalRead(ledPin)); // LED 출력 토글 

초보자라면 이 문장이 어렵겠습니다.


아두이노 우노나 메가처럼 AVR을 사용하는 보드는 출력을 읽을 수 있습니다.

digitalRead(ledPin)

LED 출력핀을 읽는 것이죠


!는 논리 부정연산자로서, 참은 거짓으로 바꾸고, 거짓은 참으로 바꿉니다.

1은 0으로 바꾸고, 0은 1로 바꾸므로

출력 상태가 토글(반전) 됩니다.


스위치 누를 때마다 출력이 변경 되는 것이죠

 

// 

엣지 검출 방법은 이 예제 말고도 더 있습니다만

하나만 잘 알고 있어도 되겟죠

 

채터링에 의해서 여러번 동작하는 경우에는

104(0.1uF) 커패시터를 스위치에 병렬로 연결하는 것이 일반적입니다만

그래도 해결되지 않는다면 

소스코드에 딜레이를 추가해주면 됩니다.

 

// DateTime : 2018-03-17 오전 11:55:13
// by Ok-Hyun Park
int buttonPin=8;
int ledPin=13;
//
int old_key=0,new_key=0;
//
void setup(){
  pinMode(ledPin,OUTPUT);
  pinMode(buttonPin,INPUT_PULLUP);
}
//
void loop(){
  new_key=digitalRead(buttonPin);
  if(old_key!=new_key){
    delay(50); //채터링 방지용 딜레이
    old_key=new_key;
    if(new_key==LOW){ // 하강엣지
      digitalWrite(ledPin,!digitalRead(ledPin)); // LED 출력 토글
    }
  }
}

 

 스위치 종류나 상태에 따라서 딜레이 값을 더 큰 값으로 줘야지 채터링이 잡히기도 힙니다.

 

 

댓글 0

조회수 692

등록된 댓글이 없습니다.

아두이노HOME > 아두이노 > 전체 목록

게시물 검색

Privacy Policy
MCU BASIC ⓒ 2017