이동거리가 1cm 될때만 측정하도록 설정 가능. 주석 내용 참조
깊이 변화를 LED 색으로 표현
/* 초음파 센서 두개를 이용하여 하나는 거리를 하나는 깊이를 측정하도록 설정
LCD는 I2C 통신을 이용
RGB LED를 이용하여 깊이 변화를 색으로 표현
-지구사랑- WK여고 이한조-
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // LCD 사용을 위해 라이브러리 호출
#define TRIG1 10 // 거리용 초음파 발신 핀번호
#define ECHO1 11 // 거리용 초음파 수신 핀번호
#define TRIG2 12 // 깊이용 초음파 발신 핀번호
#define ECHO2 13 // 깊이용 초음파 수신 핀번호
#define RED 2 // GRB LED 핀번호 지정, 디지털핀 부족해서 A0사용
#define GREEN 3 // GRB LED 핀번호 지정, 디지털핀 부족해서 A1사용
#define BLUE 4 // GRB LED 핀번호 지정, 디지털핀 부족해서 A2사용
float cdeep; // 시작 기준 깊이 변수 Criteria Deep
float dis_prev; // 이전 거리 변수
float dis_new; // 현재 거리 변수
float deep; // 측정 깊이
float dis; // 측정 거리
LiquidCrystal_I2C lcd(0x27,16,2); // LCD I2C통신 사용. 주소 지정 0x27, 0x20, 0x3F 중 하나, 16문자 2줄로 정의
//-----------------------------------------------------
void setup() {
Serial.begin(9600);
Serial.println("데이터 초기화.......");
Serial.println("이동 거리, 깊이");
lcd.begin(16, 2);
lcd.backlight(); // LCD 백라이트 켜기
pinMode(TRIG1, OUTPUT); // 거리용 초음파 발신
pinMode(ECHO1, INPUT); // 거리용 초음파 수신
pinMode(TRIG2, OUTPUT); // 깊이용 초음파 발신
pinMode(ECHO2, INPUT); // 깊이용 초음파 수신
pinMode(RED, OUTPUT); // RGB LED 빨강색
pinMode(GREEN, OUTPUT); // RGB LED 초록색
pinMode(BLUE, OUTPUT); // RGB LED 파랑색
// 최초 1회 거리 및 깊이 측정 후 출력
dis = sdistance(); // 이동 거리 함수 호출하여 거리 측정
dis_new = dis; // 처음 측정한 거리를 초기 변수로 지정
dis_prev = dis; // 처음 측정한 거리를 초기 변수로 지정
deep = seedeep(); // 깊이 측정 함수 호출하여 측정
cdeep = deep; // 시작 지점 깊이 측정
}
//-------------------------------------------------
void loop() {
// 초음파로 거리와 깊이 측정 시작
dis = sdistance(); // 초음파로 거리 구하는 함수 호출
deep = seedeep(); // 초음파로 깊이 구하는 함수 호출
dis_new = dis; // 반복문에서 구한 거리로 변수 초기화
// 거리 변화가 있으면 거리와 깊이를 출력
if (abs(dis_prev - dis_new) >= 1) { // 거리변화가 1cm이상 일때 작업 수행, 거리변화는 절대값
//if (dis_prev - dis_new >= 1.0 && dis_prev - dis_new < 1.1) { // 이전 거리보다 현재 거리가 1cm 줄어들 때만 아래 작업 수행
// 시리얼 모니터에 출력
Serial.print(dis, 0); // 이동 거리 시리얼 모니터 출력
Serial.print(" ");
Serial.println(-deep, 1); // 깊이 시리얼 모니터 출력, 깊이를 음수로
// LCD 모니터에 출력
lcd.clear(); // LCD 내용 삭제
lcd.setCursor(1, 0);
lcd.print("Dis:");
lcd.setCursor(6, 0);
lcd.print(dis, 1); // LCD에 이동 거리 표시, 소수점 이하 표시하지 않음
lcd.setCursor(12, 0);
lcd.print("Cm");
lcd.setCursor(1, 1);
lcd.print("Deep:");
lcd.setCursor(6, 1);
lcd.print(deep, 1); // LCD에 깊이 표시, 소수점 이하 1자리까지 표시
lcd.setCursor(12, 1);
lcd.print("Cm");
dis_prev = dis_new; // 현재 거리 값을 이전 거리 값으로 변환하여 새로운 거리 변화 변수로 사용
}
// 깊이 표시용 RGB LED 초기화 및 변화에 따른 표현
digitalWrite(BLUE, LOW);
digitalWrite(RED, LOW);
digitalWrite(GREEN, LOW);
if (cdeep >= deep - 1 && cdeep <= deep + 1) { // 측정 깊이가 처음 깊이보다 ±1cm 범위에 있다면
digitalWrite(BLUE, HIGH); // 파란색 LED를 켜고
} else if (cdeep < deep - 1) { // 측정 깊이가 처음 깊이보다 깊다면
digitalWrite(RED, HIGH); // 빨간색 LED를 켜고
} else if (cdeep > deep + 1) { // 측정 깊이가 처음 깊이보다 얕다면
digitalWrite(GREEN, HIGH); // 초록색 LED를 켜고
}
delay(10);
}
//-----------------------------------------------------
// 사용자 정의 함수
float sdistance() {
digitalWrite(TRIG1, LOW); // 초음파 센서 초기화
delay(2);
digitalWrite(TRIG1, HIGH); // 초음파 발신
delay(10);
digitalWrite(TRIG1, LOW); // 초음파 발신 종료
float len1 = pulseIn(ECHO1, HIGH); // 초음파 돌아온 수신 시간 체크
dis = (len1 / 1000000.0) * 34000.0 / 2.0; // cm거리로 변환, 마이크로세크초를 초로, 음파속도를 cm로 단위변화, 왕복시간이니 나누기2
return dis;
}
// 바다 깊이 측정
float seedeep() {
digitalWrite(TRIG2, LOW); // 초음파 센서 초기화
delay(2);
digitalWrite(TRIG2, HIGH); // 초음파 발신
delay(10);
digitalWrite(TRIG2, LOW); // 초음파 발신 종료
float len2 = pulseIn(ECHO2, HIGH); // 초음파 돌아온 수신 시간 체크
deep = (len2 / 1000000.0) * 34000.0 / 2.0; // cm깊이로 변환, 마이크로세크초를 초로, 음파속도를 cm로 단위변화, 왕복시간이니 나누기2
return deep;
}
이동거리가 1cm 될때만 측정하도록 설정 가능. 주석 내용 참조
깊이 변화를 LED 색으로 표현
/* 초음파 센서 두개를 이용하여 하나는 거리를 하나는 깊이를 측정하도록 설정
LCD는 456789번 핀을 사용하며 I2C 통신을 이용하지 않는다.
RGB LED를 이용하여 깊이 변화를 색으로 표현
-지구사랑- WK여고 이한조-
*/
#include <Wire.h>
#include <LiquidCrystal.h> // LCD 사용을 위해 라이브러리 호출
#define TRIG1 10 // 거리용 초음파 발신 핀번호
#define ECHO1 11 // 거리용 초음파 수신 핀번호
#define TRIG2 12 // 깊이용 초음파 발신 핀번호
#define ECHO2 13 // 깊이용 초음파 수신 핀번호
#define RED 14 // GRB LED 핀번호 지정, 디지털핀 부족해서 A0사용
#define GREEN 15 // GRB LED 핀번호 지정, 디지털핀 부족해서 A1사용
#define BLUE 16 // GRB LED 핀번호 지정, 디지털핀 부족해서 A2사용
float cdeep; // 시작 기준 깊이 변수 Criteria Deep
float dis_prev; // 이전 거리 변수
float dis_new; // 현재 거리 변수
float deep; // 측정 깊이
float dis; // 측정 거리
// LiquidCrystal_I2C lcd(0x27,16,2); // LCD I2C통신 사용. 주소 지정 0x27, 0x20, 0x3F 중 하나, 16문자 2줄로 정의
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // LCD 설정, I2C통신 아님.
//-----------------------------------------------------
void setup() {
Serial.begin(9600);
Serial.println("데이터 초기화.......");
Serial.println("이동 거리, 깊이");
lcd.begin(16, 2);
// lcd.init(); // LCD 초기화
// lcd.backlight(); // LCD 백라이트 켜기
pinMode(TRIG1, OUTPUT); // 거리용 초음파 발신
pinMode(ECHO1, INPUT); // 거리용 초음파 수신
pinMode(TRIG2, OUTPUT); // 깊이용 초음파 발신
pinMode(ECHO2, INPUT); // 깊이용 초음파 수신
pinMode(RED, OUTPUT); // RGB LED 빨강색
pinMode(GREEN, OUTPUT); // RGB LED 초록색
pinMode(BLUE, OUTPUT); // RGB LED 파랑색
// 최초 1회 거리 및 깊이 측정 후 출력
dis = sdistance(); // 이동 거리 함수 호출하여 거리 측정
dis_new = dis; // 처음 측정한 거리를 초기 변수로 지정
dis_prev = dis; // 처음 측정한 거리를 초기 변수로 지정
deep = seedeep(); // 깊이 측정 함수 호출하여 측정
cdeep = deep; // 시작 지점 깊이 측정
}
//-------------------------------------------------
void loop() {
// 초음파로 거리와 깊이 측정 시작
dis = sdistance(); // 초음파로 거리 구하는 함수 호출
deep = seedeep(); // 초음파로 깊이 구하는 함수 호출
dis_new = dis; // 반복문에서 구한 거리로 변수 초기화
// 거리 변화가 있으면 거리와 깊이를 출력
if (abs(dis_prev - dis_new) >= 1) { // 거리변화가 1cm이상 일때 작업 수행, 거리변화는 절대값
//if (dis_prev - dis_new >= 1.0 && dis_prev - dis_new < 1.1) { // 이전 거리보다 현재 거리가 1cm 줄어들 때만 아래 작업 수행
// 시리얼 모니터에 출력
Serial.print(dis, 0); // 이동 거리 시리얼 모니터 출력
Serial.print(" ");
Serial.println(-deep, 1); // 깊이 시리얼 모니터 출력, 깊이를 음수로
// LCD 모니터에 출력
lcd.clear(); // LCD 내용 삭제
lcd.setCursor(1, 0);
lcd.print("Dis:");
lcd.setCursor(6, 0);
lcd.print(dis, 1); // LCD에 이동 거리 표시, 소수점 이하 표시하지 않음
lcd.setCursor(12, 0);
lcd.print("Cm");
lcd.setCursor(1, 1);
lcd.print("Deep:");
lcd.setCursor(6, 1);
lcd.print(deep, 1); // LCD에 깊이 표시, 소수점 이하 1자리까지 표시
lcd.setCursor(12, 1);
lcd.print("Cm");
dis_prev = dis_new; // 현재 거리 값을 이전 거리 값으로 변환하여 새로운 거리 변화 변수로 사용
}
// 깊이 표시용 RGB LED 초기화 및 변화에 따른 표현
digitalWrite(BLUE, LOW);
digitalWrite(RED, LOW);
digitalWrite(GREEN, LOW);
if (cdeep >= deep - 1 && cdeep <= deep + 1) { // 측정 깊이가 처음 깊이보다 ±1cm 범위에 있다면
digitalWrite(BLUE, HIGH); // 파란색 LED를 켜고
} else if (cdeep < deep - 1) { // 측정 깊이가 처음 깊이보다 깊다면
digitalWrite(RED, HIGH); // 빨간색 LED를 켜고
} else if (cdeep > deep + 1) { // 측정 깊이가 처음 깊이보다 얕다면
digitalWrite(GREEN, HIGH); // 초록색 LED를 켜고
}
delay(10);
}
//-----------------------------------------------------
// 사용자 정의 함수
float sdistance() {
digitalWrite(TRIG1, LOW); // 초음파 센서 초기화
delay(2);
digitalWrite(TRIG1, HIGH); // 초음파 발신
delay(10);
digitalWrite(TRIG1, LOW); // 초음파 발신 종료
float len1 = pulseIn(ECHO1, HIGH); // 초음파 돌아온 수신 시간 체크
dis = (len1 / 1000000.0) * 34000.0 / 2.0; // cm거리로 변환, 마이크로세크초를 초로, 음파속도를 cm로 단위변화, 왕복시간이니 나누기2
return dis;
}
// 바다 깊이 측정
float seedeep() {
digitalWrite(TRIG2, LOW); // 초음파 센서 초기화
delay(2);
digitalWrite(TRIG2, HIGH); // 초음파 발신
delay(10);
digitalWrite(TRIG2, LOW); // 초음파 발신 종료
float len2 = pulseIn(ECHO2, HIGH); // 초음파 돌아온 수신 시간 체크
deep = (len2 / 1000000.0) * 34000.0 / 2.0; // cm깊이로 변환, 마이크로세크초를 초로, 음파속도를 cm로 단위변화, 왕복시간이니 나누기2
return deep;
}