Arduino UNO와 HC-SR04 초음파 센서, Adafruit OLED로 거리 측정하기
부품 및 소모품
Arduino UNO
1개
초음파 센서 HC-SR04
1개
Adafruit 128x64 OLED 디스플레이
1개
앱 및 온라인 서비스
프로젝트 소개
OLED 화면 사용법
이전 튜토리얼을 참고하세요:
#include 및 #define, setup() 실행 전:
#include <SPI.h> // OLED용 라이브러리들
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4 // 리셋 핀, 사용 안 함
Adafruit_SSD1306 display(OLED_RESET);
setup() 함수에서:
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // I2C 주소 0x3C로 초기화 (128x64)
display.clearDisplay(); // 시작 전 디스플레이 클리어
loop() 함수에서:
display.setCursor(22, 20); // x,y 좌표
display.setTextSize(3); // 텍스트 크기
display.setTextColor(WHITE); // BLACK 쓰면 지워짐
display.println(distance); // 변수 출력
display.setCursor(85, 20); // 단위(cm/in) 출력 위치
display.setTextSize(3);
#ifdef CommonSenseMetricSystem
display.println("cm"); // OLED에 "cm" 출력
#endif
#ifdef ImperialNonsenseSystem
display.println("in"); // OLED에 "in" 출력
#endif
display.display(); // 데이터 실제 표시
delay(500); // 사람 속도로 대기
display.clearDisplay(); // 디스플레이 검게 클리어
HC-SR04 초음파 거리 센서 사용법
데이터시트를 참고하세요. HC 모듈은 펄스 버스트를 보낸 후 초음파 에코가 원래 위치로 돌아오는 데 걸리는 시간을 측정합니다.
HC 트리거에 펄스 생성, HC가 펄스 버스트 수행:
long duration, distance; // 변수들
digitalWrite(trigPin, LOW); // 펄스 ___|---|___
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
pulseIn()은 드물게 쓰이는 함수로, 하이(__----__) 또는 로우(----___---) 펄스의 길이를 감지합니다.
필요한 부분만 컴파일하기 위해 #ifdef를 사용합니다.
duration = pulseIn(echoPin, HIGH);
#ifdef CommonSenseMetricSystem
distance = (duration/2) / 29.1;
#endif
#ifdef ImperialNonsenseSystem
distance = (duration/2) / 73.914;
#endif
OLED가 작동하지 않을 경우 디버깅용:
Serial.println(distance); // 디버그
코드
초음파 거리 측정 및 표시 Arduino
// CODE BY Javier Muñoz Sáez, 05/11/2016 문의: javimusama@gmail.com
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define CommonSenseMetricSystem
//#define ImperialNonsenseSystem
#define trigPin 13
#define echoPin 12
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // I2C 주소 0x3C로 초기화 (128x64)
display.clearDisplay();
}
void loop() {
long duration, distance;
digitalWrite(trigPin, LOW); // 펄스 ___|---|___
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
#ifdef CommonSenseMetricSystem
distance = (duration/2) / 29.1;
#endif
#ifdef ImperialNonsenseSystem
distance = (duration/2) / 73.914;
#endif
display.setCursor(22, 20); // OLED 표시
display.setTextSize(3);
display.setTextColor(WHITE);
display.println(distance);
display.setCursor(85, 20);
display.setTextSize(3);
#ifdef CommonSenseMetricSystem
display.println("cm");
#endif
#ifdef ImperialNonsenseSystem
display.println("in");
#endif
display.display();
delay(500);
display.clearDisplay();
Serial.println(distance); // 디버그
}
회로도