BASIC4MCU | 질문게시판 | 답변 : 아두이노 delay를 millis로 바꾸고 싶습니다.
페이지 정보
작성자 master 작성일2022-06-17 11:11 조회213회 댓글0건본문
초음파 센서를 이용해 거리가 가까울수록 진동모터가 더 강하고 빠르게 진동하며
수위센서에 따라 스피커 소리의 세기와 빠르기가 증가하는 장치를
아두이노로 만들려고 합니다.
아래의 코드가 에러 없이 돌아감에도 불구하고
의도와 다르게 작동되어 조사해보니
여러 실행을 할 떄엔 delay 대신 millis 를 사용해야 하는 것 같더라고요,
근데 어떻게 적용해야할 지 잘 모르겠습니다.. 도와주세요..
//수위센서 - 스피커
int Sound_Sensor=A1;
int Sensor_val;
//
void setup() {
Serial.begin(9600);
//초음파센서 - 진동모터
pinMode(2,OUTPUT); pinMode(3,INPUT);
}
void loop() {
//초음파센서 - 진동모터
digitalWrite(2,1); delayMicroseconds(10); digitalWrite(2,0);
long duration=pulseIn(3,HIGH); if(duration==0)return;
long distance=duration/58.2;
Serial.println(String("distance: ")+distance);
if(distance<50){ analogWrite(11,250); delay(1000); analogWrite(11,0); delay(10*distance); }
//----------------------
//수위센서 - 스피커
Sensor_val=analogRead(Sound_Sensor);
if (Sensor_val>600){ tone(8,1500,20); delay(20); noTone(8); delay(100000/Sensor_val); }
else if(Sensor_val>400){ tone(8,1000,20); delay(20); noTone(8); delay(100000/Sensor_val); }
}
초음파와 수위센서를 나누어서 각각의 처리 시간을 생각해보세요
//초음파센서 - 진동모터
digitalWrite(2,1); delayMicroseconds(10); digitalWrite(2,0);
long duration=pulseIn(3,HIGH); if(duration==0)return;
long distance=duration/58.2;
Serial.println(String("distance: ")+distance);
if(distance<50){ analogWrite(11,250); delay(1000); analogWrite(11,0); delay(10*distance); }
10us는 무시하고,50cm 이상일 때는 딜레이가 없고50cm 미만일 때는 1000ms가 가장 길고, 3cm=300ms, 49cm=490ms로 적지 않은 딜레이입니다.
50cm일 때에도 50ms 정도의 딜레이를 줘야합니다.
딜레이가 적으면 엉터리 거리값을 측정하게 됩니다.
100ms 이상이 측정오차가 적습니다.
if(distance<50){ analogWrite(11,250); delay(1000); analogWrite(11,0); delay(10*distance); }
else delay(100);50 이상일 때도 딜레이를 주는 것이 좋겠죠//----------------------
//수위센서 - 스피커
Sensor_val=analogRead(Sound_Sensor);
if (Sensor_val>600){ tone(8,1500,20); delay(20); noTone(8); delay(100000/Sensor_val); }
else if(Sensor_val>400){ tone(8,1000,20); delay(20); noTone(8); delay(100000/Sensor_val); }
tone에서 40ms 딜레이가 있고1023에서 delay(98)400에서 delay(250)수위센서 측정값에 따른 98~250ms 범위의 딜레이가 있습니다.//----------------------
시간제어로 이런 복잡한 제어를 만들 수는 있겠지만 필요이상으로 코드가 복잡해지게 됩니다.
센서 두 가지를 합해서 딜레이를 정해야겠습니다.1. 거리값 50cm 미만이고 수위센서 400 이상이면 ==> 진동모터ON, tone ON, 딜레이는 초음파센서 딜레이2. 거리값 50cm 미만이고 수위센서 400 미만이면 ==> 진동모터ON, 딜레이는 초음파센서 딜레이3. 거리값 50cm 이상이고 수위센서 400 이상이면 ==> tone ON, 딜레이는 수위센서 딜레이4. 거리값 50cm 이상이고 수위센서 400 미만이면 ==> 100ms 딜레이int Sound_Sensor=A1;int Sensor_val;//void setup() {Serial.begin(9600);//초음파센서 - 진동모터pinMode(2,OUTPUT); pinMode(3,INPUT);}void loop() {digitalWrite(2,HIGH); delayMicroseconds(10); digitalWrite(2,LOW);long duration=pulseIn(3,HIGH); if(duration==0)return;long distance=duration/58.2;Serial.println(String("distance: ")+distance);//----------------------Sensor_val=analogRead(Sound_Sensor);//----------------------if((distance<50)&&(Sensor_val>=400)){analogWrite(11,250);if(Sensor_val>600)tone(8,1500);else tone(8,1000);delay(1000); analogWrite(11,0); noTone(8); delay(10*distance);}else if((distance<50)&&(Sensor_val<400)){analogWrite(11,250); delay(1000); analogWrite(11,0); delay(10*distance);}else if((distance>=50)&&(Sensor_val>=400)){if(Sensor_val>600)tone(8,1500,40);else tone(8,1000,40);noTone(8); delay(100000/Sensor_val);}else{ delay(100); }}
댓글 0
조회수 213등록된 댓글이 없습니다.