/*Arduino mega 2560   ->   ESP8266
        12   (RX)     ->       D7 (GPIO 13) (TX)
        13   (TX)     ->       D6 (GPIO 12) (RX)
       GND            ->      GND
*/
//-------------------------------------------------------------------------------------------------------------------------//
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include "WiFiManager.h"
#include <FS.h>
#include <DNSServer.h>
#include "ArduinoJson.h"
#include <ESP8266HTTPClient.h>
//----------------------------------------------------------
//#include <Wire.h>
//กำหนด Serial port ของ NODE MCU ESP 8266
#include <SoftwareSerial.h>
SoftwareSerial NodeSerial(D6, D7); // RX | TX //ตั้งค่า SoftwareSerial ชื่อ  NodeSerial เพื่อกำหนดขา RX TX
//ตั้งค่า SoftwareSerial ชื่อ  NodeSerial เพื่อกำหนดขา RX TX


//----------------------------------------------------------
//Blynk------------
#include <BlynkSimpleEsp8266.h>
#define BLYNK_DEBUG
#define BLYNK_PRINT Serial
int blynkIsDownCount = 0;
char blynk_tokencenter[34] = "JL6oqQFnAMCKj-fImkiQzkN9Y1vKNSDK";

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


BlynkTimer timer;

//***********สำหรับ Server local ที่แจกให้ เพิ่ม **** แค่ 2 บรรทัดนี้
char server[] = "oasiskit.com";
int port = 8080;



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

#include "TridentTD_LineNotify.h"
char line_token[45] = "";

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

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

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

bool shouldSaveConfig1 = false;
void saveConfigCallback1 () {
  shouldSaveConfig1 = true;
  Serial.println("Should save  All Data config");
}
//-----------------------------------------------------------------------------------------------------------------------//

String IP;



int Device_1sent;
int Device_2sent;
int Device_3sent;
int Device_4sent;
int Device_5sent;
int Device_6sent;
int Device_7sent;
int Device_8sent;



#include <EEPROM.h>



//--------Blynk Control------------------------

BLYNK_WRITE(V1)
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    Device_1_On();
  }
  if (pinValue == 0) {
    Device_1_Off();
  }
}

void Device_1_On() {
  Device_1sent = 10;
  Blynk.virtualWrite(V1, 1);

  //--เก็บค่าสถานะไว้ใน EEPROM --------
  EEPROM.put(10, Device_1sent );
  EEPROM.commit(); //จบการเขียน
  delay(50);
}
//--------------------------------//
void Device_1_Off() {

  Device_1sent = 11;
  Blynk.virtualWrite(V1, 0);
  //--เก็บค่าสถานะไว้ใน EEPROM --------
  EEPROM.put(10, Device_1sent );
  EEPROM.commit(); //จบการเขียน
  delay(50);
}

//--------Blynk Control------------------------

BLYNK_WRITE(V2)
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    Device_2_On();
  }
  if (pinValue == 0) {
    Device_2_Off();
  }
}

void Device_2_On() {
  Device_2sent = 20;
  Blynk.virtualWrite(V2, 1);

  //--เก็บค่าสถานะไว้ใน EEPROM --------
  EEPROM.put(20, Device_2sent );
  EEPROM.commit(); //จบการเขียน
  delay(50);
}
//--------------------------------//
void Device_2_Off() {

  Device_2sent = 21;
  Blynk.virtualWrite(V2, 0);
  //--เก็บค่าสถานะไว้ใน EEPROM --------
  EEPROM.put(20, Device_2sent );
  EEPROM.commit(); //จบการเขียน
  delay(50);
}
//-----------------------------------//

BLYNK_WRITE(V3)
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    Device_3_On();
  }
  if (pinValue == 0) {
    Device_3_Off();
  }
}

void Device_3_On() {
  Device_3sent = 30;
  Blynk.virtualWrite(V3, 1);

  //--เก็บค่าสถานะไว้ใน EEPROM --------
  EEPROM.put(30, Device_3sent );
  EEPROM.commit(); //จบการเขียน
  delay(50);
}
//--------------------------------//
void Device_3_Off() {

  Device_3sent = 31;
  Blynk.virtualWrite(V3, 0);
  //--เก็บค่าสถานะไว้ใน EEPROM --------
  EEPROM.put(30, Device_3sent );
  EEPROM.commit(); //จบการเขียน
  delay(50);
}
//-----------------------------------//



