IFTTT와 Adafruit IO를 사용하여 IoT Door Detector 만들기 ② 코드 작성

by 심형주 | 2017-07-28 16:49
arduino ifttt

이번 시간에는 '① 준비단계'에 이어서 코드를 작성하고 컴파일하여 업로드하는 시간을 갖도록 하겠습니다!



코드를 컴파일하기 위해서 Adafruit IO Arduino 라이브러리를 설치해 주셔야 합니다. 다음 링크에 들어가셔서 파일을 다운받고 설치해 주세요.

https://github.com/adafruit/Adafruit_IO_Arduino 

(설치하는데 어려움이 있으시다면 Arduino IDE Library Manager에서 Adafruit IO Ardunio 을 찾으시면 도움을 받으실 수 있습니다.)


또한 ESP8266 아두이노 보드 패키지를 설치하셔야 합니다. 

(HUZZAH ESP8266 setup guide에서 도움을 받으실 수 있습니다.)


1
http://arduino.esp8266.com/stable/package_esp8266com_index.json
cs

위의 패키지 index URL을 사용하여 가장 최신의 ESP8266 패키지를 다운받으세요.





Arduino Sketch



아직 Adafruit IO Basics GitHub repo를 다운받지 않으셨다면, 먼저 다운로드 해주세요.

ESP8266폴더 안의 trigger 라는 이름의 스케치를 사용하려 합니다.


첫번 째로, WiFi 연결 정보를 ESP8266 trigger 스케치의 가장 윗부분에 써주셔야 합니다. 이 연결 정보를 HUZZAH ESP8266 setup guide에서의 WiFi연결을 테스트 시에도 사용가능합니다.

1
2
#define WLAN_SSID       "...your SSID..."
#define WLAN_PASS       "...your password..."
cs



Adafruit IO 키 내용은 각자 갖고 있는 키로 변경해 주셔야 합니다!

1
#define AIO_KEY         "...your AIO key..."
cs



자동적으로 스케치는 5분 마다 한번씩 Adafruit IO에게 배터리 레벨을 알려주며, 3초마다 한번씩 문의 상태를 체크합니다. 이 간격은 BATTERY_INTERVALSLEEP_LENGTH을 수정하여 변경 가능합니다. 이 변수들을 더 작은 간격으로 설정하게 되면 배터리 수명을 단축시킵니다.

1
2
3
4
5
// how often to report battery level to adafruit IO (in minutes)
#define BATTERY_INTERVAL 5
 
// how long to sleep between checking the door state (in seconds)
#define SLEEP_LENGTH 3
cs



이 예제의 많은 부분은 setup()함수에서 이루어 집니다. 휴면상태에서 재가동될때 스케치가 재시작되므로, 메인인 loop()함수는 실행되지 않습니다.

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
void setup() {
  Serial.begin(115200);
  Serial.println("HUZZAH Trigger Basic");
  
  EEPROM.begin(512);
  pinMode(DOOR, INPUT_PULLUP);
 
  // get the current count position from eeprom
  byte battery_count = EEPROM.read(0);
 
  // we only need this to happen once every X minutes,
  // so we use eeprom to track the count between resets.
  if(battery_count >= ((BATTERY_INTERVAL * 60/ SLEEP_LENGTH)) {
    // reset counter
    battery_count = 0;
    // report battery level to Adafruit IO
    battery_level();
  } else {
    // increment counter
    battery_count++;
  }
 
  // save the current count
  EEPROM.write(0, battery_count);
  EEPROM.commit();
 
  // if door isn't open, we don't need to send anything
  if(digitalRead(DOOR) == LOW) {
    Serial.println("Door closed");
    // we don't do anything
  } else {
    // the door is open if we have reached here,
    // so we should send a value to Adafruit IO.
    Serial.println("Door is open!");
    door_open();
  }
 
  // we are done here. go back to sleep.
  Serial.println("zzzz");
  ESP.deepSleep(SLEEP_LENGTH * 1000000, WAKE_RF_DISABLED);
}
cs



Adafruit IO에게 문의 상태를 전달하는 코드는 door_open()함수에서 확인 가능합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void door_open() {
 
  // turn on wifi if we aren't connected
  if(WiFi.status() != WL_CONNECTED) {
    wifi_init();
  }
  
  // grab the door feed
  Adafruit_IO_Feed door = aio.getFeed("door");
 
  Serial.println("Sending to Adafruit.io");
  // send door open value to AIO
  door.send("1");
 
}
cs



배터리 레벨 또한 5분마다 Adafruit IO에 보내집니다. BATTERY_INTERVAL을 통해 이 간격을 늘릴 수 있지만, 이것은 배터리의 수명을 단축시킵니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void battery_level() {
 
  // read the battery level from the ESP8266 analog in pin.
  // analog read level is 10 bit 0-1023 (0V-1V).
  // our 1M & 220K voltage divider takes the max
  // lipo value of 4.2V and drops it to 0.758V max.
  // this means our min analog read value should be 580 (3.14V)
  // and the max analog read value should be 774 (4.2V).
  int level = analogRead(A0);
 
  // convert battery level to percent
  level = map(level, 5807740100);
  Serial.print("Battery level: "); Serial.print(level); Serial.println("%");
  // turn on wifi if we aren't connected
  if(WiFi.status() != WL_CONNECTED)
    wifi_init();
 
  // grab the battery feed
  Adafruit_IO_Feed battery = aio.getFeed("battery");
 
  // send battery level to AIO
  battery.send(level);
 
}
cs







Upload & Test



이제 코드를 모두 작성하셨다면, 이제는 업로드하여 테스트 해볼 순서입니다!

지금까지의 과정을 모두 완료하셨다면, 이제 작성한 스케치를 FTDI케이블이나 다른 시리얼 연결장치를 이용하여 HUZZAH ESP8266에 업로드 해주세요.

업로드 후에, 시리얼 포트를 열게되면 다음과 같은 긴 텍스트를 보실 수 있습니다.

adafruit_io_door_serial.png


위의 내용은 HUZZAH가 센서를 읽거나(Door is open! / Door closed) 곧 수면모드(zzzz)에 들어간다는 것을 의미합니다. ESP8266가 수면모드에 들어갈 때 보드의 내용을 모두 리셋하게 되며, 'zzzz'텍스트 뒤의 이상한 문자들은 리셋 디버그 문자열을 의미합니다. 대부분 같은 문자이지만 약간은 다른 문자로 출력되기도 합니다.

이 프로그램은 문이 열렸을 경우가 드물기 때문에 그럴 때만 피드에 데이터를 넣어줍니다. 그렇기 때문에 문이 닫혔을 때에는 아무 일도 일어나지 않습니다. 센서의 반에서 자석의 반을 제거하게 되면, 문이 열렸다는 텍스트를 받게되고, 이것이 WiFi와 연결되어 피드를 업데이트 시킵니다.

adafruit.io 계정에 로그인하시고, door 피드를 통해 로그인된 시간을 확인해 보세요.

adafruit_io_doorfeedtest.png


5분 뒤에, 배터리 전력을 측정하는 보드와 battery 피드에 그것이 업로드 된 것을 확인하실 수 있습니다!

adafruit_io_battlevel.png


댓글 0

스마트 도우미 IFTTT를 활용해보자

IFTTT와 Adafruit IO를 사용하여 IoT Door Detector 만들기 ② 코드 작성

by 심형주

MADE BY