BASIC4MCU | 질문게시판 | 답변 : 버튼을 길게 누르면 리셋이 잘 안되는데요. 도와주세요.
페이지 정보
작성자 master 작성일2019-01-24 10:24 조회7,498회 댓글4건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=7539
작성일
작성일
본문
if(digitalRead(BTN)==HIGH){delay(700); // 300ms 이상 눌렀다면if(count<8){ mode=1; flag=0; } // 800ms 이하else{ // 800ms 이상 초기모드mode=0; flag=0; // 아무 것도 하지 않고while(!digitalRead(BTN)); // 버튼 입력을 기다림}}
count를 증가하는 곳이 없습니다.
//
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2019-01-24 오전 10:30:10// by Ok-Hyun Park////버튼을 길게 800ms 이상 누르면 초기 상태로 돌아가려고 하는데.동작을 하지 않습니다.//#define U16 unsigned intint R=6,G=9,B=10,BTN=2,pump=7;//int reading,mode=0,val=0,count=0,flag=0;long lastChangeTime=0,shortPressTime=600,longPressTime=1000;float voltage=0;//int flag=0;//void setup(){pinMode(BTN,INPUT);pinMode(charge,INPUT_PULLUP);pinMode(pump,OUTPUT);pinMode(R,OUTPUT);pinMode(G,OUTPUT);pinMode(B,OUTPUT);}//void setColor(U16 r1,U16 g1,U16 b1,U16 rate){float f=rate/255.0;r1*=f; g1*=f; b1*=f;analogWrite(R,r1); analogWrite(G,g1); analogWrite(B,b1);}//void loop(){val=analogRead(0);voltage=(float)val*5/1024.0;//--------------------------------------------if(digitalRead(BTN)==HIGH){if(flag==0){ flag=1; count=0; }count++;}else{if(flag){ flag=0;if(count<8){ mode=1; flag=0; } // 800ms 이하else { mode=0; flag=0; } // 800ms 이상}}//delay(100);//--------------------------------------------if(mode==1){val=analogRead(0);voltage=(float)val*5/1024.0;if(voltage>=1.7){ // 밧데리 전압이 3.5V이하는 제한...A0에 들어오는 실제전압값이 설정값 1.72면 같다고 인식해서 충전필요상태로 표시if(flag==0){ flag=1;digitalWrite(pump,HIGH);for(int k=0; k<60; k++){for(int i=0; i<=255; i++){ setColor(255,0,127,i); delayMicroseconds(3800); }for(int i=255; i>=0; i--){ setColor(255,0,127,i); delayMicroseconds(3800); }}digitalWrite(pump,LOW);for(int k=0; k<457*8; k++){for(int i=0; i<=255; i++){ delayMicroseconds(3800); }for(int i=255; i>=0; i--){ delayMicroseconds(3800); }}digitalWrite(pump,HIGH);for(int k=0; k<30; k++){for(int i=0; i<=255; i++){ setColor(255,0,127,i); delayMicroseconds(3800); }for(int i=255; i>=0; i--){ setColor(255,0,127,i); delayMicroseconds(3800); }}digitalWrite(pump,LOW);}}else{if(flag==0){ flag=1;digitalWrite(pump,LOW);for(int k=0; k<3; k++){for(int i=0; i<=255; i++){ setColor(255,0,0,i); delayMicroseconds(3800); }for(int i=255; i>=0; i--){ setColor(255,0,0,i); delayMicroseconds(3800); }}}}}}
댓글 4
조회수 7,498스캉이님의 댓글
스캉이 작성일pump가 동작중일때 버튼을 길게 눌러도 계속 동작을 합니다. 어디가 문제인지요?
master님의 댓글
master
for(int k=0; k<457*8; k++){ // 1945.6ms*457*8=7113113.6ms=7113.1136sec=약118분
for(int i=0; i<=255; i++){ delayMicroseconds(3800); } // 3.8ms*256=972.8ms
for(int i=255; i>=0; i--){ delayMicroseconds(3800); } // 3.8ms*256=972.8ms
}
이 for문 하나만 118분걸립니다.
반복문 실행 할 때는 스위치 체크를 하지 않습니다.
스캉이님의 댓글
스캉이 작성일딜레이 있어서 끝날때까지 버튼 인식을 하지 않는다는 애기시죠? 인터럽터를 쓰니까 바로 종료되어 버리는 문제가 있어서요
master님의 댓글
master
간단한 제어가 아닙니다.
공부를 많이 하셔야겠습니다.