초음판 감지기 응용 거리측정기 기물판

Copy of IMGP1109

 

사용자 설명서

초음파센서 기물판 사용자 설명서

아두올 …..  (스케치)

Ultrasonic_distance_measure

동영상

초음파응용기기시연

회로도…..

초음파거리계 회로도

#include <EEPROM.h>

uint8_t ledPin = 4;
uint8_t buzzerPin = 5;
uint8_t ultraEcho = 8;
uint8_t ultraTrig = 9;
uint8_t buttonPin = 13;
uint8_t highSetPin=12;
uint8_t lowSetPin=11;

bool done;
bool BPinon, BPinPast; //버튼 눌러짐 기록, 현재 와 과거
long milli; //현재의 millis() 함수 값 저장
long numbTimeT=50; //버튼의 자기 불능시간
long numbTime,dureTerm;
bool actionOn; //버튼 누름에 따라 교반하며 on/off
bool highSet, lowSet; //원거리 스위치, 근거리 스위치
uint16_t A, vHighset, vLowset, value1, value2; //임시로 그때그때 사용하기 위한 변수
uint8_t i,j,k,L; //임시로 그때그때 사용하기 위한 변수
char c; //임시로 그때그때 사용하기 위한 변수
String AAA,sub1,sub2,string; //임시로 그때그때 사용하기 위한 변수
long ledTime; //LED 등불 밝힘 관련
bool ledtimeSet;
//*****************************************************************
void setup() {
//*****************************************************************
Serial.begin(9600);
Titleback();
vHighset = EEPROM.read(0)*256+EEPROM.read(1); //원거리 설정값을 내장메모리에서 불러옴
vLowset = EEPROM.read(2)*256+EEPROM.read(3); //근거리 설정값을 내장메모리에서 불러옴
if(vHighset<vLowset) {vHighset = 60000; vLowset=0;} //처음 불러올 시 오류 발생하는 것 처리
if(vHighset<10){vHighset = 60000;}
if (vLowset>40000 || vLowset<0 ){vLowset = 0;} //오류 값 입력시 정상으로 처리
SPI(“최대 거리 설정 값 = “,vHighset,1); //통신창에 표시 Serial.println(… )에 해당
SPI(“최단 거리 설정 값 = “,vLowset,1);
pinMode(ledPin, OUTPUT);
pinMode(ultraTrig, OUTPUT); //초음파 감지기의 발신기 핀
pinMode(ultraEcho, INPUT); //초음파 감지기의 수신기 핀
pinMode(buttonPin, INPUT) ; // 눌 하면 1 발생
pinMode(highSetPin, OUTPUT);
pinMode(lowSetPin, OUTPUT);
ledTime=millis();
actionOn=true;

int sum = 0;
}
//*****************************************************************
void loop() {
//*****************************************************************
while(Serial.available()){ //통신창에 입력된 문자 확인 처리…
c = Serial.read();
// WIFI 자세인 경우는 c 를 wifi 선에 출력
if(c==10 || c== 13){ // 입력문자중 10 번과 13번 문자가 발견되면
if(string !=””){AAA=string;} // 출력 문자열 AAA를 그동안 입력된 단위 문자를 모안둔 string으로 확정한다…
string=””; // string 변수는 이제 초기화한다.
c=0;
}
else { //입력 문자가 10번이나 13번이 아니면
string +=c; //string 변수에 입려된 단위 문자인 c를 모아둔다…
}
}
if (AAA.indexOf(“S”)>=0 || AAA.indexOf(“s”)>=0) {
L= AAA.length() ;
if (L>1){ //문자열 길이가 2 보다 크면
c= AAA.charAt(0);
k = AAA.indexOf(‘ ‘) ; //문자열 중에 “ “가 있는 위치 확인 없으면 -1값
sub1=AAA.substring(1,k);
value1 = sub1.toInt() ; // 문자열 sub1을 정수로 변환
if (k>0){
sub2=AAA.substring(k);
value2 = sub2.toInt();} // 문자열 sub2 정수로 변환
else { value2=0;}
AAA=””;
SPN();
if(value1>30 && value1>value2){
vHighset = value1; vLowset = value2;
EEPROM.write(0, highByte(vHighset));
EEPROM.write(1, lowByte(vHighset));
EEPROM.write(2, highByte(vLowset));
EEPROM.write(3, lowByte(vLowset));
}
else { SPS(” 입력 오류 입니다 …”);}
}
}
milli = millis();
if (milli>ledTime){ledtimeSet = !ledtimeSet; ledTime +=200;}
BPinon = digitalRead(buttonPin);
ActionOnoff();
//Serial.println(analogRead(buttonPin));
Serial.println(actionOn);
A= DistanceMeasure(); // 초음파 발신 신호로 거리를 출력하는 함수
if (A>vHighset
) {highSet = true;} else {highSet = false;}
if (A<vLowset) {lowSet = true;} else {lowSet = false;}
digitalWrite(ledPin, highSet || lowSet);
if(actionOn){ //버튼 눌하여 통신창에 계속해서 거리를 출력하도록 한 경우
SPI(” 장애물까지 거리 mm…”,A,1);
done = false;
}
else {
if (!done){
SPN();
SPI(“최대 설정”, vHighset,0);
SPI(” 최소 설정”, vLowset,0);
done = true;
}
}
digitalWrite(highSetPin, highSet); // 외부 스위치 기능 발휘
digitalWrite(lowSetPin, lowSet);
}
//***************************************************************
void Titleback() {
//***************************************************************
Serial.println(F(“***************************************************”));
Serial.println(F(” 초음파 활용 거리 측정”));
Serial.println(F(” – 21세기의 봄 -“));
Serial.println(F(“***************************************************”));
Serial.println();
}
//*****************************************************************
void ActionOnoff(){ //접점 신호의 교반 작동
//*****************************************************************
if (BPinon) { // buttonPin 이 참이면 (접점이 눌 되면)
if (! BPinPast && milli>numbTimeT) { // buttonPin 이 부 상태에서 접점이 눌 되어야….
Serial.println(BPinon);
actionOn= ! actionOn; // LED pin으로의 출력 상태를 반전
BPinPast = true; // 눌접점이 계속 반응하는 것을 차단하기 위한 것
numbTimeT= milli+numbTime; //지금 시간으로부터 자기 불능 시간을 첨가
}
}
else {
BPinPast = false; //눌접점이 부 상태로 하여 등불 상태를 변경 하는 기능 복원
delay(150);
}
// Serial.print(BPinon);Serial.println(actionOn);
}
//***************************************************************
uint16_t DistanceMeasure() { //초음파 센서
//***************************************************************
uint16_t A;
digitalWrite(ultraTrig, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(ultraTrig, HIGH);
delayMicroseconds(5);
digitalWrite(ultraTrig, LOW); // 펄츠 신호를 보내는 과정 종료
// Reads the echoPin, returns the sound wave travel time in microseconds
dureTerm = pulseIn(ultraEcho, HIGH,50000); //함수가 시작해서부터 HIGH 가 LOW 가 될 때까지의 시간
// Calculating the distance
A= dureTerm*340/2000;

if(actionOn){tone(buzzerPin, 250, 250);} //0.25초의 짧은 비프 음을 낸 후
if (dureTerm>30000){dureTerm=30000;} //상한선을 300으로 제한
if (dureTerm<10){dureTerm=10;} //너무 짧은 거리는 기본 1로
delay(300* dureTerm/1500); // 1m 거리가 3 milli초 약 0.3초간 간격으로 bit음을 만들기 위한 것
return A;
}
//*****************************************************************
void SPI( String AAA, int I, bool nt){
//*****************************************************************
Serial.print(AAA+”…”);Serial.print(I);Serial.print(” “);
if(nt){Serial.println();}
}
void SPN(){ Serial.println();}
void SPS(String AAA){ Serial.print(AAA);Serial.print(“… “);}
void SerialPrintInt(int a,int b,int c,int d) // debug 시 편리를 위한 시리얼 문자 출력함수
{ Serial.print(a);Serial.print(” “);Serial.print(b);Serial.print(” “);Serial.print(c);Serial.print(” “);Serial.print(d); Serial.println(“…”);
}

댓글 남기기

이메일은 공개되지 않습니다.

다음의 HTML 태그와 속성을 사용할 수 있습니다: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>