Arduino Uno : Ultrasonic Sensor HC-SR04 with I2C CLCD
초음파 센서 HC-SR04 로 측정한 거리값을 I2C CLCD 로 출력
하는 예제입니다. 이번 예제에 사용한 HC-SR04와 I2C CLCD 사용법이 필요하신 분들은 하단 관련 포스트를 참고해주세요.Hardware
준비물
본 예제의 구성품은 아래와 같습니다.
- Arduino Uno x 1EA
- HC-SR04 x 1EA
- I2C CLCD 16x2 x 1EA
- Bread Board x 1EA
- JumperWIres
회로도 및 연결
I2C CLCD 는 I2C 통신을 사용하기 때문에 Arduino Uno 의 A4, A5 번 핀으로 연결되어야 합니다. HC-SR04는 Arduino Uno의 D8, D9 포트에 연결하였지만, 다른 포트에 연결이 가능합니다.
아두이노 우노 I2C CLCD, HC-SR04 연결 회로도 및 연결 예시
예제 코드 : HC-SR04 측정한 거리 CLCD 에 출력
500ms 간격으로 HC-SR04로 거리를 측정하여, CLCD 에 물체와의 거리를 출력합니다. CLCD 출력하는 방법은 이전 포스트에 소개한 깜빡임이 없는 방식으로 출력하는 법을 적용하였습니다.
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | #include <LiquidCrystal_I2C.h> #include <MsTimer2.h> // HC-SR04 핀 정의 #define triggerPin 8 #define echoPin 9 // I2C CLCD address 및 사양 정보 정의 #define lcdAddress 0x27 #define lcdColumns 16 #define lcdRows 2 LiquidCrystal_I2C lcd(lcdAddress, lcdColumns, lcdRows); // 거리 데이터 저장 mm, inch 단위 double distanceMm; double distanceInch; // CLCD 에 출력할 문자열 변수 String mm; String inch; // 데이터 취득 flag 선언, 거리 데이터 취득시 1로 활성화 int flag = 0; void setup() { pinMode(triggerPin, OUTPUT); pinMode(echoPin, INPUT); MsTimer2::stop(); MsTimer2::set(200, myTimer); MsTimer2::start(); lcd.init(); lcd.backlight(); lcd.clear(); } void loop() { // 신규 데이터 취득시에만 동작 if(flag == 1) { flag = 0; // HC-SR04 거리 측정 getDistance(); // 측정한 거리 CLCD 출력 printDistanceLCD(); } } void myTimer() { flag = 1; } void getDistance(){ again: // goto static int count; // Tigger High 지속 시간 10us digitalWrite(triggerPin, LOW); delayMicroseconds(2); digitalWrite(triggerPin, HIGH); delayMicroseconds(10); digitalWrite(triggerPin, LOW); //echoPin High 유지 시간 측정 double Duration = 0; Duration = pulseIn(echoPin, HIGH); distanceMm = Duration / 5.8; distanceInch = Duration / 148; // 거리 측정 값이 유효하지 않을 때, 거리를 다시 측정 if ((distanceMm > 4000) && (count < 10)){ count++; goto again; } // 거리 측정 값이 유효하지 않을 때 goto문 무한 루프를 방지 else if(count >= 10){ distanceMm = 9999; distanceInch = 9999; } count = 0; } void printDistanceLCD(){ // LCD Clear()를 하지 않기 위해, 공백칸 숫자 입력 변수 // LCD Clear()를 하면 LCD 가 깜빡임.. int mmBlank; int inchBlank; // CLCD 에 출력할 데이터를 문자열로 변경 mm = "mm : " + String(distanceMm); inch = "inch : " + String(distanceInch); // 문자열의 공백 저장 mmBlank = lcdColumns - mm.length(); inchBlank = lcdColumns - inch.length(); //CLCD 첫번째 줄 lcd.setCursor(0,0); lcd.print(mm); for(int i = 0 ; i < mmBlank ; i++){ lcd.print(" "); } //CLCD 2번째 줄 lcd.setCursor(0,1); lcd.print(inch); for(int i = 0 ; i < inchBlank ; i++){ lcd.print(" "); } } | cs |
코드 설명
MsTimer2 라이브러리를 사용하여 500ms마다 실행되는 타이머 인터럽트 루틴을 만들고, 타이머 flag를 true로 활성화합니다. 타이머 flag가 true인 경우 void loop()에서 거리를 측정하고, CLCD에 거리를 출력합니다.
- 2 Line : MsTimer2 라이브러리 참조
- 29~31 Line : 타이머 인터럽트 설정
- 50~53 Line : 타이머 인터럽트 서비스 루틴
HC-SR04 거리를 측정하는 방법은 지난 포스트의 HC-SR04 기초 사용 방법 코드에서, HC-SR04의 측정 유효 거리 4000mm를 초과하는 경우 다시 측정하기 위한 goto 문을 추가하였습니다. goto 문으로 인한 무한 루프를 방지하기 위해 정적 변수 count를 사용하여 10회 동안만 다시 측정하도록 설정하였습니다.
- 56~85 Line :
getDistance()함수 호출 시 HC-SR04로 거리 측정, 유효 측정 거리 초과(에러) 시 10회 동안 다시 측정
I2C CLCD에 깜빡임 없이 문자를 출력하기 위해, 공백 문자를 따로 기입하여 가로 16문자를 가득 채운 후 출력하였습니다.
- 87~113 Line :
printDistanceLCD()함수 호출 시 HC-SR04로 측정한 거리값을 CLCD로 출력
예제 실행 결과
위의 코드를 실행하면 아래와 같은 동작을 확인 할 수 있습니다.
마무리
이번 포스트에서는 지난 포스트에서 소개한 HC-SR04, I2C CLCD, 타이머 인터럽트를 사용하여 일정 시간 간격으로 HC-SR04로 측정한 거리를 CLCD에 출력하는 예제를 소개하였습니다. 이와 관련된 기초 내용은 아래의 관련 포스트를 참고해주세요.
끝까지 읽어 주셔서 감사합니다.^^
'Embedded > Arduino' 카테고리의 다른 글
아두이노 강좌 #40 온습도 센서 DHT11 Adafruit 라이브러리 사용 방법 (6) | 2020.09.24 |
---|---|
아두이노 강좌 #39 DHT11 사용 방법 및 라이브러리 없이 온도 습도 측정 (0) | 2020.09.22 |
아두이노 강좌 #38 HC-SR04 동작 방식과 사용법 (0) | 2020.09.19 |
아두이노 코딩 : 아두이노 우노로 리모컨 만들기 (0) | 2020.09.11 |
아두이노 강좌 #37 IR 적외선 통신 송신 코드 작성 IRremote 라이브러리 사용 (0) | 2020.09.10 |