재료

  • 점프 와이어 10개
  • USB 케이블 1개
  • esp8266 1개
  • 브래드 보드 1개
  • 온도 센서 1개
  • 아두이노 우노 1개
  • AC 어댑터 1개

    아두이노를 사용하면서 아쉬웠던 점은 값을 체크할 때 항상 시리얼 모니터를 통해서 확인해야한다는 것이었습니다. 센서 값이 변할 때마다 웹페이지나 혹은 txt 파일에 그 값을 저장해서 보여준다면 좀 더 효율적으로 그 값을 사용할 수 있지 않을까라는 생각이 들었습니다. 그래서 이번 프로젝트에서는 ThingSpeak이라는 사이트를 이용해서 아두이노로부터 센서 값을 읽어서 쉽게 모니터링해보려고 합니다.



    사이트의 이름만 들어도 뭔가 알 것 같죠? 사물이 말을 하는 것처럼 센서가 읽어온 값들을 ThingSpeak이 읽어와서 자동으로 그래프를 그려줍니다. 매번 시리얼 모니터를 확인해서 값을 추적해야하는 것보다 훨씬 간편하고 보기도 쉽겠죠? 이번 프로젝트에서는 ThingSpeak에 대해서 알아보고 온도센서의 값을 읽어와봅시다.


STEP1. 준비물

아두이노 보드, USB 케이블, 브래드 보드, AC 어댑터, ESP8266, 온도 센서, 점프 와이어 10개





STEP2. 회로도

    먼저 온도 센서의 다리에 맞는 연결을 해주셔야 합니다. 각각의 다리가 의미하는 바는 아래와 같아요.

                             

다리의 역할에 유의해서 아래와 같이 회로도를 구성해주시면 됩니다.




STEP3. 연결 과정

    먼저 아두이노 IDE를 실행시킨 다음 시리얼 모니터를 켜주세요. Both NL & CR과 9600 보드레이트로 설정해주시면 됩니다.



그런 후에 시리얼 모니터에 AT를 입력해서 OK 사인이 돌아오는 지 확인해봅시다. OK 사인이 돌아온다면 펌웨어가 정상적으로 설치된 것입니다. 다음으로 Station 모드로 전환해줍시다. 이 모드로 전환할 때에는 AT+CWMODE=1 명령어를 사용하시면 됩니다.



모드를 변경하였으면 와이파이 공유기에 연결해주세요. IP 할당까지 제대로 받았다면 성공적으로 연결된 것입니다. 연결하는 방법에 대해서는 <ESP8266을 공유기에 연결해보자> 스토리를 확인하시면 보다 자세하게 나와있습니다.  위의 과정을 진행하실 때에는 RX선과 TX선을 아래와 같이 연결해주셔야 합니다.


    만약 연결이 어려우시다면 제가 코드상에서 설정될 수 있도록 해놓을테니 위의 과정을 스킵하시고 아래의 과정부터 따라하시면 됩니다.

 

    연결을 완료하신 뒤에는 ThingSpeak에 가입해주세요. Sign up-Create Account를 선택하시면 아래와 같은 화면이 보이는데 이것을 통해서 계정을 만드시면 됩니다.



가입을 완료하시면 아래와 같은 화면이 뜨는데 여기서 초록색 New Channel 버튼을 눌러서 새로운 채널을 생성해주시면 됩니다.




저는 아래와 같이 채널을 생성하려고 합니다. Name은 "온도 센서 그래프 생성", Description에는 "온도 센서의 값을 읽어와보자"라고 하였고, 저는 온도 센서 하나만을 사용할 것이기 때문에 Field1에 Temperature 하나만 입력하였습니다. 입력이 끝난 후에는 스크롤을 아래로 내려서 초록색 버튼의 save channel을 눌러주시면 되요.



그럼 아래와 같이 채널이 생성되는 것을 확인할 수 있습니다.




STEP4. 코드

    위에서 했던 복잡한 연결 방식을 간단하게 하기 위해서 코드에 추가해주었어요. 연결을 따로 하기 어려우셨다면 회로도와 같은 상태로 연결을 하신 뒤에 아래의 코드를 아두이노에 업로드해주시면 수행되기 전에 연결이 될 겁니다.


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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <SoftwareSerial.h>
#include <stdlib.h>
#define DEBUG true
 
