반응형
온도에 따른 EC(Electrical Conductivity, 전도도) 보정은 매우 중요합니다. EC 값은 온도에 민감하게 변화하므로, 이를 표준 온도(일반적으로 25°C)로 변환해야 합니다. 이를 온도 보정이라 하며, 보정 공식과 코드를 통해 구현할 수 있습니다.
1. 온도 보정 공식
온도 보정을 위한 기본 공식은 다음과 같습니다:
$$ EC_{25} = \frac{EC_{measured}}{1 + \alpha \times (T - 25)} $$
- EC_25: 표준 온도(25°C)에서 보정된 EC 값.
- EC_measured: 현재 온도에서 측정된 EC 값.
- T: 현재 온도(°C).
- α: 온도 보정 계수(보통 0.02~0.03/°C, 일반적으로 0.02 사용).
2. INA219를 이용한 EC 측정 개요
- 전도도 측정 원리:
- INA219로 측정 전류와 분압 전압을 이용해 저항을 계산한 뒤, 전도도(EC)를 계산합니다.
- 전도도는 저항(Ω)과 반비례 관계: $EC = \frac{1}{R \times K}$ 여기서 KK는 셀 상수(Cell Constant, 보통 1/cm로 초기 설정).
3. 라즈베리파이 피코W용 마이크로파이썬 코드
아래 코드는 INA219를 사용해 전류와 전압을 측정하여 EC를 계산하고, 온도 보정을 적용하는 프로그램입니다.
코드
from machine import I2C, Pin
import time
class INA219:
def __init__(self, i2c, addr=0x40):
self.i2c = i2c
self.addr = addr
self.shunt_resistance = 0.1 # 분압 저항 값 (단위: Ω)
self.max_expected_current = 0.5 # 최대 예상 전류(500mA)
self._calibrate()
def _calibrate(self):
# 보정값 계산
current_lsb = self.max_expected_current / 32768 # 전류 LSB 계산
calibration_value = int(0.04096 / (current_lsb * self.shunt_resistance))
self.i2c.writeto_mem(self.addr, 0x05, calibration_value.to_bytes(2, 'big'))
self.current_lsb = current_lsb
def read_current(self):
raw_data = self.i2c.readfrom_mem(self.addr, 0x04, 2)
current_raw = int.from_bytes(raw_data, 'big', True)
return current_raw * self.current_lsb # 단위: A
def read_shunt_voltage(self):
raw_data = self.i2c.readfrom_mem(self.addr, 0x01, 2)
shunt_raw = int.from_bytes(raw_data, 'big', True)
shunt_lsb = 0.00001 # 10μV 단위로 변환
return shunt_raw * shunt_lsb # 단위: V
def calculate_ec(shunt_voltage, current, cell_constant=1):
# 저항 계산 (R = V / I)
if current == 0:
return float('inf') # 전류가 0일 경우 무한대
resistance = shunt_voltage / current
# EC 계산 (EC = 1 / (R * K))
ec = 1 / (resistance * cell_constant)
return ec
def temperature_compensation(ec_measured, temperature, alpha=0.02):
# 온도 보정 (25°C 기준)
ec_25 = ec_measured / (1 + alpha * (temperature - 25))
return ec_25
# I2C 설정 (피코W의 I2C0 사용, SCL: GP1, SDA: GP0)
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=100000)
# INA219 센서 초기화
ina = INA219(i2c)
# 셀 상수 (1/cm)
cell_constant = 1
try:
while True:
# 전압과 전류 측정
shunt_voltage = ina.read_shunt_voltage()
current = ina.read_current()
# 전도도 계산
ec_measured = calculate_ec(shunt_voltage, current, cell_constant)
# 온도 입력 (현재 온도 값을 외부 센서로 받아온다고 가정)
temperature = 25 # 예: 현재 온도 (센서를 통해 입력받을 수 있음)
# 온도 보정된 EC 계산
ec_25 = temperature_compensation(ec_measured, temperature)
# 출력
print(f"Shunt Voltage: {shunt_voltage:.6f} V")
print(f"Current: {current:.6f} A")
print(f"EC (measured): {ec_measured:.6f} S/cm")
print(f"EC (25°C): {ec_25:.6f} S/cm")
# 1초 대기
time.sleep(1)
except KeyboardInterrupt:
print("Program stopped")
4. 코드 구성 요소
- INA219 초기화:
- 분압 전압과 전류를 측정하여 저항을 계산합니다.
- EC 계산:
- 저항을 계산한 후 전도도(EC)를 구합니다.
- 온도 보정:
- 측정된 EC 값을 표준 온도(25°C)로 보정합니다.
- 출력:
- 보정 전/후 EC 값을 출력합니다.
5. 온도 센서 통합
온도 데이터를 자동으로 얻으려면 DS18B20과 같은 온도 센서를 추가하여 현재 온도를 측정할 수 있습니다. 온도 센서를 통합하면 temperature 값을 자동으로 갱신할 수 있습니다.
6. 결론
- 이 코드는 INA219를 사용해 **전도도(EC)**를 측정하고, 온도에 따른 보정을 적용합니다.
- **온도 보정 계수(α)**는 기본값 0.02를 사용했지만, 사용 환경에 따라 조정할 수 있습니다.
- 추가적으로 온도 센서를 통합하여 정확한 실시간 온도 기반 보정을 구현할 수 있습니다.
반응형
'컴퓨터|인터넷 > 라즈베리파이' 카테고리의 다른 글
라즈베리파이 GPIO 입력 핀 풀업/풀다운 정리 (0) | 2024.12.17 |
---|---|
라즈베리파이 피코에서 I2C 통신 (0) | 2024.10.12 |
센서 데이터 획득 I2C 통신 (0) | 2024.10.12 |
라즈베리파이 피코W 마이크로파이썬 mqtt 클라이언트 (1) | 2024.10.04 |
Ubuntu 시스템에서 apt update 및 apt upgrade 후 재부팅 실패시 (1) | 2024.10.04 |
댓글