BLYNK_WRITE(V4)
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    Device_4_On();
  }
  if (pinValue == 0) {
    Device_4_Off();
  }
}

void Device_4_On() {
  Device_4sent = 40;
  Blynk.virtualWrite(V4, 1);

  //--เก็บค่าสถานะไว้ใน EEPROM --------
  EEPROM.put(40, Device_4sent );
  EEPROM.commit(); //จบการเขียน
  delay(50);
}
//--------------------------------//
void Device_4_Off() {

  Device_4sent = 41;
  Blynk.virtualWrite(V4, 0);
  //--เก็บค่าสถานะไว้ใน EEPROM --------
  EEPROM.put(40, Device_4sent );
  EEPROM.commit(); //จบการเขียน
  delay(50);
}
//-----------------------------------//

BLYNK_WRITE(V5)
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    Device_5_On();
  }
  if (pinValue == 0) {
    Device_5_Off();
  }
}

void Device_5_On() {
  Device_5sent = 50;
  Blynk.virtualWrite(V5, 1);

  //--เก็บค่าสถานะไว้ใน EEPROM --------
  EEPROM.put(50, Device_5sent );
  EEPROM.commit(); //จบการเขียน
  delay(50);
}
//--------------------------------//
void Device_5_Off() {

  Device_5sent = 51;
  Blynk.virtualWrite(V5, 0);
  //--เก็บค่าสถานะไว้ใน EEPROM --------
  EEPROM.put(50, Device_5sent );
  EEPROM.commit(); //จบการเขียน
  delay(50);
}
//-----------------------------------//


BLYNK_WRITE(V6)
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    Device_6_On();
  }
  if (pinValue == 0) {
    Device_6_Off();
  }
}

void Device_6_On() {
  Device_6sent = 60;
  Blynk.virtualWrite(V6, 1);

  //--เก็บค่าสถานะไว้ใน EEPROM --------
  EEPROM.put(60, Device_6sent );
  EEPROM.commit(); //จบการเขียน
  delay(50);
}
//--------------------------------//
void Device_6_Off() {

  Device_6sent = 61;
  Blynk.virtualWrite(V6, 0);
  //--เก็บค่าสถานะไว้ใน EEPROM --------
  EEPROM.put(60, Device_6sent );
  EEPROM.commit(); //จบการเขียน
  delay(50);
}
//-----------------------------------//



BLYNK_WRITE(V7)
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    Device_7_On();
  }
  if (pinValue == 0) {
    Device_7_Off();
  }
}

void Device_7_On() {
  Device_7sent = 70;
  Blynk.virtualWrite(V7, 1);

  //--เก็บค่าสถานะไว้ใน EEPROM --------
  EEPROM.put(70, Device_7sent );
  EEPROM.commit(); //จบการเขียน
  delay(50);
}
//--------------------------------//
void Device_7_Off() {

  Device_7sent = 71;
  Blynk.virtualWrite(V7, 0);
  //--เก็บค่าสถานะไว้ใน EEPROM --------
  EEPROM.put(70, Device_7sent );
  EEPROM.commit(); //จบการเขียน
  delay(50);
}
//-----------------------------------//


BLYNK_WRITE(V8)
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    Device_8_On();
  }
  if (pinValue == 0) {
    Device_8_Off();
  }
}

void Device_8_On() {
  Device_8sent = 80;
  Blynk.virtualWrite(V8, 1);

  //--เก็บค่าสถานะไว้ใน EEPROM --------
  EEPROM.put(80, Device_8sent );
  EEPROM.commit(); //จบการเขียน
  delay(50);
}
//--------------------------------//
void Device_8_Off() {

  Device_8sent = 81;
  Blynk.virtualWrite(V8, 0);
  //--เก็บค่าสถานะไว้ใน EEPROM --------
  EEPROM.put(80, Device_8sent );
  EEPROM.commit(); //จบการเขียน
  delay(50);
}
//-----------------------------------//



//--------Blynk <Timer> Control---------

BLYNK_WRITE(V11)
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    Blynk.setProperty(V1, "onBackColor", "#f6119d");
    delay(10);
    Blynk.setProperty(V1, "onLabel", "Ctrl By Timer");
    delay(10);

    Device_1_On();

  }
  if (pinValue == 0) {
    Blynk.setProperty(V1, "offBackColor", "#181916");
    delay(10);
    Blynk.setProperty(V1, "onLabel", "เปิด");
    Blynk.setProperty(V1, "onBackColor", "#c6e613");

    Device_1_Off();
  }
}

