사물인터넷(IoT)2016. 6. 1. 13:51

예전 포스팅에서 IoT 클라우드 서비스인 Thingspeak.com 에 대해서 알아 보았습니다.  이번에는 실제 아두이노의 데이터를 Thingspeak 에 올리는 방법을 알아보겠습니다. 이렇게 하므로써 센서의 데이터를 모바일이나 원격지의 PC에서도 모니터링이 가능해지게 됩니다. 온도센서는 LM35 를 이용하였고 인터넷 통신을 위해서 와이파이 모듈인 ESP8266 ESP-01 모듈을 이용하였습니다. ESP8266 모듈은 아래의 사전 참고글을 참고하여 AT 커맨드 베이스의 펌웨어가 올라가 있어야 합니다.



LM35 센서 입니다. 온도를 측정하는 센서 입니다. 핀은 위와 같으며 OUTPUT 은 아두이노 아날로그 단자와 연결 됩니다.


인터넷 통신을 위한 ESP8266 모듈 입니다. 핀의 배열은 위와 같습니다. 3.3V 로 작동 합니다. 


ESP8266 펌웨어 업데이트가 되었으면 ESP8266 모듈을 와이파이에 연결해 주어야 합니다. 한 번 세팅한 연결값은 전원이 꺼져도 유지되므로 한 번만 설정해 주면 됩니다. 아래를 참고하여 설정해 줍니다.


ESP8266 와이파이 연결


아두이노와 ESP8266(ESP-01)의 연결은 위와 같이 합니다. 펌웨어 업데이트 시의 연결과 다른 점은 GPIO0 단자의 연결을 없앤 것입니다.


일단 시리얼 모니터를 열고 9600 보드레이트로 설정합니다.


1. 펌웨어 정상작동 확인

시리얼 모니터에 'AT' 를 입력합니다. 

'OK' 가 나오면 펌웨어가 정상적으로 설치된 것입니다.


2. ESP8266 모드 세팅

'AT+CWMODE=1' 을 입력해서 ESP8266 을 Station (Client) 로 세팅 합니다.


3. 연결할 와이파이 찾기

'AT+CWLAP' 명령을 입력해서 연결 가능한 와이파이를 찾습니다. 자신이 연결하고자 하는 와이파이가 목록에 나오는지 확인 합니다.


4. 와이파이 연결

AT+CWJAP="연결할 와이파이 이름","패스워드" 를 입력해서 와이파이에 연결 합니다.


5. 와이파이 연결 확인

'AT+CIFSR' 명령을 이용해서 ESP8266에 할당된 IP 가 정상적으로 나오면 연결이 잘 된 것입니다.


모든 준비가 끝났으니 아두이노 우노, LM35, ESP8266을 연결 합니다. 물론 Thingspeak.com 에도 가입이 되어 있어야 하며 온도 데이터 업로드를 위한 field 하나 짜리 채널도 만들어져 있어야 합니다. Thingspeak 에 대한 내용은 [Thingspeak 사용법] 을 참조하세요.


연결

esp8266_lm35_thingspeak.fzz


LM35

아두이노 우노

5V

5V

OUTPUT

A0

GND

GND


ESP8266

아두이노 우노

TXD

D10

CH_PD

3.3V

VCC

3.3V

GND

GND

RXD

D11


위와 같이 연결했습니다. 3.3V 및 LM35 연결을 위해서 브레드보드 등을 이용해야 합니다.


실제 연결 모습 입니다. 전원으로 스마트폰 충전용 5V 보조 배터리를 이용했습니다.



소스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <SoftwareSerial.h>
#include <stdlib.h>
 
// 업로드 알림 LED 설정 (아두이노 우노 On Board LED)
int ledPin = 13;
// LM35 핀설정
int lm35Pin = 0;
 
// 자신의 thingspeak 채널의 API key 입력
String apiKey = "thingspeak Write API Key";
 
SoftwareSerial ser(1011); // RX/TX 설정, serial 객체생성
 
void setup() {
  //알림 LED 아웃풋 설정
  pinMode(ledPin, OUTPUT);
  //시리얼통신속도 9600보드레이트 설정    
  Serial.begin(9600); 
  //소프트웨어 시리얼 시작
  ser.begin(9600);
  //ESP8266 Reset
  ser.println("AT+RST");
}
 
