BASIC4MCU | 질문게시판 | 소리감지센서간의 시간지연 문제
페이지 정보
작성자 쌀찐포도 작성일2021-12-20 18:28 조회935회 댓글3건본문
지금 max 9814센서를 3개를 사용하고있는데
전원들 넣을때부터 센서에 소리가 감지될때까지의 시간을 구하고싶은데 어떻게 코딩을 해야할지 모르겠습니다.
void loop() {
// 1) 소리센서 감지를 위한 식
unsigned long startMillis = millis(); // 샘플링 시작
unsigned int peakToPeak1 = 0; // 음성신호의 진폭
unsigned int peakToPeak2 = 0;
unsigned int peakToPeak3 = 0;
unsigned int signalMax1 = 0; // 최대 크기를 초기에는 0으로 설정
unsigned int signalMin1 = 1024; // 최소 크기를 초기에는 1024로 설정
unsigned int signalMax2 = 0;
unsigned int signalMin2 = 1024;
unsigned int signalMax3 = 0;
unsigned int signalMin3 = 1024;
while( millis() - startMillis < sampleWindow) // 데이터를 0.05s 마다 모으는 while문
{
sample1 = analogRead(0); //1차 감지센서에서 데이터 받아오기 - 아날로그 0에 연결
sample2 = analogRead(1); //2차 감지센서에서 데이터 받아오기 - 아날로그 1에 연결
sample3 = analogRead(2); //3차 감지센서에서 데이터 받아오기 - 아날로그 2에 연결
if(sample1<1024) // 소리센서에서 받아온 데이터의 값이 1024 이하일때
{
if(sample1>signalMax1){ // 최대 크기 측정
signalMax1 = sample1; } // 최대 크기 저장
else if(sample1 < signalMin1){ // 최소 크기 측정
signalMin1 = sample1; } // 최소 크기 저장
startMillis1 = micros(); // 소리 감지
}
if(sample2<1024)
{
if(sample2>signalMax2){
signalMax2 = sample2; }
else if(sample2 < signalMin2){
signalMin2 = sample2; }
startMillis2 = micros();
}
if(sample3<1024)
{
if(sample3>signalMax3){
signalMax3 = sample3; }
else if(sample3 < signalMin3){
signalMin3 = sample3; }
startMillis3 = micros();
}
}
peakToPeak1 = signalMax1 - signalMin1; // 최대-최소=진폭값
double volts1 = (peakToPeak1 * 5.0) / 1024; // 전압 단위로 변환 = 소리 크기로 변환
peakToPeak2 = signalMax2 - signalMin2;
double volts2 = (peakToPeak2 * 5.0) / 1024;
peakToPeak3 = signalMax3 - signalMin3;
double volts3 = (peakToPeak3 * 5.0) / 1024;
// 2) 소리센서의 전값 비교를 위한 식
volts1_prev = arr1[0]; // 현재 소리 크기
volts2_prev = arr2[0];
volts3_prev = arr3[0];
for( i=0; i<3; i++) { // 소리를 배열에 저장
arr1[i] = volts1;
arr2[i] = volts2;
arr3[i] = volts3; }
volts1_new = arr1[0]; // 새로 나는 소리 크기
volts2_new = arr2[0];
volts3_new = arr3[0];
댓글 3
조회수 935master님의 댓글
master 작성일
unsigned long startMillis = millis(); // 샘플링 시작
루프함수에서 실행하면 안되고요
변수 선언은 전역변수로하고, 함수 실행은 셋업함수에서 하세요
//
하지만, 셋업함수에서 하지 않더라도 startMillis 는 거의 0에 가까운 값일겁니다.(초기값=0)
쌀찐포도님의 댓글
쌀찐포도
답변 감사합니다. 근데 바꿔서 실행을하면 처리속도가 엄~~~청 느려지는데 해결방법이 있나요?
제가 센서간의 지연시간차이를 구해야해서
master님의 댓글
master
unsigned long startMillis = millis(); // 샘플링 시작
루프 함수에서 이 코드는 제거됬죠?
//
while(millis()-startMillis<sampleWindow){ // 0.05s
sample1=analogRead(0); //1차 감지센서
sample2=analogRead(1); //2차 감지센서
sample3=analogRead(2); //3차 감지센서
if(sample1>signalMax1){ signalMax1=sample1; }
else if(sample1<signalMin1){ signalMin1=sample1; }
startMillis1=micros();
if(sample2>signalMax2){ signalMax2=sample2; }
else if(sample2<signalMin2){ signalMin2=sample2; }
startMillis2=micros();
if(sample3>signalMax3){ signalMax3=sample3; }
else if(sample3<signalMin3){ signalMin3=sample3; }
startMillis3=micros();
}
startMillis=millis(); // <---- 추가