코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
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 모듈 | 점퍼 케이블 |
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에 들어가면 데이터가 기록되는지 확인 가능합니다.
#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
항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!