아두이노 피지컬컴퓨팅 교구로 활용할 수 있는 실 생할용품 메이킹 프로젝트(워터맨IOT) 열번째.

 

 

IFTTT 기능 사용하기 : 다음과 같이 인터넷으로 IFTTT 서버에 접속하여 API Key와 함께 event_name을 지정해 주면 된다.

  1. #include <ESP8266WiFi.h>  
  2. WiFiClient client;   
  3. const char* IFTTT_server = "maker.ifttt.com";   
  4. char IFTTT_key[50] = "dOYxxxxxxxxxxxxxxxxx9ssF";  
  5. void setup() {  
  6.     WiFi.mode(WIFI_STA);  
  7.     WiFi.disconnect();  
  8.     WiFi.begin("pnit", “xxxxxxxxxxx");    
  9.     while (WiFi.status() != WL_CONNECTED) {  
  10.         delay(1000);  
  11.     }  
  12.     if (client.connect(IFTTT_server, 80)) {   
  13.         String getStr = "/trigger/";  
  14.         getStr += "iot_test";  
  15.         getStr += "/with/key/";  
  16.         getStr += IFTTT_key;   
  17.         client.print("GET ");   
  18.         client.print(getStr);  
  19.         client.print(" HTTP/1.1\r\n");  
  20.         client.print("Host: maker.ifttt.com\r\n");   
  21.         client.print("Connection: close\r\n");   
  22.         client.print("Content-Type: 'text/html;'");   
  23.         client.print("\r\n\r\n");   
  24.         delay(1000);   
  25.         client.stop();  
  26.    }  
  27. }  
  28. void loop() {  
  29. }  

 

 

  3  line:  접속할 IFTTT 서버 주소
  4  line:  본인의 WEB hook API key
  8  line:  접속하고자 하는 공유기의 SSID와 password
 14  line: 기동시키고자 하는 event_name을 지정한다.
 16  line:  4 line에서 정의한 IFTTT API key값을 지정한다.

 

위 프로그램을 실행시키면 스마트폰에 지정한 메시지가 전송되는 것을 확인할 수 있다.

 

 

 

중간과제

 

 

매1분마다 온도와 토양수분 값을 측정하여 일정값이하로 떨어지면 스마트폰에 해당되는 알람 메시지 전송하는 기능을 구현
 -온도가 20도 이하로 떨어지면  “추워요”메시지
 -토양수분이 50이하로 떨어지면 “목말라요”메시지
 -토양수분이 50이하로 3분이상 계속되면 “물이 없어요” 메시지 보내기

 

 

 

 IFTTT Applet만들기 : 프로그램 작성을 위해 먼저 다음과 같이 Webhook trigger와 Notification Message로 구성된 세개의 IFTT Applet을 새로 등록한다

 1) Webhook event_name : low_temp,  Notification 메세지 : “추워요”
 2) Webhook event_name : low_moist,  Notification 메세지 : 목말라요
 3) Webhook event_name : low_water,  Notification 메세지 : 물이 없어요

 

 

 

 

