본문 바로가기
Arduino(아두이노) 활용 강좌

Arduino Uno 로 수위감지센서와 LED, 부저를 사용해서 간단한 수위 경보기 만들어 보기

by 오마이엔지니어 2017. 12. 25.
반응형

Arduino Uno 로 아날로그 수위감지센서와 LED, 부저를 사용해서 간단하게 수위 경보기 키트를 만들어 보는 프로젝트 입니다

수위감지센서는 말 그대로 수위를 감지해서 아날로그 방식으로 출력값을 출력해 주는 센서이며 물탱크나 수조등에 활용할수 있습니다 
세로로 위치한 전극 부분은 수위에 따라 저항값과 전류값이 서로 다르게 변하는데
수위가 높아지면 저항이 감소하고, 전류가 증가하며, 수위가 낮아지면 저항이 증가하고, 전류가 감소하는 원리를 이용한 센서입니다

 

 

<아날로그 수위 감지센서 이미지>

 

사용된 부품

Arduino Uno R3 (Italy)
아날로그 수위감지 센서
SG90 마이크로 서보모터
5mm LED 3색상
3색 RGB LED (캐소드 타입)

능동 부저
막대저항 220 Ohm 3개
점퍼케이블

사용된 키트
아두이노 수위센서 키트

구성배선도-수위 감지시 Buzzer부저 제어해 보기


구성 배선도-수위 감지시 LED와 부저 제어해 보기

 

사용된 예제소스  

water buzzer.txt
0.00MB
Water Level.txt
0.00MB


테스트 방업
첫번째 water buzzer 예제를 테스트할때는 부저를 사용해도 되고 LED를 배선해 주어도 무방합니다
그리고 부저의 긴다리 (+)쪽을 11번핀에 짧은다리 (-)쪽을 아두이노 GND에 배선해 주어도 무방합니다
위의 구성배선도 그대로 배선한 다음 테스트 해도 역시 상관은 없습니다


예제코드를 살펴보면

  pinMode(A0, INPUT);   
  pinMode (11, OUTPUT);
수위센서는 아날로그 0번핀에 부저는 11번핀에 세팅됩니다

void loop ()
{  
  Serial.print ("Sensor Value: ");
  int x = analogRead (A0);
  Serial.println (x);
 반복 루프에서 수위센서 아날로그 출력값 AO을 시리얼 모니터로 출력해 줍니다

  if (x < 100)
  {    
   Serial.println(" WATER DETECTED!");    
   digitalWrite (11, HIGH);
  }  
if문을 사용해서 출력값이 100이하로 떨어질때 11번 부저가 HIGH 로 울리게 됩니다

  else  
  {    
    digitalWrite (11, LOW);
  }  
  delay (1000);

els문을 사용해서 그밖의 출력값이 100이상일때 부저는 LOW로 꺼지게 됩니다
간단한 예제로 수위센서는 생산버전 마다 출력값이 약간씩 틀리므로
시리얼 모니터로 출력값을 확인하면서 if (x < 100) 이부분의  100을 적당한 수치로
변경하면서 테스트 하면 됩니다


두번째 Water Level 예제를 테스트 하는 방법입니다

--------------------------------------------------------------------------------------------------------------------------------
int level;
const int analog_0=0;
int l1=13;
int l2=12;
int l3=11;
int l4=10; 
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(l1,OUTPUT);
  pinMode(l2,OUTPUT);
  pinMode(l3,OUTPUT);
  pinMode(l4,OUTPUT);
  pinMode(8,OUTPUT);
}
void loop() {
  
  // put your main code here, to run repeatedly:
level=analogRead(analog_0);
Serial.println(level);
if(level>300&&level<400)
 { 
  digitalWrite(l1, HIGH);
  digitalWrite(l2, LOW);
   digitalWrite(l3, LOW);
    digitalWrite(l4, LOW);
    digitalWrite(8, LOW);
 }
else if(level>400&&level<500)
 {
  digitalWrite(l1, LOW);
  digitalWrite(l2, HIGH);
   digitalWrite(l3, LOW);
    digitalWrite(l4, LOW);
    digitalWrite(8, LOW);
 }
else if(level>500&&level<600)
 {
  digitalWrite(l1, LOW);
  digitalWrite(l2, LOW);
   digitalWrite(l3, HIGH);
    digitalWrite(l4, LOW);
    digitalWrite(8, LOW);
  }
else if(level>600&&level<650)
 {
  digitalWrite(l1, LOW);
  digitalWrite(l2, LOW);
   digitalWrite(l3, LOW);
    digitalWrite(l4, HIGH);
    digitalWrite(8, HIGH);
  }
}

