Devin.KR

깨어 있는 시간과 추정 전력

90분 안팎

학습 목표

3.3V·활성 10mA·절전 1mA 모델에서 시간 비율별 평균 전류·전력·에너지를 계산합니다.

개념

평균 전류는 시간 가중 평균입니다

센서를 읽지 않는 시간에도 장치는 전류를 사용합니다. 활성 전류 한 줄만 보거나 절전 전류 한 줄만 보면 동작 주기 전체를 설명하지 못합니다. 이번 레슨은 3.3V·활성10mA·절전1mA라는 가상 명세를 사용해 시간 비율에 따른 평균 전류·평균 전력·에너지를 계산합니다. 이 숫자는 제품 데이터시트가 아니며 측정기로 얻은 값도 아닙니다. 입력 시간을 바꾸어 어떤 항이 달라지는지 설명하는 것이 목표입니다.

한 관찰 구간을 active_ms와 total_ms로 표현합니다. 절전 시간은 total_ms에서 active_ms를 뺍니다. 두 상태가 구간을 빠짐없이 나누고 겹치지 않는다고 가정합니다. total_ms는 양수이고 active_ms는0부터 total_ms까지입니다. 평균 전류는 (10×active_ms+1×절전시간)/total_ms이며 단위는mA입니다. 전류를 단순히 더해서11mA라고 하거나 두 상태를 반씩 평균하는 것은 실제 시간 비율을 버린 계산입니다.

100ms 중 활성20ms이면 절전80ms입니다. 가중합은10×20+1×80=280mA·ms이고 평균은2.8mA입니다. 공급 전압이 일정한3.3V라는 모델에서 평균 전력은3.3×2.8=9.24mW입니다. 활성20%라는 비율만 주어도 평균 전류와 전력은 계산할 수 있지만 총 에너지를 구하려면 관찰 시간도 필요합니다. 100ms와1000ms는 비율이 같아도 에너지가 열 배 차이납니다.

단위를 연결해서 에너지를 계산합니다

전력mW에 시간초를 곱하면 에너지mJ입니다. 입력이ms이면1000으로 나눠 초로 바꿉니다. 위 사례에서9.24mW×0.1s=0.924mJ입니다. 전압V·전류mA·시간ms를 바로 곱한 값은µJ에 해당하므로 mJ로 출력하려면1000으로 나눕니다. 평균 전류 식과 에너지 식을 따로 써서 각각 단위를 검토하면 누락된 환산을 찾기 쉽습니다. 출력 소수점 자리수는 측정 정확도의 주장이 아닙니다.

브라우저 입력은 공백으로 구분한 정수 두 개이며 순서는 active_ms total_ms입니다. total_ms는1부터1000000, active_ms는0부터 total_ms입니다. 음수·소수·문자열·누락·추가 토큰·범위 초과는 INVALID 한 줄로 처리합니다. 테스트는 모두 절전, 모두 활성, 활성20%, 같은 비율의 긴 구간과 오류 입력을 포함합니다. 형식 검사는 계산 전에 끝내며 일부 값만 읽고 뒤의 쓰레기 토큰을 무시하지 않습니다.

정상 출력은 avg_ma=소수3자리 power_mw=소수3자리 energy_mj=소수4자리 형식입니다. 예를 들어0 100은 avg_ma=1.000 power_mw=3.300 energy_mj=0.3300입니다. 0이 정수 입력이어도 출력은 지정 자리수로 맞춥니다. 평균 전류가0이 되지 않는 이유는 절전 상태도1mA를 소비하기 때문입니다. 모든 활성 입력은10mA이며0으로 나누는 total_ms=0은 정상 상태가 아닙니다.

경계와 비교 실험을 설계합니다

활성 시간이0에서 총 시간까지 늘 때 평균 전류는1mA에서10mA 사이를 벗어나지 않습니다. 이 범위를 벗어나면 단위·시간 합·부호를 점검합니다. 활성20ms/100ms와200ms/1000ms는 같은 평균 전류·전력을 출력해야 하고 에너지만 다릅니다. 이를 비율 불변성 검사로 사용합니다. 총 시간이 커졌는데 에너지가 그대로면 평균값과 누적량을 혼동했을 가능성이 큽니다.

Python에서는 int로 입력을 읽고 범위를 확인한 다음 계산합니다. float로 먼저 읽어20.5를20으로 자르면 잘못된 입력을 정상화합니다. 정수 입력을 허용하는 계약에 맞게 변환 오류는 ValueError로 처리하고 INVALID를 출력합니다. 제출 코드에서 계산 중간값을 print하면 표준 출력 형식이 깨집니다. 디버깅 후에는 결과 한 줄만 남깁니다. 예외 처리 범위를 넓혀 코드 결함까지 숨기는 방식은 피합니다.

활성 시간을 줄이는 선택에는 작업의 완료 조건이 붙습니다. 샘플 측정·큐 발행·UART 전송·SPI 저장이 끝나기도 전에 절전으로 전환하면 에너지 숫자는 줄어도 제품 기능이 사라질 수 있습니다. 이번 브라우저 계산은 작업이 끝났는지 판정하지 않으며 주어진 active_ms가 유효한 업무 시간을 나타낸다고 가정합니다. 실제 스케줄을 만드는 일은 다음 레슨의 지연 모델과 묶어 평가합니다.

