BASIC4MCU | 질문게시판 | 답변 : 답변 : 스위치 입력제어 궁금해요
페이지 정보
작성자 master 작성일2019-01-08 13:15 조회11,244회 댓글5건본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2019-01-08 오후 1:20:39// by Ok-Hyun Park//int sw[] ={2,3, 4}; // 스위치 핀int led[]={8,9,10}; // led 핀//int count=0,mode=0;bool flag=0;long t;//void setup(){for(int i=0;i<3;i++){pinMode(sw[i],INPUT_PULLUP); // 스위치 입력으로 설정pinMode(led[i],OUTPUT); // LED 출력으로 설정}t=millis();}//void loop(){//스위치 입력int n=0;if(digitalRead(sw[0])==LOW)n|=1;if(digitalRead(sw[1])==LOW)n|=2;if(digitalRead(sw[2])==LOW)n|=4;//------------------------------------//1번 스위치만 입력하는 것을 체크if(n==1){if(flag==0){ flag=1; t=millis();if(++count>11)count==0;//if (count< 5)mode=0;else if(count<11)mode=1;else mode=2;}}else{ flag=0; }//------------------------------------if(mode==0){digitalWrite(led[0],0); digitalWrite(led[1],0); digitalWrite(led[2],0);}else if(mode==1){digitalWrite(led[1],0); digitalWrite(led[2],0);if(millis()-t>5000){ t=millis();digitalWrite(led[0],!digitalRead(led[0]));}}else{ // mode=2;digitalWrite(led[0],0); digitalWrite(led[2],0);if(millis()-t>5000){ t=millis();digitalWrite(led[1],!digitalRead(led[1]));}}//------------------------------------delay(50);}
댓글 5
조회수 11,244스캉이님의 댓글
스캉이 작성일
int n=0;
if(digitalRead(sw[0])==LOW)n|=1;
if(digitalRead(sw[1])==LOW)n|=2;
if(digitalRead(sw[2])==LOW)n|=4;
//------------------------------------
//1번 스위치만 입력하는 것을 체크
if(n==1){
if(flag==0){ flag=1; t=millis();
위 구문한 주석으로 설명좀 부탁드려도 될까요?
master님의 댓글
master
비트 연산을 공부한 후에 다시 분석해보세요
스캉이님의 댓글
스캉이 작성일
1번 스위치와 2번 스위치 입력이 들어왔다는 체크를
if((n==1) && ((n==2){
으로 하면 되나요?
신호가 처음 들어올때는 동작이 잘 넘어갑니다.
다시 신호를 넣으니까 상태 변화가 없어 리셋 스위치를 누르면 다시 상태가 변화합니다.
1번 신호가 2초정도 끊어졌다 다시 들어올때도 동작시킬수 있을까요?
master님의 댓글
master 작성일
if(n==3){
1번 스위치와 2번 스위치 입력이 들어왔다는 체크는 위처럼 하면 됩니다.
스캉이님의 댓글
스캉이
스위치 1번이 들어오면 계속 1번 LED을 깜박이고 스위치 1번과 2번이 들어오면
2번 LED를 5회 깜박이다 0번 LED를 계속 깜박이게 하려고 조금 수정해봤습니다.
들어오는 입력을 카운터가 다 되기전에 바꾸니 모드가 바뀌지 않고 계속 0번 LED가 조금더 빠른 속도로 깜박이거나 아예 입력을 받지 않고 멈춰버립니다.
보드에 있는 리셋을 누르면 초기상태는 돌아옵니다.
int sw[] ={2,3, 4}; // 스위치 핀
int led[]={8,9,10}; // led 핀
//
int count=0,mode=0;
bool flag=0;
long t;
//
void setup(){
for(int i=0;i<3;i++){
pinMode(sw[i],INPUT_PULLUP); // 스위치 입력으로 설정
pinMode(led[i],OUTPUT); // LED 출력으로 설정
}
t=millis();
}
//
void loop(){
//스위치 입력
int n=0;
if(digitalRead(sw[0])==LOW)n|=1;
if(digitalRead(sw[1])==LOW)n|=2;
if(digitalRead(sw[2])==LOW)n|=4;
//------------------------------------
//1번 스위치만 입력하는 것을 체크
if(n==1){
if(flag==0){ flag=1; t=millis();
if(++count>11)count==0;
//
/* if (count<5)mode=0;
else if(count<11)mode=1;*/
else mode=0;
}
}
if(n==3){
if(flag==0){ flag=1; t=millis();
if(++count>11)count==0;
//
if (count<5)mode=0;
else if(count<30)mode=1;
else mode=2;
}
}
else{ flag=0; }
//------------------------------------
if(mode==0){
digitalWrite(led[0],0); digitalWrite(led[2],0);
if(millis()-t>500){ t=millis();
digitalWrite(led[1],!digitalRead(led[1]));
}
}
else if(mode==1){
digitalWrite(led[0],0); digitalWrite(led[1],0);
if(millis()-t>500){ t=millis();
digitalWrite(led[2],!digitalRead(led[2]));
}
}
else{ // mode=2;
digitalWrite(led[1],0); digitalWrite(led[2],0);
if(millis()-t>500){ t=millis();
digitalWrite(led[0],!digitalRead(led[0]));
}
}
//------------------------------------
delay(50);
}