文章程式碼顯示

2018年1月26日 星期五

NodeMCU 教學 - 03:WeMos D1 mini (NodeMCU) 與 Line 的連結

本篇為 實現 D1 mini (或NodeMCU) 與 Line 之間的連結

我們已經實作了 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連結在此 









以上的步驟我們就完成了 IFTTT 與 Line 之間的連結。並且我們設置了一個 "事件" 名稱為 "NotifyMe" 

也設置了當我們觸發這個事件的時候, IFTTT 在 Line 的機器人要發送怎樣的訊息到我們的 Line 帳號。

接下來我們就看一下當這個事件被觸發的時候會發生怎樣的事



左圖是你按完 Finish 就會出現的介面。右圖是我們在右上角的人頭像中點一下,再點擊 " Services " ,並且搜尋 " Webhook "



Your key is: 下面的英文數字組合就是你在 IFTTT 上面的識別碼(privateKey)。左圖是一進入畫面時的介面,我們在空格裡面輸入我的"事件"名稱 NotifyMe ,就會看到下面的連結網址變了(右圖下方紅框)。

我們將這個連結網址(URL)複製並貼到瀏覽器會發生什麼事?


發現當這個網址(URL)被"觸發"的時候,就會產生出 Line 的通知


我們在原本的識別碼網址後面加上 ?value1=689&value2=633 就可以把值也傳上去了

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


↓↓↓ 連結到部落格方針與索引 ↓↓↓

Blog 使用方針與索引