BLYNK_WRITE(V12)
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    Blynk.setProperty(V2, "onBackColor", "#f6119d");
    delay(10);
    Blynk.setProperty(V2, "onLabel", "Ctrl By Timer");
    delay(10);

    Device_2_On();

  }
  if (pinValue == 0) {
    Blynk.setProperty(V2, "offBackColor", "#181916");
    delay(10);
    Blynk.setProperty(V2, "onLabel", "เปิด");
    Blynk.setProperty(V2, "onBackColor", "#c6e613");

    Device_2_Off();
  }
}


BLYNK_WRITE(V13)
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    Blynk.setProperty(V3, "onBackColor", "#f6119d");
    delay(10);
    Blynk.setProperty(V3, "onLabel", "Ctrl By Timer");
    delay(10);

    Device_3_On();

  }
  if (pinValue == 0) {
    Blynk.setProperty(V3, "offBackColor", "#181916");
    delay(10);
    Blynk.setProperty(V3, "onLabel", "เปิด");
    Blynk.setProperty(V3, "onBackColor", "#c6e613");

    Device_3_Off();
  }
}

BLYNK_WRITE(V14)
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    Blynk.setProperty(V4, "onBackColor", "#f6119d");
    delay(10);
    Blynk.setProperty(V4, "onLabel", "Ctrl By Timer");
    delay(10);

    Device_4_On();

  }
  if (pinValue == 0) {
    Blynk.setProperty(V4, "offBackColor", "#181916");
    delay(10);
    Blynk.setProperty(V4, "onLabel", "เปิด");
    Blynk.setProperty(V4, "onBackColor", "#c6e613");

    Device_4_Off();
  }
}


BLYNK_WRITE(V15)
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    Blynk.setProperty(V5, "onBackColor", "#f6119d");
    delay(10);
    Blynk.setProperty(V5, "onLabel", "Ctrl By Timer");
    delay(10);

    Device_5_On();

  }
  if (pinValue == 0) {
    Blynk.setProperty(V5, "offBackColor", "#181916");
    delay(10);
    Blynk.setProperty(V5, "onLabel", "เปิด");
    Blynk.setProperty(V5, "onBackColor", "#c6e613");

    Device_5_Off();
  }
}


BLYNK_WRITE(V16)
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    Blynk.setProperty(V6, "onBackColor", "#f6119d");
    delay(10);
    Blynk.setProperty(V6, "onLabel", "Ctrl By Timer");
    delay(10);

    Device_6_On();

  }
  if (pinValue == 0) {
    Blynk.setProperty(V6, "offBackColor", "#181916");
    delay(10);
    Blynk.setProperty(V6, "onLabel", "เปิด");
    Blynk.setProperty(V6, "onBackColor", "#c6e613");

    Device_6_Off();
  }
}



BLYNK_WRITE(V17)
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    Blynk.setProperty(V7, "onBackColor", "#f6119d");
    delay(10);
    Blynk.setProperty(V7, "onLabel", "Ctrl By Timer");
    delay(10);

    Device_7_On();

  }
  if (pinValue == 0) {
    Blynk.setProperty(V7, "offBackColor", "#181916");
    delay(10);
    Blynk.setProperty(V7, "onLabel", "เปิด");
    Blynk.setProperty(V7, "onBackColor", "#c6e613");

    Device_7_Off();
  }
}


BLYNK_WRITE(V18)
{
  int pinValue = param.asInt();
  if (pinValue == 1 ) {
    Blynk.setProperty(V8, "onBackColor", "#f6119d");
    delay(10);
    Blynk.setProperty(V8, "onLabel", "Ctrl By Timer");
    delay(10);

    Device_8_On();

  }
  if (pinValue == 0) {
    Blynk.setProperty(V8, "offBackColor", "#181916");
    delay(10);
    Blynk.setProperty(V8, "onLabel", "เปิด");
    Blynk.setProperty(V8, "onBackColor", "#c6e613");

    Device_8_Off();
  }
}





