การกดปุ่ม ให้ส่งข้อความเข้า LINE notify ด้วย ESP 8266

การกดปุ่ม ให้ส่งข้อความเข้า LINE notify ด้วย ESP 8266

สำหรับวัตถุประสงค์ของโครงการนี้ผมได้จัดทำขึ้นมา เพื่อให้ผู้ที่นำไปใช้งานสามารถที่จะนำอุปกรณ์นี้ไปใช้งานเพื่อเชื่อมต่อ WiFi ของ Modem Router ในสถานที่ต่างๆได้เลย โดยการกดปุ่ม AP Config เพื่อป้อนค่า SSID และ Password ได้อย่างอิสระโดยไม่ต้องมีปัญหาในเรื่องของการย้ายอุปกรณ์นี้ไปยัง Modem Router ที่อื่น แล้วต้องมานั่งตั้งโค้ด SSID และ password แล้ว อัด Code ลงไปใหม่ทุกครั้ง

ส่วนในเรื่องของการทำงานคือเมื่อเรากดปุ่ม Pushbutton 1 ครั้ง LED จะติด พร้อมกับส่งข้อความเข้า LINE Notify และเมื่อกดปุ่ม Pushbutton อีก 1 ครั้ง LED จะดับพร้อมกับส่งข้อความเข้า LINE Notify เช่นกัน โดยเฉพาะชุดนี้จะไม่ใช้โค้ดที่เกี่ยวกับ App blynk และ blynk server นะครับ

