本篇為 實現 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