BASIC4MCU | 질문게시판 | 답변 : 아두이노 led 부저 스위치
페이지 정보
작성자 master 작성일2023-03-30 19:14 조회565회 댓글4건본문
//
#define BUZ_PIN 13
//
int R_LED[3] ={11,10, 9};
int B_LED[3]={ 6, 5, 4};
int Btn[3] ={12, 7, 3};
//
int rCnt=0,bCnt=0;
bool R_run=0,B_run=0,BUZ_run=0;
bool R_key=0,B_key=0,BUZ_key=0;
//
unsigned long previousTime=0;
//
void setup(){
Serial.begin(9600);
for(int i=0;i<3;i++){ pinMode(R_LED[i],OUTPUT); pinMode(B_LED[i],OUTPUT); pinMode(Btn[i],INPUT_PULLUP); }
pinMode(BUZ_PIN,OUTPUT);
}
//
void loop(){
unsigned long t=millis();
if(t-previousTime>=300){ previousTime=t; // 300ms마다 실행
if(digitalRead(Btn[0])==0){ if(R_key ==0){ R_key =1; R_run !=R_run; } } else{ if(R_key )R_key =0; }
if(digitalRead(Btn[1])==0){ if(B_key ==0){ B_key =1; B_run !=B_run; } } else{ if(B_key )B_key =0; }
if(digitalRead(Btn[2])==0){ if(BUZ_key==0){ BUZ_key=1; BUZ_run!=BUZ_run; } } else{ if(BUZ_key)BUZ_key=0; }
//--------------------------------------------------------------
if(R_run){
for(int i=0;i<3;i++)digitalWrite(R_LED[i],0); // all off
digitalWrite(R_LED[rCnt],1);
if(++rCnt)rCnt=0;
}
else for(int i=0;i<3;i++)digitalWrite(R_LED[i],0); // all off
//--------------------------------------------------------------
if(B_run){
for(int i=0;i<3;i++)digitalWrite(B_LED[i],0); // all off
digitalWrite(B_LED[bCnt],1);
if(++bCnt)bCnt=0;
}
else for(int i=0;i<3;i++)digitalWrite(R_LED[i],0); // all off
//--------------------------------------------------------------
if(BUZ_run){
digitalWrite(BUZ_PIN,1);
}
else digitalWrite(BUZ_PIN,0); // off
}
}
첫번째 버튼은 빨간led 3개가 0.3초간 순차점등되었다가 소등되는것을 반복
두번재 버튼은 부저가 3단계의 음계가 순차적으로 0.3초간 울리는것을 반복
세번째 버튼은 파란 led 3개가 순차적으로 0.3초간 점등되었다가 소등되는것을 반복
그리고 각 버튼을 다시 한번 누르면 반복을 중지함.
제 목적은 이렇습니다. 그런데 현재 문제는 각 버튼의 기능들은 원하는대로 됐습니다.
그러나 첫번째 버튼을 눌러 기능을 동작하고 이어서 두번째 버튼을 누르면 두번째버튼의기능이 같이 반복해야하는데
반응이 없습니다.
또한 첫번째 버튼을 다시 누르면 반복동작을 멈춰야하는데 멈추질않습니다.
delay()때문이라 millis()를 써서 병행하게 해야하는데 어떻게 써야할지 감이 안잡힙니다.
댓글 4
조회수 565김똘님의 댓글
김똘 작성일
해당 코드를 적용하면 스위치가 반응하지않습니다.
사용하는건 아두이노 우노입니다.
master님의 댓글
master
다시 해보세요
김똘님의 댓글
김똘
푸시스위치를 다시 눌러도 반응이 없습니다. 혹여나 보드 문제인가해서 질문코드를 다시 적용하면 작동합니다.
master님의 댓글
master
bool R_key=0,B_key=0,BUZ_key=0;
//
void setup(){
Serial.begin(9600);
pinMode(12,INPUT_PULLUP);
pinMode( 7,INPUT_PULLUP);
pinMode( 3,INPUT_PULLUP);
}
//
void loop(){
if(digitalRead(12)==0){ if(R_key==0){ R_key=1; Serial.println("R_key 0"); } }
else{ if(R_key){ R_key=0; Serial.println("R_key 1"); } }
//
if(digitalRead(7)==0){ if(B_key==0){ B_key=1; Serial.println("B_key 0"); } }
else{ if(B_key){ B_key=0; } Serial.println("B_key 1"); }
//
if(digitalRead(3)==0){ if(BUZ_key==0){ BUZ_key=1; Serial.println("BUZ_key 0"); } }
else{ if(BUZ_key){ BUZ_key=0; Serial.println("BUZ_key 1"); } }
//
delay(300);
}
버튼 체크는 간단한 코드로 하면 됩니다.
누를 때 0이 되는지 떼었을 때 1이 되는지 확인하세요