//------------------------------------------------------//
BLYNK_CONNECTED()
{


  Device_1sent = EEPROM.get(10, Device_1sent);
  delay(50);
  //-----------------------------
  if (Device_1sent  == 10) {//กรณีที่ Device_1sent ON จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    Blynk.virtualWrite(V1, 1);


  }

  if (Device_1sent  == 11) {//กรณีที่ Device_1sent OFF จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    Blynk.virtualWrite(V1, 0);

  }

  Serial.print("Device_1sent :");
  Serial.println(Device_1sent);
  //-----------------------------
  delay(50);
  //-----------------------------




  Device_2sent = EEPROM.get(20, Device_2sent);
  delay(50);
  //-----------------------------
  if (Device_2sent  == 20) {//กรณีที่ Device_2sent ON จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    Blynk.virtualWrite(V2, 1);


  }

  if (Device_2sent  == 21) {//กรณีที่ Device_2sent OFF จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    Blynk.virtualWrite(V2, 0);

  }

  Serial.print("Device_2sent :");
  Serial.println(Device_2sent);
  //-----------------------------
  delay(50);
  //-----------------------------







  Device_3sent = EEPROM.get(30, Device_3sent);
  delay(50);
  //-----------------------------
  if (Device_3sent  == 30) {//กรณีที่ Device_3sent ON จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    Blynk.virtualWrite(V3, 1);


  }

  if (Device_3sent  == 31) {//กรณีที่ Device_3sent OFF จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    Blynk.virtualWrite(V3, 0);

  }

  Serial.print("Device_3sent :");
  Serial.println(Device_3sent);
  //-----------------------------
  delay(50);
  //-----------------------------



  Device_4sent = EEPROM.get(40, Device_4sent);
  delay(50);
  //-----------------------------
  if (Device_4sent  == 40) {//กรณีที่ Device_4sent ON จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    Blynk.virtualWrite(V4, 1);


  }

  if (Device_4sent  == 41) {//กรณีที่ Device_4sent OFF จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    Blynk.virtualWrite(V4, 0);

  }

  Serial.print("Device_4sent :");
  Serial.println(Device_4sent);
  //-----------------------------
  delay(50);
  //-----------------------------


  Device_5sent = EEPROM.get(50, Device_5sent);
  delay(50);
  //-----------------------------
  if (Device_5sent  == 50) {//กรณีที่ Device_5sent ON จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    Blynk.virtualWrite(V5, 1);


  }

  if (Device_5sent  == 51) {//กรณีที่ Device_5sent OFF จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    Blynk.virtualWrite(V5, 0);

  }

  Serial.print("Device_5sent :");
  Serial.println(Device_5sent);
  //-----------------------------
  delay(50);
  //-----------------------------



  Device_6sent = EEPROM.get(60, Device_6sent);
  delay(50);
  //-----------------------------
  if (Device_6sent  == 60) {//กรณีที่ Device_6sent ON จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    Blynk.virtualWrite(V6, 1);


  }

  if (Device_6sent  == 61) {//กรณีที่ Device_6sent OFF จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    Blynk.virtualWrite(V6, 0);

  }

  Serial.print("Device_6sent :");
  Serial.println(Device_6sent);
  //-----------------------------
  delay(50);
  //-----------------------------


  Device_7sent = EEPROM.get(70, Device_7sent);
  delay(50);
  //-----------------------------
  if (Device_7sent  == 70) {//กรณีที่ Device_7sent ON จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    Blynk.virtualWrite(V7, 1);


  }

  if (Device_7sent  == 71) {//กรณีที่ Device_7sent OFF จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    Blynk.virtualWrite(V7, 0);

  }

  Serial.print("Device_7sent :");
  Serial.println(Device_7sent);
  //-----------------------------
  delay(50);
  //-----------------------------



  Device_8sent = EEPROM.get(80, Device_8sent);
  delay(50);
  //-----------------------------
  if (Device_8sent  == 80) {//กรณีที่ Device_8sent ON จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    Blynk.virtualWrite(V8, 1);


  }

  if (Device_8sent  == 81) {//กรณีที่ Device_8sent OFF จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    Blynk.virtualWrite(V8, 0);

  }

  Serial.print("Device_8sent :");
  Serial.println(Device_8sent);
  //-----------------------------
  delay(50);
  //-----------------------------













}//end Blynk connect




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