// 업로드 알림 LED 설정 (아두이노 우노 Board LED)
int ledPin = 13;
// LM35 핀설정
int lm35Pin = A0;
 
// 자신의 thingspeak 채널의 Write API key 입력
String apiKey = "B9XQWSUVMMXVK8YI";
 
SoftwareSerial esp8266(2,3); // TX/RX 설정, esp8266 객체생성
 
void setup() {
  //알림 LED 아웃풋 설정
  pinMode(ledPin, OUTPUT);
  //시리얼통신속도 9600보드레이트 설정    
  Serial.begin(9600); 
  //소프트웨어 시리얼 시작
  esp8266.begin(9600);
 
  /*AT Command 이용*/
  sendData("AT+RST\r\n"2000, DEBUG); //reset module
  sendData("AT+CWMODE=1\r\n"1000, DEBUG); //dual mode로 설정
  sendData("AT+CWJAP=\"SSID\",\"패스워드\"\r\n"5000, DEBUG); //사용할 공유기 설정
}
 
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
  esp8266.println(cmd);
   
  if(esp8266.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());
  esp8266.println(cmd);
 
  if(esp8266.find(">")){
    esp8266.print(getStr);
  }
  else{
    esp8266.println("AT+CIPCLOSE");
    // alert uesp8266
    Serial.println("AT+CIPCLOSE");
  }
    
  // Thingspeak 최소 업로드 간격 15초를 맞추기 위한 delay
  delay(16000);  
}
 
/*ESP8266의 정보를 알아내고 설정하기 위한 함수 선언*/
String sendData(String command, const int timeout, boolean debug){
  String response = "";
  esp8266.print(command); //command를 ESP8266에 보냄
  long int time=millis();
  
  while((time+timeout)>millis()){
    while(esp8266.available()){
      /*esp가 가진 데이터를 시리얼 모니터에 출력하기 위함*/
      char c=esp8266.read(); //다음 문자를 읽어옴
      response+=c;
    }
  }
  if(debug){
    Serial.print(response);
  }
 
  return response;
}
 
cs


    이 코드에서 12번째 라인과 27번째 라인의 코드는 약간의 수정이 필요합니다. 12번째 라인은 생성된 채널의 write API_KEY를 넣어주시면 되고, 27번째 라인은 공유기 이름과 비밀번호를 입력해주시면 됩니다. 만약 위에서 이러한 연결 과정들을 수행해주셨다면 26번째 라인과 27번째 라인은 지우셔도 됩니다.

    만약 위의 코드를 업로드했는데에도 ThingSpeak 채널에 데이터가 업로드 되지 않는다면 API_KEY가 제대로 입력이 되었는지, 아니면 내 계정의 프로필에서 Time Zone이 SEOUL이 맞는지 다시 한 번 확인해주세요. 보통 시리얼 모니터로 데이터가 올라오는 순간 같이 ThingSpeak 채널로 업로드됩니다.


STEP5. 결과 확인

    저는 지금 제가 있는 방의 온도를 측정하고 있는데요, 히터가 가동되고 있어서 온도가 상대적으로 높게 나왔네요. 계속 온도 센서를 켜두면서 제 방의 온도 변화를 측정하고자 합니다. 아래의 사진은 측정된 결과가 계속해서 업로드되고 있는 상태입니다.


    시리얼 모니터로 실시간으로 확인하는 것보다 ThingSpeak을 이용해서 데이터를 그래프로 확인할 수 있으니 훨씬 편리하고 효율적이네요! 여러분도 한번 해보세요:-) 뭔가 사물 인터넷(IoT)에 한 발 다가선 것 같은 느낌이 드네요ㅎㅎ


추가) 아래의 사진은 제가 2시간동안 데이터를 모아서 그래프로 작성한 것입니다. 연속된 많은 양의 데이터를 한 눈에 확인할 수 있습니다.



댓글 0

사물 인터넷(IoT)

ThingSpeak을 이용하여 온도센서 값 읽어오기

by 김민정

MADE BY

김민정

사물인터넷, 아두이노