리튬 이온 배터리는 완충 시 약 4.2V, 방전 시 약 3.0V~3.2V 사이의 전압을 가집니다. 하지만 ESP32-C3의 ADC 입력 전압은 보통 0V~2.5V(내부 설정에 따라 다름) 정도로 제한되어 있어, 배터리 전압을 직접 연결하면 MCU가 손상될 수 있습니다.
이때 가장 간단하고 효과적인 해결책이 바로 분압 저항을 사용하는 방법입니다.

1. 하드웨어 구성: 분압 저항(Voltage Divider) 원리
100kΩ 저항 두 개를 직렬로 연결하면 전압이 정확히 **절반(1/2)**으로 줄어듭니다. 배터리 전압이 4.2V일 때 ADC 핀에는 2.1V가 입력되므로 ESP32-C3에서 안전하게 읽을 수 있습니다.
- 준비물: 100kΩ 저항 2개, ESP32-C3, 리튬 이온 배터리
- 회로 연결:
- 배터리 양극(+) → 첫 번째 100kΩ 저항 시작점 연결
- 두 저항 사이의 중간 지점 → ESP32-C3의 ADC 핀(예: GPIO 0) 연결
- 두 번째 100kΩ 저항 끝점 → 배터리 음극(-) 및 ESP32-C3 GND 공통 연결
2. 마이크로파이썬(MicroPython) 구현 코드
ESP32-C3에서 ADC 값을 읽어 실제 배터리 전압으로 환산하는 코드입니다.
Python “battery.py”
from machine import ADC, Pin
import time
adc = ADC(Pin(0))
adc.atten(ADC.ATTN_11DB)
def get_voltage():
raw_value = adc.read()
measured_v = raw_value * (3.3 / 4095)
real_v = measured_v * 2
return real_v
def test():
while True:
voltage = get_voltage()
print("Battery Voltage: {:.2f} V".format(voltage))
if voltage < 3.3:
print("Warning: Low Battery!")
time.sleep(1)
if __name__ == "__main__":
test()
3. 더 정확한 측정을 위한 팁
- 저항 오차: 100kΩ 저항이라도 미세한 오차가 있으므로, 멀티미터로 실제 배터리 전압을 재보고 코드의
2대신2.05와 같이 미세하게 조정(Calibration)하면 더 정확합니다. - 전력 소모: 상시 구동 기기라면 100kΩ 이상의 높은 저항을 사용하거나, 측정할 때만 회로를 연결하는 트랜지스터 스위치를 추가하는 것이 좋습니다.
- 노이즈 제거:
adc.read()값을 여러 번 읽어 평균을 내면 값이 훨씬 안정적으로 출력됩니다.
4. 맺음말
전원을 직접 연결하기 힘든 위치에 온습도계를 둘 때는 배터리를 쓰게 되죠. 이때 배터리 전압을 실시간으로 체크해주면 정말 편리해요. ‘배터리가 다 됐어요!’라고 기기가 스스로 알려줄 수 있도록 이번 강좌의 ADC 측정 회로를 꼭 적용해 보시기 바랍니다.
답글 남기기