BASIC4MCU | 질문게시판 | 답변 : LED 밝기 제어를 어떻게 해야할까요...?
페이지 정보
작성자 master 작성일2019-04-25 11:09 조회4,689회 댓글1건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=8339
본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2019-04-25 오전 10:52:21// by Ok-Hyun Park//스위치 하나를 가지고 한번씩 누를때 마다 LED ON/OFF가 되고,스위치를 1초정도 꾹 누르면 밝기 조절모드로 되고,이 상태에서 한번 클릭 시 밝기가 밝아지고 (PWM)다시 여기서 1초 꾹 누르면 이 세팅이 저장되는 코딩을 어떻게 짜야 할까요...?//지금 PWM 사용하는 것 까진 했는데 그 다음이 감이 잘 안잡힙니다...//const int Touch=3,LED=6;//int touchTime=0,lasttouchSave=0,bottonState=0,analogValue;//void setup(){pinMode(Touch,INPUT); pinMode(LED,OUTPUT);}//void loop(){buttonState=digitalRead(Touch);int touchSave=digitalRead(Touch);int bright=digitalRead(Touch);//if(touchSave!=lasttouchSave){if(touchSave==HIGH){touchTime++;lasttouchSave=touchSave;if(touchTime%8==0){ analogValue=255; }if(touchTime%8==1){ analogValue=216; }if(touchTime%8==2){ analogValue=180; }if(touchTime%8==3){ analogValue=144; }if(touchTime%8==4){ analogValue=108; }if(touchTime%8==5){ analogValue= 72; }if(touchTime%8==6){ analogValue= 36; }if(touchTime%8==7){ analogValue= 0; }analogWrite(LED,analogValue);}else{ }delay(10);}lasttouchSave=touchSave;//if(buttonState==HIGH){ analogWrite(LED,analogValue); } else{ analogWrite(LED,0); }}
analogWrite(LED,0);
0번핀을 사용하면 안되고 PWM핀을 사용하세요
기초부터 하나씩 차근차근 만드세요
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2019-04-25 오전 10:55:32// by Ok-Hyun Park//const int Touch=3,LED=6;//int flag=0;//void setup(){pinMode(LED,OUTPUT);}//void loop(){if(digitalRead(Touch)){if(flag==0){ flag=1; delay(50); } // 스위치 누르는 순간 체크}else{if(flag==1){ flag=0; delay(50); } // 스위치 뗀 순간 체크}}스위치를 누르는 순간과 떼는 순간을 체크하기 위해서는 몇가지 방식의 코드가 있고
그 중 어느 한가지라도 완벽하게 이해해서 사용하면 됩니다.
얼마나 오래 눌렀는지는 떼는 순간에 체크해야 합니다.
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2019-04-25 오전 10:58:32// by Ok-Hyun Park//const int Touch=3,LED=6;//int flag=0;long t1,t2;//void setup(){pinMode(LED,OUTPUT);}//void loop(){if(digitalRead(Touch)){if(flag==0){ flag=1; // 스위치 누르는 순간 체크delay(50);t1=millis();}}else{if(flag==1){ flag=0; // 스위치 뗀 순간 체크t2=millis()-t1; // 스위치 누른 시간 계산delay(50);}}//}
1초이상 길게 누르면 모드 변경이 되고
모드는 두 가지입니다.
1. ON/OFF 모드
2. 디밍 모드
짧게 누르는 경우에는
<ON/OFF 모드>에서는
1. 디폴트 OFF 모드로 시작하고
2. OFF 모드에서는 PWM=0
3. ON 모드에서는 analogValue 값을 출력
<디밍 모드>에서는
1. 시스템 시작시 analogValue=0 을 설정하고
2. 누를 때마다 analogValue 값을 36씩 증가
3. analogValue 값이 255을 넘으면 0부터 다시 시작
이런식으로 알고리즘을 만들면 되겠죠
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2019-04-25 오전 11:06:28// by Ok-Hyun Park//const int Touch=3,LED=0;//int flag=0;long t1,t2;//void setup(){pinMode(LED,OUTPUT);}//void loop(){if(digitalRead(Touch)){if(flag==0){ flag=1; // 스위치 누르는 순간 체크delay(50);t1=millis();}}else{if(flag==1){ flag=0; // 스위치 뗀 순간 체크t2=millis()-t1; // 스위치 누른 시간 계산if(t2<1000){ // 짧게 누른 경우}else{ // 길게 누른 경우}delay(50);}}}
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2019-04-25 오전 11:15:45// by Ok-Hyun Park//const int Touch=3,LED=6;//bool flag=0,OnOff=0;long t1,t2;int mode=0,analogValue=0;//void setup(){pinMode(LED,OUTPUT);}//void loop(){if(digitalRead(Touch)){if(flag==0){ flag=1; // 스위치 누르는 순간 체크delay(50);t1=millis();}}else{if(flag==1){ flag=0; // 스위치 뗀 순간 체크t2=millis()-t1; // 스위치 누른 시간 계산if(t2<1000){ // 짧게 누른 경우if(mode==0){ // ON/OFF 모드OnOff^=1; // ON/OFF 토글if(OnOff)analogWrite(LED,analogValue);else analogWrite(LED,0);}else{ // 디밍 모드analogValue+=36;if(analogValue>255)analogValue=0;analogWrite(LED,analogValue);}}else{ // 1초이상 길게 누르면 모드 변경if(++mode>1)mode=0;}delay(50);}}}
댓글 1
조회수 4,689초보왕초보님의 댓글
초보왕초보 작성일감사합니다. 덕분에 제가 몰랐던 부분 막혁던 부분도 알게 되었고 디밍 모드도 알게 되었습니다. 이를 토대로 한번 잘 만들어 보겠습니다.