BASIC4MCU | 질문게시판 | 초음파 지자기 mp3모듈연결질문있습니다.
페이지 정보
작성자 몽룡이 작성일2020-12-02 16:04 조회32,763회 댓글10건본문
제가 구현하고싶은거는
초음파 거리 50cm이하 일때
지가기센서 +100이상일때
두 조건이 모두 만족할시
1) 20초이상 지속될때
경광등
2) 40초이상 지속될때
경광등 + mp3모듈1
3)90초이상 지속될때
경광등 + mp3모듈2
를 구현하고싶은데
void loop()
{
qmc.read(&Mag_Current_x,&Mag_Current_y,&Mag_Current_z);
Mag_Variance_Value = Mag_Initial_Value-Mag_Current_x;
delay(1000);
Serial.print("Mag_Variance_Value: ");
Serial.print(abs(Mag_Variance_Value));
Serial.println();
digitalWrite(trig,LOW);
delayMicroseconds(2);
digitalWrite(trig,HIGH);
delayMicroseconds(10);
digitalWrite(trig,LOW);
Duration = pulseIn (echo, HIGH);
Distance_Value = Duration / 29 / 2;
unsigned long Time_Initial = millis();
Serial.println("ms초: ");
Serial.println(Time_Initial);
Serial.print("Distance_Value: ");
Serial.print(Distance_Value);
Serial.println(" Cm");
Serial.println();
delay(1000);
if (Mag_Variance_Value >= 50 && Distance_Value <= 100)
{
Serial.print("route_1--- ");
Serial.println();
Time_Initial = millis();
Serial.print("CountTime: ");
Serial.print(Time_Initial);
Serial.println();
if (Time_Initial + 2000 >= millis())
{
digitalWrite (relay, HIGH);
}
else if(Time_Initial + 4000 >= millis())
{
digitalWrite (relay, HIGH);
mp3_play (1);
}
else if(Time_Initial + 9000 >= millis())
{
digitalWrite (relay, HIGH);
mp3_next ();
}
}
else
{
Serial.print("route_2--- ");
Serial.println();
digitalWrite (relay, LOW);
Time_Initial = 0;
}
Serial.print("END LOOP");
Serial.println();
delay(1000);
}
루프부분 소스에 이렇게 짯는데 초음파 거리 50cm이하 일때
지가기센서 +100이상일때 이부분도 잘 작동이 안되는것 같습니다ㅠ
댓글 10
조회수 32,763master님의 댓글
master 작성일
if (Mag_Variance_Value >= 50 && Distance_Value <= 100){
초음파 거리 50cm이하 일때, 지가기센서 +100이상일때 // 요구조건
초음파 거리 100cm이하 일때, 지가기센서 +50이상일때 // 코드조건
50 하고 100 을 바꿔 적으면 되겠죠?
몽룡이님의 댓글
몽룡이
if문은 저렇게 적는거 맞나요?? mp3모듈이 작동이 안됩니당 ㅠㅠ
master님의 댓글
master
mp3모듈 작동은 mp3 예제를 공부하세요
if문의 시간계산 조건식 부호가 바뀌어 있습니다.
Serial.println("route_1--- "); Serial.print("CountTime: "); Serial.println(Time_Initial); 이 내용이 시리얼모니터에 출력되면 거리50이하 if문은 작동한 겁니다.
master님의 댓글
master 작성일
long t1;
bool flag=0;
셋업함수 위에서 전역변수로 선언하시고
if문 아래는 아래 코드로 변경해보세요
if(Mag_Variance_Value>=100&&Distance_Value<=50){
if(flag==0){ flag=1;
t1=millis();
Serial.println("route_1--- "); Serial.print("CountTime: "); Serial.println(Time_Initial);
}
//
if (t1+2000<=millis()){digitalWrite (relay,HIGH); }
else if(t1+4000<=millis()){digitalWrite (relay,HIGH); mp3_play (1); }
else if(t1+9000<=millis()){digitalWrite (relay,HIGH); mp3_next (); }
}
else{
if(flag){ flag=0;
Serial.println("route_2--- "); digitalWrite (relay,LOW);
}
}
//
Serial.println("END LOOP");
delay(1000);
}
몽룡이님의 댓글
몽룡이 작성일
선생님,,순차적으로 20초이상이면 경광등, 20초를 지나40초가되면 경광등 mp3 (1) , 40초를 지나 90초가 되면 경광등 mp3 (2)이 되어야 하는데
40초가 지나고 값을 계속 충족해주면 경광등과 mp3(1)이 나오고 그다음 계속 경광등만 돌아갑니다 그래서 값을 충족해주지 않고 센서들이 멈춘 다음 다시 값을 충족해 주면 경광등과 mp3(2)가 나옵니다,,,왜,, 그런걸까요,, 순차적으로,, 바꿀려고 아무리 해봐도 바꿔지지 않네요 ㅠㅠㅠ
몽룡이님의 댓글
몽룡이 작성일또한 40초에서~ 90초로 가는 사이 mp3모듈에서 음성이 계속 나와야 하는데 한번만 음성이 나오고 꺼집니당,,, 또한 90초에서 값을 충족시키지 않을때까지 음성이 나와야 하는데 while문을 써보니 전체가 무한 루프에 걸려서,,, 제가 잘 못하는것 같습니다,,,
master님의 댓글
master 작성일
조건식에 문제가 있군요
//
if (t1+9000<=millis()){digitalWrite (relay,HIGH); mp3_next (); }
else if(t1+4000<=millis()){digitalWrite (relay,HIGH); mp3_play (1); }
else if(t1+2000<=millis()){digitalWrite (relay,HIGH); }
순서를 바꿔서 다시 돌려보세요
몽룡이님의 댓글
몽룡이
이렇게 하니깐 mp3(2)가 나오구 mp3(1)재생 경광등이 나옵니다 ㅜㅜ
master님의 댓글
master
노래가 2개만 있나요?
if (t1+9000<=millis()){digitalWrite (relay,HIGH); mp3_next (); }
이 조건이 계속 성립해서 mp3_next();가 몇번씩 실행 된다면 (2) 다음에 (1)이 실행 될 수도 있을까요?
실제 상태를 상상만으로 답변해드리기가 어렵습니다.
모듈을 가진 분이 직접 해결하셔야합니다.
몽룡이님의 댓글
몽룡이
답변 감사드립니다,,, 출력 할 때 쓰레기값이 자꾸나와서 그것이 원인이 아닐까,,, 생각해서 변수값을 바꿔보려고합니다. 답변감사합니다 많은 도움이 되었습니다^^