BASIC4MCU | 질문게시판 | 답변 : 댓글 : millis()? 질문드립니다.
페이지 정보
작성자 master 작성일2022-06-14 20:23 조회855회 댓글1건본문
void disp100(){
for(int i=0;i<5;i++){ // 20ms*5=100ms
pickDigit(1); one(); delay(6);
pickDigit(2); zero(); delay(7);
pickDigit(3); zero(); delay(7);
}
}
//
void disp99(){
for(int i=0;i<10;i++){ // 10ms*10=100ms
pickDigit(2); nine(); delay(5);
pickDigit(3); zero(); delay(5);
}
}
//
int full_flag=0;
//
void loop(){
if (dis<10){ disp100(); } // 100표시
else if(dis<20){ disp99(); } // 99표시
else { delay(100); }
//--------------------------------------------------
digitalWrite(TRIGPIN,1); delayMicroseconds(10); digitalWrite(TRIGPIN,0);
long dur=pulseIn(ECHOPIN,HIGH);
float dis=(float)dur*0.017;
Serial.print(dis); Serial.println("cm");
if(dis<10){
if(full_flag==1){ full_flag=2;
tone(5,530);
for(int i=0;i<10;i++)disp100(); // 100ms*10=1000ms
noTone(5);
}
}
else if(dis<20){
if(full_flag==0){ full_flag=1;
myservo.write(160);
for(int i=0;i<100;i++)disp99(); // 10ms*100=1000ms
myservo.write(20);
}
}
else if(dis>30){ // 30cm 이상 비어있으면 플래그 초기화
full_flag=0;
}
}
루프함수 부분만 수정 한 것입니다.
millis()를 빼버리고 full_flag 상태값을 추적하도록 했습니다.
해당 거리에 도달하면 각각 1회씩만 처리합니다.
서보모터도 1회만 동작하고 부저도 1회만 동작
댓글 1
조회수 855master님의 댓글
master 작성일
초음파센서는 50ms~100ms 인터벌로 읽어야지 거리값 오차가 발생하지 않습니다. (99또는 100을 표시 하거나 딜레이를 추가)
트리거에는 10us 딜레이를 추가해야 합니다.