AHT10에서 측정한 온도/습도 데이터를 인터넷 아두이노 클라우드로 보내기

AHT10에서 측정한 온도/습도 데이터를 인터넷 아두이노 클라우드로 보내기

아두이노 클라우드에 센서 연결을 위한 기본 지식

앞선 글에서 IOT 플랫폼의 하나인 아두이노 IOT 클라우드에 연결된 ESP32/또는 라즈베리파이 피코 W를 이용해 LED를 원격으로 모니터링하고, 또한 원격으로 켜고 끄는 조작을 하는 방법을 소개한 바 있었다.

https://blog.naver.com/mythee1/223453592371

그런데, 피코 W/ESP32와 아두이노 클라우드를 이용하면, 이처럼 LED만 원격으로 조작할 수 있는 것이 아니라, 원격지의 피코 W나 ESP32에 연결된 각종 센서 데이터들도, 아두이노 IOT 클라우드에 연결해서 실시간으로 모니터링할 수가 있다.

또한, 아두이노 클라우드는 일정 기간 동안 데이터를 보관하는 기능도 지원하기 때문에, 이처럼 센서 데이터들을 IOT 클라우드에 연결하면 과거의 센서 데이터들의 시계열 정보도 다음과 같은 차트 형식으로 살펴볼 수 있고, 센서 입력 결과를 원격제어 스위치 들과 연계해 자동화 조작도 가능해지는 장점이 있다.

본 글에서는 라즈베리파이 피코 W 보드에 연결된 AHT10 센서로 온도/습도 측정 센서를 측정하고, 이를 온라인상에 있는 아두이노 클라우드에 연결해서 모니터링하는 방법을 자세히 소개한다.

아두이노 클라우드에 AHT10 센서 연결 방법

Step 1. 변수 선언

아두이노 클라우드에 추가적인 센서 신호를 연결해 주려면, 이들 신호를 연결되는 보드와 주고받을 변수를 먼저 선언해 주어야 한다.

먼저 아두이노 클라우드의 Things 탭으로 이동하고, 기존에 클라우드에 연결된 장치 중에 필요한 것을 골라서 클릭한다. 참고로 things는 클라우드에 정보가 1차 등록된 장치들 중, 실제로 클라우드와 데이터를 주고받기 위해 변수 등의 세부 내용이 설정된 장치를 의미한다.

특정 Things에 들어가면 다음과 같이 Add 버튼을 이용하여 신호값을 주고받을 변수를 추가로 만들거나, 기존에 만들어둔 변수를 편집할 수 있다.

본 글에서는 온도와 습도 데이터를 새롭게 클라우드에 연결할 예정이므로, Add 버튼을 이용해 “Temp”라는 이름과 “Humidity”라는 이름을 이용해 변수를 2개 만들어준다.

먼저 Add 버튼을 선택해 주면 다음과 같이 변수의 세부 내용을 지정하는 화면이 되는데, Temp라는 변수명(임의로 정한 이름임)을 넣고, 변수 형태로는 Floating number를 선택해 준다.

그리고 센서 값은 아두이노 클라우드에서 읽기만 하면 되는 변수이므로(역으로 클라우드에서 센서의 측정값을 바꿀 수 있는 게 아니므로) Variable perssion 부분은 ” Read Only”로 설정해 준다.

또한 일정 간격으로 센서 값을 읽어오도록, Update policy를 “Periodically”로 선택하고, 갱신 주기를 10초(임의로 선택)로 설정해 주었다.

이렇게 변수 이름과 세부사항을 지정해 주면, 다음과 같이 Temp라는 이름의 변수가 생긴 것을 확인할 수 있다.

동일한 방법으로 습도 데이터를 받아들인 Humidity라는 이름의 변수를 동일한 방법으로 만들어준다.

그러면, 다음과 같이 Temp와, Humidity라는 이름의 변수가 새로 생긴 것이 확인되며, 다음 화면처럼 이 변수들이 화면 우측의 “Associated Device” 부분에서 “PICO”라는 장치와 연계된 것을 확인할 수 있다.

(만일 연계된 장치가 자신이 의도한 장치가 아니면, Associated Device 부분에서 정정해서 설정해 주어야 한다.)

Step 2. 대시보드 편집

다음으로는 위에서 만들어준 변수 Temp와 Humidity로 입력될 신호를 사용자 화면인 Dashboard에 표시해 주기 위해서, 다음과 같이 Dashboard로 이동해 새로 대시보드를 만들거나 기존 대시보드를 편집해 준다.

본 예에서는 기존에 만들어졌던 대시보드에 새로운 변수들을 추가하기 위해 기존에 만들어둔 대시보드를 클릭해 준다.

다음과 같이 펜 모양 아이콘을 눌러 편집 모드로 들어온 후, 새로운 변수를 표시하는 데 사용할 위젯을 Add 명령을 이용해 선택해 준다. 본 글에서는 입력되는 센서 값을 숫자형태와, 차트 형태 2가지로 표시하려고 하며,

센서 값을 우선 숫자 형태로 표시하기 위해, 다음과 같이 Gauge 위젯을 선택해 주었다.