--------------------------------------------------------------------------------------------------------------------------------
int level;
const int analog_0=0;
int l1=13;
int l2=12;
int l3=11;
int l4=10; 
l1, l2, l3, l4 가 차례대로 13, 12, 11, 10번핀에 세팅됩니다

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(l1,OUTPUT);
  pinMode(l2,OUTPUT);
  pinMode(l3,OUTPUT);
  pinMode(l4,OUTPUT);
  pinMode(8,OUTPUT);
}
셋업에서 LED l1,l2,l3,l4 와 8번 부저를 출력해 줍니다

void loop() {
level=analogRead(analog_0);
Serial.println(level);
루프에서 수위센서의 아날로그 출력값을 입력 받아서 
if 문을 사용해서

첨부된 예제코드에서 확인할 수 있듯이
if(level>300&&level<400)
if 만약 출력값이 300~400 이면 l1 의 13번 핀의 빨간색 LED가 점등 됩니다
else if(level>400&&level<500)
else 그밖의 출력값이 400~500 이면 l2의 12번 핀의 노란색 LED가 점등 됩니다
else if(level>500&&level<600)
else 그밖의 출력값이 500~600 이면 l3 의 11번 핀의 녹색 LED가 점등 됩니다

else if(level>600&&level<650)
elsd 그밖의 출력값이 600~650 이면 l4 의 10번 핀의 LED가 점등 됩니다 (배선하지 않음) 또한 8번핀의 부저가 울립니다


수위센서 생산 버전에 따라 출력값이 약간씩 틀릴 수 있으므로 시리얼 모니터로 수위가 없을때의 기본 출력값을 체크한 후 수위를 올려 보면서 수치변화를 확인 후 예제 코드의 위 수치 300~650 을 적당하게 수정해서 테스트 해 봅시다

 

위 이미지의 버전같은 경우 출력값이 낮으므로
첨부된 예제코드에서
if(level>100&&level<150)
if 만약 출력값이 100~150 이면 l1 의 13번 핀의 빨간색 LED가 점등 됩니다
else if(level>150&&level<200)
else 그밖의 출력값이 150~200 이면 l2의 12번 핀의 노란색 LED가 점등 됩니다
else if(level>200&&level<250)
else 그밖의 출력값이 200~250 이면 l3 의 11번 핀의 녹색 LED가 점등 됩니다

else if(level>250&&level<300)
elsd 그밖의 출력값이 250~300 이면 l4 의 10번 핀의 LED가 점등 됩니다 (배선하지 않음) 또한 8번핀의 부저가 울립니다
이런식으로 예제코드를 수정후 테스트 하면 됩니다

--------------------------------------------------------------------------------------------------------------------------------

level=analogRead(analog_0);
Serial.println(level);
--------------------------------------------------------------------------------------------------------------------------------
위 예제코드에서 보듯이
시리얼 모니터로 출력값을 확인할수 있습니다

컴퓨터나 노트북의 사양에 따라 USB를 통해 아두이노로 공급하는 전류의 차이가 있으므로

테스트시 시리얼 모니터로 출력되는 출력값이 틀릴수 있습니다
시리얼 모니터로 출력값을 확인해 보면서 코드값을 수정해 가면서 테스트 해보면 조금 더 원활하게 테스트 할 수 있습니다


아주 정밀하지는 않지만 수위경보기를 구성하는 원리에 대해 알아보고 테스트 해보는데 도움이 될수 있습니다

구성 배선도-수위 감지시 3색 RGB LED와 부저 제어해 보기

LED 대신 3색 RGB LED를 사용해서도 동일한 예제코드로 동일하게 테스트 할 수 있습니다


프로젝트 동영상-수위 감지시 부저 제어해 보기


프로젝트 동영상-수위 감지시 LED와 부저 제어해 보기


프로젝트 동영상-수위 감지시 3색 RGB LED와 부저 제어해 보기

이어서 추가로 아날로그 수위감지센서와 SG90 마이크로 서보모터를 사용해서 간단하게

수위 변화시 서보모터를 제어해 보는 프로젝트입니다

구성 배선도

사용된 예제소스  

Water Level Servo.txt
0.00MB
Water Level Servo2.txt
0.00MB


주의사항
가장 주의해야 할 점은 마이크로 서보모터이긴 하지만SG90 서보모터 제대로 동작하려면
안정적인 전압과 전류가 필요하므로 아날로그 수위센서 모듈과 별도의 전압으로 5V로 연결해 줍니다
아날로그 수위센서 모듈 3.3V 에도 동작하므로 SG90 서보모터와 별도로 
3.3V로 연결해 줍니다

Water Level Servo 예제는 수위센서 아날로그 출력값이 50 넘을때 서보모터가 180도로 회전하고
출력값이 50 이하게 될때 0도로 회전하는 예제입니다

Water Level Servo2 예제는 수위센서 아날로그 출력값이 50 넘을때 서보모터가 180와 0도로 반복회전하고
출력값이 50 이하게 될때 0도로 회전하는 예제입니다

Water Level Servo 예제코드를 살펴보면
#include <Servo.h>
Servo.h 라이브러리를 사용합니다, 아두이노 IDE 설치시 기본 설치되는 라이브러리 입니다

Servo myservo;
const int waterSens = A0;
int pos = 0;
아날로그 A0번핀에 연결된 센서값을 받아서 서보가 동작합니다

void setup() {
  Serial.begin(9600);
  myservo.attach(9);
}
셋업에서 서보모터는 9번핀에 세팅합니다

void loop() {
  int sensorValue = analogRead(waterSens);      
  sensorValue = map(sensorValue, 0, 1023, 0, 180); 
     if (sensorValue >= 50) {
         myservo.write(180); 
         delay(100); 
     }  
루프에서 수위센서 아날로그 센서값을 읽어와서 아날로그 0~1023 수치를 0~180도로 세팅합니다
if문을 사용해서 수위센서 아날로그 출력값이 50이 넘으면 서보모터가 180도로 회전합니다

else{
    myservo.write(0);
}
  Serial.println(sensorValue);
  delay(20);        
}
else문을 사용해서 그밖의 경우는 서보모터가 0도로 회전합니다
Serial.println 문구가 있으므로 시리얼 모니터로 아날로그 센서 출력값을 확인할수 있습니다

 if (sensorValue >= 50) {

시리얼 모니터로 수위센서 아날로그 출력값을 확인하면서 위 예제의 센서값 50을
적당한 수치로 변경한 다음 테스트 할수 있습니다


Water Level Servo2 예제코드를 살펴보면
첫번째 예제와 모두 동일하며

    if (sensorValue >= 50) {
        for (pos = 0; pos <= 180; pos += 1) {
    myservo.write(pos);
    delay(15);
  }
  for (pos = 180; pos >= 0; pos -= 1) {
    myservo.write(pos);
    delay(15);
  }  

if문을 사용해서 수위센서 아날로그 출력값이 50이 넘으면 서보모터가 180도와 0도로 반복 회전합니다

프로젝트 동영상


이런 방법으로 아두이노 아날로그 수위센서와 서보모터를 이용해서 수위가 높아지면
수도를 잠근다던가 하는
수위 조절 장치를 구성해 볼 수 있습니다

반응형

댓글