void loop() {
  // blink LED on board
  digitalWrite(ledPin, HIGH);   
  delay(200);               
  digitalWrite(ledPin, LOW);
 
  // LM35 값 읽음
  int val = 0;
  for(int i = 0; i < 10; i++) {
      val += analogRead(lm35Pin);   
      delay(500);
  }
 
  // LM35 값을 섭씨온도로 변환
  float temp = val*50.0f/1023.0f;
 
  // String 변환
  char buf[16];
  String strTemp = dtostrf(temp, 41, buf);
  
  Serial.println(strTemp);
  
  // TCP 연결
  String cmd = "AT+CIPSTART=\"TCP\",\"";
  cmd += "184.106.153.149"// api.thingspeak.com 접속 IP
  cmd += "\",80";           // api.thingspeak.com 접속 포트, 80
  ser.println(cmd);
   
  if(ser.find("Error")){
    Serial.println("AT+CIPSTART error");
    return;
  }
  
  // GET 방식으로 보내기 위한 String, Data 설정
  String getStr = "GET /update?api_key=";
  getStr += apiKey;
  getStr +="&field1=";
  getStr += String(strTemp);
  getStr += "\r\n\r\n";
 
  // Send Data
  cmd = "AT+CIPSEND=";
  cmd += String(getStr.length());
  ser.println(cmd);
 
  if(ser.find(">")){
    ser.print(getStr);
  }
  else{
    ser.println("AT+CIPCLOSE");
    // alert user
    Serial.println("AT+CIPCLOSE");
  }
    
  // Thingspeak 최소 업로드 간격 15초를 맞추기 위한 delay
  delay(16000);  
}
cs


위와 같이 TCP/IP 통신을 통해서 api.thingspeak.com 서버로 온도 데이터를 보내 준다. 만약 온도 데이터 이외에 추가로 데이터를 보내길 원한다면 채널에 field 를 추가하고 위의 getStr 만드는 소스인 62행과 63행 사이에 field2 의 값을 추가해서 전송하면 됩니다.


위와 같이 설정해서 어젯밤부터 방안의 온도 데이터를 모으고 있습니다. Thingspeak.com 에 접속해서 해당 채널의 Private View 를 보면 됩니다.


지금까지 계속 데이터를 모아서 1762 개의 데이터가 쌓였습니다. 현재 온도는 25.5도 정도네요. 


지금까지의 데이터를 다운로드 받아 보았습니다. 채널의 Data Import/Export 메뉴에 들어가서 Export 버튼을 클릭하면 됩니다. CSV 파일로 다운로드 되며 엑셀에서 바로 열어서 볼 수 있습니다.


1762개의 데이터를 분석해보니 지금까지 평균온도는 23.7도, 최저기온은 20.8도, 최고기온은 26.9도 네요. 아주 적당한 온도라고 할 수 있겠습니다. ^^


또한 Thingspeak 에는 MATLAB 과의 데이터 연동을 웹상에서 지원해서 MATLAB 을 다룰줄 안다면 바로 데이터를 불러와서 분석이나 통계 등의 작업을 할 수 있습니다.


이상 아두이노와 ESP8266 모듈을 이용해서 센서의 데이터를 Thingspeak 에 올리는 방법에 대해서 알아보았습니다. 이런 IoT 클라우드의 장점이 세계 어디서든 인터넷만 연결되어 있으면 원거리의 센서 데이터를 볼 수 있다는 점이 있겠습니다. 그것도 추가적인 비용 없이 간편하게 말이죠. 참으로 매력적인 서비스인 것 같습니다.



반응형
Posted by 대네브 (deneb)

