文章程式碼顯示

2018年1月26日 星期五

NodeMCU 教學 - 05:結合 WeMos D1 mini (NodeMCU)、BLYNK、Line 三者

本篇功能概述
  1. 實現 D1 mini 與 Line 之間的連結
  2. 實現 D1 mini 與 BLYNK 之間的連結 

我嘗試將

NodeMCU 教學 - 02:WeMos D1 mini NodeMCU 與 BLYNK

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

NodeMCU 教學 - 04:WeMos D1 mini (NodeMCU) 與 Line 的連結 (實際應用於居家監控)

進行結合,也就是 D1 mini 、 BLYNK 、 Line 這三者之間的結合。

BLYNK 的部分用最簡單的直接控制 I/O 腳 D4 來進行實現,如果這部分可以就表示這兩者之間的連結沒有問題。再加上 IFTTT&Line 的事件觸發就可以完成三者間的連結(這部份我們也用最簡單的觸發事件通知不帶 value 的方式)


最終的結果如上圖

#define BLYNK_PRINT Serial

#include "ESP8266WiFi.h"
#include "BlynkSimpleEsp8266.h"

void send_event(const char *event); // Function 原型

// ===== Wifi & BLYNK setup =====
char auth[] = “BLYNK上的 auth";
char ssid[] = “WIFI名稱";
char pass[] = “WIFI密碼";

// ===== IFTTT setup =====
const char *host = "maker.ifttt.com";
const char *privateKey = “IFTTT上的KEY";

// ===== Hardware setup =====
const int buttonPin = D8;

// ===== Variables will change =====
int buttonState;             
int lastButtonState = LOW;   
long lastDebounceTime = 0;  
long debounceDelay = 50; 

void setup()
{
  Serial.begin(9600);
  Blynk.begin(auth, ssid, pass); //Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 8442);
}

void loop()
{
  Blynk.run();

  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)
{
  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();
}


額外應用

之前用 3D列印機在列印的時候一直有一個問題

就是放著列印並且出門之後,無法知道它到底印完沒

且印完了也不會自己關機 ....

所以一直想方設法要取得列印的狀態,以及列印完自動關機

而要改列印機本身的韌體我覺得太麻煩了,要取得列印狀態在網路上的範例大多要配合樹梅派來用,較繁瑣而且成本又高。

當我們用了 WeMos D1 mini 完成了這章的應用

我們就可以上傳微控器的變數資料到手機 APP ,且配合 IFTTT 可以發送 Line 訊息到手機,且可以用手機 APP 遙控微控制器的 I/O 口

如此一來只要改一下配置就可以監測到 3D 列印目前狀態了(雖然還是無法得知列印到多少 % )

我們可以配合電流感測器,運用電流來判斷現在印表機是否正在列印(列印的時候肯定電流挺大的,且列印完成後噴頭跟熱床都會關閉,這樣電流就會突然變很小)

當我們判斷到列印完成的狀態後,就可以用微控器配合 IFTTT 傳送 Line 訊息通知我們。並且我們可以用手機 APP 搭配繼電器,完成遠端將列印機關閉的動作。

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

Blog 使用方針與索引