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

TODAY845 TOTAL607,641
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


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

페이지 정보

작성자 master 작성일2018-03-17 11:44 조회2,094회 댓글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

조회수 2,094

등록된 댓글이 없습니다.

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

게시물 검색

2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2017
모바일버전으로보기