중간과제 샘플

 

  1. #include <Wire.h>  
  2. #include <ESP8266WiFi.h>  
  3. #include "DHT.h"  
  4. #define DHTTYPE DHT11    
  5. int pinPower = D5;   
  6. #define DHTPIN D6  
  7. DHT dht(DHTPIN, DHTTYPE);  
  8. int temp;  
  9. int moist;  
  10. int moistr;  
  11. int cnt_low_moist = 0;  
  12. WiFiClient client;   
  13. char  ssid[30] = "pnit";  
  14. char  password [30] = "xxxxxxxxxxxxx";  
  15. const char* IFTTT_server = "maker.ifttt.com";   
  16. char IFTTT_key[50] = "dOYxxxxxxxxxxxxxxxxxx9ssF";  
  17.   
  18. void procReadSensors(){  
  19.     digitalWrite(pinPower, HIGH);  
  20.     delay(500);  
  21.     for ( int i= 0; i < 30; i++ ) {  
  22.        delay(100);  
  23.        temp  = dht.readTemperature();  
  24.        if (temp < 100 && temp > 0 ) break;  
  25.     }  
  26.     moistr = analogRead(A0);  
  27.     moist = map(moistr,1023,0,0,100) ;   
  28.     digitalWrite(pinPower, LOW);  
  29.     Serial.print("temp="); Serial.print(temp);  
  30.     Serial.print(",moist="); Serial.print(moist );  
  31.     Serial.println("   Sensor Read=");  
  32. }  
  33. void procIFTTT(String trigger){  
  34.     WiFi.mode(WIFI_STA);  
  35.     WiFi.disconnect();  
  36.     delay(300);  
  37.     WiFi.begin(ssid, password);   
  38.     for ( int i= 0; i < 10; i++ ) {  
  39.        if ( WiFi.status() == WL_CONNECTED ) {  
  40.           break;  
  41.         }  
  42.         delay(1000);  
  43.     }   
  44.     if ( WiFi.status() != WL_CONNECTED ) {  
  45.        return;  
  46.     }  
  47.     if (client.connect(IFTTT_server, 80)) {   
  48.         Serial.println("IFTTT Server connected ");   
  49.         String getStr = "/trigger/";  
  50.         getStr += trigger;  
  51.         getStr += "/with/key/";  
  52.         getStr += IFTTT_key;   
  53.         client.print("GET ");   
  54.         client.print(getStr);  
  55.         client.print(" HTTP/1.1\r\n");  
  56.         client.print("Host: maker.ifttt.com\r\n");   
  57.         client.print("Connection: close\r\n");   
  58.         client.print("Content-Type: 'text/html;'");   
  59.         client.print("\r\n\r\n");   
  60.         delay(1000);   
  61.         client.stop();   
  62.      }  
  63.      else {  
  64.          Serial.println("procIFTTT Server connect FAIL");   
  65.      }  
  66.     Serial.println("procIFTTT END");  
  67.     delay(100);  
  68. }  
  69. void setup() {  
  70.    Wire.begin();  
  71.    pinMode(pinPower, OUTPUT);  
  72.    digitalWrite(pinPower, LOW);  
  73.    dht.begin();  
  74.    Serial.begin(115200);  
  75.    Serial.println("==waterman IOT  START==");  
  76. }  
  77. void loop() {  
  78.    procReadSensors();  
  79.    if ( temp < 20) {  
  80.            procIFTTT("low_temp");  
  81.    }  
  82.    if ( moist < 50) {  
  83.        cnt_low_moist++;  
  84.        if ( cnt_low_moist < 2 ) {  
  85.             procIFTTT("low_moist");  
  86.         }  
  87.         else{  
  88.             procIFTTT("low_water");  
  89.         }  
  90.     }  
  91.     else {  
  92.           cnt_low_moist = 0;   
  93.     }  
  94.     delay(60000);  
  95. }  

 


 11  line  : cnt_low_moist : 토양수분 부족 확인 횟수 관리를 위한 변수
 13~14 line : 각자의 환경에 맞는 공유기 SSID/Password와 각자 채널별 Write API key
 16      line:  본인의 IFTTT WEB hook API key
 18~32 line : 온도와 토양수분을 check하기 위한 함수
 33~68 line:  trigger라는 인수로 event_name을 전달받아 IFTTT event를 발생시키기 위한 함수
 50   Line  :  IFTTT URL의 일부로써 전달받은 event_name을 지정   
 79~81 line :  측정한 온도값이 20도 이하이면 low_temp라는 IFTTT event를 호출
 82~90 line :  측정한 토양수분값이 50일때 해당 IFTTT event를 호출( 2회 이하까지는 low_moist, 3회이상 반복되면 low_water 라는 event 호출)
 94 line :  60초 마다 다시 센서측정 반복    

 

 

 

 

+ Recent posts