지구본

[아두이노] 3. I2C LCD와 초음파 센서로 물 높이를 측정하자 본문

Arduino

[아두이노] 3. I2C LCD와 초음파 센서로 물 높이를 측정하자

Xollo 2023. 5. 2. 22:24

이번에는 I2C LCD와 온도센서를 활용하여 센서들을 제작했던 이전 시간에 이어,

만끽 스마트 바스의 물 높이를 측정할 수 있도록 초음파 센서를 활용해보았습니다. 

 

 

[아두이노] 2. I2C LCD와 온도센서로 센서들을 제어해보자

지난 시간에 LED의 기본 제어 코드를 작성해보았고, 이번에는 마찬가지로 만끽 스마트 바스 제작에 필요한 I2C LCD와 온도센서를 이용해 센서들을 제어해보았습니다. 마찬가지로 초안이기 때문에

zigo0bone.tistory.com

 

기본 구성


두번째 글에서와 동일하게 I2C LCD를 사용하여 물 높이를 출력했습니다.

실험을 위해 카페에서 파는 음료 플라스틱 통을 기준으로 플라스틱 통의 높이를 먼저 설정하고 측정을 진행했습니다.

 

물 높이가 출력된 I2C LCD

 

LCD 연결 이후 초음파 센서를 연결합니다. 

 

초음파 센서

 

필요 부품

  • 아두이노 우노 1개
  • 초음파 센서 1개
  • I2C LCD 1

 

회로 구성


현재 물 높이의 퍼센트와 수치 출력

  • LCD SDA 핀을 A4핀에 연결
  • LCD SCL 핀을 A5핀에 연결
  • TRIG 핀을 3번 핀에 연결
  • ECHO 핀을 4번 핀에 연결

 

코드


틴커캐드에서 진행했던 코드에는 욕조 최대 높이를 20cm로 설정하여 진행해서,

실제로 플라스틱 통에 적용하기 위해 플라스틱 통의 높이를 측정하여 13cm로 코드를 수정해서 진행했습니다.

적용한 코드로 아두이노를 실행했을 때, 실시간으로 물을 채워 변동되는지 확인을 했고 잘 동작하는 것을 확인했습니다.

 

아두이노 구현 코드

#include <LiquidCrystal_I2C.h>
#include <Wire.h>

#define trig 3
#define echo 4

//float lpf = 0; //n-1
//float weight = 0.95;
float len = 13; //욕조의 최대 높이(cm)
LiquidCrystal_I2C lcd(0x27,16,2);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(trig, OUTPUT);  //trig 발사
  pinMode(echo, INPUT); //echo 받기
  lcd.init();
  lcd.backlight();

  //lpf = get_dist();
}

void loop() {
  // put your main code here, to run repeatedly:

  float dist = 0;

  for(int i = 0; i<40; i++){
    dist += get_dist();
    delay(10);
  }
  dist = dist/40;

  // 필터값을 게산
  //lpf = lpf * weight + dist * (1 - weight);

  float water_level = len - dist; //cm, 현재 물높이
  float per = (water_level/len) * 100; // 물높이의 퍼센트

  wave_cur(water_level, per);

  Serial.print("수위 : ");
  Serial.print(water_level);
  Serial.print(" 퍼센트 : ");
  Serial.println(per);
  delay(500);

}

float get_dist() {
  //trig핀에 사각펄스를 만든다.
  digitalWrite(trig,LOW);
  delayMicroseconds(2);
  digitalWrite(trig,HIGH);
  delayMicroseconds(10);
  digitalWrite(trig,LOW);

  float dist = (pulseIn(echo, HIGH)/29.0)/2;  //cm

  return dist;
}

void wave_cur(float level, float per) { // 현재 수위 출력
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("level : ");
  lcd.print(level);
  lcd.print("cm");
  lcd.setCursor(0,1);
  lcd.print("per : ");
  lcd.print(per);
  lcd.print("%");
}

 

결과


물 높이 측정

실제로 측정하는 과정 중에 찍은 사진입니다.

오차가 어느정도 있지만 물 높이(cm)와 퍼센트가 잘 측정되고 있는 모습입니다.