티스토리 뷰

Arduino Uno HC-SR04 CLCDArduino Uno HC-SR04 CLCD

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아두이노 우노 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마다 실행되는 타이머 인터럽트 루틴을 만들고, 타이머 flagtrue로 활성화합니다. 타이머 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에 출력하는 예제를 소개하였습니다. 이와 관련된 기초 내용은 아래의 관련 포스트를 참고해주세요.

끝까지 읽어 주셔서 감사합니다.^^


관련포스트

아두이노 타이머 인터럽트

2020/07/13 - [Arduino] - 아두이노 강좌 #14 타이머 인터럽트 MsTimer2.h

I2C CLCD 사용 관련 포스트

2020/07/28 - [Arduino] - 아두이노 강좌 #16 I2C 통신 소개와 구현 방법

2020/07/30 - [Arduino] - 아두이노 강좌 #18 I2C Character LCD 기본 함수 사용 방법 (JHD 162A LiquidCrystal_I2C)

2020/08/05 - [Arduino] - 아두이노 코딩 : I2C Character LCD 한 줄 고정, 한 줄 스크롤 하기 JHD-162A

Ultrasonic Sensor HC-SR04

2020/09/19 - [Arduino] - 아두이노 강좌 #38 HC-SR04 동작 방식과 사용법



댓글
댓글쓰기 폼
최근에 올라온 글
«   2020/10   »
        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
Total
21,940
Today
165
Yesterday
595