인터넷 클라우드로 멀리 떨어진 곳의 여러 개 스위치를 조작하는 방법 – 피코 W/ESP32와 아두이노 클라우드 사용

인터넷 클라우드로 멀리 떨어진 곳의 여러 개 스위치를 조작하는 방법 –  피코 W/ESP32와 아두이노 클라우드 사용

앞선 두 개의 글에서, 라즈베리파이 피코나 ESP32처럼 마이크로 파이썬을 사용한 보드를 IOT 클라우드의 하나인 아두이노 클라우드에 연결시키고, 온도나 습도 같은 센서 측정값을 클라우드에서 모니터링하고, 클라우드에서 이들 원격지의 보드에 연결된 LED를 켜고 끄는 방법을 소개한 바 있었다.

https://kongyine.com/223456110799

https://kongyine.com/223453592371

본 글에서는 이러한 기능을 조합하여, 클라우드에서 온도 및 습도를 모니터링하는 것과 동시에, 3개의 스위치를 조작하는 사례를 소개한다. 본 글에서는 LED를 켜고 끄는 방식으로 이를 구현하지만, LED 대신 다음 사진에 소개된 릴레이 모듈의 신호선을 각각의 LED 대신 사용하면, 외부의 대용량 전력 기기들도 LED와 동일하게 조작이 가능하다.

라즈베리파이 피코 보드의 회로는 GP0과 GP1을 이용하여 I2C 방식으로 AHT10 모듈을 연결하여 온도와 습도를 측정하도록 하였고, 스위치 조작을 위한 3개의 출력핀은 GP13, GP14, GP15를 각각의 LED에 연결해 주었다.

이렇게 구성된 회로를 아두이노 클라우드에서 조작하기 위해,

이전 글에서 소개한 원리나 방법을 그대로 이용하되, 3개의 스위치를 조작할 수 있도록 아두이노 클라우드의 things에서 각각 sw1, sw2, sw3라는 이름으로 3개의 변수를 선언해 주었다.

그리고 대시보드에서는 이들 변수의 상태를 표시하고, 또 조작할 수 있도록 하기 위하여,

다음과 같이 각기 sw1의 상태를 나타내주는 LED 위젯과, 이를 켜고 끄는 스위치 위젯을 하나의 세트로 총 3세트를 다음과 같이 추가해 주었다.

그리고 이들은 각각 하나의 세트 단위로 위에서 만들어준 변수에 연결해 주었다.

라즈베리파이 피코 보드(또는 ESP32)에서 사용할 프로그램에서는 해당 스위치의 on/off 상태를 보드와 클라우드 간 동기화 시키기 위해 다음과 같은 코드를 추가해 주었다.

그리고 이 변수의 값이 변할 때마다 실행될 동작을 다음과 같이 함수의 형태로 추가해 주었다,

이렇게 구성된 전체 마이크로 파이썬 코드는 다음과 같으며,

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"

# picoW
DEVICE_ID="097998f9-f161-xxxx-xxxx-xxxxxxxx9cb7"
CLOUD_PASSWORD="pZ#117xxxxxxx!L?LAnyL1H3"

sw1 = Pin(13,Pin.OUT)
sw2 = Pin(14,Pin.OUT)
sw3 = Pin(15,Pin.OUT)
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 onSW1Change(client,value):
if value:
        sw1.value(1)
print('SW1 ON!')
else:
        sw1.value(0)
print('SW1 OFF!')

def onSW2Change(client,value):
if value:
        sw2.value(1)
print('SW2 ON!')
else:
        sw2.value(0)
print('SW2 OFF!')

def onSW3Change(client,value):
if value:
        sw3.value(1)
print('SW3 ON!')
else:
        sw3.value(0)
print('SW3 OFF!')


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('sw1', value=None, on_write=onSW1Change, interval=0.25)
    client.register('sw2', value=None, on_write=onSW2Change, interval=0.25)
    client.register('sw3', value=None, on_write=onSW3Change, interval=0.25)
    client.register('Temp', on_read=read_temperature, interval=10)
    client.register('Humidity', on_read=read_humidity, interval=10)
    client.start()

이 코드가 업로드된 라즈베리파이 피코 보드에 전원이 인가된 후, 인터넷 클라우드에서 이를 조작하는 모습은 다음과 같다.