#include <LiquidCrystal_I2C.h> // 추가
LiquidCrystal_I2C lcd(0x27, 16, 2); // lcd 객체 선언
/* 서보는 망가졌다!
#include <Servo.h> // 추가
Servo servo; // servo 객체 선언
*/
#define TRIG 9 // TRIG 핀 설정
#define ECHO 8 // ECHO 핀 설정
#define LEDY 12 // 노란 LED 핀 설정
#define LEDR 13 // 빨간 LED 핀 설정
int lcdCheck=0, lcdChange;
void setup() {
lcd.begin(); // LCD 사용 시작
Serial.begin(9600); // 테스트용 시리얼 통신 정의
pinMode(TRIG, OUTPUT); // 보내는 핀이니까 출력
pinMode(ECHO, INPUT); // 받는 핀이니까 입력
pinMode(LEDY, OUTPUT);
pinMode(LEDR, OUTPUT);
/* 서보는 망가졌다!
servo.attach(3);
servo.write(90);
*/
/* 부저는 빠졌다!
pinMode(7, OUTPUT);
*/
}
void loop() {
long duration, distance;
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
duration = pulseIn(ECHO, HIGH);
distance = duration * 17 / 1000; // 돌아오는 시간 cm로 환산
/*초음파센서 테스트
Serial.println(duration);
Serial.print("\nDistance : ");
Serial.print(distance);
Serial.println(" Cm");
*/
Serial.println(distance);
lcdChange=0;
if(distance>=10 && lcdCheck==1){ // 만약 거리가 멀다면
digitalWrite(LEDR, HIGH); // 빨간 LED 켜기
digitalWrite(LEDY, LOW);
lcd.setCursor(5, 0);
lcd.print("Far!!!"); // LCD에 Far!!! 출력하기
/* 서보는 망가졌다!
for(int i=170;i>=10;i--){ // 서보 돌리기
servo.write(i);
delay(10);
}
*/
/* 부저는 빠졌다!
tone(7, 523); // '도' 음 출력하기
*/
lcdCheck=0;
lcdChange=1;
}else if(distance<10 && lcdCheck==0){ // 만약 거리가 가깝다면
digitalWrite(LEDR, LOW);
digitalWrite(LEDY, HIGH); // 노란 LED 켜기
lcd.setCursor(5, 0);
lcd.print("Close!"); // LCD에 Close! 출력하기
/*서보는 망가졌다!
for(int i=10; i<170; i++){ // 서보 돌리기
servo.write(i);
delay(10);
}
*/
/* 부저는 빠졌다!
tone(7, 783); // '솔' 음 출력하기
*/
lcdCheck=1;
lcdChange=1;
}
/* 부저는 빠졌다!
if(lcdChange){
servo.detach();
}
*/
delay(1000);
}
이 프로젝트의 목표는 거리를 측정하고, 거리에 따른 변화를 여러 방법을 통해 나타내는 것입니다. 표현하는 방법으로는 led에 불 붙이기, 부저로 소리내기, lcd 판에 글자 띄우기, 서보 돌리기 등이 있고, 현재까지 제가 구현할 수 있는 방법은 이 네 가지 뿐입니다. 다만, 안타깝게도 구현하다가 서보를 망가뜨렸기에 서보를 뺐고, 이 프로젝트 결과물을 촬영한 시각이 새벽 2시 36분 이었기에, 부저를 뺐습니다..
부저와 서보도 코드 상에는 존재합니다! 영상에는 나오지 않습니다!
(i) setup과 loop가 실행되기 전
lcd판과, 서보를 사용할 것이기에 각각의 라이브러리를 가져오고, 객체를 정의시킵니다.
핀을 구별하기 쉽게 만들기 위해 초음파의 TRIG, ECHO, 빨간 LED, 노란 LED를 각각 핀에 맞추어 변수로 정의시킵니다.
불필요한 if문 반복을 막기 위해 '가까운 거리인 상태인지', '먼 거리인 상태인지'를 구분하는 변수 lcdCheck와, '가까운 거리에서 먼 거리로 바뀌거나, 먼 거리에서 가까운 거리로 바뀐 상태인지'를 구분하는 변수 lcdChange를 설정합니다. lcdCheck의 기본값은 '먼 거리'인 0이고, lcdChange의 기본값은 '바뀌지 않은 상태'인 0입니다. 특히 lcdChange는 loop가 반복될 때마다 0으로 초기화 시킵니다.
(ii) setup
부품들과 기능을 사용하기 위해 기본 설정을 합니다. 여기서는 lcd와 serial 통신, 두 LED를 활성화 시켰습니다.
(사실 Arduino IDE에서 LED를 pinMode 설정하지 않은 상태로 upload하고, 제대로 LED가 켜지는 것을 확인했었습니다! 원래 pinMode(LED, OUTPUT);을 하지 않아도 digitalWrite(LED, HIGH);가 되나요? 신기하네요!)
(iii) loop
초음파 센서를 이용하여 얼마나 거리가 떨어져있는지 Cm값을 구하여 distance 변수에 저장합니다. 그 후 제대로 Cm값이 구해졌는지 체크하기 위하여 serial 모니터를 이용합니다.
(i)에서 말했듯, lcdChange를 0으로 설정하고 거리가 먼지, 가까운지를 비교합니다. 그 기준은 10cm입니다.
만약 거리가 멀다면 빨간 LED를 켜고, 노란 LED를 끈 후, lcd판에 (5,0) 위치에서부터 'Far!!!'을 출력합니다. 서보가 있다면 반 바퀴 돌았을테고, 부저가 있다면 '도' 음을 낼 것입니다. 모든 변화가 일어난 후에는 현재 '먼 거리'라는 것을 표현하기 위해 lcdCheck를 1로 바꾸고, 거리값(먼지, 가까운지)이 바뀌었다는 것을 표현하기 위해 lcdChange를 1로 바꿉니다.
만약 거리가 가깝다면 빨간 LED를 끄고, 노란 LED를 켠 후, lcd판에 (5,0) 위치에서부터 'Close!'을 출력합니다. 서보가 있다면 반 바퀴 돌았을테고, 부저가 있다면 '솔' 음을 낼 것입니다. 모든 변화가 일어난 후에는 현재 '가까운 거리'라는 것을 표현하기 위해 lcdCheck를 0으로 바꾸고, 거리값(먼지, 가까운지)이 바뀌었다는 것을 표현하기 위해 lcdChange를 1로 바꿉니다.
만약 거리값이 바뀌었다면 서보가 움직인 것이기 때문에 servo.detach();를 해줍니다. (detach를 위해 lcdChange를 설정해 둔 것인데, 서보가 없네요!)
마지막으로 시간차를 두기 위해 delay(1000);을 주면 프로그램이 종료됩니다.
발표를 못 했기에 자세한 과정을 적어놓았습니다!
'Nefus' 카테고리의 다른 글
NEFUS_Network(2)_20230813 (0) | 2023.08.13 |
---|---|
NEFUS_Network(1)_20230724 (0) | 2023.07.24 |
NEFUS_Arduino_20230531 (0) | 2023.05.31 |
NEFUS_Arduino_20230517 (0) | 2023.05.17 |
NEFUS_Arduino_20230515 (0) | 2023.05.14 |