댓글을 달아 주세요

  1. 최준혁

    작성자님 ㅜㅜ 와이파이 모듈에 펌웨어도 씌우고 부품을 모두 결선했는데
    아두이노 IDE의 시리얼 모니터에는 온도값이 읽히는데요 Thinspeak에는 업로드가 안되네요ㅜㅜ
    어디가 잘못된걸까요?

    2016.11.19 22:54 [ ADDR : EDIT/ DEL : REPLY ]
    • 음... 시리얼모니터에 읽히는걸 보면 아두이노 쪽에는 이상이 없어보이구요. 통신상의 문제겠네요... thingspeak 에 가입은 당연히 하셨을 것이고 와이파이도 당연히 연결 됐겠죠? thingspeak 채널의 필드 등은 제대로 만들었는지 채널의 api key 가 소스에 제대로 반영이 됐는지 등등을 체크해 보면 되겠네요. 워낙 여러가지 문제가 있을 수 있어서 뭐라 확답을 못하겠네요. 다시 한 번 모든 부분을 확인해 보시길 바랍니다.

      2016.11.19 23:06 신고 [ ADDR : EDIT/ DEL ]
  2. 최준혁

    와이파이 연결이 문제가 된것같아요.
    와이파이 연결을 하고 'AT+CIFSR' 명령어로 ip를 확인할때 0.0.000이렇게 잡히는 곳에서는 안되다가
    19x.xxx.xx이런식으로 잡히는 곳에서는 연결이 되네요
    전기공학과 학생인데 이번 논문주제로 이주제를 선택하면서 많이 공부했는데
    작성자님이 올려주신 게시글들에서 가장 많은 도움 얻었어요^^
    재능기부 정말 감사드립니다.

    2016.11.20 19:03 [ ADDR : EDIT/ DEL : REPLY ]
  3. 임상민

    안녕하세요! 좋은글 잘 봤습니다!
    저도 서버에 데이터를 올리려고 여러 글을 찾아보고 있는데
    get 방식으로 데이터를 전송하고 계시더라고요.
    데이터를 전송하는 코드부분에서 &feild값이 무엇이길레 string 변수에 저장된 온도값이 올라가는 건지 궁금합니다!
    그리고 혹시 post방식으로 데이터를 보내는 방법도 괜찮으시다면 여쭈어봐도 될까요?

    2017.04.06 14:34 [ ADDR : EDIT/ DEL : REPLY ]
    • 61과 62행 보시면 url에 온도값을 붙여서 보내는게 보이시죠? post로 하는건 thingspeak에 나오던가? 아마도 본걸로 기억하는데 한 번 가보시길 아마도 field 값만 post로 보내면 그냥 받아서 저장될것 같아요

      2017.04.15 12:36 신고 [ ADDR : EDIT/ DEL ]
  4. 한번 만들어보고 싶네요

    2017.04.15 13:39 신고 [ ADDR : EDIT/ DEL : REPLY ]
  5. 김만기

    데이터를 thingspeak.com으로 받을수만 있는건가요??
    명령어를 새로 만들어서 thingspeak.com 사이트를 통해서 따로 제어할 수 있는 방법은 없는건가요??

    2017.09.12 15:14 [ ADDR : EDIT/ DEL : REPLY ]
    • thingspeak 는 주로 데이터를 받아서 저장하는 역할을 합니다. 이 데이터를 다시 받아서 활용하는 것은 개발하는 사람의 몫입니다.

      2017.09.12 15:26 신고 [ ADDR : EDIT/ DEL ]
  6. 김도연

    작성자님 ㅠㅠ
    if(ser.find(">"))
    { ser.print(getStr); }

    이 부분에 걸리지 않고 else로 넘어가서 AT+CIPCLOSE 만 계속 뜨네요ㅠㅠ

    통신이 안 되서 그런가
    시리얼모니터에서 AT 커맨드가 먹지 않는데 ESP8266이 고장난 것일까요
    원인이 궁금합니다..

    2018.01.21 17:07 [ ADDR : EDIT/ DEL : REPLY ]
    • 일단 at 커맨드가 되야 합니다 제 글에서 관련글 검색해서 at커맨드 먼저 해보시고 재시도 하세요 ^^ 펌웨어도 확인 하시구요

      2018.01.22 11:27 신고 [ ADDR : EDIT/ DEL ]
    • 김도연

      아 처음에 펌웨어 업데이트 할때 RX TX에 꽂고 모듈을 실제 이용할때 RX TX에 그대로 꽂으면 오류가 납니다
      그래서 와이파이는 RX TX에 꽂은 후 연결을 하고 실제 사용시에 다른 포트에 꽂아서 하면 정상적으로 진행 됩니다

      감사합니다 다른분들도 착오 없으시길

      2018.01.22 16:32 [ ADDR : EDIT/ DEL ]
  7. 만선

    우선 좋은 정보에대해 감사드립니다.
    결론적으로는 성공적으로 서버에 온도데이터를 보내기는 하였으나
    현재 핸드폰 1,2 공유기 1,2가 있는데
    공유기 1과 폰 1만 정상적으로되고 공유기 2, 폰 2는 안되네요 ㅋㅋ 같은 설정으로하고 뭐 다른점도 따로 없는데 말이죠..
    ip주소며 시리얼통신상에서도 멀쩡합니다만... 그냥 하소연이었습니다 ㅋㅋㅋ

    2019.10.18 18:45 [ ADDR : EDIT/ DEL : REPLY ]
  8. snai

    작성자님 글대로 실습해보고 있습니다. 근데 58,59번줄에
    api.thingspeak.com 접속 IP, api.thingspeak.com 접속 포트는 어디에서 확인할 수 있나요??

    2021.05.26 21:03 [ ADDR : EDIT/ DEL : REPLY ]
    • https://nothans.com/thingspeak-tutorials/esp8266/building-the-internet-of-things-with-the-esp8266-wi-fi-module-and-thingspeak 을 참고하세요

      2021.05.26 21:35 신고 [ ADDR : EDIT/ DEL ]
  9. snai

    네 감사합니다. 그런데 하다보니 값이 Thingspeak에 전달될 때도 있고 CIPCLOSE가 뜰때도 있는데 이건 무엇이 문제인가요??
    와이파이는 최대출력입니다.

    2021.05.26 21:49 [ ADDR : EDIT/ DEL : REPLY ]
    • 글쎄요. 이 글이 작성된 시점과 현재는 많은 것들이 달라졌을 겁니다 알려드린 사이트에서 최신코드를 확인 하시는게 좋을 것 같네요. 참고로 Thingspeak 전용 라이브러리도 나왔네요. 이걸 이용하시면 더 안정적인 통신이 가능하리라 봅니다

      2021.05.26 21:56 신고 [ ADDR : EDIT/ DEL ]
    • 넵...보니까 연결 후 첫값만 전달되는 것 같네요

      2021.05.26 22:04 [ ADDR : EDIT/ DEL ]