void setup() {

  //-------IO NODE MCU Esp8266-------//
  pinMode(D0, OUTPUT);      //กำหนดโหมดใช้งานให้กับขา D0 เป็นขา สัญญาณไฟ ในสภาวะต่างๆ
  pinMode(D4, INPUT_PULLUP);//กำหนดโหมดใช้งานให้กับขา D4 เป็นขา กดปุ่ม ค้าง เพื่อตั้งค่า AP config



  Serial.begin(115200);
  NodeSerial.begin(57600);

  EEPROM.begin(512);



  delay(1000);

  //เชคค่าให้ MEGA ทำงานเลย ไม่ต้องรอให้ Blynk connect ได้
  //และหน่วงเวลากันการกระชากของกระแส

  Device_1sent = EEPROM.get(10, Device_1sent);
  delay(50);
  //-----------------------------
  if (Device_1sent  == 10) {//กรณีที่ Device_1sent ON จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    NodeSerial.print(110);
    NodeSerial.print('\n');

  }
  if (Device_1sent  == 11) {//กรณีที่ Device_1sent OFF จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    NodeSerial.print(111);
    NodeSerial.print('\n');

  }

  //-----------------------------
  delay(2000);



  Device_2sent = EEPROM.get(20, Device_2sent);
  delay(50);
  //-----------------------------
  if (Device_2sent  == 20) {//กรณีที่ Device_2sent ON จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    NodeSerial.print(120);
    NodeSerial.print('\n');

  }
  if (Device_2sent  == 21) {//กรณีที่ Device_2sent OFF จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    NodeSerial.print(121);
    NodeSerial.print('\n');
  }

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

  delay(2000);

  Device_3sent = EEPROM.get(30, Device_3sent);
  delay(50);
  //-----------------------------
  if (Device_3sent  == 30) {//กรณีที่ Device_3sent ON จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    NodeSerial.print(130);
    NodeSerial.print('\n');
  }

  if (Device_3sent  == 31) {//กรณีที่ Device_3sent OFF จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    NodeSerial.print(131);
    NodeSerial.print('\n');
  }


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

  delay(2000);

  Device_4sent = EEPROM.get(40, Device_4sent);
  delay(50);
  //-----------------------------
  if (Device_4sent  == 40) {//กรณีที่ Device_4sent ON จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    NodeSerial.print(140);
    NodeSerial.print('\n');
  }

  if (Device_4sent  == 41) {//กรณีที่ Device_4sent OFF จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    NodeSerial.print(141);
    NodeSerial.print('\n');
  }
  delay(2000);

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


  Device_5sent = EEPROM.get(50, Device_5sent);
  delay(50);
  //-----------------------------
  if (Device_5sent  == 50) {//กรณีที่ Device_5sent ON จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    NodeSerial.print(150);
    NodeSerial.print('\n');
  }

  if (Device_5sent  == 51) {//กรณีที่ Device_5sent OFF จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    NodeSerial.print(151);
    NodeSerial.print('\n');
  }
  delay(2000);

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



  Device_6sent = EEPROM.get(60, Device_6sent);
  delay(50);
  //-----------------------------
  if (Device_6sent  == 60) {//กรณีที่ Device_6sent ON จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    NodeSerial.print(160);
    NodeSerial.print('\n');
  }

  if (Device_6sent  == 61) {//กรณีที่ Device_6sent OFF จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    NodeSerial.print(161);
    NodeSerial.print('\n');
  }

  delay(2000);
  //-----------------------------


  Device_7sent = EEPROM.get(70, Device_7sent);
  delay(50);
  //-----------------------------
  if (Device_7sent  == 70) {//กรณีที่ Device_7sent ON จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    NodeSerial.print(170);
    NodeSerial.print('\n');
  }

  if (Device_7sent  == 71) {//กรณีที่ Device_7sent OFF จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    NodeSerial.print(171);
    NodeSerial.print('\n');
  }

  delay(2000);
  //-----------------------------



  Device_8sent = EEPROM.get(80, Device_8sent);
  delay(50);
  //-----------------------------
  if (Device_8sent  == 80) {//กรณีที่ Device_8sent ON จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    NodeSerial.print(180);
    NodeSerial.print('\n');
  }

  if (Device_8sent  == 81) {//กรณีที่ Device_8sent OFF จะเก็บค่า ทั้งหมดไว้รอ Sysn กับ Blynk
    NodeSerial.print(181);
    NodeSerial.print('\n');
  }
  delay(2000);
  //-----------------------------







































  //-----------------------------------------------------------------------------------------------------------------------//
  //read configuration from FS json
  Serial.println("mounting  FS...");


  if (SPIFFS.begin()) {

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

    Serial.println("mounted Data file system");


    if (SPIFFS.exists("/config1.json")) {
      //file exists, reading and loading
      Serial.println("reading Data config file");
      File configFile1 = SPIFFS.open("/config1.json", "r");

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

        configFile1.readBytes(buf1.get(), size);
        DynamicJsonBuffer jsonBuffer;
        JsonObject& json = jsonBuffer.parseObject(buf1.get());
        json.printTo(Serial);
        if (json.success()) {
          Serial.println("\nparsed  json");

          strcpy(blynk_tokencenter, json["blynk_tokencenter"]);

          strcpy(line_token, json["line_token"]);


        } else {
          Serial.println("failed to load Data file json config");
        }
      }
    }
    //---------------------------------------------------------------------------------//



  } else {
    Serial.println("failed to mount FS");

  }
  //end read


  delay(1000);


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

  WiFiManagerParameter custom_text0("<p> </p>");
  WiFiManagerParameter custom_textA("<label>A: Blynk Token center</label>");

  WiFiManagerParameter custom_text1("<label>1: ID Line กลุ่ม</label>");


  WiFiManagerParameter custom_blynk_tokencenter("blynk_tokencenter", "blynk_tokencenter", blynk_tokencenter, 34);
  WiFiManagerParameter custom_line_token("line_token", "line_token", line_token, 45);





  //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(saveConfigCallback1);

  wifiManager.addParameter(&custom_text0);
  wifiManager.addParameter(&custom_textA);
  wifiManager.addParameter(&custom_blynk_tokencenter);

  wifiManager.addParameter(&custom_text0);
  wifiManager.addParameter(&custom_text1);
  wifiManager.addParameter(&custom_line_token);


  delay(1000);

  for (int i = 5; i > -1; i--) {  // นับเวลาถอยหลัง 5 วินาทีก่อนกดปุ่ม AP Config

    digitalWrite(D0, LOW);
    delay(500);
    digitalWrite(D0, HIGH);
    delay(500);
    Serial.print (String(i) + " ");


  }

  if (digitalRead(D4) == LOW) {
    digitalWrite(D0, LOW);
    Serial.println("Button Pressed");



    wifiManager.resetSettings();//ให้ล้างค่า SSID และ Password ที่เคยบันทึกไว้


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

    if (!wifiManager.autoConnect("Lighting Ctrl")) {
      Serial.println("failed to connect and hit timeout");
      delay(3000);


      //reset and try again, or maybe put it to deep sleep
      ESP.reset();
      delay(5000);
    }

  }




  Serial.println(": เชื่อมต่อ WiFi สำเร็จ!)");

  strcpy(blynk_tokencenter, custom_blynk_tokencenter.getValue());
  strcpy(line_token, custom_line_token.getValue());
  delay(1000);

  if (shouldSaveConfig1) {
    //Serial.println("saving config");//แสดงข้อความใน Serial Monitor

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

    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();

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

    Serial.println("saving blynk_tokencenter_ config");
    json["blynk_tokencenter"] = blynk_tokencenter;
    File configFile1 = SPIFFS.open("/config1.json", "w");

    //------------------------------------------------------------------
    Serial.println("saving line token config");
    json["line_token"] = line_token;
    File configFile2 = SPIFFS.open("/config1.json", "w");
    //------------------------------------------------------------------


    if (!configFile1) {
      Serial.println("failed to open  config file for writing");

    }
    json.printTo(Serial);
    //-------------------------------------
    //--Write Close blynk_tokencenter
    json.printTo(configFile1);
    configFile1.close();
    //-------------------------------------
    //--Write Close Line token
    json.printTo(configFile2);
    configFile2.close();
  }

  delay(1000);
  //-----------------------------------------------------------------

  //-----------------------------------------------------------------------------------------------------------------------//
  Serial.println("-----------------------------------");
  Serial.println();
  Serial.print("local ip   : ");
  delay(100);
  Serial.println(WiFi.localIP());
  delay(100);
  Serial.print("gateway    :");
  delay(100);
  Serial.println(WiFi.gatewayIP());
  Serial.print("subnetMask :");
  delay(100);
  Serial.println(WiFi.subnetMask());
  Serial.print("SSID       :");
  delay(100);
  Serial.println(WiFi.SSID());
  Serial.print("Password   :");
  delay(100);
  Serial.println(WiFi.psk());
  //-----------------------------------------------------------------------------------------------------------------------//
  //Print เพื่อเชคว่าค่าที่บันทึกไว้ยังอยู่หรือไม่
  Serial.println("-----------------------------------");
  Serial.println("เชคว่าค่าที่บันทึกไว้ยังอยู่หรือไม่");
  Serial.println();

  IP = WiFi.localIP().toString();
  Serial.print("IP to String = ");
  Serial.println(IP);


  //  Blynk.config(blynk_tokencenter);//เริ่มการเชื่อมต่อ Blynk Server แบบปกติ
  Blynk.config(blynk_tokencenter, server, port);
  //เริ่มการเชื่อมต่อ Blynk Server*********สำหรับ Server local
  //ที่แจกให้ เพิ่ม, server, port  แค่นี้จบ


  timer.setInterval(30000L, reconnecting);


  LINE.setToken(line_token);




}//end setup

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









