(초보)초음파센서 시니얼모니터에 0cm라고 뜹니다
페이지 정보
작성자 살려줘 작성일18-12-19 23:02 조회8,668회 댓글0건본문
초음파 센서를 이용하여, 일정한 거리를 두고 아두이노를 배치한 뒤 기존에 배치한 센서의 거리가 믈체가 지나감으로써
기존 거리가 변경될 때마다 카운트하여 수를 세는 프로그램을 만들고 있습니다
그런데 시니얼모니터에 0cm라고만 나오네요...
계속 방법을 찾아보지만 안되서 질문게시판에 올려봅니다
꼭 해결방안이 필요한데 도움 주시면 정말 감사하겠습니다
<코드>
int echo_i = digitalRead(A1); //수신
int trig_i = digitalRead(A2); //발신
int echo_o = digitalRead(A3);
int trig_o = digitalRead(A4);
int dipin[] = {10,11,12,13};
int segment[] = {2,3,4,5,6,7,8,9}; //a,b,c,d,e,f,g,dp순
byte didata [10] = {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE4,0xFE,0xE6};
int cnt = 0;
unsigned long duration_i;
unsigned long duration_o;
float distance_i;
float distance_o;
void setup()
{
Serial.begin(9600);
pinMode(echo_i, INPUT);
pinMode(trig_i, OUTPUT);
pinMode(echo_o, INPUT);
pinMode(trig_o, OUTPUT);
for (int i=0; i<8; i++){
pinMode(segment[i], OUTPUT);}
for (int i=0; i<4; i++){
pinMode(dipin[i], OUTPUT);}
}
void show_dipin(int position, int number) {
//4자리 중 원하는 자리 선택
for(int i = 0; i < 4; i++) {
if(i + 1 == position){
digitalWrite(dipin[i], LOW);
} else {
digitalWrite(dipin[i], HIGH);
}
}
//8개 세그먼트를 제어해서 원하는 숫자 출력
for(int i = 0; i < 8; i++){
byte segment_data = (didata[number] & (0x01 << i)) >> i;
if(segment_data == 1){
digitalWrite(segment[7 - i], HIGH);
} else {
digitalWrite(segment[7 - i], LOW);
}
}
}
void loop()
{
digitalWrite(trig_i,LOW); //찾아보니 오류 발생 방지로 추가
delay(2);
digitalWrite(trig_i,HIGH); //신호 보냄
delay(10);//보낸상태 1/100초 정도 유지
digitalWrite(trig_i,LOW); //보내지 않음
duration_i = pulseIn(echo_i,HIGH); //신호 수신값
distance_i = ((float)34000*duration_i / 1000000); //cm의 거리단위로 변경
Serial.print(distance_i); //값 출력 / 프로그램엔 필요없지만 제작과정에서 올바른 값이 나오는지 확인하기 위해 필요
Serial.println("cm/in"); // 프로그램엔 필요없지만 제작과정에서 올바른 값이 나오는지 확인하기 위해 필요
digitalWrite(trig_o,LOW); //찾아보니 오류 발생 방지로 추가
delay(2);
digitalWrite(trig_o,HIGH);
delay(10);
digitalWrite(trig_o,LOW);
duration_o = pulseIn(echo_o,HIGH);
distance_o = ((float)34000*duration_o / 1000000);
Serial.print(distance_o);
Serial.println("cm/out");
if (distance_i >= 0 && distance_i < 30 ){ //거리값 알아서 주세요
cnt += 1;
}
if (distance_o >= 0 && distance_o < 30 ){ //거리값 알아서 주세요
cnt -= 1;
}
//delay(1000);//1초에 한 번씩 측정(굳이 필요 없을듯?, 알아서 판단)
if (cnt<10){
show_dipin(4,cnt);
}
else if (cnt>9 and cnt<100){
show_dipin(4,cnt%10);
show_dipin(3,cnt/10);
}
else if (cnt>99 and cnt<1000){
show_dipin(4,cnt%10);
show_dipin(3,cnt/10%10);
show_dipin(2,cnt/100);
}
else if (cnt>999 and cnt<10000){
show_dipin(4,cnt%10);
show_dipin(3,cnt/10%10);
show_dipin(2,cnt/100%10);
show_dipin(1,cnt/1000);
}
}
댓글 : 0
조회수 : 8,668
등록된 댓글이 없습니다.