센서값을 인터넷에 업로드하기!

by 고학능 | 2017-12-08 01:36
dht22 iot relay wemos d1 가습기 아두이노

저번장에서 DHT22로 측정한 값을 액정이 출력했습니다.

이번 장에서는 DHT22 측정한 값을 인터넷(ubidots)에 업로드를 하는 방법에 대해서 글을 쓰겠습니다.


ubidots 홈페이지 화면입니다.

아두이노를 무선인터넷에 연결해서 서버를 만들고... 센서 값을 업로드하고... 업로드한 값을 그래프 등으로 시각화하려면... 메이커 활동에서 웹 개발자, 웹 디자이너 역할도 겸하게 될 것 같군요... 

우리는 1인 3역을 다하는 것이 아니라 메이커 역할만 하고 웹 개발자, 웹 디자이너 역할은 ubidots 서비스를 활용할 예정입니다. ubidots는

1. 아두이노를 쉽게 인터넷과 연결시키고

2. 센서에서 측정한 값을 인터넷에 업로드하고

3. 인터넷에서 아두이노를 쉽게 제어할 수 있습니다.

4. 또한 데이터를 시각화해주는 기능까지 가지고 있습니다.(비슷한 업체로 blynk, speakthings 등이 있습니다.)


본격적으로 ubidots을 활용하는 법에 대해서 알아보겠습니다.

순서는

1. ubidots을 활용해서 wemos d1 LED 껏다 켜기

2. ubidots에서 값을 ubidots에 업로드하기입니다.


1. ubidots을 활용해서 wemos d1 LED 껏다 켜기 

ubidots 홈페이지 - Dashboard에서 동그란 스위치를 눌러서 wemos d1에 있는 LED를 제어합니다. 

이를 위해서 Dashboard에 widget을 생성하고 이와 연결된 코드를 wemos에 업로대해야 합니다.


ubidots-8266-master 라이브러리를 설치하면 다양한 예제가 있는데 그중 UbidotsGetValue를 바탕으로 wemos d1 LED를 껏다가 켜는 스케치를 작성했습니다.  

#include "UbidotsMicroESP8266.h"

#define ID "Your_variable_ID_here" // Put here your Ubidots variable ID
#define TOKEN "Your_token_here" // Put here your Ubidots TOKEN
#define WIFISSID "Your_WiFi_SSID" // Put here your Wi-Fi SSID
#define PASSWORD "Your_WiFi_Password" // Put here your Wi-Fi password

Ubidots client(TOKEN);

void setup() {
Serial.begin(115200);
client.wifiConnection(WIFISSID, PASSWORD);
pinMode(LED_BUILTIN, OUTPUT);
//client.setDebug(true); // Uncomment this line to set DEBUG on
}

void loop() {
float value = client.getValue(ID);
Serial.print("Value: ");
Serial.println(value);
digitalWrite(LED_BUILTIN, ID);
delay(10000);
}























우리가 ubidots에서 해야할 것은 

 가. 계정 토큰

 나. 변수 ID 값 

 다. switch widget 만들기 입니다. 

 가. 계정 토큰 확인하는 방법


우측 상단에 계정을 클릭 - API Credentials을 클리합니다.


그러면 API Keys와 Tokens이 나옵니다. 여기서 기본 토큰(빨간상자)을 복사해서 wemos에 입력합니다.


 나. 변수 ID 값 얻기

먼저 Devices(주황색상자)를 클릭한 다음 + Add Device(빨간색 상자)를 클릭합니다. 그러면 파란색 상자가 생성되는데 파란색 상자를 클릭합니다.

클릭하면 다음과 같은 화면이 나옵니다. 여기서 Add Variable 클릭 후 Default(빨간색상자)를 클릭합니다. 그러면 파란색 상자가 생성되는데 파란색 상자(New variable, 이름변경 가능)를 클릭합니다.

클릭하면 다음과 같은 화면이 나옵니다. 여기서 좌측 중앙부분 ID 값(빨간색 상자)이 생성되는데 이 값을 wemos에 입력해야 합니다.


다시 처음으로 돌아가서

#include "UbidotsMicroESP8266.h"

#define ID "***************************" // 변수 ID값 입력
#define TOKEN "***************************" // Ubidots 계정 토큰 입력
#define WIFISSID "mango" // wifi ID 입력
#define PASSWORD "*************" // wifi 비밀번호 입력

Ubidots client(TOKEN);

void setup() {
Serial.begin(115200);
client.wifiConnection(WIFISSID, PASSWORD);
pinMode(LED_BUILTIN, OUTPUT);
//client.setDebug(true); // Uncomment this line to set DEBUG on
}

void loop() {
float value = client.getValue(ID);
Serial.print("Value: ");
Serial.println(value);
digitalWrite(LED_BUILTIN, !(int)value);
delay(10000);
}





















ubidots에서 받아온 token 및 변수 ID값, 무선인터넷 아이디 및 비밀번호를 입력 후 업로드를 합니다.

