초급 예제

누구나 쉽게 따라해볼 수 있는 쉬운 예제들입니다. 가볍게 도전~!

Ubidots 클라우드와 연동하여 원격으로 LED 제어하기

2021-11-29 11:01:46

 

OrangeBoard WiFi​+는 기존 OrangeBoard WiFi의 성능을 보완하여 유저들이 더 쉽게 사용하고 다양한 프로젝트로 확장할 수 있도록 개선한 보드입니다.

WiFi모듈은 WizFi250대신 WizFi360으로 변경되었고 MCU또한 Uno에서 쓰이던 ATmega328p대신 Mega에서 쓰이는 ATmega2560을 사용합니다.

 

 


 

 

 

개요

 

이번 튜토리얼에서는 IoT 클라우드 서비스 중 하나인 Ubidots를 OrangeBoard WiFi를 통해 사용하는 방법에 대해 알아보겠습니다.

 

 

 

 

 

 

 

 

내가 알고싶은 데이터나 별도로 관리하고 싶은 데이터가 있을 때 보통은 개인이 사비로 서버를 구매해서 그 서버를 통해 데이터를 관리하게 됩니다.

하지만 IoT 클라우드 서비스는 그렇게 개인이 서버를 구매할 필요 없이 클라우드 서비스를 제공함으로써 각 사용자들이 손쉽게 여러가지 IoT서비스를 사용하고 정보를 한 눈에 볼 수 있도록 도와줍니다.

 

 

 

 

 

 

 

Ubidots는 대표적인 IoT 웹 클라우드 서비스 업체 중 하나로, 데이터에 맞게 차트를 그리거나, 컨트롤러 제공, 테이블 제작 등 다양한 기능을 제공하고 있습니다.

근데 아두이노에 WiFi를 장착하면 이런 클라우드 서비스를 쉽게 사용할 수 있습니다. 그렇기에 OrangeBoard WiFi로도 쉽게 사용할 수 있습니다!

 

이번 글에서는 Ubidots에 접속하여 WiFi를 사용해 LED를 컨트롤하는 버튼을 만들어 보겠습니다.

 

 

 

 

동영상

 

 

 

 

 

 

 

필요한 부품 목록

 

No 부품명 수량 상세 설명
1 OrangeBoard WiFi+ 1 WizFi360을 사용한 WiFi보드
2 RGB LED 모듈 1  
3 점퍼 케이블 4  

 

OrangeBoard WiFi RGB LED 모듈 점퍼 케이블


 
 

 

 

 

 

하드웨어 making

 

 

 

 

 

Ubidots이용하기

 

ubidots사이트에 접속합니다.

 

https://ubidots.com/에 접속한 다음 오른쪽 상단에 있는 로그인 단추를 클릭하여 로그인을 합니다.

만약 계정이 없을 경우 SIGN UP을 눌러 회원가입을 먼저 합니다.

 

 

 

 

 

 

 

 

 

 

회원가입을 할때에는 For Educational or Personal Use를 선택합니다.

 

 

 

 

 

 

 

 

 

 

 

로그인을 하고나서 Ubidots를 사용하기 위한 API키를 받기 위해 로그인 화면 우측 상단의 사람 아이콘을 눌러 API Credintials를 클릭합니다.

 

클릭하고 나면 API Key와 Tokens가 있는데 그 중 Tokens를 클릭하여 그 안의 값을 복사하여 저장합니다.

 

 

 

 

 

 

 

 

 

 

 

사용할 디바이스를 생성하기 위해 사이트 상단에서 Devices - Devices를 클릭 하고 Create Device를 클릭해 신규 디바이스를 생성한다.

 

 

 

 

 

 

 

 

 

새로 열린 창에서 Blank Device를 선택합니다.

 

 

 

 

 

 

 

 

 

디바이스의 이름을 자유롭게 작성합니다. 이 예제에서는 OrangeBoard WiFi로 작성하였습니다.

 

 

 

 

 

 

 

 

 

위의 세팅까지 마무리하면 디바이스의 생성이 완료됩니다. 

디바이스 생성을 마친 다음에는 디바이스의 이름(여기서는 OrangeBoard WiFi)을 눌러 variable 생성 페이지로 넘어갑니다.

 

 

 

 

 

 

 

 

 

 

 

Variable을 생성하기 위해 Add Variable을 클릭하고 Raw를 선택합니다. 

 

 

 

 

 

 

 

 

 

왼쪽 중간에 있는 ID를 복사합니다. (코드에서 VARID로 사용)

 

 

 

 

 

 

 

 

위 과정까지 끝냈다면 Widget을 생성하기 위해 상단에서 Data - Dashboards를 클릭한 뒤 Add new Widget을 클릭한다.

 

 

 

 

 

 

 

 

 

 

스크롤을 내려 Switch를 선택하고 다음 창에서 Add Variables를 클릭합니다.

 

 

 

 

 

 

 

 

 

이전에 생성한 LED Control을 Variable로 선택하고 DashBoard생성을 완료합니다.

 

 

 

 

 

 

 

 

 

 

