[스마트팜] 아쿠아포닉스에서 pH 제어를 자동화해보자! (Python 활용)

아쿠아포닉스(Aquaponics)를 운영하면서 가장 중요하게 관리해야 하는 요소 중 하나가 바로 pH입니다.
pH가 적정 범위를 벗어나면 물고기, 박테리아, 식물 모두 스트레스를 받고 시스템 전체가 무너질 수 있죠.

그래서 저는 "pH 관리를 자동화할 수 있을까?"를 고민하게 되었고, Python을 활용해 제어 프로세스를 구현하는 방법을 정리해봤습니다.


1. 기본 pH 관리 프로세스

아쿠아포닉스에서 pH를 관리하는 기본 흐름은 다음과 같습니다.

  1. 현재 pH 측정 (센서로)

  2. 목표 pH 범위와 비교

  3. pH를 높이거나 낮출지 결정

  4. 산성/염기성 조정제 소량 주입

  5. 시간을 두고 다시 pH 측정

단순하지만, 사람이 수시로 pH를 측정하고 조정하는 건 상당히 번거롭습니다. 이걸 자동화하면 훨씬 효율적이겠죠?


2. Python으로 간단한 pH 제어 프로그램 만들기

Python을 이용하면 아주 간단하게 자동 pH 제어 로직을 짤 수 있습니다.

# 설정값 TARGET_PH = 7.0 # 목표 pH PH_TOLERANCE = 0.2 # 허용 오차 ±0.2 MAX_DOSING_AMOUNT = 1 # 최대 주입량 (1ml) # pH 센서 읽기 (구현 필요) def read_ph_sensor(): ph_value = 7.5 # 예시 return ph_value # 조정제 주입 함수 def dose_solution(amount_ml, direction): if direction == "lower": print(f"{amount_ml}ml 산성 조정제 투입") elif direction == "raise": print(f"{amount_ml}ml 염기성 조정제 투입") # pH 제어 메인 함수 def control_ph(): ph_now = read_ph_sensor() print(f"현재 pH: {ph_now}") if ph_now > TARGET_PH + PH_TOLERANCE: dose_solution(MAX_DOSING_AMOUNT, direction="lower") elif ph_now < TARGET_PH - PH_TOLERANCE: dose_solution(MAX_DOSING_AMOUNT, direction="raise") else: print("pH 적정, 조정 불필요") if __name__ == "__main__": control_ph()

이렇게 하면 센서로 pH를 읽고, 범위를 벗어나면 조정제 소량 주입하는 기본 루프를 만들 수 있습니다.


3. 더 똑똑하게 제어하려면? PID 제어 도입하기

하지만 실제 운영해보면 알게 됩니다.

  • 조정제를 조금만 넣어도 pH가 확 변하는 경우

  • pH가 천천히 변화하는 경우

  • 조정하고 나서 바로 효과가 나타나지 않는 경우

이런 복잡한 상황을 단순한 if-else 구조로 대응하는 데에는 한계가 있습니다.

이때 필요한 게 바로 PID 제어입니다.


4. PID 제어란?

PID

  • P(Proportional, 비례): 현재 오차를 반영

  • I(Integral, 적분): 오차 누적을 반영

  • D(Derivative, 미분): 오차의 변화를 반영
    하는 방식으로 제어량을 계산합니다.

쉽게 말하면:
"얼마나 많이, 얼마나 오랫동안, 얼마나 빠르게 pH가 어긋나는지"를 종합적으로 고려해서 부드럽게 조정하는 방법입니다.


5. Python으로 PID pH 제어 구현하기

import time # PID 파라미터 (튜닝 필요) Kp = 0.5 # 비례 Ki = 0.05 # 적분 Kd = 0.1 # 미분 TARGET_PH = 7.0 integral = 0 last_error = 0 def read_ph_sensor(): ph_value = 7.5 # 예시 return ph_value def dose_solution(amount_ml): print(f"{amount_ml:.2f} ml 조정제 주입") def pid_control(): global integral, last_error ph_now = read_ph_sensor() error = TARGET_PH - ph_now integral += error derivative = error - last_error output = Kp * error + Ki * integral + Kd * derivative output = max(min(output, 5), -5) # 주입량 제한 if output > 0: dose_solution(output) elif output < 0: print("pH 낮춰야 하는 상황, 별도 조정 없음") last_error = error if __name__ == "__main__": while True: pid_control() time.sleep(300) # 5분마다 제어

6. PID 제어의 장점

항목설명
부드러운 조정급격한 pH 변동 없이 자연스럽게 목표에 접근
자동화 수준 향상환경 변화에도 유연하게 대응 가능
과조정 방지조정제를 너무 많이 넣지 않게 함

7. 실제 적용 시 주의사항

  • PID 파라미터 튜닝 필수 (Kp, Ki, Kd 값 조정)

  • 센서 반응 속도 고려 (pH는 바로 변하지 않음)

  • 투입량 제한 설정해서 과투입 방지

  • 제어 주기를 너무 짧게 잡지 말기 (5~30분 추천)


마무리

아쿠아포닉스 pH 관리는 단순히 pH를 읽고 조정제를 주입하는 것 이상으로,
시간에 따른 변화까지 고려해서 부드럽게 제어하는 것이 중요합니다.

Python을 이용해

  • 간단한 if-else 방식 제어

  • 고급 PID 제어
    모두 구현할 수 있으니,
    시스템 규모와 목표에 따라 적절한 방법을 선택하면 좋습니다.

앞으로 저도 실전 테스트를 해보면서

  • pH 변화 그래프 기록

  • 조정량 자동 최적화

  • 경고 알림 시스템 추가
    등을 확장할 계획입니다.

함께 자동화된 아쿠아포닉스 시스템을 만들어 봅시다! 🌱🚀

댓글

이 블로그의 인기 게시물

[PLC] PLC 아날로그 입출력 기본

전력(kW) 계산하기 (직류, 교류 단상, 교류 삼상)

공압 속도 제어: 미터인 vs 미터아웃

[아두이노] 가변저항(Potential Divider)과 전압분배(Voltage Divider)

[주식] 한국거래소(KRX) 데이터 API 입문 가이드

제너 다이오드에 저항을 연결하는 이유

[아두이노] 74HC595 시프트 레지스터 연동

[PLC] 래더 다이어그램과 PLC

[스마트팜] EC/pH 미터 만들기: 아두이노로 전기 전도도 및 pH 측정

공압회로 기호