//------------------------------------------------------------------------------------------------------------------------//
//*********************************************       void Loop        ***************************************************//
//------------------------------------------------------------------------------------------------------------------------//


void loop(void) {




  //ส่ง ไปสั่งให้ MEGA ทำงาน
  //------PB 1 -----------------//



  if (Device_1sent == 11 ) {//on

    NodeSerial.print(11);
    NodeSerial.print('\n');
  }
  if (Device_1sent == 10 ) {//off

    NodeSerial.print(10);
    NodeSerial.print('\n');
  }




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







  //------PB 2 -----------------//
  if (Device_2sent == 21 ) {//on

    NodeSerial.print(21);
    NodeSerial.print('\n');
  }
  if (Device_2sent == 20 ) {//off

    NodeSerial.print(20);
    NodeSerial.print('\n');
  }

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




  //------PB 3 -----------------//
  if (Device_3sent == 31 ) {//on

    NodeSerial.print(31);
    NodeSerial.print('\n');
  }
  if (Device_3sent == 30 ) {//off

    NodeSerial.print(30);
    NodeSerial.print('\n');
  }




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


  //------PB 4 -----------------//
  if (Device_4sent == 41 ) {//on

    NodeSerial.print(41);
    NodeSerial.print('\n');
  }
  if (Device_4sent == 40 ) {//off

    NodeSerial.print(40);
    NodeSerial.print('\n');
  }



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


  //------PB 5 -----------------//
  if (Device_5sent == 51 ) {//on

    NodeSerial.print(51);
    NodeSerial.print('\n');
  }
  if (Device_5sent == 50 ) {//off

    NodeSerial.print(50);
    NodeSerial.print('\n');
  }



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


  //------PB 6 -----------------//
  if (Device_6sent == 61 ) {//on

    NodeSerial.print(61);
    NodeSerial.print('\n');
  }
  if (Device_6sent == 60 ) {//off

    NodeSerial.print(60);
    NodeSerial.print('\n');
  }




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

  //------PB 7 -----------------//
  if (Device_7sent == 71 ) {//on

    NodeSerial.print(71);
    NodeSerial.print('\n');
  }
  if (Device_7sent == 70 ) {//off

    NodeSerial.print(70);
    NodeSerial.print('\n');
  }


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


  //------PB 8 -----------------//
  if (Device_8sent == 81 ) {//on

    NodeSerial.print(81);
    NodeSerial.print('\n');
  }
  if (Device_8sent == 80 ) {//off

    NodeSerial.print(80);
    NodeSerial.print('\n');
  }



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





  //รับข้อมูล จาก ARDUINO MEGA
  //ทำการอ่านค่าจาก ARDUINO MEGA เข้ามาผ่านทาง port serial
  //ค่าที่ได้มาจากการกดปุ่ม Push button switch จาก ARDUINO MEGA

  while (NodeSerial.available() > 0) {
    int ValFromMega = NodeSerial.parseFloat();
    //--------------------------------------------------
    if (NodeSerial.read() == '\n') {


      //------------------------------------------------
      //ถ้ารับค่า 11 เข้ามา จะให้ทำอะไร
      if (ValFromMega == 10) {  //ส่ง ON  มา
        Device_1_On();

      }

      //ถ้ารับค่า 10 เข้ามา  จะให้ทำอะไร
      if (ValFromMega == 11) {
        Device_1_Off();
      }
      //------------------------------------------------


      if (ValFromMega == 20) {  //ส่ง ON  มา
        Device_2_On();

      }


      if (ValFromMega == 21) {
        Device_2_Off();
      }
      //------------------------------------------------

      if (ValFromMega == 30) {  //ส่ง ON  มา
        Device_3_On();

      }


      if (ValFromMega == 31) {
        Device_3_Off();
      }
      //------------------------------------------------

      if (ValFromMega == 40) {  //ส่ง ON  มา
        Device_4_On();

      }


      if (ValFromMega == 41) {
        Device_4_Off();
      }
      //------------------------------------------------

      if (ValFromMega == 50) {  //ส่ง ON  มา
        Device_5_On();

      }


      if (ValFromMega == 51) {
        Device_5_Off();
      }
      //------------------------------------------------


      if (ValFromMega == 60) {  //ส่ง ON  มา
        Device_6_On();

      }


      if (ValFromMega == 61) {
        Device_6_Off();
      }
      //------------------------------------------------

      if (ValFromMega == 70) {  //ส่ง ON  มา
        Device_7_On();

      }


      if (ValFromMega == 71) {
        Device_7_Off();
      }
      //------------------------------------------------


      if (ValFromMega == 80) {  //ส่ง ON  มา
        Device_8_On();

      }


      if (ValFromMega == 81) {
        Device_8_Off();
      }
      //------------------------------------------------




    }

  }//end while






  //ส่ง ไปสั่งให้ MEGA ทำงาน
  //------PB 1 -----------------//


  if (Device_1sent == 10 ) {//on

    NodeSerial.print(110);
    NodeSerial.print('\n');
  }
  if (Device_1sent == 11 ) {//off

    NodeSerial.print(111);
    NodeSerial.print('\n');
  }


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


  //------PB 2 -----------------//
  if (Device_2sent == 20 ) {//on

    NodeSerial.print(120);
    NodeSerial.print('\n');
  }
  if (Device_2sent == 21 ) {//off

    NodeSerial.print(121);
    NodeSerial.print('\n');
  }

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


  //------PB 3 -----------------//
  if (Device_3sent == 30 ) {//on

    NodeSerial.print(130);
    NodeSerial.print('\n');
  }
  if (Device_3sent == 31 ) {//off

    NodeSerial.print(131);
    NodeSerial.print('\n');
  }


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


  //------PB 4 -----------------//
  if (Device_4sent == 40 ) {//on

    NodeSerial.print(140);
    NodeSerial.print('\n');
  }
  if (Device_4sent == 41 ) {//off

    NodeSerial.print(141);
    NodeSerial.print('\n');
  }



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


  //------PB 5 -----------------//
  if (Device_5sent == 50 ) {//on

    NodeSerial.print(150);
    NodeSerial.print('\n');
  }
  if (Device_5sent == 51 ) {//off

    NodeSerial.print(151);
    NodeSerial.print('\n');
  }



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


  //------PB 6 -----------------//
  if (Device_6sent == 60 ) {//on

    NodeSerial.print(160);
    NodeSerial.print('\n');
  }
  if (Device_6sent == 61 ) {//off

    NodeSerial.print(161);
    NodeSerial.print('\n');
  }



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

  //------PB 7 -----------------//
  if (Device_7sent == 70 ) {//on

    NodeSerial.print(170);
    NodeSerial.print('\n');
  }
  if (Device_7sent == 71 ) {//off

    NodeSerial.print(171);
    NodeSerial.print('\n');
  }


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


  //------PB 8 -----------------//
  if (Device_8sent == 80 ) {//on

    NodeSerial.print(180);
    NodeSerial.print('\n');
  }
  if (Device_8sent == 81 ) {//off

    NodeSerial.print(181);
    NodeSerial.print('\n');
  }



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







  //------------- Blynk Connect ---------------//
  if (Blynk.connected())
  {
    Blynk.run();
    digitalWrite(D0, LOW);



  } else {
    digitalWrite(D0, LOW);
    delay(100);
    digitalWrite(D0, HIGH);
    delay(300);


  }
  timer.run();//ให้เวลาของ Blynk ทำงาน

  delay(5);
}//Loop




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


void reconnecting()
{
  if (!Blynk.connected())
  {
    blynkIsDownCount++;
    BLYNK_LOG("blynk server is down! %d  times", blynkIsDownCount);
    Blynk.connect(5000);
  }
}
//--------------------------------------------------------------------------------------------------------
