홍창민정보·인공지능 교사

물·흙 · 난이도 쉬움

막대형 수위 센서로 물 깊이 보정표 만들고 잴 때만 전원을 켜서 전극 부식 줄이기

빨간 막대형 수위 센서는 물에 잠긴 줄무늬가 많을수록 출력이 커져요. 전원을 GP22로 잴 때만 켜서 부식을 줄이는 배선, 깊이와 값의 보정표로 cm를 구하는 코드, 물의 종류와 물방울 수에 따른 차이 탐구, 물과 전기를 함께 다룰 때 지킬 것을 정리했어요.

글 홍창민 · 갱신 2026-10-31 · 읽는 데 약 7분 · 가상 실행 확인 (실물 미확인)

이 센서로 무엇을 잴 수 있나

흔히 파는 수위 센서는 빨간 기판에 구리 줄무늬가 길게 드러난 모듈이에요. 판매처 자료(Rajguru Electronics)에는 동작 전압 3~5V, 전류 20mA 미만, 아날로그 출력이 적혀 있어요. 줄무늬는 10개이고, 5개는 전원 쪽, 5개는 감지 쪽이며 서로 한 줄씩 엇갈려 있어요.

이 센서가 직접 재는 것은 깊이가 아니라 "줄무늬가 물에 얼마나 잠겼나"예요. 그래서 줄무늬 길이 안에서 컵의 물이 얼마나 찼는지, 빗방울이 떨어졌는지, 바닥에 물이 샜는지를 알아내는 데 맞아요. 깊이를 cm로 말하려면 직접 잰 보정표가 필요해요. 수 m짜리 물탱크의 수위처럼 줄무늬보다 긴 범위는 잴 수 없어요.

원리

줄무늬가 말라 있으면 전원 쪽과 감지 쪽 사이로 전기가 흐르지 않아요. 물이 둘을 이으면 감지 쪽으로 작은 전류가 흐르고, 기판의 NPN 트랜지스터(S8050)가 이 전류를 키워 S 핀의 전압을 올려요(Last Minute Engineers의 회로 설명). 더 많이 잠길수록 물을 통해 흐르는 전류가 늘어 S 전압도 커져요.

이 전류는 물이 얼마나 전기를 잘 통하게 하는지에도 좌우돼요. 같은 깊이라도 소금물에서는 값이 크고, 미네랄이 거의 없는 증류수에서는 작게 나와요. 그래서 보정표는 실제로 잴 물로 만들어야 해요.

전기가 계속 흐르는 채로 젖어 있는 구리는 빨리 녹슬어요. 줄무늬가 녹슬면 같은 깊이에서도 값이 달라지고, 결국 못 쓰게 돼요. 그래서 이 글은 센서의 전원을 피코의 GP22에 이어, 잴 때만 잠깐 켜고 바로 꺼요. 저항식 토양 수분 센서도 같은 이유로 이렇게 쓰면 좋아요.

준비물

  • 라즈베리파이 피코와 USB 케이블
  • 수위 센서 모듈, 암-수 점퍼선 3개
  • 투명한 컵이나 눈금실린더, 30cm 자, 스포이트, 쟁반, 휴지
  • 탐구용: 증류수, 수돗물, 소금, 0.01g 전자저울

배선

막대형 수위 센서로 물 깊이 보정표 만들고 잴 때만 전원을 켜서 전극 부식 줄이기: 브레드보드에 피코와 센서를 꽂은 배선 그림
시나브로 PICO 브레드보드 작업대와 같은 계산으로 그린 배선이에요. 위 + 줄은 3.3V, 아래 + 줄은 5V예요.
브레드보드 따라 꽂기 순서 (7단계)
  1. 피코를 브레드보드 가운데 홈에 걸쳐 꽂아요. USB 단자가 왼쪽을 보게 하고, 1번 핀이 f2, 40번 핀이 e2에 들어가요. 다리가 홈 양쪽에 모두 들어갔는지 옆에서 봐요.
  2. 검은 선: 피코 38번 핀(GND) 옆 칸 a4 → 위쪽 − 줄(GND). 이제 이 줄 전체가 GND예요.
  3. 수위 센서 Water Level 꽂기: 다리 + · − · S를 위쪽 a24 · a25 · a26에 차례로 꽂아요. 다리가 브레드보드에 바로 안 들어가면 암-수 점퍼선으로 같은 칸에 이어요.
  4. 초록 선(신호): 수위 센서 + 줄 b24 → 피코 29번 핀(GP22) 옆 칸 a13
  5. 검은 선(GND): 수위 센서 − 줄 b25 → 위쪽 − 줄(GND)
  6. 초록 선(신호): 수위 센서 S 줄 b26 → 피코 34번 핀(GP28) 옆 칸 a8
  7. 마지막 확인: ① 위쪽 + 줄(3.3V)과 아래쪽 + 줄(5V)이 서로 이어지지 않았나요? ② 모든 부품의 GND가 − 줄에 이어졌나요? ③ 5V 신호 다리는 저항을 거쳐 피코에 이어졌나요? ④ 긴 브레드보드는 + − 줄이 가운데에서 끊긴 것도 있어요(빨간·파란 선이 끊겨 있으면 짧은 선으로 이어요). ⑤ 그림과 한 칸씩 비교한 뒤 USB를 꽂아요.
