안녕하세요? 메카솔루션입니다. 물의 높이 측정에 이용하는 수위 측정(water level) 센서에 대해 종류, 회로도와 프로그램 코드와 예제에 대해 알아보고자 합니다.
수위 측정 센서 알아보기
수위 측정 센서는 물센서라도 불리며, 센서를 일정 높이에 달거나 부착해서 물의 여부를 확인하는 용도로 자주 이용됩니다. 센서 종류마다 물이 직접 닿는 접촉식과 외관(표면)에 장착해서 사용하는 비접촉식 방식이 있으며, 그 외의 방법으로는 부력을 이용해서 내부 스위치가 닫기면 감지 신호를 내는 플로팅 방식의 수위 센서도 있습니다.
접촉식 수위센서는 니켈 같은 도체로 구성된 금속판이 절연체에 띄엄띄엄 떨어져 있습니다. 이를 개방된 회로라고 하고, 전류가 흐르지 않습니다. 반면에, 액체가 접촉하게 되면 띄어져 있는 도체가 연결되기 때문에 저항값이 무한대인 개방된 회로보다 저항값이 줄어들고 전류가 흐를 수 있게 됩니다 (닫긴 회로) 이를 통해 물에 접촉하는 표면적이 많을수록 출력 저항값이 적어지는 것을 알 수 있고, 센서를 세워서 연결했을 때, 센서의 저항값은 액체 높이에 반비례한다는 점을 확인할 수 있습니다. 접촉식 수위센서 뿐만 아니라, 수분센서, 강우량 센서 등 액체의 직접적인 접촉에 의한 대부분의 센서들은 이와 같은 저항값에 따른 수분량을 파악합니다.
회로도 알아보기
왼쪽 회로도는 접촉식 수위센서(아날로그)의 배선방법이고, 오른쪽 회로도는 비접촉식 수위센서(디지털) 배선방법입니다.
수위센서는 대부분 모듈형으로 나오기 때문에 모듈에 적혀있는 실크표기에 맞게 연결해주시면 됩니다.
소스 코드 알아보기
별다른 라이브러리는 필요 없기 때문에, 쉽게 값을 확인할 수 있습니다. 아날로그 방식의 수위센서면 analogRead()를, 디지털 방식의 수위센서면 digitalRead() 함수를 통해 쉽게 읽어드릴 수 있습니다.
아날로그 방식;analogRead()
voidsetup(){
Serial.begin(9600);//시리얼 모니터를 시작합니다.}voidloop(){
int level =analogRead(A0);// 수분센서의 신호를 측정합니다.
Serial.println(level);//시리얼 모니터에 값을 출력합니다.}
디지털 방식;digitalRead()
voidsetup(){
Serial.begin(9600);//시리얼 모니터를 시작합니다.}voidloop(){
int level =digitalRead(2);// 수분센서의 신호를 측정합니다.
Serial.println(level);//시리얼 모니터에 값을 출력합니다.}
소프트웨어 코딩 교육 예제
수위 센서에 받아온 값을 통해 아두이노 프로젝트에 응용할 수 있는 예제를 해보도록 하겠습니다.
비접촉 수위센서를 이용해서 물이 인식이 되면 13번 핀의 내장 LED를 점등(ON)되고, 물이 인식되지 않으면(일정 수치보다 이하면) 13번 핀의 내장 LED를 소등(OFF)합니다.
앞서 알아본 소스코드 알아보기에 IF문을 추가해, 조건문을 만들어 LED를 점등(ON), 소등(OFF)을 선언해주면 어렵지 않게 작성할 수 있습니다.
voidsetup(){
Serial.begin(9600);//시리얼 모니터를 시작합니다.pinMode(13,OUTPUT);}voidloop(){
int level =digitalRead(2);// 수분센서의 신호를 측정합니다.
Serial.println(level);//시리얼 모니터에 값을 출력합니다.if(level == HIGH)//수위센서에 액체가 감지되면,digitalWrite(13,HIGH);//13번 핀에 HIGH를 출력합니다(LED점등)else//그렇지 않으면,digitalWrite(13,LOW);//13번 핀에 LOW를 출력합니다(LED소등)}
이 부분을 좀 더 응용한다면 수중모터와 비접촉 수위센서 두 개를 같이 이용해서 일정 높이보다 낮으면(아래쪽 수위센서) 수중모터를 돌려 물을 채우고, 위 쪽 비접촉 수위센서가 감지되면 수중모터를 멈춰 물 공급을 중단이 필요한 곳에 유용하게 이용될 것 같습니다
첫댓글 https://blog.naver.com/leecblee/221259156786