本篇為 實現 D1 mini (或NodeMCU) 與 Line 之間的連結
我們已經實作了 D1 mini 與手機藉由 BLYNK APP 的連結
NodeMCU 教學 - 02:WeMos D1 mini NodeMCU 與 BLYNK
接下來想做一些更具有 “即時傳遞數據與通知功能” 的應用
事實上在 BLYNK APP 裡面有一個 Notify 功能,可以在程式碼中去撰寫程式碼讓微控器去觸發 BLYNK APP 的手機通知,但實際使用後我發現功能很遲鈍而且常常失效,所以就被我打入冷宮了
我們已經實作了 D1 mini 與手機藉由 BLYNK APP 的連結
NodeMCU 教學 - 02:WeMos D1 mini NodeMCU 與 BLYNK
接下來想做一些更具有 “即時傳遞數據與通知功能” 的應用
事實上在 BLYNK APP 裡面有一個 Notify 功能,可以在程式碼中去撰寫程式碼讓微控器去觸發 BLYNK APP 的手機通知,但實際使用後我發現功能很遲鈍而且常常失效,所以就被我打入冷宮了
如果可以用微控器觸發
Line 訊息通知呢
!?
這個功能較簡易的實現方法是這樣的,我們透過微控器與第三方網站(IFTTT)進行連結,
IFTTT 又會跟 Line 進行連結。
而 IFTTT 在 Line 的那邊有一個“機器人帳號”(
這是我自己想像幫助自己理解的)
當我們用微控制器去
“觸發”  IFTTT
上的”事件” 時,它在 Line 那邊的機器人帳號就會依照我們對 “事件”
的設定,來發送 Line 訊息到我們的帳號上。
首先我們先設定一下
IFTTT 跟 Line 之間的連結(這部分我用手機進行設定)
以上的步驟我們就完成了 IFTTT 與 Line 之間的連結。並且我們設置了一個 "事件" 名稱為 "NotifyMe" 
也設置了當我們觸發這個事件的時候, IFTTT 在 Line 的機器人要發送怎樣的訊息到我們的 Line 帳號。
也設置了當我們觸發這個事件的時候, IFTTT 在 Line 的機器人要發送怎樣的訊息到我們的 Line 帳號。
接下來我們就看一下當這個事件被觸發的時候會發生怎樣的事
左圖是你按完 Finish 就會出現的介面。右圖是我們在右上角的人頭像中點一下,再點擊 " Services " ,並且搜尋 " Webhook "
Your key is: 下面的英文數字組合就是你在 IFTTT 上面的識別碼(privateKey)。左圖是一進入畫面時的介面,我們在空格裡面輸入我的"事件"名稱 NotifyMe ,就會看到下面的連結網址變了(右圖下方紅框)。
我們將這個連結網址(URL)複製並貼到瀏覽器會發生什麼事?
發現當這個網址(URL)被"觸發"的時候,就會產生出 Line 的通知
我們在原本的識別碼網址後面加上 ?value1=689&value2=633 就可以把值也傳上去了
OK ! 那現在的問題就是,該怎樣用微控制器去產生同樣的效果? 程式碼如下
上述的程式碼執行結果如上圖,觸發成功 !!!
注意 : 若你使用不同的事件名稱,須修改第 70 行的程式碼
加上傳 value ,程式碼變成以下
只要把上面的程式碼修改成自己的 WIFI 名稱、密碼以及自己的識別碼就可以完成微控器與 Line 的連結了
注意 : 若你使用不同的事件名稱,須修改第 74 行的程式碼
將其與 "居家監控" 的應用合體,請參考下篇
NodeMCU 教學 - 04:WeMos D1 mini NodeMCU 與 Line 的連結 (居家監控實際應用)
參考連結
02MeMos D1
12-04IFTTT應用
13-11簡易保全系統
CONNECT MAKER TO ANYTHING - IFTTT
IFTTT教學(三) – 利用 GET 定義你的 Maker Webhooks 參數
使用Arduino IDE 控制 NodeMcu 上的 LED 燈 ( Arduino Project: Control a Builtin LED from a Web Browser )
[NodeMCU] Lab0 安裝與設定
Programming ESP8266 ESP-12E NodeMCU Using Arduino IDE - a Tutorial
WeMos D1 mini pins and diagram
Control an Arduino Project Through a Customisable Android / Iphone App With Blynk and Wemos D1: THE 2016 SUPER NOOB FRIENDLY WAY
OK ! 那現在的問題就是,該怎樣用微控制器去產生同樣的效果? 程式碼如下
#include "ESP8266WiFi.h"
void send_event(const char *event); // Function 原型
// ===== Wifi setup =====
const char *ssid     = “我的WIFI名稱";
const char *password = “我的WIFI密碼";
// ===== IFTTT setup =====
const char *host = "maker.ifttt.com";
const char *privateKey = “IFTTT上的KEY";
// ===== Hardware setup =====
const int buttonPin = D8;     // the number of the pushbutton pin
const int ledPin = D4;        // the number of the LED pin
// ===== Variables will change =====
int buttonState;             // the current reading from the input pin
int lastButtonState = LOW;   // the previous reading from the input pin
long lastDebounceTime = 0;  // the last time the output pin was toggled
long debounceDelay = 50;    // the debounce time; increase if the output flickers
void setup() 
{
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
  Serial.begin(115200);
  delay(10);
  // ===== We start by connecting to a WiFi network =====
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  // ===== Wait for the connection, flashing the LED while we wait =====
  int led = HIGH;  
  while (WiFi.status() != WL_CONNECTED) {
    delay(200);
    digitalWrite(ledPin, led);
    led = !led;
    Serial.print(".");
  }
  digitalWrite(ledPin, LOW);
  // ===== Connect successful =====
  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}