สิ่งแรกที่เราต้องทำเลยคือ สร้าง LINE กลุ่มใน App Line ในสมาร์ทโฟนของเราก่อนนะครับ
(หลายๆท่านที่มีพื้นฐานอยู่แล้วหรือยังไม่มีก็สามารถดูรายละเอียดจากเว็บไซต์ต่างๆที่เขานำเสนอเกี่ยวกับเรื่องนี้ได้นะครับหรือจะดูจากลิงก์ที่ผมเคยโพสต์เอาไว้ การส่งข้อความแจ้งคอมพิวเตอร์ เปิด และ shutdown ผ่าน Line notify ด้วย Visual Studio

ผลลัพธ์ที่ได้ เมื่อกดปุ่ม
image
image

ผลลัพธ์ที่ได้ เมื่อกดปุ่ม อีกครั้ง
image
image

สำหรับการประยุกต์ใช้งานในตัวอย่างแรกผมจะใช้ ESP 8266 พร้อมกับสวิตซ์ปุ่มกด 1 ตัวโดยมีการทำงานคือเมื่อกดปุ่ม 1 ครั้งจะให้ส่งข้อความเข้ามาใน LINE กลุ่มของเราที่ได้สร้างไว้ สำหรับ libraries ที่ใช้งานผมจะใช้ตัวนี้ TridentTD_Linenotify และ Bounce2-master (ลดการแกว่งตัวของ สวิทซ์ปุ่มกด) ต้องให้เครดิตกับทางผู้สร้างและขอขอบคุณ มา ณ ที่นี้ด้วยนะครับ ที่ทำให้การเขียนโค้ดง่ายขึ้นและสามารถนำไปใช้งานได้จริง

ขั้นตอนการทำมีดังนี้

  1. Copy folder ทั้ง 2 libraries ไปไว้ที่ตำแหน่ง C:\Users\MAXGOD\Documents\Arduino\libraries (ลองคลิกดูที่ libraries ตัวนี้นะครับเขาจะมีวิธีการใช้คำสั่งอยู่แล้ว)

  2. จากนั้นก็เริ่มเขียนชุดคำสั่งกันโดยใช้ arduino ide

ไดอะแกรมการต่อสาย (ก็เห็นว่าที่ผมกากบาทเอาไว้ไม่จำเป็นต้องต่อก็ได้ครับแต่ปุ่ม Push button ที่เกี่ยวกับการรีเซ็ต esp 8266 และปุ่ม AP Config ก็ยังคงเอาไว้)

image

Code

//*********************************************************************************************
//NodeMCU V2 จะมี LED อยู่ 2 ตัวคือบนชิพ ESP8266 (D4) และบนบอร์ด (D0)
//NodeMCU V3 จะมี LED อยู่ 1 ตัวคือบนชิพ ESP8266 (D4) ซึ่งไม่มีบนบอร์ดเหมือน V2
//เลือกบอร์ดเป็น NodeMCU 1.0 ความเร็วอัพโหลดจะเป็น 115200 และ LED_BUILTIN จะเป็น D0
//*********************************************************************************************


#include <ESP8266WiFi.h>                  //โหลดไลบารี่ ..มาใช้งาน                        //https://github.com/esp8266/Arduino
#include <ESP8266WebServer.h>             //โหลดไลบารี่ ..มาใช้งาน
#include <WiFiManager.h>                  //โหลดไลบารี่ ..มาใช้งาน                        //https://github.com/tzapu/WiFiManager
#include <FS.h>                           //โหลดไลบารี่ ..มาใช้งาน                        //this needs to be first, or it all crashes and burns...
#include <DNSServer.h>                    //โหลดไลบารี่ ..มาใช้งาน
#include <ArduinoJson.h>                  //โหลดไลบารี่ ..มาใช้งาน                        //https://github.com/bblanchon/ArduinoJson
#include <Bounce2.h>
#include <TridentTD_LineNotify.h>
//------------------------------------------------------------------------------------------------

#define D0 16                     // ใช้ไฟ LED สีฟ้า ของบอร์ด MCU ESP8266 ให้มีสัญญาณไฟกระพริบ ตาม Code ที่เขียน
#define D6 12                     // ใช้เป็นปุ่มกด เพื่อเข้า AP Config ได้ตามความต้องการของผู้ใช้


#define D1 5 //PB
Bounce debouncer1 = Bounce();
int Btn1 = 0;

#define D2 4  //LED


#define LINE_TOKEN  "QerWyEZdBShylI3iTTxKz1Pk8Zo1vLy2NQa7AXFgYLM"
//------------------------------------------------------------------------------------------------

//Character Variable ตัวแปรที่ใช้เก็บอักขระ
bool shouldSaveConfig = false;

//------------------------------------------------------------------------------------------------


//callback notifying us of the need to save config
void saveConfigCallback () {
  Serial.println("Should save config");
  shouldSaveConfig = true;
}

//------------------------------------------------------------------------------------------------



//*****************************************************************************************************
//*******************************       void setup        *********************************************
//*****************************************************************************************************

void setup() {

  //****************************************************************************************************

  pinMode(D6, INPUT);//กำหนดโหมดใช้งานให้กับขา D6 เป็นขา กดปุ่ม ค้าง เพื่อตั้งค่า AP config
  pinMode(D0, OUTPUT);//กำหนดโหมดใช้งานให้กับขา D0 เป็นขา สัญญาณไฟ ในสภาวะต่างๆ
  digitalWrite(D0, LOW);//ให้หลอด LED สีฟ้าดับก่อน

  pinMode(D1, INPUT_PULLUP);
  debouncer1.attach(D1);   debouncer1.interval(25);

  pinMode(D2, OUTPUT);

  //***************************************************************************************************

  Serial.begin(115200);
  Serial.println();//แสดงข้อความใน Serial Monitor

  LINE.setToken(LINE_TOKEN);

  //*************************    การ อ่าน  เขียนค่า WiFi + Password ]ลงใน Node MCU ESP8266   ***************

  //read configuration from FS json
  Serial.println("mounting FS...");//แสดงข้อความใน Serial Monitor

  if (SPIFFS.begin()) {
    Serial.println("mounted file system");//แสดงข้อความใน Serial Monitor

    if (SPIFFS.exists("/config.json")) {
      //file exists, reading and loading
      Serial.println("reading config file");//แสดงข้อความใน Serial Monitor
      File configFile = SPIFFS.open("/config.json", "r");

      if (configFile) {
        Serial.println("opened config file");
        size_t size = configFile.size();
        // Allocate a buffer to store contents of the file.
        std::unique_ptr<char[]> buf(new char[size]);

        configFile.readBytes(buf.get(), size);
        DynamicJsonBuffer jsonBuffer;
        JsonObject& json = jsonBuffer.parseObject(buf.get());
        json.printTo(Serial);
        if (json.success()) {
          Serial.println("\nparsed json");//แสดงข้อความใน Serial Monitor
          //strcpy(blynk_token, json["blynk_token"]);

        } else {
          Serial.println("failed to load json config");//แสดงข้อความใน Serial Monitor
        }
      }
    }
  } else {
    Serial.println("failed to mount FS");//แสดงข้อความใน Serial Monitor
  }
  //end read

  //*************************   จบการ อ่าน  เขียนค่า WiFi + Password ]ลงใน Node MCU ESP8266   ***************

  //**************************        AP AUTO CONNECT   **************************************************

  //WiFiManagerParameter custom_blynk_token("blynk", "blynk token", blynk_token, 34);

  //WiFiManager
  //Local intialization. Once its business is done, there is no need to keep it around
  WiFiManager wifiManager;

  //set config save notify callback
  wifiManager.setSaveConfigCallback(saveConfigCallback);
  //wifiManager.addParameter(&custom_blynk_token);

  for (int i = 5; i > 0; i--) {
    digitalWrite(D0, LOW);
    delay(500);
    digitalWrite(D0, HIGH);
    delay(500);
    Serial.print (String(i) + " ");//แสดงข้อความใน Serial Monitor
  }
  if (digitalRead(D6) == LOW) {
    digitalWrite(D0, LOW);
    Serial.println("Button Pressed");//แสดงข้อความใน Serial Monitor
    wifiManager.resetSettings();//ให้ล้างค่า SSID และ Password ที่เคยบันทึกไว้


    // wifiManager.autoConnect(); ใช้สร้างชื่อแอคเซสพอยต์อันโนมัติจาก ESP + ChipID

    if (!wifiManager.autoConnect("PUYIOT AP")) {
      Serial.println("failed to connect and hit timeout");//แสดงข้อความใน Serial Monitor
      delay(3000);
      //reset and try again, or maybe put it to deep sleep
      ESP.reset();
      delay(5000);

    }
  }
  Serial.println("connected........:)");//แสดงข้อความใน Serial Monitor
  //save the custom parameters to FS
  if (shouldSaveConfig) {
    Serial.println("saving config");//แสดงข้อความใน Serial Monitor
    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();

    File configFile = SPIFFS.open("/config.json", "w");

    if (!configFile) {
      Serial.println("failed to open config file for writing");//แสดงข้อความใน Serial Monitor
    }
    json.printTo(Serial);
    json.printTo(configFile);
    configFile.close();

  }

  //**************************    จบ    AP AUTO CONNECT   **************************************************
  Serial.println("local ip"); //แสดงข้อความใน Serial Monitor
  Serial.println(WiFi.localIP());//แสดงข้อความใน Serial Monitor
}

//*****************************************************************************************************
//*******************************     จบ  void setup        *********************************************
//*****************************************************************************************************

//*****************************************************************************************************
//*******************************     void loop       *************************************************

void loop() {

  debouncer1.update();
  //--Toggle SW  PB 1 -----------------------------------------------------------------------------------

  if ( debouncer1.fell() ) {  // Call code if button transitions from HIGH to LOW
    Btn1 = !Btn1; // Toggle LED state

    if ( Btn1 == 1 ) {
                 digitalWrite(D2, HIGH);
      LINE.notify("สวัสดีครับ PUYIOT LED ติด แล้วนะจ๊ะ");
      

    }
    if ( Btn1 == 0 ) {
      digitalWrite(D2, LOW);
      LINE.notify("สวัสดีครับ PUYIOT LED ดับ แล้วนะจ๊ะ");
          }
  }
  //-------------------------------------------------------------------------------------------------
  delay (1);
}
//*******************************   จบ  void loop     *************************************************

ต่อไปก็ Upload code ไปยัง Esp8266 Esp8266 ก็จะเริ่มทำงาน เราต้องการตั้งค่า SSID และ Password ของ WiFi ที่เราต้องการเชื่อมต่อก่อน ในครั้งแรก ภายใน 5 วินาที ให้เรากดปุ่ม PB AP config ค้างไว้ก่อนนะครับ จะสังเกตว่า LED สีฟ้า จะติดค้าง เป็นสัญญาณบอกให้เรารู้ว่า เราสามารถกำหนดค่าได้แล้ว
เมื่อเราเปิด WiFi ขึ้นมาก็จะโชว์ชื่อของ access point มาให้เรา ตามที่ได้กำหนดชื่อไว้ในโค้ด และทำการกดปุ่ม connect
image
และเมื่อเชื่อมต่อเสร็จเรียบร้อยแล้วให้เปิด Browser ขึ้นมาและพิมพ์หมายเลข IP 192.168 .4.1 พร้อมกับคลิกปุ่ม Configure WiFi
image
คลิกเลือก ssid ที่เราต้องการจากนั้นป้อน password และกดปุ่ม Save และปิดตัว Browser เมื่อมีการเชื่อมต่อสำเร็จ WiFi ก็จะเปลี่ยนกลับไปเชื่อมต่อ WiFi ปกติ
image

จากนั้น esp 8266 จะทำการเชื่อมต่อ WiFi ตามที่เรากำหนดค่าเอาไว้ จนสำเร็จแล้วเราก็สามารถทดสอบการกดปุ่มได้เลยครับ (การตั้งค่า AP Config ตัวนี้ทำแค่ครั้งเดียวนะครับ ถึงแม้ว่าเราเสียบเข้าเสียบออกก็ไม่มีปัญหาแล้วค่า ssid และ password ได้ถูกบันทึกค่าไว้แล้ว แต่ถ้าเราเอาอุปกรณ์ชุดนี้ไปทดสอบการทำงานที่อื่น อย่างเช่นที่บ้าน เราต้องทำการกดปุ่ม AP Config เพื่อตั้งค่า SSID และ password ของ WiFi mที่บ้านเราใหม่นะครับ)

1 Likes

สอบถามครับผมติดปัญหา Json version 5 เป็น Json version 6 ครับ ลองทำตามเว็บ Json แล้วงงครับ พี่ช่วยอธิบายหน่อยครับ

ได้แล้วครับ ลองลบ Libralies v6 แล้วลง v5 ใหม่ครับ

2 Likes

เยี่ยมครับ

รบกวนขอบถามครับ เราเขียน code เพิ่มยังไงบ้างครับ เพื่อเพิ่มการเปลี่ยน token line และ ข้อความที่ส่งออกจากไลน์ จากหน้าเฟส 192.168.4.1,
เมื่อเราเซ็ต username password ได้แล้ว จากหน้าเดียวกันโดยไม่ต้องเขียนใน coed

-หมายถึงว่า เพิ่มให้ใส่ได้หลายๆไลน์หรือเปล่าครับ

  • ส่วนเมื่อเรากรอก user,pass เเล้วเปลี่ยนหน้าที่ต้งการทำได้ครับ แก้ตรง host ที่ชี้ไปก็ได้ครับเป็นหน้าเว็บเราหรืออะไรก็ได้ครับ