아두이노 IOT의 Time Picker 위젯을 마이크로 파이썬 코드로 사용하는 방법

아두이노 IOT의 Time Picker 위젯을 마이크로 파이썬 코드로 사용하는 방법

아두이노 IOT 클라우드를 이용하여 온도나 습도 같은 센서 데이터들을 측정하다 보면, 시간을 모니터링하거나 기록해야 하는 경우들이 있는데, 아두이노 IOT 클라우드는 다음과 같은 형태로 날짜와 시간을 표시해 주는 Time Picker라는 위젯을 대시보드상에서 제공해 주며, 자신이 선호하는 형식으로 날짜와 시간을 표시할 수 있어 편리하다.

이러한 Time Picker 위젯을 아두이노나 ESP32, 라즈베리파이 피코 보드 등에서 사용하려면 먼저 시간 값을 전달받기 위한 클라우드 변수를 Things 탭에서 만들어 주어야 한다.

이때 Time Picker 용도로 사용할 변수는 Time 포맷의 변수로 지정해 주어야 하는데, 다음과 같이 변수 선언 화면에서 필요한 사항을 설정해 주면 된다.

변수 이름은 각자의 마이크로 파이썬 코드 등에서 사용할 변수명과 완전히 일치되도록 (대소문자 구별) 선언해 주면 되고, 양방향으로 값을 주고받을지 아니면 시간을 읽기만 할 것인지에 따라 Read&Write 또는 Read Only를 선택해 주면 된다.

신경 써야 할 부분은 변수의 형식인데, 다음과 같이 변수 형식을 선택하는 부분을 누르고, 다음과 같이 Time을 선택해 주면 적절한 형식으로 설정이 된다.

적절하게 변수 선언이 되면 최종적으로 다음과 같이 변수 이름 밑에 “CloudTime”이라는 변수 형식이 표기되며, 자신이 부여해 준 변수명(여기서는 mytime)이 표기된다.

이렇게 Time Picker 용으로 사용하려는 변수의 선언이 완료되면 아두이노 클라우드의 대시보드에서 다음과 같이 Time Picker 위젯을 선택해 주면 된다.

그러면 다음과 같은 화면이 되는데,

먼저 구분에 사용할 이름을 넣어준 후(생략 가능), 다음 화면처럼 값을 전달받을 변수를 설정해 주어야 한다.

위의 Link 부분을 선택하면 다음과 같은 화면이 나오는데, 여기서 자신이 시간 값을 연결할 변수를 선택해 주면 된다.

그 후, 날짜와 시간의 표시 형식을 선호하는 대로 선택해 주고 “Done” 버튼을 눌러주면

대시보드에 다음과 같은 형식으로 시간 값이 표시되게 된다.

한편 마이크로 컨트롤러의 코드에서는 위에서 지정한 변수에 적절한 시간 값을 전달해 주어야 하는데, 한 가지 중요한 사항은 Time Picker는 시간 값을 Unix Timestamp 형식으로 전달한다는 점을 기억해야 한다.

아래는 현재의 시간을 10초 단위로 아두이노 클라우드의 Time Picker에 전달하는 마이크로 파이썬 예제인데, utime.time( )이란 시간 함수를 사용하여 초 단위 timestamp의 형식으로 값을 전달하였고, UTC시간과의 차이를 보정하기 위해 3600*9를 추가하여 서울지역의 시간을 표시하도록 했다.

(참고: 원론적으로는 아두이노 클라우드에서 설정된 지역의 시간으로 표시하도록 되어 있으나, 실제의 경우 아두이노 IOT의 time picker가 시간대를 반영한 정확한 시간을 표시하지 못하는 오류가 발생하는 경우들이 보고되고 있다. 본 예제에서도 지역설정을 정확히 했으나 이런 문제가 있었기에, UTC 기준 timemark(초 단위)로 시간을 구하고 여기에 3600*9 를 더하는 대안으로 해결했다. )

from machine import Pin
from time import sleep
import network
import logging
import sys
from arduino_iot_cloud import ArduinoCloudClient

WIFI_SSID="MySSID"
WIFI_PASSWORD = "MyPassword"
DEVICE_ID="XXXXXXXXXX161-42b7-98ff-XXXXXXXXXXb7"
CLOUD_PASSWORD="pZ#117eDr#S@6s!XXXXXXXXXX"

def wifi_connect():
if not WIFI_SSID or not WIFI_PASSWORD:
raise (Exception("Network is not configured."))
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.connect(WIFI_SSID, WIFI_PASSWORD)
while not wlan.isconnected():
        logging.info("Trying to connect. Note this may take a while...")
sleep(0.5)
    logging.info(f"WiFi Connected {wlan.ifconfig()}")  
  
def read_mytime(client):
print(utime.time( )+3600*9)
return utime.time( )+3600*9
if __name__ == "__main__":
    logging.basicConfig(datefmt="%H:%M:%S",format="%(asctime)s.%(msecs)03d %(message)s",level=logging.INFO,)
wifi_connect()
    client = ArduinoCloudClient(device_id=DEVICE_ID, username=DEVICE_ID, password=CLOUD_PASSWORD)
    client.register('mytime', on_read=read_mytime, interval=1)
    client.start()