물·흙 · 난이도 보통
탁도 센서로 물의 흐림을 맑은 물 기준 전압 비율로 재고 NTU 환산의 한계 알기
탁도 센서는 물을 지나는 빛이 줄어드는 정도로 흐림을 봐요. 5V 출력을 10kΩ·20kΩ으로 나눠 GP27에 잇는 배선, 맑은 물 기준 전압과 비교한 % 값을 내는 코드, NTU 그래프를 대략값으로만 쓰는 이유, 거름 재료와 가라앉는 시간 탐구를 정리했어요.
이 센서로 무엇을 잴 수 있나
탁도는 물에 떠 있는 작은 알갱이 때문에 물이 흐린 정도예요. 학교에서 많이 쓰는 탁도 모듈은 손가락 굵기의 탐침과 작은 변환 기판으로 되어 있어요. DFRobot의 SEN0189 자료에는 전원 5V, 최대 전류 40mA, 응답 시간 500ms 미만, 아날로그 출력 0~4.5V, 사용 온도 5~90℃가 적혀 있어요. Seeed의 Grove 탁도 센서는 3.3V와 5V를 모두 쓸 수 있다고 적혀 있어요. 이 글은 시나브로 PICO 배선처럼 5V로 켜고 출력을 나누는 방식이에요.
이 센서로는 같은 탐침으로 잰 물끼리 "어느 쪽이 더 흐린가, 얼마나 변했나"를 숫자로 비교할 수 있어요. 흙탕물이 가라앉는 빠르기, 거름 장치가 물을 얼마나 맑게 하는지, 우유를 한 방울씩 넣을 때 값이 어떻게 줄어드는지 같은 탐구에 잘 맞아요.
원리
탐침의 갈라진 틈 양쪽에 빛을 내는 부품과 받는 부품이 마주 보고 있어요. 그 틈에 물이 차면 알갱이가 빛을 흡수하거나 옆으로 흩뜨려서 받는 쪽에 닿는 빛이 줄어요. DFRobot 자료는 이 원리를 빛의 투과율과 산란율의 변화로 설명해요. 받는 빛이 줄면 출력 전압이 내려가요. DFRobot과 Seeed 자료 모두 흐린 물일수록 아날로그 출력이 작아진다고 적어요. 다른 회사 제품은 회로가 다를 수 있으니, 처음에 맑은 물과 우유를 탄 물을 재서 방향을 먼저 확인해요.
DFRobot 위키에는 온도에 따라 전압을 NTU(탁도 단위)로 바꾸는 참고 그래프가 있고, 순수한 물(NTU 0.5 미만)에서 10~50℃일 때 4.1±0.3V가 나와야 한다고 적혀 있어요. 맑은 물에서도 ±0.3V만큼 제품마다 다르다는 뜻이라, 그래프로 읽은 NTU는 대략값으로만 써요.
기판의 D/A 스위치는 출력 방식을 고르는 거예요. A는 아날로그 전압, D는 가변저항으로 정한 문턱을 넘었는지만 알려 주는 HIGH·LOW예요. 이 글은 A로 둬요.
준비물
- 라즈베리파이 피코와 USB 케이블
- 탁도 모듈(탐침, 변환 기판, 연결선)
- 10kΩ 저항 1개, 20kΩ 저항 1개, 브레드보드, 점퍼선
- 모양이 같은 투명 컵 여러 개, 정수기 물이나 증류수(기준 물)
- 탐구용: 화분 흙, 우유, 스포이트, 커피 필터, 면포, 모래, 깔때기, 쟁반
배선
브레드보드 따라 꽂기 순서 (10단계)
- 피코를 브레드보드 가운데 홈에 걸쳐 꽂아요. USB 단자가 왼쪽을 보게 하고, 1번 핀이 f2, 40번 핀이 e2에 들어가요. 다리가 홈 양쪽에 모두 들어갔는지 옆에서 봐요.
- 빨간 선: 피코 40번 핀(VBUS) 옆 칸 a2 → 아래쪽 + 줄(5V). 이제 이 줄 전체가 5V예요. 위쪽 + 줄(3.3V)과 아래쪽 + 줄(5V)은 절대 서로 잇지 않아요.
- 검은 선: 피코 3번 핀(GND) 옆 칸 j4 → 아래쪽 − 줄(GND). 이제 이 줄 전체가 GND예요.
- Grove 탁도 센서 물의 흐림 꽂기: 다리 VCC · GND · SIG를 아래쪽 j24 · j25 · j26에 차례로 꽂아요. 다리가 브레드보드에 바로 안 들어가면 암-수 점퍼선으로 같은 칸에 이어요.
- 빨간 선(5V 전원): Grove 탁도 센서 VCC 줄 i24 → 아래쪽 + 줄(5V)
- 검은 선(GND): Grove 탁도 센서 GND 줄 i25 → 아래쪽 − 줄(GND)
- 저항 10kΩ(색띠 갈색·검정·주황): g26 ↔ g28 (SIG 다리 칸 → 나눔 칸 28열)
- 저항 20kΩ(색띠 빨강·검정·주황): i28 ↔ 아래쪽 − 줄(GND)
- 초록 선: 나눔 칸 h28 → 피코 32번 핀(GP27) 옆 칸 a10. 5V 신호가 3.3V 아래로 줄어 피코가 안전해요.
- 마지막 확인: ① 위쪽 + 줄(3.3V)과 아래쪽 + 줄(5V)이 서로 이어지지 않았나요? ② 모든 부품의 GND가 − 줄에 이어졌나요? ③ 5V 신호 다리는 저항을 거쳐 피코에 이어졌나요? ④ 긴 브레드보드는 + − 줄이 가운데에서 끊긴 것도 있어요(빨간·파란 선이 끊겨 있으면 짧은 선으로 이어요). ⑤ 그림과 한 칸씩 비교한 뒤 USB를 꽂아요.
| 모듈 핀 | 피코 핀 | 비고 |
|---|---|---|
| VCC | VBUS (40번) | 5V. DFRobot 자료 기준 최대 40mA |
| GND | GND (38번) | 피코와 접지를 함께 써요 |
| SIG(아날로그 출력) | GP27 (32번) | 10kΩ·20kΩ 분압 뒤 연결 |
출력이 4.5V까지 나오므로 SIG ─ 10kΩ ─ ● ─ 20kΩ ─ GND로 잇고, 가운데 점(●)을 GP27에 연결해요. 4.5V가 들어오면 가운데 점은 3.0V가 되어 피코 ADC가 읽는 3.3V 안에 들어와요. 코드에서는 읽은 전압에 1.5를 곱해 센서 전압으로 되돌려요. ADC 핀(GP26~28)은 피코 2에서도 5V를 견디는 핀이 아니라서 분압을 빼면 안 돼요(분압 회로).
탐침과 변환 기판을 잇는 선은 방향이 있어요. DFRobot 자료의 자주 묻는 질문에는 선을 반대로 꽂으면 동작하지 않아 아주 작은 값만 나온다고 적혀 있어요.
코드
from machine import ADC, Pin
import time
tb = ADC(Pin(27)) # SIG → 10kΩ/20kΩ 분압 → GP27
def volt(n=32):
s = 0
for i in range(n):
s += tb.read_u16()
time.sleep_ms(5)
return s / n * 3.3 / 65535 * 1.5 # 분압을 되돌린 센서 전압(V)
print("기준 물(정수기 물이나 증류수)에 탐침을 담그고 5초 기다려요")
time.sleep(5)
ref = volt(64)
print(f"기준 전압: {ref:.2f} V")
if ref < 3.8 or ref > 4.4:
print("DFRobot 자료의 맑은 물 값(4.1±0.3V)과 달라요. 탐침 창과 배선을 확인해요")
while True:
v = volt()
clear = v / ref * 100 if ref > 0 else 0
print(f"DATA: tb_v={v:.3f}, clear={clear:.1f}")
time.sleep(1)
volt()는 32번 읽어 평균을 내고, 0~65535를 0~3.3V로 바꾼 뒤 1.5를 곱해요.- 시작할 때 기준 물의 전압
ref를 64번 평균으로 재요. DFRobot 자료의 맑은 물 범위(3.8~4.4V) 밖이면 경고를 보여 줘요. 다른 회사 모듈이라면 이 범위가 맞지 않을 수 있어요. clear는 지금 전압이 기준 물의 몇 %인지예요. 100이면 기준 물만큼 맑고, 작을수록 흐려요.
값 해석과 보정
clear는 단위가 없는 상대값이에요. 기준 물을 무엇으로 정했는지(정수기 물, 증류수)를 꼭 함께 적어요. 기준으로 나눠 보기 때문에 탐침마다 다른 맑은 물 전압의 차이는 지워지지만, 탐침을 바꾸거나 다른 날 잴 때는 기준을 다시 재요.
NTU로 말하고 싶다면 조심해요. NTU는 포마진이라는 표준 물질로 맞춘 탁도계의 단위예요. 우리 모듈을 표준 물질로 보정하지 않았다면, DFRobot 그래프에서 읽은 NTU는 "그 정도 범위"라는 뜻으로만 써요. 발표에서는 clear 값을 중심으로 쓰고, NTU는 괄호 안에 "참고 그래프로 읽은 대략값"이라고 밝혀요.
내 센서만의 보정표는 우유로 만들 수 있어요. 기준 물 200mL에 우유를 1, 2, 4, 8방울 넣으며 clear를 재면 "우유 몇 방울만큼 흐린가"라는 우리 반만의 눈금이 생겨요. 이 눈금은 직선이 아닐 가능성이 높으니 점을 여러 개 찍어 그래프로 남겨요.
값을 흔드는 원인도 알아 둬요. 탐침 창에 붙은 공기 방울은 빛을 가려 값을 낮춰요. 시료를 저은 직후보다 몇 초 뒤에 읽고, 방울이 보이면 탐침을 살짝 흔들어 떼요. DFRobot 그래프가 온도별로 나뉜 것처럼 물 온도도 영향을 주니, 시료들의 온도를 비슷하게 맞춰요. 같은 모양의 컵에서 탐침을 같은 깊이, 같은 자리에 두는 것도 중요해요.
자주 하는 실수
- 탐침을 끝까지 물에 담그기. DFRobot 자료는 탐침 윗부분이 방수가 아니라고 적어요. 틈이 잠길 만큼만 담가요.
- SIG를 GP27에 바로 잇기. 출력이 4.5V까지 나와 ADC 입력 범위를 넘어요.
- D/A 스위치를 D에 둔 채로 재기. 값이 0 아니면 최댓값 근처로만 나와요. A로 옮겨요.
- 기준 물을 재지 않고 다른 반의 숫자와 비교하기. 탐침마다 맑은 물 전압이 달라요. 비율로 바꿔 비교해요.
- 흙을 넣고 바로 재기. 큰 알갱이가 빠르게 가라앉는 동안 값이 계속 변해요. 저은 뒤 잴 시각을 정해 두고 지켜요.
이 센서로 잴 수 있는 탐구
1. 어떤 거름 재료가 흙탕물을 가장 맑게 할까
- 질문: 커피 필터, 면포 두 겹, 모래층 가운데 어느 것이 흙탕물을 가장 맑게 할까?
- 바꾸는 것: 거름 재료
- 재는 것: 거른 물의 clear(%), 거르기 전 흙탕물의 clear와의 차이
- 방법: 물 1L에 흙을 넣고 저어 한 번에 흙탕물을 만든 뒤 같은 양(200mL)씩 나눠 걸러요. 거른 물은 같은 컵에 담아 30초 뒤에 재고, 재료마다 3번 반복해요.
2. 흙탕물은 얼마나 빨리 가라앉을까
- 질문: 모래가 많은 흙과 고운 흙은 흙탕물이 맑아지는 빠르기가 다를까?
- 바꾸는 것: 흙의 종류(운동장 모래흙, 화분 흙)
- 재는 것: 저은 뒤 30분 동안 1분마다 잰 clear(%), 기준의 80%에 이르는 시간(분)
- 방법: 물 300mL에 흙 10g을 넣고 30초 저어요. 탐침은 스탠드에 고정해 수면에서 같은 깊이에 두고, 흙마다 3번 해요.
3. 주변 빛이 값을 바꿀까
- 질문: 같은 물을 잴 때 실내등 아래, 상자로 가린 곳, 손전등을 비춘 곳에서 값이 달라질까?
- 바꾸는 것: 주변 빛(실내등, 상자로 가림, 옆에서 손전등)
- 재는 것: 10줄 평균 clear(%)와 조건 사이의 차이
- 방법: 탐침과 컵은 움직이지 않고 빛 조건만 바꿔요. 조건마다 3번 반복하고, 차이가 있다면 다른 탐구를 할 때 빛을 어떻게 맞출지 정해요.
안전
- 물과 전기를 떨어뜨려요. 피코와 브레드보드는 컵보다 높은 곳이나 쟁반 밖에 두고, 젖은 손으로 배선을 만지지 않아요. 물을 쏟으면 먼저 USB를 뽑아요.
- 탐침 윗부분과 변환 기판은 물에 닿지 않게 해요.
- 흙과 시료 물은 마시지 않고, 실험이 끝나면 손을 씻어요.
- 이 장치는 먹는 물의 안전을 판단하는 기기가 아니에요. 수질 판정에 쓰지 마세요.
더 알아보기
- 제품 자료: DFRobot "Gravity: Analog Turbidity Sensor (SEN0189)" 위키(5V, 40mA, 출력 0~4.5V, 응답 500ms 미만, 맑은 물 4.1±0.3V, 윗부분 방수 아님, 탐침 선 방향), Seeed Studio "Grove - Turbidity Sensor (Meter) for Arduino V1.0" 위키(3.3V·5V, A/D 스위치, 흐릴수록 출력 감소)
- 라이브러리: 따로 없어요. MicroPython 내장
machine.ADC - 기초 글: 분압 회로, 센서 값의 신뢰도, 잴 수 있는 탐구 주제 만들기, 브레드보드 처음 쓰기