Gauge 위젯을 선택하면 다음과 같은 화면이 되며, 해당 위젯에 구분을 위해 표시될 이름을 지정해 주고, 중간 부분의 Link Variable을 선택해 준다.

그러면 다음과 같은 화면이 되며, 추가한 Gauge 위젯에 실제 값이 표시될 변수를 왼쪽부터 오른쪽으로 선택하고 “Link variable” 버튼을 눌러준다.

그러면 화면 중간 부분에 연결되는 장치와 변수명이 표시되는데, 이를 확인한 후, 하단부에 있는 최소값/최대값 등과 같은 추가 사항들을 지정해 주면 된다. 본 장치는 온도를 표시하는 경우에는 -50~250도까지 값이 표시되도록 지정해 주었다.

그러면 다음과 같이 온도를 표시하기 위한 게이지가 추가된 것을 볼 수가 있다.

습도 데이터도 동일 방식으로 표시하기 위해, humidity variable에 대해서도 동일한 과정으로 다음과 같이 게이지를 만들어준다. 단, 습도 데이터의 경우 최소값/최대값은 0~100으로 설정해 주면 된다.

다음에는 이렇게 수치값으로 게이지에 나타나는 값을 그래프 형태로도 동시에 표시하기 위해, 다음과 같이 Chart 위젯을 추가해 준다.

그러면 다음과 같은 화면이 나타나는데, 동일 방식으로 위젯의 이름을 지정하고, 변수를 연결해 주면 된다.

연결하는 변수는 앞서 게이지에 연결한 Temp 변수를 다시 연결해 주면 된다.

즉, 동일한 Temp 변수가 Gauge 위젯에도 연결되고, Chart 위젯에도 동시에 연결되는 것이다.

그다음 변수가 제대로 연결된 것을 확인하고, 기타 사항들을 설정하고 확인해 준면 된다.

참고로 Chart 위젯에서 interpolation 연결 방식은 센서 값 갱신에 주기를 지정해 주었기에, 센서 값을 그래프 형태로 표시할 때 데이터 포인트들을 연결하는 방식을 의미하며, Line은 데이터 포인트들을 단순 직선으로 연결하고, spline은 부드러운 곡선의 형식으로 연결하는 방식을 의미한다.

지정을 마치면 차트 위젯이 하나 추가된 것을 볼 수 있으며, humidity 변수에 대해서도 동일한 방법으로 Chart 위젯을 추가하고 humidity 변수를 연결하면 대시보드는 다음과 같은 형태가 된다.

만일 필요하다면, 차트의 위치나 크기를 변경할 수도 있는데, 다음 표시된 사방 화살표로 자리 배치를 변경하고, 차트 오른쪽 모서리를 마우스로 클릭하여 조절하면 다음과 같이 크기도 변경할 수가 있다.

Step 3. 보드 및 코드 구성과 클라우드 접속

위에서 만들어준 변수와 대시보드에 실제로 연결할 보드를 다음과 같이 구성했고, 전원을 연결하여 아두이노 클라우드에 접속하였다.

접속에는 다음과 같은 마이크로 파이썬 코드를 사용했는데, AHT10 온습도 센서의 기본적인 사용법 및 라이브러리 활용법 등은 이전 글에서 자세히 소개한 바 있으므로, 이전 글( https://blog.naver.com/mythee1/223240132657)을 참조하기 바란다.

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

WIFI_SSID="MySSID"                                  ; 각자의 장치에 맞게 수정 필요
WIFI_PASSWORD = "MyPassword"                        ; 각자의 장치에 맞게 수정 필요
DEVICE_ID="097998f9-XXXX-XXXX-XXXX-c994d0019cb7"    ; 각자의 장치에 맞게 수정 필요
CLOUD_PASSWORD="pZ#117XXXXXXXXXX?LAnyL1H3"          ; 각자의 장치에 맞게 수정 필요

i2c = machine.I2C(0, scl=machine.Pin(1), sda=machine.Pin(0), freq=400000)
detect_sensor(i2c)
reading=convert(i2c)
Temp=reading[0]
Humidity=reading[1]   

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_temperature(client):
    detect_sensor(i2c)
    reading=convert(i2c)
    temperature_Celcius=reading[0]
    humidity_percent=reading[1]
    return temperature_Celcius
        
def read_humidity(client):
    detect_sensor(i2c)
    reading=convert(i2c)
    temperature_Celcius=reading[0]
    humidity_percent=reading[1]
    return humidity_percent

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('Temp', on_read=read_temperature, interval=10)
    client.register('Humidity', on_read=read_humidity, interval=10)
    client.start()   

Step 4. 결과 확인 및 사용

정상적으로 해당 장치의 아두이노 클라우드 접속이 이루어지면, 대시보드에서는 다음과 같은 형태로 결과가 표시된다.

AHT10 센서를 Blynk 플랫폼에 연결하는 경우라면

동일한 AHT10 센서를 아두이노 IOT 클라우드와 유사한 IOT 플랫폼 대신 유사한 기능을 하는 IOT 플랫폼인 Blynk에 연결할 수도 있는데, 해당 방법에 대해서는 별도의 이전 글에서 자세히 소개한 바 있으므로, 해당 글을 참조하기 바란다.

https://blog.naver.com/mythee1/223443619959