반응형
이번 시간에는 아두이노를 활용하여 비접촉수위센서(XKC-Y25-V)를 사용해 보자.
비접촉수위센서(워터레벨센서)란 물이 담긴 용기 안에 센서를 집어넣지 않고 용기 밖에서 수위를 측정할 수 있는 센서다. 비접촉이란 말 대로 물속에 집어넣어 측정하는 게 아니라 밀폐된 용기 밖에서 수위가 어느 정도 올라왔는지 감지가 가능한 센서다.
1. 먼저 아두이노에서 센서값이 어떻게 측정되는지 살펴보고
2. 측정결과를 LED 전등을 ON
3. 측정 결과에 따라 부저가 작동하도록 수정해 보고,
4. 측정결과를 16x2 LCD에 디스플레이한다.
5. 수위센서 1개를 이용해서 워터펌프가 최저수위에 도달하면 작동을 멈추도록 실습한다.
더욱 확장하여 비접촉수위센서 2개를 이용해서 최저수위와 최고수위를 바탕으로 펌프를 작동시켜야 할 시점을 판단해 워터펌프를 동작하거나 멈추는 기능을 각자 구현한다.
비접촉수위센서의 디지털값을 읽는 간단한 코드는 물이 감지되면 HIGH, 감지가 안되면 LOW가 출력되었다.
기본 연결 회로도
/*
* 비접촉수위센서를 D2에 연결했다!
* 기본적인 수위센서의 디지털값을 읽어보는 간단한 코드이다!
* 물이 감지되면 HIGH, 감지가 안되면 LOW가 출력되었다!
*/
#define wlsensor 2
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(wlsensor,INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
Serial.println(digitalRead(wlsensor));
delay(100);
}
기본 회로에 LED를 연결하여 수위를 감지하면 LED 점등하는 회로
/*
* 아두이노에 LED를 D3에 연결한다음 수위센서가 감지되면 LED를 켜고
* 감지가 안되면 LED를 OFF 상태로 한다
*/
#define wlsensor 2
#define LED 3
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(LED,OUTPUT);
pinMode(wlsensor,INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
if(digitalRead(wlsensor) == HIGH){
//감지
digitalWrite(LED,HIGH);
}else{
digitalWrite(LED,LOW);
//감지안됨
}
delay(100);
}
부저를 추가하여 부저를 작동하는 회로
코드
/*
* 부저를 1개 추가를해서 D4에 연결
* 수위센서에 의해서 감지가 되면 부저를 작동
*/
#define wlsensor 2
#define LED 3
#define buzzer 4
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(LED,OUTPUT);
pinMode(wlsensor,INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
if(digitalRead(wlsensor) == HIGH){
//감지
digitalWrite(LED,HIGH);
tone(buzzer, 1175);
}else{
digitalWrite(LED,LOW);
noTone(buzzer);
//감지안됨
}
delay(100);
}
I2C 인터페이스를 가진 1602 LCD를 연결하여 상태 메시지를 디스플레이하는 회로
코드
/*
* 1602LCD를 I2C로 사용할 수 있는 모듈
* 수위센서의 작동상태를 text로 디스플레이
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define wlsensor 2
#define LED 3
#define buzzer 4
LiquidCrystal_I2C lcd(0x27,16,2); //16*2
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(LED,OUTPUT);
pinMode(wlsensor,INPUT);
lcd.init();
lcd.backlight();
}
void loop() {
// put your main code here, to run repeatedly:
lcd.clear();
if(digitalRead(wlsensor) == HIGH){
//감지
digitalWrite(LED,HIGH);
tone(buzzer, 1175);
lcd.print("WATER DETECTED!!");
}else{
digitalWrite(LED,LOW);
noTone(buzzer);
//감지안됨
}
delay(100);
}
워터펌프를 달고, 제어는 릴레이를 통해 제어하도록 수정한 회로
/*
* 아두이노에 워터펌프를 연결
* 워터펌프를 직접 아두이노에 연결할 수 없기에 모스펫(mosfet, Relay)을 D3에 연결
* 릴레이 출력을 워터펌프를 연결
* 버튼을 누르면 워터펌프를 작동
* 구현 안된 것: 수위센서에 의해서 최저수위가 감지되면 워터펌프의 작동을 멈추는 기능
*/
#define button 4
#define pump 3
#define wlsensor 2
void setup() {
// put your setup code here, to run once:
pinMode(button,INPUT_PULLUP);
pinMode(pump,OUTPUT);
pinMode(wlsensor,INPUT);
digitalWrite(pump,LOW);
}
void loop() {
// put your main code here, to run repeatedly:
if(digitalRead(wlsensor) == LOW){
//물이 있다가 없어진것!
digitalWrite(pump,LOW);
}
if(digitalRead(button) == LOW){
//버튼이 눌려진것! 왜냐! 풀업방식이라고 위에서 했기 때문!
digitalWrite(pump,HIGH);
}
}
이미지와 코드 참고: 녹칸다 블로그
반응형
더욱 좋은 정보를 제공하겠습니다.~ ^^