목차
[Arduino] Python threading timer 함수
이번 포스트에서는 파이썬의 스레딩(Threading)의 타이머(timer) 함수에 대해 알아보겠습니다. 타이머의 말 자체가 알려 주듯이 타이머는 정해진 시간(Time)이 지났을 때 사용자가 원하는 동작을 하게 도와주는 함수 입니다.
Syntax는 아래와 같습니다.
인스턴스명 = threading.Timer(타이머시간, 실행시킬함수명)
인스턴스명.daemon = True
인스턴스명.start()
입력 값에 타이머 시간은 시간 단위이고 밀리초 (mili second)는 소수점 형식으로 표기하시면 됩니다. 실행 시킬 함수 명은 타이머가 시간이 되었을 때 구현할 함수 명을 입력 하시면 됩니다. 리턴 값을 인스턴스(Instance)에 입력 하시고 daemon으로 프로그램이 종료되었을 때 같이 종료하도록 설정 합니다.
그리고 스레드 실행을 위해 start 함수를 실행 합니다.
아래에 간단한 예제로 쉽게 이해해보도록 하겠습니다.
<<예제에 대한 설명>>
예제는 1초 단위로 컴퓨터의 파이썬에서 serial 통신을 이용해서 on, off 메세지를 전달 합니다. 메세지를 전달 받은 아두이노(Arduino)는 Uno 보드의 LED 등을 켰다 껐다 해줍니다.
Arduino 실행 코드
아두이노는 "on"이라는 메세지(message)가 들어오면 보드의 LED를 켜고 "off"라는 메세지에 보드의 LED를 꺼줍니다.
예제 코드>>
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(9600);
while (!Serial) {
;
}
}
int blk_on = 0;
void loop() {
if (Serial.available() > 0)
{
String cmmd = Serial.readStringUntil('\n');
Serial.println(cmmd);
if (cmmd == "on")
{
blk_on = 1;
}
else if (cmmd == "off")
{
blk_on = 0;
}
}
if (blk_on ==1){
digitalWrite(LED_BUILTIN, HIGH);
}
else {
digitalWrite(LED_BUILTIN, LOW);
}
}
1~4번 라인: PC와 시리얼 통신 연결
9번 라인: LED 초기값 설정
16번 라인: 메세지가 on 인경우 blk_on을 1로 변경함
25~29번 라인: blk_on에 따라 LED를 켜거나 끔
파이썬 Thread Timer 함수 실행 예제
앞서 아두이노 코드와 연계해서 파이썬 코드를 작성하겠습니다.
파이썬 코드애서는 두개의 함수를 정의 합니다. 하나는 2초 간격으로 LED 켜는 on 메세지를 보내는 함수이고 나머지는 2초 간격으로 LED를 끄는 off 메세지를 보내는 함수 입니다.
두 함수는 sleep 함수를 통해 1초의 간격을 두고 진행됩니다. 즉, 1초 간격으로 LED on, off 메세지가 전달 됩니다. 해당 메세지는 반복 송신됩니다.
예제 코드>>
import serial
import threading
import time
import datetime
ser = serial.Serial("COM6", 9600)
def send_on_msg_to_arduino():
msg = "on\n"
ser.write(msg.encode())
thread1 = threading.Timer(2, send_on_msg_to_arduino)
thread1.daemon = True
thread1.start()
print("ON msg sent at : ", datetime.datetime.now())
def send_off_msg_to_arduino():
msg = "off\n"
ser.write(msg.encode())
thread1 = threading.Timer(2, send_off_msg_to_arduino)
thread1.daemon = True
thread1.start()
print("OFF msg sent at : ", datetime.datetime.now())
if __name__ == "__main__":
send_on_msg_to_arduino()
time.sleep(1)
send_off_msg_to_arduino()
while True:
time.sleep(10)
8~14번 라인: on 메세지를 2초 간격으로 보내는 함수 입니다.
11번 라인: timer 함수를 함수 내부에 실행 시켜서 반복 실행되게 설정했습니다.
16~22번 라인: off 메세지를 2초 간격으로 보내는 함수 입니다.
25~27번 라인: 함수를 각 각 실행하고 사이에 1초 sleep을 진행 합니다.
28~29번 라인: 프로그램 종료를 막기 위해 while 문을 진행합니다.
결과>>
ON msg sent at : 2022-05-18 08:35:15.806915
OFF msg sent at : 2022-05-18 08:35:16.812057
ON msg sent at : 2022-05-18 08:35:17.821817
OFF msg sent at : 2022-05-18 08:35:18.817879
ON msg sent at : 2022-05-18 08:35:19.832559
OFF msg sent at : 2022-05-18 08:35:20.829230
ON msg sent at : 2022-05-18 08:35:21.832707
OFF msg sent at : 2022-05-18 08:35:22.841439
ON msg sent at : 2022-05-18 08:35:23.838608
1초 간격으로 메세지가 전달됩니다.
LED가 1초 간격으로 정확하게 켜졌다가 꺼집니다.
'아두이노 Arduino > 파이썬(Python)' 카테고리의 다른 글
아두이노 온도, 습도 값 파이썬으로 그래프 출력하기(Arduino, Python, Serial, Graph) (1) | 2024.01.14 |
---|---|
Ping이란? CMD, 파이썬으로 예제 실습하기(Window OS) (2) | 2023.12.20 |
[Python] 파이썬 실행파일(exe) 만들기(Pyinstaller, Batch file) (0) | 2022.11.14 |
[아두이노] 파이썬 threading 함수로 통신하기 (threading, target, daemon (0) | 2022.05.17 |
[아두이노]파이썬 Pyserial로 아두이노 문자, 실수, 정수 값 읽기(수신하기, 송수신, 통신) (0) | 2022.05.16 |