깨우기 구간의 전류는 따로 측정하지 않았습니다. 다음 통합에서는 깨우기5ms를 활성10mA에 포함하는 가정을 추가합니다. 순간 전류가 더 크거나 주변장치 안정화에 시간이 더 필요하면 이 두 상태 모델을 세 상태 이상으로 확장해야 합니다. 다만 새 상태를 추가할 때 전체 시간을 중복 합산하지 않습니다. 각 시간 구간은 한 번만 전하량에 반영하고 총 시간과의 합을 검사합니다.

추정과 실측의 차이를 보고합니다

이 모델에는 LED·센서·통신 주변장치·전원 변환 손실·전압 변동을 개별 항으로 넣지 않았습니다. 실제 보드 전체 전력이라고 소개하려면 측정 경계와 장치별 소비를 추가해야 합니다. 특히 PC 프로세스가0.1초 실행되었다고 그 시간을 MCU 활성 시간으로 대입할 수는 없습니다. 앞 레슨의 호스트 시간은 코드 실행 관찰이고 여기의 시간은 가상 장치 명세입니다. 서로 다른 표의 숫자를 단위가 같다는 이유로 섞지 않습니다.

배터리 용량을 평균 전류로 나누면 이상적인 시간 추정의 출발점은 얻을 수 있습니다. 그러나 이번 과제는 배터리 수명 보증을 출력하지 않습니다. 전압·사용 가능한 용량·방전 조건·차단 전압·온도·자기방전이 빠져 있기 때문입니다. 가상 평균 전류를 재현 가능한 값으로 계산한 것과 실제 사용 시간 검증은 다른 산출물입니다. 제품 문서에는 모델 가정과 빠진 요소를 함께 적습니다.

실물 검증을 계획한다면 측정 위치가 전원 입력인지 MCU 공급선인지, 샘플 주기가 짧은 활성 펄스를 포착하는지, 로그 인터페이스와 디버거 연결이 전류를 바꾸는지 정합니다. 평균 표시만 읽으면 짧은 큰 전류를 놓칠 수 있어 전류 파형과 반복 주기를 같이 봅니다. 여기서 그런 장비를 사용했다고 주장하지 않습니다. 이번 제출에는 계산한 값과 향후 확인해야 할 측정 조건을 나누어 남깁니다.

실수 사례에서 energy_mj가924.0000이면 ms를초로 바꾸는1000이 빠졌는지 봅니다. avg_ma가2.000이면 활성 항만 포함하여 절전80ms의 소비를 버렸는지 봅니다. 20 0을 받아 프로그램이 ZeroDivisionError로 끝나면 계산 전에 total_ms 범위 검사가 없습니다. traceback의 마지막 예외 이름부터 읽고 입력 검증 위치를 찾습니다. 정상 예제를 맞췄다고 오류 입력 계약도 충족했다고 생각하지 않습니다.

최종 계산 메모는 전압3.3V·활성10mA·절전1mA·관찰 구간·활성 시간·평균 전류·평균 전력·에너지의 순서로 작성합니다. 같은 비율의 두 길이를 비교하여 평균과 누적량을 구별하고, 모든 절전과 모든 활성 경계가 예상 범위인지 확인합니다. 절전 모드와 깨우기 원인에 대한 자세한 장치 관점은 더 읽기로 이어집니다. 이 레슨에서는 모델을 정확히 계산하고 적용할 수 없는 주장까지 함께 구별합니다.

따라하기

활성20%

두 상태의 시간 가중합에서 평균과 에너지를 계산합니다.

active,total=20,100
charge=10*active+(total-active)
avg=charge/total
print(f"avg_ma={avg:.3f} power_mw={3.3*avg:.3f} energy_mj={3.3*charge/1000:.4f}")

실행 결과

avg_ma=2.800 power_mw=9.240 energy_mj=0.9240

모두 절전

활성0에서도 절전 전류는 남습니다.

active,total=0,100
charge=10*active+(total-active)
avg=charge/total
print(f"avg_ma={avg:.3f} power_mw={3.3*avg:.3f} energy_mj={3.3*charge/1000:.4f}")

실행 결과

avg_ma=1.000 power_mw=3.300 energy_mj=0.3300

관찰 시간을 늘리기

비율은 같아서 평균 전류와 전력이 같고 에너지만10배입니다.

active,total=200,1000
charge=10*active+(total-active)
avg=charge/total
print(f"avg_ma={avg:.3f} power_mw={3.3*avg:.3f} energy_mj={3.3*charge/1000:.4f}")

실행 결과

avg_ma=2.800 power_mw=9.240 energy_mj=9.2400

확인 문제

실습

active_ms total_ms 정수 두 개를 받아 평균 전류mA·전력mW·에너지mJ를 계산합니다. 전압3.3V, 활성10mA, 절전1mA를 사용합니다. total_ms는1~1000000이며 active_ms는0~total_ms입니다. 추가·누락 토큰과 형식/범위 오류는 INVALID입니다. 정상 출력 자릿수는 avg_ma=3자리 power_mw=3자리 energy_mj=4자리입니다. 상태 소비를 시간 가중합으로 계산하세요.

모범 답안
import sys
try:
    tokens=sys.stdin.read().split()
    if len(tokens)!=2: raise ValueError()
    active,total=map(int,tokens)
    if not 1<=total<=1000000 or not 0<=active<=total: raise ValueError()
    charge=10*active+(total-active)
    avg=charge/total
    power=3.3*avg
    energy=3.3*charge/1000
    print(f"avg_ma={avg:.3f} power_mw={power:.3f} energy_mj={energy:.4f}")
except ValueError:
    print("INVALID")

더 읽기

면접 질문

  • 활성 시간 비율로 평균 전류와 에너지를 계산하는 방법을 설명해 주세요.