Python로 마이크로초(μs) 단위 지연/타이밍 구현 방법
서론
최근 라즈베리 파이의 GPIO를 공부하면서 Python을 사용해 DHT11 온습도 센서의 데이터를 읽어보려 했습니다. DHT11은 단일 버스 통신을 사용하며, 마이크로초 단위의 지연이 필요합니다. sleep() 함수는 이 요구 사항을 충족할 수 없어 보였고, 저는 타임스탬프가 소수점 이하 7자리까지 정확하게 측정될 수 있다는 것을 알게 되었습니다. 즉, 0.1 마이크로초 단위까지 가능하다는 뜻입니다. 실제 정확도는 이 정도까지 도달하지 못할 수도 있지만, 충분히 사용 가능할 것입니다.
이 방법은 Linux 시스템에만 적용됩니다. Windows 시스템은 왜 그런지 모르겠지만, 어떤 방식으로도 지연 시간이 항상 1000마이크로초 이상으로 나옵니다.
1초(s) = 1000밀리초(ms) = 1,000,000마이크로초(μs)
타임스탬프란?
타임스탬프는 그린위치 표준시 1970년 1월 1일 00시 00분 00초(베이징 시간 1970년 1월 1일 08시 00분 00초)부터 현재까지의 총 초 수를 의미합니다.
구현 방법
초기 타임스탬프를 기록한 후, 루프를 실행하며 매번 타임스탬프를 기록합니다. 루프 조건은 현재 기록된 타임스탬프에서 초기 타임스탬프를 뺀 값이 설정한 시간보다 작을 때 계속 반복하고, 설정된 시간 이상이 되면 종료합니다.
소스 코드:
import time # time 모듈 임포트
# https://blog.zeruns.com/
def delayMicrosecond(t): # 마이크로초 단위 지연 함수
start, end = 0, 0 # 변수 선언
start = time.time() # 시작 시간 기록
t = (t - 3) / 1000000 # 입력 t를 초 단위로 변환, -3은 시간 보정값
while end - start < t: # 시간 차이가 설정값 이상이 될 때까지 반복
end = time.time() # 종료 시간 기록
사용 방법: 위 코드를 복사하여 프로그램에 붙여넣고, 함수 delayMicrosecond(t)를 호출하세요. 괄호 안의 t는 지연 시간(단위: 마이크로초)입니다.
위 소스 코드에서 t-3은 시간 보정값입니다. 함수 호출, 루프 실행 등 명령어 실행 자체에도 시간이 소요되기 때문입니다. 본인의 환경에 따라 테스트하여 조정할 수 있습니다. 제가 라즈베리 파이 4에서 테스트한 결과, 약 3마이크로초가 추가로 소모되었으므로 3을 빼주었습니다.
예제
import time # time 모듈 임포트
# https://blog.zeruns.com/
def delayMicrosecond(t): # 마이크로초 단위 지연 함수
start, end = 0, 0 # 변수 선언
start = time.time() # 시작 시간 기록
t = (t - 3) / 1000000 # 입력 t를 초 단위로 변환, -3은 시간 보정값
while end - start < t: # 시간 차이가 설정값 이상이 될 때까지 반복
end = time.time() # 종료 시간 기록
a = time.time() # 지연 함수 실행 시작 시점 기록
delayMicrosecond(35) # 35 마이크로초 지연
b = time.time() # 지연 함수 실행 종료 시점 기록
print("https://blog.zeruns.com/")
print((b - a) * 1000000) # 지연 함수 실행에 소요된 시간 출력
결과:
추천 읽기
- 고가성비 및 저렴한 VPS/클라우드 서버 추천: https://blog.zeruns.com/archives/383.html
- Python 관련 글: https://blog.zeruns.com/category/Python/
- Arduino로 DHT11, DHT22, SHTC3 온습도 데이터 읽기: https://blog.zeruns.com/archives/527.html
- 학생 전용 할인 혜택 전체: https://blog.zeruns.com/archives/557.html
- 개인 블로그 구축 방법: https://blog.zeruns.com/archives/218.html