모듈 핀 피코 핀 비고
+ GP22 (29번) 잴 때만 켜는 전원(3.3V)
− GND (38번) 피코와 접지를 함께 써요
S GP28 (34번) 아날로그 출력

+를 3V3에 바로 잇지 않고 GP22에 이은 것이 이 배선의 핵심이에요. 코드가 GP22를 HIGH로 올리는 짧은 순간에만 센서에 전기가 들어가요. 모듈의 전원 표시 LED도 이때만 잠깐 켜져요.

다만 GP 핀은 원래 전원 핀이 아니에요. RP2350 데이터시트를 보면 GP 핀의 출력 세기는 2·4·8·12mA 가운데 하나로 정하고 기본은 4mA이며, 모든 GP 핀이 내보내는 전류의 합은 100mA를 넘지 않아야 해요. 센서는 사양상 20mA 미만을 쓰는데, 물에 많이 잠겨 전류가 늘면 GP22의 전압이 3.3V보다 처질 수 있어요. 잴 때마다 같은 방식으로 켜니 보정표를 쓰면 이 영향까지 표에 담기지만, 이런 모듈 여러 개를 GP 핀으로 켜지는 않아요(전원 계산).

코드

from machine import ADC, Pin
import time

power = Pin(22, Pin.OUT, value=0)   # + → GP22: 잴 때만 켜요
level = ADC(Pin(28))                # S → GP28
TABLE = []    # 직접 잰 (값, 깊이cm)를 값이 커지는 순서로 채워요. 처음에는 비어 있어요

def read_level(n=8):
    power.on()
    time.sleep_ms(20)               # 켠 뒤 값이 자리 잡을 때까지
    s = 0
    for i in range(n):
        s += level.read_u16()
    power.off()                     # 바로 꺼서 전류가 흐르는 시간을 줄여요
    return s / n

def to_cm(v):
    if len(TABLE) < 2:
        return -1
    for i in range(len(TABLE) - 1):
        v1, d1 = TABLE[i]
        v2, d2 = TABLE[i + 1]
        if v1 <= v <= v2:
            return d1 + (d2 - d1) * (v - v1) / (v2 - v1)
    return -1                       # 표 범위 밖

dry = read_level()
print(f"마른 상태 값: {dry:.0f} (물에 넣기 전에 재요)")
while True:
    v = read_level()
    print(f"DATA: level={v:.0f}, cm={to_cm(v):.1f}")
    time.sleep(2)                   # 2초마다 20ms만 켜요
  • read_level()은 GP22를 켜고 20ms 기다린 뒤 8번 읽어 평균을 내고 바로 꺼요. 2초마다 20ms만 켜니 전류가 흐르는 시간은 늘 켜 둘 때의 1%예요.
  • TABLE에 직접 잰 (값, 깊이) 쌍을 넣으면 to_cm()이 이웃한 두 점 사이를 직선으로 이어 cm를 계산해요(선형 보간). 표가 비었거나 표 범위 밖이면 −1을 내보내요.
  • 시작할 때 마른 상태의 값을 한 번 보여 줘요. 이 값이 0 근처가 아니라면 줄무늬에 물기가 남았거나 배선을 확인해요.

값 해석과 보정

보정표는 이렇게 만들어요. 센서를 자에 붙여 세우고 컵에 물을 0.5cm씩 더 부으며, 깊이마다 level을 5줄씩 기록해 평균을 내요. 그 결과를 TABLE = [(값0, 0.0), (값1, 0.5), …]처럼 값이 커지는 순서로 적어요. 점이 많을수록 보간이 정확해요. 탐구 1의 결과가 곧 이 표예요.

표를 만들 때 깊이와 값이 직선이라고 미리 정하지 않아요. 처음 몇 mm에서 값이 크게 뛰었다가 깊어질수록 덜 오르는 모습이 나올 수도 있고, 줄무늬가 거의 다 잠기면 더 오르지 않을 수도 있어요. 어떤 모양이 나오는지 그래프로 확인하는 것 자체가 탐구예요.