정상적으로 Switch Widget이 생성되었는지 확인하고 버튼을 눌러보면서 테스트합니다.

 

 

 

 

 

 

 

 

버튼을 클릭해보고 Widget과 연동된 Variable에 들어가면 데이터가 기록되는지 확인 가능합니다.

 

 

 

 

 

 

 

 

 

소프트웨어 Coding

#include <Arduino.h>
#include <SPI.h>
#include <IPAddress.h>
#include "WizFi360.h"

/* Baudrate */
#define SERIAL_BAUDRATE   115200
#define SERIAL3_BAUDRATE  115200

char ssid[] = "nepes_wireless_guest";    // your network SSID (name)
char pass[] = "gu@st12345";          // your network password
int status = WL_IDLE_STATUS;       // the Wifi radio's status

//Ubidots information
#define TOKEN    "BBFF-P0e6DFdYZRyRl8FnomKVJCMZDWLYa7"
#define VARID_LED_Red "60150d6d1d847239bd9e3f00"

//Server information
char server[] = "stem.ubidots.com";
#define  REMOTE_PORT    80

unsigned long lastConnectionTime = 0;         // last time you connected to the server, in milliseconds
const unsigned long postingInterval = 3000L; // delay between updates, in milliseconds

//Hardware Pin status
#define Pin_LED_Red     8

// Initialize the Ethernet client object
WiFiClient client;

// use a ring buffer to increase speed and reduce memory allocation
RingBuffer buf(200);

bool isLEDOn = false;

void printWifiStatus();
void httpRequest();

void setup()
{
  // initialize serial for debugging
  Serial.begin(SERIAL_BAUDRATE);
  // initialize serial for WizFi360 module
  Serial3.begin(SERIAL3_BAUDRATE);
  // initialize WizFi360 module
  WiFi.init(&Serial3);

  pinMode(Pin_LED_Red, OUTPUT);   //added
  digitalWrite(Pin_LED_Red, LOW);

  // check for the presence of the shield
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    // don't continue
    while (true);
  }

  // attempt to connect to WiFi network
  while ( status != WL_CONNECTED) {
    Serial.print("Attempting to connect to WPA SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network
    status = WiFi.begin(ssid, pass);
  }

  // you're connected now, so print out the data
  Serial.println("You're connected to the network");

  printWifiStatus();
}

void loop()
{
  char c;
  // if there's incoming data from the net connection send it out the serial port
  // this is for debugging purposes only
  while (client.available()) {
    c = client.read();
    if ( c != -1)
    {
      buf.push(c);
      // printing the stream to the serial monitor will slow down
      Serial.write((char)c);
    }

    if (buf.endsWith("\"value\": 1.0,"))
    {
      isLEDOn = true;
    }
    else if (buf.endsWith("\"value\": 0.0,"))
    {
      isLEDOn = false;
    }
  }

  // if 10 seconds have passed since your last connection,
  // then connect again and send data
  if (millis() - lastConnectionTime > postingInterval) {
    if ( isLEDOn )
    {
      Serial.println("Turn On LED");
      digitalWrite(Pin_LED_Red, HIGH);
    }
    else
    {
      Serial.println("Turn Off LED");
      digitalWrite(Pin_LED_Red, LOW);
    }
    httpRequest();
  }
}

void printWifiStatus()
{
  // print the SSID of the network you're attached to
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength
  long rssi = WiFi.RSSI();
  Serial.print("Signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

// this method makes a HTTP connection to the server
void httpRequest()
{
  Serial.println();

  // close any connection before send a new request
  // this will free the socket on the WiFi shield
  client.stop();

  // if there's a successful connection
  if (client.connect(server, REMOTE_PORT)) {
    Serial.println("Connecting...");

    // send the HTTP PUT request
    client.print(F("GET /api/v1.6/variables/"));
    client.print(VARID_LED_Red);
    client.print(F(" HTTP/1.1\r\n"));
    client.print(F("Host: things.ubidots.com\r\n"));
    client.print(F("X-Auth-Token: "));
    client.print(TOKEN);
    client.print(F("\r\n"));
    client.print(F("Content-Type: application/json\r\n"));
    client.print(F("Connection: close\r\n"));
    client.print(F("\r\n\r\n"));

    // note the time that the connection was made
    lastConnectionTime = millis();
  }
  else {
    // if you couldn't make a connection
    Serial.println("Connection failed");
  }
}

 

 

 

 

 

 

 

 

위 코드에서 ubidots에서 가져온 TOKEN과 VARID를 입력합니다.

 

 

 

 

 

 

정보 입력 후 코드를 OrangeBoard WiFi+에 업로드하고 시리얼 모니터를 열어 확인합니다.

 

▲불이 꺼졌을 때(버튼 Off)

 

 

 

 

 

 

 

 

 

▲불이 켜졌을 때(버튼 On)

 

 

 

 

 

 

 

 

▲LED에 불이 켜진 모습

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!