게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
버튼으로 led제어 하는 코드에서 궁금한게 있습니다
게시물ID : programmer_18603짧은주소 복사하기
작성자 : 스물두울
추천 : 0
조회수 : 428회
댓글수 : 3개
등록시간 : 2016/10/04 03:36:24
옵션
  • 본인삭제금지
<코드>
#define led 2
#define button 13
int val=0;                     //변수  val은 digitalRead();의 결과를 저장한다.
int state=0;

void setup(){
pinMode(led,OUTPUT);
pinMode(button,INPUT);
}

void loop(){
val=digitalRead(button);    // digitalRead(button);의 값 저장

if(val == HIGH){  // if(digitalRead(buttin) == HIGH) 라면 {~}문장 실행해라. //한번 클릭했을 때
state= 1-state;   // int state =0; 이므로 0=1-0;  > 0=1; 이되는데 ['='의 의미는 내 뒤에 오는 결과를 앞의 변수에 대입하라는 뜻이므로 ]state값은 1이된다. 

//버튼을 한번 더 클릭하면 처음 클릭으로 인해 state값은 1이므로 1=1-1 > 1=0 > state 값은 0이 된다. > 따라서 버튼을 한번더 클릭하면 led는 LOW상태가 된다.
//**state에는 0과 1의 값만 들어갈 수 있다.
}

if(state ==1){
digitalWrite(led,HIGH);
}else{
digitalWrite(led,LOW);
}
}

​                                                                                                                                                                                         
​이렇게 하면 버튼을 누를때 마다 정확하게 on /off 가 되지 않는다. 
버튼이 눌러진 그 순간을 정확히 감지하여 on /off 상태로 되게 해야한다.
>int old_val; (이전 val값)을 넣어 현재 버튼(val)값과 이전 버튼(old_val)값을 비교하자.
버튼이 LOW에서 HIGH (버튼을 누른후 손을 떼었다가[LOW] 다시 눌렀을 때[HIGH])가 되었을 때 LED값이 변하게 해야한다.
                                                                                                                                                                                         
​<코드2>
​#define led 13
#define button 2
int val=0;
int old_val=0;   //변수 val의 이전상태를 저장한다.
int state=0;

void setup(){
pinMode(led, OUTPUT);
pinMode(button, INPUT);
}

void loop(){
val=digitalRead(button);  // digitalRead(button);의 값 저장
if(val==HIGH)&&(old_val==LOW){//이전에 버튼을 누르고 손뗌(LOW) 새로 버튼을 누름(HIGH)이라면 state문장 실행
state=1-state;  // state값 도출
delay(10); //10ms 대기 후 아래 if문 코드 실행          //변경을 감지한후 대기하는 시간을 넣으면 버튼을 완전히 누르지 않았을 때 나타나는 가짜신호인 바운싱을 방지할 수 있다.
}

if(state==1){
digitalWrite(led,HIGH);
}else{
digitalWrite(led,LOW);
}
}
 
-------------------------------------------------------------------------------------------------------------------------------
여기까지는 버튼 1개를 가지고 led전구 1개를 제어하는 코드인데요.
버튼을 누르면 켜졌다가 다시 누르면 꺼지는 코드입니다.
옆에 설명적어 놓은건 나중에 봐도 알아볼 수 있게 정리해서 이해한대로 적어 놓은거에요.
여기까지는 잘 됬고요. 이걸 응용해서 같은 효과를 버튼 2개와 led2개를 이용해서 해보려고 했습니다.
-------------------------------------------------------------------------------------------------------------------------------
 
 
int led1=6;
int led2=7;
int key1=12;
int key2=13;
int val1=0;
int val2=0; //digitaRead(key2)값 저장

int old_val1=0;
int old_val2=0; //이전의 digitaRead(key2)값 저장
int state1=0;
int state2=0;

void setup(){
  pinMode(led1,OUTPUT);
  pinMode(led2,OUTPUT);
  pinMode(key1,INPUT);
  pinMode(key2,INPUT);
}
 
void loop(){
  val1=digitalRead(key1);
  val2=digitalRead(key2);
 
    if((val1==HIGH)&&(old_val1==LOW)){  //현재의 버튼값과 이전의 버튼값을 비교했을 때 값이 달라졌나?
 state1=1-state1;  //0=1-0 >1
 delay(10);
    }
    if((val2==HIGH)&&(old_val2==LOW)){
      state2=1-state2; //0=1-0>1
      delay(10);
    }
  
 
  if(state1==HIGH){
    digitalWrite(led1,HIGH);
  }else{
    digitalWrite(led1,LOW);
  }
    if(state2==HIGH){
    digitalWrite(led2,HIGH);
  }else{
    digitalWrite(led2,LOW);
  }
}
 
 
위에 적은 것 처럼 버튼 2개와led2개를 이용한 코드가 이건데요.
작동은 잘 됬는는데 코드중에서 잘 이해가 안가는 부분이 있어서요

    if((val1==HIGH)&&(old_val1==LOW)){  //현재의 버튼값과 이전의 버튼값을 비교했을 때 값이 달라졌나?
 state1=1-state1;  //0=1-0 >1
 delay(10);
 
이부분에서 state값이 원래 0이였는데 1로 변해서
 
 if(state1==HIGH){       <<여기서 state1이 아니라 '1'이 들어가야된다고 생각했거든요 
    digitalWrite(led1,HIGH);
  }else{
    digitalWrite(led1,LOW);
  }
 
처음에는 1을 넣었는데 오류가 나서 state1로 바꿔 넣은건데 왜 1은 안되고 state1인지 잘 모르겠어요 ㅠㅠ
버튼 하나로 할때는 1이 맞았는데 왜 버튼 두개일때는 아닌가욤.... ㅠㅠ?
너무 길죠 ㅠㅠㅠ 죄송합니다.
너무 장황하게 써놔서 이해가 가실지 모르겠네요 ㅠㅠㅠ....
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호