(보드는 wemos d1 & mini, 업로드 속도는 115200으로 설정합니다.)


다.스위치 widget을 생성하겠습니다.

우측 상단에 있는 동그라미 속 +(빨간색 상자)를 클릭합니다.

'Control - Switch - My Data Source - New Variable'을 선택합니다.

My Data Source - New Variable은 먼저 Device에서 변수를 생성해야합니다. 

이후 Finish 버튼을 눌러서 생성을 마무리합니다.

On 상태에서는 1을 전송하고, OFF 상태에서는 0을 전송합니다.

wemos에 스케치 파일 업로드 및 widget을 생성했으니 잘 작동하는지 확인하면 됩니다.

(※LED_BUILTIN으로 연결된 LED는 HIGH(1)일 때 꺼지고, LOW(0)일 때 켜집니다. 생각하는거랑 반대인거 유의하셔야 합니다. 그래서 digitalWrite에 !를 붙였습니다. )

(※※ ubidtos에서 신호를 받는 것은 약간 늦습니다. 그리고 ubidots에서 신호를 받는것이 약간 불안정한것 같습니다. )



다음으로는 센서에서 읽은 값을 ubidots으로 업로드하겠습니다. 

이번에는 온도, 습도 변수 2개 생성 및 막대그래프 widget을 생성하면 됩니다.

  가. 변수 ID_temperature, ID_humidity을 생성하기

    Device에서 온도값, 습도값 변수를 생성하고 각각 ID값을 확인합니다.

    앞에서 한 내용과 크게 다르지 않아서 생략하겠습니다.

    

  나. 막대그래프 widget 생성

우측 상단 주황색 +를 클릭해서 widget을 생성합니다.


Chart - double axis 선택 후 2개 변수를 지정합니다.(온도, 습도)

그래프는 축 값을 설정할 수 있습니다. widget에서 톱니바퀴를 누른 다음 그래프에서 최소, 최대를 직접 설정할 지 auto로 할지 선택하면 되고, Number of datapoints는 최대 몇개 데이터를 그래프에 표현할지 설정합니다. 

ubidots-8266-master 라이브러리를 설치하면 다양한 예제가 있는데 그중 'UbidotsSaveValueWithID'를 바탕으로 온도, 습도 값을 ubidots에 업로드 하는 스케치를 작성했습니다.  

앞장에서 DHT22 및 0.96인치 액정을 사용한 스케치 파일에 ubidots 내용을 추가한것입니다.

//필요한 라이브러리
#include "UbidotsMicroESP8266.h"
#include "DHT.h"
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

//ubidots에 연결에 필요한 토큰, 와이파이 등
#define TOKEN "***********************" // Put here your Ubidots TOKEN
#define ID_Temperature "*************************" // 온도 ID값 입력
#define ID_Humidity "*******************" // 습도 ID값 입력

#define WIFISSID "mango" // Put here your Wi-Fi SSID
#define PASSWORD "***********" // Put here your Wi-Fi password
Ubidots client(TOKEN);

//dht22 핀, 종류, class 선언
#define DHTPIN D6 // what pin we're connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT dht(DHTPIN, DHTTYPE,11);

//oled 액정 class 선언
#define OLED_RESET LED_BUILTIN //4
Adafruit_SSD1306 display(OLED_RESET);
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif // 128*64화면인지 확인하기

char _h[5], _t[5];

void setup(){
Serial.begin(9600);
client.wifiConnection(WIFISSID, PASSWORD);

Serial.println("DHT22 test!");
dht.begin();

display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.display();
}

void loop(){
// put your main code here, to run repeatedly:
float h = dht.readHumidity();
float t = dht.readTemperature();

dtostrf(h, 4, 1, _h);
dtostrf(t, 4, 1, _t);
if (isnan(t) || isnan(h)) {
Serial.println("Failed to read from DHT");
} else {
client.add(ID_Temperature, t); //ubidots으로 값을 보내는 method입니다.
client.add(ID_Humidity, h);
//첫번째 매개변수에는 온도,습도 변수 ID와
client.sendAll(false);
//두번째 매개변수에는 DHT22에서 측정한 온도, 습도값이 저장된 변수 명을 입력합니다.
display.setTextSize(2);
display.setTextColor(WHITE);
display.clearDisplay();
display.setCursor(0,0); display.println("hum : ");
display.setCursor(0,30); display.println("temp: ");
display.setCursor(70,0); display.println(_h);
display.setCursor(70,30); display.println(_t);
display.display();
delay(5000);
}
}





























































회로는 앞장과 같습니다.




wemos d1와 연결된 액정에서 출력된 값과 ubidots에 업로드 된 값을 비교해보세요 

(Ubidots에서 보드를 제어하는 것은 불안정한데 보드에서 ubidots으로 값을 업로드 하는 것은 나름 안정적입니다.)

다음 장에서는 릴레이로 가습기를 제어하는 방법에 대해서 작성하겠습니다.

댓글 0

MADE BY

고학능

3d모델링, 아두이노, 전기회로 구성