void loop() 
{
  int reading = digitalRead(buttonPin);
  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }
  if ((millis() - lastDebounceTime) > debounceDelay) 
  {
    if (reading != buttonState) 
    {
      Serial.print("Button now ");
      Serial.println(HIGH == reading ? "HIGH" : "LOW");
      buttonState = reading;
      if (buttonState == LOW) {
        // ===== 輸入在 IFTTT 上輸入的 event 名稱 =====
        send_event("NotifyMe");
      }
    }
  }
  lastButtonState = reading;
}
void send_event(const char *event)
{
  digitalWrite(ledPin, HIGH);
  Serial.print("Connecting to ");
  Serial.println(host);
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("Connection failed");
    return;
  }
  
  // Create a URI for the request
  String url = "/trigger/";
  url += event;
  url += "/with/key/";
  url += privateKey;
  
  Serial.print("Requesting URL: ");
  Serial.println(url);
  
  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" + 
               "Connection: close\r\n\r\n");
  // Read all the lines of the reply from server and print them to Serial,
  // the connection will close when the server has sent all the data.
  while(client.connected())
  {
    if(client.available())
    {
      String line = client.readStringUntil('\r');
      Serial.print(line);
    } else {
      // No data yet, wait a bit
      delay(50);
    };
  }
  
  Serial.println();
  Serial.println("closing connection");
  client.stop();
  digitalWrite(ledPin, LOW);
}
上述的程式碼執行結果如上圖,觸發成功 !!!
注意 : 若你使用不同的事件名稱,須修改第 70 行的程式碼
加上傳 value ,程式碼變成以下
#include "ESP8266WiFi.h"
void send_event(const char *event); // Function 原型
// ===== Wifi setup =====
const char *ssid     = “我的WIFI名稱";
const char *password = “我的WIFI密碼";
// ===== IFTTT setup =====
const char *host = "maker.ifttt.com";
const char *privateKey = “IFTTT上的KEY";
// ===== Hardware setup =====
const int buttonPin = D8;     // the number of the pushbutton pin
const int ledPin = D4;        // the number of the LED pin
// ===== Variables will change =====
int buttonState;             // the current reading from the input pin
int lastButtonState = LOW;   // the previous reading from the input pin
long lastDebounceTime = 0;  // the last time the output pin was toggled
long debounceDelay = 50;    // the debounce time; increase if the output flickers
// ==== define value =====
int value1 = 324;
int value2 = 689;
void setup() 
{
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
  Serial.begin(115200);
  delay(10);
  // ===== We start by connecting to a WiFi network =====
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  // ===== Wait for the connection, flashing the LED while we wait =====
  int led = HIGH;  
  while (WiFi.status() != WL_CONNECTED) {
    delay(200);
    digitalWrite(ledPin, led);
    led = !led;
    Serial.print(".");
  }
  digitalWrite(ledPin, LOW);
  // ===== Connect successful =====
  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}
void loop() 
{
  int reading = digitalRead(buttonPin);
  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }
  if ((millis() - lastDebounceTime) > debounceDelay) 
  {
    if (reading != buttonState) 
    {
      Serial.print("Button now ");
      Serial.println(HIGH == reading ? "HIGH" : "LOW");
      buttonState = reading;
      if (buttonState == LOW) {
        // ===== 輸入在 IFTTT 上輸入的 event 名稱 =====
        send_event("NotifyMe");
      }
    }
  }
  lastButtonState = reading;
}
void send_event(const char *event)
{
  digitalWrite(ledPin, HIGH);
  Serial.print("Connecting to ");
  Serial.println(host);
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("Connection failed");
    return;
  }
  
  // Create a URI for the request
  String url = "/trigger/";
  url += event;
  url += "/with/key/";
  url += privateKey;
  url += "?";
  url += "value1=";
  url += value1;
  url +-= "&";
  url += "value2=";
  url += value2;
  
  Serial.print("Requesting URL: ");
  Serial.println(url);
  
  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" + 
               "Connection: close\r\n\r\n");
  // Read all the lines of the reply from server and print them to Serial,
  // the connection will close when the server has sent all the data.
  while(client.connected())
  {
    if(client.available())
    {
      String line = client.readStringUntil('\r');
      Serial.print(line);
    } else {
      // No data yet, wait a bit
      delay(50);
    };
  }
  
  Serial.println();
  Serial.println("closing connection");
  client.stop();
  digitalWrite(ledPin, LOW);
}
只要把上面的程式碼修改成自己的 WIFI 名稱、密碼以及自己的識別碼就可以完成微控器與 Line 的連結了
注意 : 若你使用不同的事件名稱,須修改第 74 行的程式碼
將其與 "居家監控" 的應用合體,請參考下篇
NodeMCU 教學 - 04:WeMos D1 mini NodeMCU 與 Line 的連結 (居家監控實際應用)
參考連結
02MeMos D1
12-04IFTTT應用
13-11簡易保全系統
CONNECT MAKER TO ANYTHING - IFTTT
IFTTT教學(三) – 利用 GET 定義你的 Maker Webhooks 參數
使用Arduino IDE 控制 NodeMcu 上的 LED 燈 ( Arduino Project: Control a Builtin LED from a Web Browser )
[NodeMCU] Lab0 安裝與設定
Programming ESP8266 ESP-12E NodeMCU Using Arduino IDE - a Tutorial
WeMos D1 mini pins and diagram
Control an Arduino Project Through a Customisable Android / Iphone App With Blynk and Wemos D1: THE 2016 SUPER NOOB FRIENDLY WAY













