이 프로젝트는 물탱크 수위 정보를 제공합니다. 수위가 낮으면 녹색 LED 점등, 중간이면 노란색 LED 점등, 높으면 빨간색 LED가 부저 소리와 함께 점멸합니다. 초음파 센서로 센서-수면 간 거리를 측정해 LCD에 표시하고, DS18B20으로 탱크 내부 온도도 함께 표시합니다.
이 프로젝트는 더 큰 프로젝트의 일부입니다. 2단계: 펌프 작동 표시용 6개 추적 LED 원형 장착 (링크). 3단계: 수위 높으면 펌프 시작, 낮으면 정지 (제작 중). 실제로는 방수 초음파 센서 사용 예정이며 배선/코드 변경 없음. 센서가 젖었을 때(습도) 판독에 어떤 영향 있을지 모르니 이 프로젝트는 정보 제공용이고, 3단계에서 자기 접점으로 펌프 제어 예정.
코드
#include <LiquidCrystal.h> // Liquid Crystal 라이브러리 로드
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 6 // 데이터선은 아두이노 핀 6에 연결
OneWire oneWire(ONE_WIRE_BUS); // OneWire 인스턴스 생성
DallasTemperature sensors(&oneWire); // Dallas Temperature에 oneWire 참조 전달
LiquidCrystal LCD(12, 11, 5, 4, 3, 2); // LCD 객체 생성 (RS, E, D4, D5, D6, D7)
int trigPin = 9; // 센서 Trig 핀 → 아두이노 핀 9
int echoPin = 7; // 센서 Echo 핀 → 아두이노 핀 7
int myCounter = 0;
float pingTime; // 왕복 시간 (마이크로초)
float targetDistance; // 목표 거리 (cm)
float speedOfSound = 776.5; // 음속 (마일/시) - 원본 단위 주의
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
LCD.begin(16, 2); // 16x2 LCD 초기화
LCD.setCursor(0, 0);
LCD.print("Distance:");
sensors.begin(); // 온도 센서 라이브러리 시작
pinMode(8, OUTPUT); // 노란색 LED
pinMode(10, OUTPUT); // 빨간색 LED
pinMode(13, OUTPUT); // 녹색 LED
}
void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2000); // 신호 안정화
digitalWrite(trigPin, HIGH);
delayMicroseconds(15); // 15μs 트리거 펄스 (일반적으로 10μs 권장)
digitalWrite(trigPin, LOW);
delayMicroseconds(10);
pingTime = pulseIn(echoPin, HIGH); // 마이크로초 단위
pingTime = pingTime / 1000000; // 초 단위 변환
pingTime = pingTime / 3600; // 시간 단위 변환
targetDistance = speedOfSound * pingTime; // 마일 단위 거리
targetDistance = targetDistance / 2; // 왕복이므로 반으로
targetDistance = targetDistance * 160934.4; // 마일 → 센티미터 변환
sensors.requestTemperatures(); // 온도 측정 요청
LCD.setCursor(10, 0);
LCD.print(" "); // 행 지우기
LCD.setCursor(10, 0);
LCD.print((int)(targetDistance + 0.5)); // 반올림 거리 출력
LCD.print("cm ");
LCD.setCursor(0, 1);
LCD.print(" "); // 행 지우기
LCD.setCursor(0, 1);
if (targetDistance > 40) {
LCD.print("LEV LOW ");
LCD.print(sensors.getTempCByIndex(0));
LCD.print((char)223); // 도(°) 기호
LCD.print("C");
} else if (targetDistance < 40 && targetDistance > 20) {
LCD.print("LEV MED ");
LCD.print(sensors.getTempCByIndex(0));
LCD.print((char)223);
LCD.print("C");
} else { // targetDistance < 20
LCD.print("LEV HIGH ");
LCD.print(sensors.getTempCByIndex(0));
LCD.print((char)223);
LCD.print("C");
}
delay(2000);
// LED 제어
if (targetDistance > 40) {
digitalWrite(13, HIGH); // 녹색 ON
} else {
digitalWrite(13, LOW); // 녹색 OFF
}
if (targetDistance < 40 && targetDistance > 20) {
digitalWrite(8, HIGH); // 노란색 ON
} else {
digitalWrite(8, LOW); // 노란색 OFF
}
if (targetDistance < 20) {
digitalWrite(10, HIGH); // 빨간색 ON
delay(2000);
digitalWrite(10, LOW); // 빨간색 OFF
} else {
digitalWrite(10, LOW); // 빨간색 OFF
}
}