코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
2021-11-22 17:06:49
OrangeBoard WiFi+는 기존 OrangeBoard WiFi의 성능을 보완하여 유저들이 더 쉽게 사용하고 다양한 프로젝트로 확장할 수 있도록 개선한 보드입니다.
WiFi모듈은 WizFi250대신 WizFi360으로 변경되었고 MCU또한 Uno에서 쓰이던 ATmega328p대신 Mega에서 쓰이는 ATmega2560을 사용합니다.
Thingspeak는 데이터를 보내고 확인할 수 있는 IoT 웹클라우드 솔루션 서비스 중 하나로 무료로 다양한 기능들을 사용할 수 있습니다.
Thingspeak는 사물을 뜻하는 Thing과 말하다의 의미를 지닌 Speak의 합성어로 '사물이 말하다'라는 뜻, 즉 IoT기기들이 출력하는 여러가지 값들을 의미합니다.
Thingspeak에서는 Public으로 공개한다면 내가 만든 데이터 뿐만 아니라 아래 사진처럼 현재 실시간으로 작동하는 해외 여러나라 다른 사람들의 데이터도 확인할 수 있습니다.
<public channels을 클릭할 경우 실시간으로 작동하는 수천개의 채널을 볼 수 있다>
Thingspeak에서는 MATLAB을 사용한 분석도 제공하기 때문에 단순히 센서값 축적뿐만 아니라 정밀한 데이터 분석도 가능합니다.
이번글에서는 Thingspeak와 OrangeBoard WiFi+를 연동하여 온도센서의 값을 Thingspeak에 올리는 방법에 대해 알아보겠습니다.
No | 부품명 | 수량 | 상세 설명 |
1 | OrangeBoard WiFi+ | 1 | WizFi360 |
2 | 온습도 센서 | 1 | DHT11 |
3 | 점퍼 케이블 | 3 |
OrangeBoard WiFi | 온습도 센서 | 점퍼 케이블 |
![]() |
![]() |
![]() |
Thingspeak를 사용하기 위해 Thingspeak(https://thingspeak.com/)에 접속합니다.
여러 사이트가 그렇듯 Thingspeak를 사용하기 위해서는 회원가입을 합니다.
사이트 우측 상단에 사람모양의 아이콘을 누르고 Create one!을 눌러 회원가입을 진행합니다.
회원가입을 완료하고 로그인 후 데이터를 올릴 새로운 채널을 만들기 위해 Channels - My Channels를 클릭합니다.
New Channel을 눌러 새로운 채널을 생성합니다.
New Channel을 클릭하여 아래 이미지와 같이 정보를 입력할 수 있는 칸들이 보이는데 간단하게 정보를 입력합니다.
여기서는 온습도 센서 측정이라는 이름으로 채널을 생성하고 Field1에서는 온도, Field2에서는 습도를 읽어오도록 하겠습니다.
Field는 데이터의 값을 표현하는 하나의 구역으로 Field를 생성할 경우 하나의 값을 그래프로 표현할 수 있습니다.
만약 여러개의 센서를 이용하여 온도, 습도, 조도, 기압 등의 여러 데이터를 받아오면 그 수만큼 Field를 늘려주시면 됩니다.
작성후에 하단의 Save Channel을 누르면 채널이 생성됩니다.
이제 생성된 채널을 들어가면 아래와 같이 Field가 두개 생성된 것을 확인할 수 있습니다.
※ 아래 코드를 사용하기 전에 온습도 센서를 사용하기 때문에 <DHT.h>라이브러리가 미리 설치되있어야 합니다.
#include <stdlib.h>
#include <DHT.h>
#include "WizFi360.h"
/* Baudrate */
#define SERIAL_BAUDRATE 115200
#define SERIAL3_BAUDRATE 115200
/* Sensor */
#define DHTTYPE DHT11
#define DHTPIN 6
#define CDSPIN A0
char ssid[] = "ssid"; // your network SSID (name)
char pass[] = "pass"; // your network password
int status = WL_IDLE_STATUS; // the Wifi radio's status
char server[] = "api.thingspeak.com"; // server address
String apiKey ="apiKey"; // api key
// sensor buffer
char temp_buf[10];
char humi_buf[10];
unsigned long lastConnectionTime = 0; // last time you connected to the server, in milliseconds
const unsigned long postingInterval = 10000L; // delay between updates, in milliseconds
// Initialize the Ethernet client object
WiFiClient client;
// Initialize the DHT object
DHT dht(DHTPIN, DHTTYPE);
void setup() {
//initialize sensor
pinMode(CDSPIN, INPUT);
dht.begin();
// initialize serial for debugging
Serial.begin(SERIAL_BAUDRATE);
// initialize serial for WizFi360 module
Serial3.begin(SERIAL3_BAUDRATE);
// initialize WizFi360 module
WiFi.init(&Serial3);
// 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);
}
Serial.println("You're connected to the network");
printWifiStatus();
//First transmitting
sensorRead();
thingspeakTrans();
}
void loop()
{
// if there's incoming data from the net connection send it out the serial port
// this is for debugging purposes only
while (client.available()) {
char c = client.read();
Serial.print("recv data: ");
Serial.write(c);
Serial.println();
}
// if 30 seconds have passed since your last connection,
// then connect again and send data
if (millis() - lastConnectionTime > postingInterval) {
sensorRead();
thingspeakTrans();
}
}
// Read sendsor value
void sensorRead(){
float cdsValue= analogRead(CDSPIN);
float tempValue=dht.readTemperature();
float humiValue=dht.readHumidity();
String strTemp = dtostrf(tempValue, 4, 1, temp_buf);
String strHumi = dtostrf(humiValue, 4, 1, humi_buf);
Serial.print("Temperature: ");
Serial.println(strTemp);
Serial.print("Humidity: ");
Serial.println(strHumi);
}
//Transmitting sensor value to thingspeak
void thingspeakTrans()
{
// 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, 80)) {
Serial.println("Connecting...");
// send the Get request
client.print(F("GET /update?api_key="));
client.print(apiKey);
client.print(F("&field1="));
client.print(temp_buf);
client.print(F("&field2="));
client.print(humi_buf);
client.println();
// note the time that the connection was made
lastConnectionTime = millis();
}
else {
// if you couldn't make a connection
Serial.println("Connection failed");
}
}
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");
}
위의 코드를 업로드 하기 전에 코드에서 작성해야 할 부분이 3곳이 있습니다.
SSID, PASS, APIKEY 이렇게 3개의 값을 사용자가 작성해주어야 하는데 SSID와 PASS는 사용자가 현재 쓰고 있는 WiFi의 이름과 패스워드를 작성하여 넣으면 됩니다.
APIKEY는 Thingspeak내에서 구할 수 있는데 채널에 접속 후 API Keys버튼을 누르면 됩니다.
탭에 접속하면 Write API Key와 Read API Keys가 보이는데 값을 읽어오는 것이 아닌 값을 등록하는 것이기 때문에 Write API Key에 해당하는 값을 입력하면 됩니다.
<Write API Key를 복사하여 코드에 사용합니다>
SSID, PASS, APIkey까지 입력하고 난 뒤 코드를 업로드 하면 이제 Thingspeak에서 정상적으로 센서값에 따라 그래프를 그리는 모습을 볼 수 있습니다.
<현재 온도인 27.8도를 그래프에 출력한 모습>
기본적으로 채널은 Private(비공개)으로 설정되어 있지만 Sharing탭에서 채널을 공개(Public)로 변경할 수 있습니다.
공개로 변경하게 되면 링크만 있다면 다른 사용자들도 값을 확인할 수 있습니다.
kocoafabeditor
항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!