물에서 꺼낸 직후에는 줄무늬에 남은 물막 때문에 값이 한동안 높게 나와요. 같은 물에서 여러 번 잴 때는 꺼낸 뒤 휴지로 살짝 닦고 다시 넣어요. 물을 바꾸면 보정표도 새로 만들어요. 몇 주 쓰고 나서 같은 깊이의 값이 달라졌다면 줄무늬가 녹슬었는지 살펴봐요.

자주 하는 실수

  1. +를 3V3에 이어 계속 켜 두기. 젖은 줄무늬에 전류가 계속 흘러 빨리 녹슬어요. GP22로 잴 때만 켜요.
  2. 줄무늬 위 부품까지 물에 담그기. 트랜지스터와 커넥터가 있는 윗부분은 물에 닿으면 안 돼요. Last Minute Engineers도 줄무늬 부분만 물에 닿게 하라고 적어요.
  3. 증류수로 만든 보정표로 소금물을 재기. 물이 다르면 같은 깊이에서도 값이 달라요.
  4. 꺼내자마자 다시 재기. 남은 물막 때문에 값이 높게 나와요.
  5. 센서 여러 개를 GP 핀으로 켜기. GP 핀 전류의 합에는 한계가 있어요. 여러 개라면 전원 스위치 회로를 따로 생각해요.

이 센서로 잴 수 있는 탐구

1. 잠긴 깊이와 값은 비례할까 - 질문: 물에 잠긴 깊이가 두 배가 되면 level도 두 배가 될까? - 바꾸는 것: 잠긴 깊이 0cm부터 줄무늬 끝까지 0.5cm 간격 - 재는 것: level(ADC 값) - 방법: 센서를 자에 붙여 세우고 컵에 물을 조금씩 부어요. 깊이마다 5줄 평균을 내고 3번 반복해, 그래프와 보정표를 함께 만들어요.

2. 물의 종류가 값을 바꿀까 - 질문: 같은 깊이에서 증류수, 수돗물, 소금물의 값은 얼마나 다를까? - 바꾸는 것: 물의 종류(증류수, 수돗물, 수돗물 100mL에 소금 0.5g) - 재는 것: 깊이 2cm에서의 level(ADC 값) - 방법: 물을 바꿀 때마다 센서를 증류수로 헹구고 닦아요. 종류마다 3번 재고, 차이를 보고 보정표를 물마다 따로 만들어야 하는지 판단해요.

3. 물방울 몇 개부터 비가 온다고 알아챌까 - 질문: 눕혀 둔 센서에 떨어진 물방울 수에 따라 값이 어떻게 늘어날까? - 바꾸는 것: 스포이트로 떨어뜨린 수돗물 방울 수 1, 2, 4, 8개 - 재는 것: level(ADC 값), 마른 상태보다 커진 정도 - 방법: 센서를 쟁반 위에 비스듬히 눕히고, 방울은 줄무늬 가운데에 떨어뜨려요. 시도 사이에는 휴지로 닦아 말리고, 방울 수마다 5번 반복해 "비 감지" 문턱을 정해요.

안전

  • 3.3V라도 물과 전기는 떨어뜨려요. 피코, USB, 노트북은 쟁반 밖 마른 곳에 두고, 물을 쏟으면 먼저 USB를 뽑아요.
  • 젖은 손으로 배선을 만지지 않고, 센서를 닦을 때는 전원을 끈 상태에서 해요.
  • 이 장치는 침수·누수 경보기가 아니에요. 집이나 학교 시설을 지키는 데 쓰지 마세요.

더 알아보기

  • 모듈 자료: Rajguru Electronics "Water Level Sensor Module" 자료(3~5V, 20mA 미만, 줄무늬 10개의 구성), Last Minute Engineers "How Water Level Sensor Works"(S8050 회로, 잴 때만 디지털 핀으로 켜기, 줄무늬 부분만 담그기)
  • 공식 자료: Raspberry Pi "RP2350 datasheet"(GP 핀 출력 세기 2·4·8·12mA와 기본 4mA, GP 핀 전류 합 100mA)
  • 라이브러리: 따로 없어요. MicroPython 내장 machine.ADC, machine.Pin
  • 기초 글: 전원 계산, 피코 핀 지도, 센서 값의 신뢰도, 잴 수 있는 탐구 주제 만들기
글쓴이

홍창민 · 울산 학성고등학교 정보·인공지능 교사. 수업에 쓰는 도구(시나브로 PICO 웹 IDE, 학교 AI 서버 등)를 직접 만들어 운영해요. 소개 보기 · 고칠 곳 알려 주기