การเก็บข้อมูล ด้วย File System (SPIFFS) ป้อนข้อมูลหลายๆ ค่า ผ่าน Wifimanager

ความต้องการของ Project (เพื่อป้องกันความผิดพลาดเรื่องของ Version และตรวจสอบย้อนหลังได้)
Arduino IDE Version 1.8.7
WiFiManager Version 0.14.0
ArduinoJson Version 5.13.3

อันนี้จะเป็นตัวอย่างการป้อนค่าผ่านทาง WiFi Manager บันทึกค่าแล้วให้ไปเก็บที่ File System (SPIFFS) ครับ โดยมีสมาชิกหลายๆท่าน ต้องการที่จะได้การป้อนข้อมูลหลายๆ ข้อมูลลงไปแล้ว ให้บันทึกค่าเอาไว้ เพื่อนำเอาไปใช้งานในส่วนต่างๆของ เงื่อนไข ที่เขียนไว้


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

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#include <FS.h>
#include <DNSServer.h>
#include <ArduinoJson.h>
#include <ESP8266HTTPClient.h>


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

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

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

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

//------------------------------------------------------------------------------------------------------------------------//
char device[10] = "";
//------------------------------------------------------------------------------------------------------------------------//

char Tmin[10] = "";
char Tmax[10] = "";
String St_Tmin;
String St_Tmax;
float Tmin_;
float Tmax_;


char Hmin[10] = "";
char Hmax[10] = "";
String St_Hmin;
String St_Hmax;
float Hmin_;
float Hmax_;


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

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



}
//-----------------------------------------------------------------------------------------------------------------------//

//Temp count Record
char Tcount[10] = "";
String St_Tcount;
int Tcount_;
int Tcount_1;

//Humid count Record
char Hcount[10] = "";
String St_Hcount;
int Hcount_;
int  Hcount_1;




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

void setup() {

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

  //-----------------------------------------------------------------------------------------------------------------------//
  //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(line_token, json["line_token"]);
          strcpy(device, json["device"]);
          strcpy(Tmin, json["Tmin"]);
          strcpy(Tmax, json["Tmax"]);
          strcpy(Hmin, json["Hmin"]);
          strcpy(Hmax, json["Hmax"]);
          strcpy(Tcount, json["Tcount"]);
          strcpy(Hcount, json["Hcount"]);
        } else {
          Serial.println("failed to load Data file json config");
        }
      }
    }
    //---------------------------------------------------------------------------------//



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

  }
  //end read


  delay(2000);



  //-----------------------------------------------------------------------------------------------------------------------//
  WiFiManagerParameter custom_device("device", "device", device, 10);
  WiFiManagerParameter custom_line_token("LINE", "line_token", line_token, 45);

  WiFiManagerParameter custom_Tmin("Tmin", "Tmin", Tmin, 10);
  WiFiManagerParameter custom_Tmax("Tmax", "Tmax", Tmax, 10);

  WiFiManagerParameter custom_Hmin("Hmin", "Hmin", Hmin, 10);
  WiFiManagerParameter custom_Hmax("Hmax", "Hmax", Hmax, 10);

  WiFiManagerParameter custom_Tcount("Tcount", "Tcount", Tcount, 10);
  WiFiManagerParameter custom_Hcount("Hcount", "Hcount", Hcount, 10);
  //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_device);
  wifiManager.addParameter(&custom_line_token);

  wifiManager.addParameter(&custom_Tmin);
  wifiManager.addParameter(&custom_Tmax);

  wifiManager.addParameter(&custom_Hmin);
  wifiManager.addParameter(&custom_Hmax);

  wifiManager.addParameter(&custom_Tcount);
  wifiManager.addParameter(&custom_Hcount);


  delay(2000);

  for (int i = 5; i > -1; i--) {  // นับเวลาถอยหลัง 5 วินาทีก่อนกดปุ่ม AP Config
    digitalWrite(D4, LOW);
    delay(500);
    digitalWrite(D4, HIGH);
    delay(500);
    Serial.print (String(i) + " ");
  }

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

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


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

    if (!wifiManager.autoConnect("PUYIOT AP CONFIG")) {
      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(": Connected.......OK!)");
  strcpy(device, custom_device.getValue());
  strcpy(line_token, custom_line_token.getValue());

  strcpy(Tmin, custom_Tmin.getValue());
  strcpy(Tmax, custom_Tmax.getValue());

  strcpy(Hmin, custom_Hmin.getValue());
  strcpy(Hmax, custom_Hmax.getValue());

  strcpy(Tcount, custom_Tcount.getValue());
  strcpy(Hcount, custom_Hcount.getValue());

  delay(2000);

  if (shouldSaveConfig1) {
    //------------------------------------------------------------------

    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();
    //------------------------------------------------------------------
    Serial.println("saving device config");
    json["device"] = device;
    File configFile = SPIFFS.open("/config1.json", "w");
    //------------------------------------------------------------------
    Serial.println("saving line config");
    json["line_token"] = line_token;
    File configFile1 = SPIFFS.open("/config1.json", "w");
    //------------------------------------------------------------------

    Serial.println("saving Tmin config");
    json["Tmin"] = Tmin;
    File configFile2 = SPIFFS.open("/config1.json", "w");
    //------------------------------------------------------------------
    Serial.println("saving Tmax config");
    json["Tmax"] = Tmax;
    File configFile3 = SPIFFS.open("/config1.json", "w");
    //------------------------------------------------------------------


    Serial.println("saving Hmin config");
    json["Hmin"] = Hmin;
    File configFile4 = SPIFFS.open("/config1.json", "w");
    //------------------------------------------------------------------
    Serial.println("saving Hmax config");
    json["Hmax"] = Hmax;
    File configFile5 = SPIFFS.open("/config1.json", "w");


    Serial.println("saving Tcount config");
    json["Tcount"] = Tcount;
    File configFile6 = SPIFFS.open("/config1.json", "w");
    //------------------------------------------------------------------
    Serial.println("saving Hcount_ config");
    json["Hcount"] = Hcount;
    File configFile7 = SPIFFS.open("/config1.json", "w");








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

    }
    json.printTo(Serial);
    json.printTo(configFile);
    configFile.close();

    json.printTo(configFile1);
    configFile1.close();

    json.printTo(configFile2);
    configFile2.close();

    json.printTo(configFile3);
    configFile3.close();

    json.printTo(configFile4);
    configFile4.close();

    json.printTo(configFile5);
    configFile5.close();

    json.printTo(configFile6);
    configFile6.close();


    json.printTo(configFile7);
    configFile7.close();
  }

  delay(2000);

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

  Serial.println();
  Serial.print("local ip : ");
  delay(100);
  Serial.println(WiFi.localIP());
  delay(100);

  //-----------------------------------------------------------------------------------------------------------------------//
  //Print เพื่อเชคว่าค่าที่บันทึกไว้ยังอยู่หรือไม่
  Serial.println("เชคว่าค่าที่บันทึกไว้ยังอยู่หรือไม่");
  Serial.print("device =");
  Serial.println(device);

  Serial.print("line_token =");
  Serial.println(line_token);

  Serial.print("Tmin = ");
  Serial.println(Tmin);

  Serial.print("Tmax = ");
  Serial.println(Tmax);

  Serial.print("Hmin = ");
  Serial.println(Hmin);

  Serial.print("Hmax = ");
  Serial.println(Hmax);

  Serial.print("Tcount = ");
  Serial.println(Tcount);

  Serial.print("Hcount = ");
  Serial.println(Hcount);

  digitalWrite(D4, LOW);
  LINE.setToken(line_token);


  //----------------แปลงค่า Char >String > Float--------------------//
  // char Tmin[10] = "29.00";    char Tmax[10] = "35.00";  char Hmin[10] = "40.00";  char Hmax[10] = "65.00";
  // String St_Tmin;             String St_Tmax;           String St_Hmin;           String St_Hmax;
  // float Tmin_;                float Tmax_;              float Hmin_;              float Hmax_;

  Serial.println("เชคว่าค่าที่บันทึกได้ถูกแปลงเป็น Float แล้ว");

  for (int i = 0; i < sizeof(Tmin); i++)
    St_Tmin += Tmin[i];
  Tmin_ = St_Tmin.toFloat();
  Serial.print("Float Tmin = ");
  Serial.println(Tmin_);

  for (int i = 0; i < sizeof(Tmax); i++)
    St_Tmax += Tmax[i];
  Tmax_ = St_Tmax.toFloat();
  Serial.print("Float Tmax = ");
  Serial.println(Tmax_);


  for (int i = 0; i < sizeof(Hmin); i++)
    St_Hmin += Hmin[i];
  Hmin_ = St_Hmin.toFloat();
  Serial.print("Float Hmin = ");
  Serial.println(Hmin_);



  for (int i = 0; i < sizeof(Hmax); i++)
    St_Hmax += Hmax[i];
  Hmax_ = St_Hmax.toFloat();
  Serial.print("Float Hmax = ");
  Serial.println(Hmax_);

  Serial.println("เชคว่าค่าที่บันทึกได้ถูกแปลงเป็น Int แล้ว");
   //----------------แปลงค่า Char >String > Int--------------------//
  //char Tcount[6] = "10"; char Hcount[6] = "10";
  //String St_Tcount;      String St_Hcount;
  //int Tcount_;           int Hcount_;

  for (int i = 0; i < sizeof(Tcount); i++)
    St_Tcount += Tcount[i];
  Tcount_ = St_Tcount.toInt();
  Serial.print("Int Tcount = ");
  Serial.println(Tcount_);

  Tcount_1 = Tcount_ * 60;




  for (int i = 0; i < sizeof(Hcount); i++)
    St_Hcount += Hcount[i];
  Hcount_ = St_Hcount.toInt();
  Serial.print("Int Hcount = ");
  Serial.println(Hcount_);

  Hcount_1 = Hcount_ * 60;






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

}

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




//------------------------------------------------------------------------------------------------------------------------//
//*********************************************       void Loop        ***************************************************//
//------------------------------------------------------------------------------------------------------------------------//
void loop(){
}

//------------------------------------------------------------------------------------------------------------------------//
//*********************************************      จบ void Loop       **************************************************//
//------------------------------------------------------------------------------------------------------------------------//


1 Likes

อีกตัวอย่างหนึ่ง จะเป็นการป้อน latitude longitude ผ่าน การเก็บข้อมูล ด้วย File System (SPIFFS) ป้อนข้อมูล ผ่าน Wifimanager จากนั้นจะใช้ Line notify ส่งข้อความเป็น พิกัดออกมา ให้เรากด link เข้า google map ได้เลย
พร้อมส่งเข้า Thingspeak.com

11

code ครับ


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

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#include <FS.h>
#include <DNSServer.h>
#include <ArduinoJson.h>
#include <ESP8266HTTPClient.h>
//------------------------------------------------------------------------------------------------------------------------//

#include <TridentTD_LineNotify.h>
char line_token[45] = "QxxxEZdBShylI3iTTxKzxxxx8Zo1vLy2NQa7AXFgYLM";
String LineText;
String LineText1;
String LineText2;
String string1 = "https://www.google.com/maps/place/";
String string2 = ",+";
String string3 = "/@";
String string4 = "@";
String string5 = ",18z";


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

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

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


//-----------------------------------------------------------------------------------------------------------------------//
int L1_0 = 0;
int L1_01 = 0;
int L1 ;

int L2_0 = 0;
int L2_01 = 0;
int L2 ;


int L3_0 = 0;
int L3_01 = 0;
int L3 ;


int L11;
int L21;
int L31;









// ThingSpeak Settings //
char thingSpeakAddress[] = "api.thingspeak.com";
String writeAPIKey = "BBxxxYXBxxTIKLR"; // ไปเอาคีย์จากเมนู key Api เอาแบบ write
WiFiClient client;





char latitude[15] = "7.7xx888";
char longitude[15] = "99.6xxx56";


String la  ;
String lon  ;

String latitude_  ;
String longitude_  ;



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

void setup() {

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


  // ให้ LED ทั้งหมดดับก่อน
  digitalWrite(D0, LOW);//ให้หลอด LED สีฟ้าดับก่อน

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


  Serial.begin(115200);
  //-------------------------------//



  //-----------------------------------------------------------------------------------------------------------------------//
  //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(line_token, json["line_token"]);
          strcpy(latitude, json["latitude"]);
          strcpy(longitude, json["longitude"]);
        } else {
          Serial.println("failed to load Data file json config");
        }
      }
    }
    //---------------------------------------------------------------------------------//



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

  }
  //end read


  delay(1000);

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

  WiFiManagerParameter custom_line_token("LINE", "line_token", line_token, 45);

  WiFiManagerParameter custom_latitude("latitude", "latitude", latitude, 15);
  WiFiManagerParameter custom_longitude("longitude", "longitude", longitude, 15);


  //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_line_token);
  wifiManager.addParameter(&custom_latitude);
  wifiManager.addParameter(&custom_longitude);

  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(D3) == LOW) {
    digitalWrite(D0, LOW);
    Serial.println("Button Pressed");

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


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

    if (!wifiManager.autoConnect("PUYIOT AP CONFIG")) {
      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(": Connected.......OK!)");

  strcpy(line_token, custom_line_token.getValue());
  strcpy(latitude, custom_latitude.getValue());
  strcpy(longitude, custom_longitude.getValue());
  delay(1000);

  //save the custom parameters to FS


  if (shouldSaveConfig1) {

    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();
    //------------------------------------------------------------------
    Serial.println("saving line config");
    json["line_token"] = line_token;
    File configFile1 = SPIFFS.open("/config1.json", "w");
    //------------------------------------------------------------------

    Serial.println("saving latitude config");
    json["latitude"] = latitude;
    File configFile2 = SPIFFS.open("/config1.json", "w");
    //------------------------------------------------------------------
    Serial.println("saving longitude config");
    json["longitude"] = longitude;
    File configFile3 = SPIFFS.open("/config1.json", "w");
    //------------------------------------------------------------------

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

    }
    json.printTo(configFile1);
    configFile1.close();

    json.printTo(configFile2);
    configFile2.close();

    json.printTo(configFile3);
    configFile3.close();

  }

  delay(1000);

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

  Serial.println();
  Serial.print("local ip : ");
  delay(100);
  Serial.println(WiFi.localIP());
  delay(100);

  //-----------------------------------------------------------------------------------------------------------------------//
  //Print เพื่อเชคว่าค่าที่บันทึกไว้ยังอยู่หรือไม่
  Serial.println("เชคว่าค่าที่บันทึกไว้ยังอยู่หรือไม่");

  Serial.print("line_token =");
  Serial.println(line_token);

  Serial.print("latitude = ");
  Serial.println(latitude);

  Serial.print("longitude = ");
  Serial.println(longitude);

  LINE.setToken(line_token);


  LineText = string1 + latitude + string2 + longitude + string3 + latitude + string4 + longitude + string5;

  Serial.print("LineText =  ");
  Serial.println(LineText );

  delay(2000);

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

}

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






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


void loop() {


  //----------------------------------------------------------------------
  L1 = digitalRead(D5);
  Serial.println(L1);

  if (L1 == 0 and L1_0 == 0) {
    LINE.notify("xxx");
    delay(200);

    L1_0 = 1;
    L1_01 = 0;
    L11 = 1;
    sendThingSpeak();
    LINE.notify("https://thingspeak.com/channels/xxx4767");
    delay(200);
  }

  if (L1 == 0 and L1_0 == 1) {
    delay(20);
  }


  if (L1 == 1 and L1_01 == 0 ) {
    LINE.notify("xxxโปรดตรวจสอบตามพิกัดด้านล่าง");
    delay(200);

    LINE.notify(LineText);
    delay(200);

    L1_0 = 0;
    L1_01 = 1;
    L11 = 0;
    sendThingSpeak();

    LINE.notify("https://thingspeak.com/channels/xxxx4767");
    delay(200);
  }

  if (L1 == 0 and L1_01 == 1) {
    delay(20);

  }

  //----------------------------------------------------------------------
  L2 = digitalRead(D6);
  Serial.println(L2);

  if (L2 == 0 and L2_0 == 0) {
    LINE.notify("xxx");
    delay(200);

    L2_0 = 1;
    L2_01 = 0;
    L21 = 1;
    sendThingSpeak();

    LINE.notify("https://thingspeak.com/channels/1024767");
    delay(200);
  }

  if (L2 == 0 and L2_0 == 1) {
    delay(20);
  }


  if (L2 == 1 and L2_01 == 0 ) {
    LINE.notify("xxxโปรดตรวจสอบตามพิกัดด้านล่าง");
    delay(200);
    LINE.notify(LineText);
    delay(200);



    L2_0 = 0;
    L2_01 = 1;
    L21 = 0;
    sendThingSpeak();

    LINE.notify("https://thingspeak.com/channels/xxx4767");
    delay(200);
  }

  if (L2 == 0 and L2_01 == 1) {
    delay(20);

  }


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

  L3 = digitalRead(D7);
  Serial.println(L3);

  if (L3 == 0 and L3_0 == 0) {
    LINE.notify("xxx");
    delay(200);

    L3_0 = 1;
    L3_01 = 0;
    L31 = 1;
    sendThingSpeak();

    LINE.notify("https://thingspeak.com/channels/xxx4767");
    delay(200);
  }

  if (L3 == 0 and L3_0 == 1) {
    delay(20);
  }


  if (L3 == 1 and L3_01 == 0 ) {
    LINE.notify("xxxโปรดตรวจสอบตามพิกัดด้านล่าง");
    delay(200);
    LINE.notify(LineText);
    delay(200);



    L3_0 = 0;
    L3_01 = 1;
    L31 = 0;

    sendThingSpeak();

    LINE.notify("https://thingspeak.com/channels/xxx4767");
    delay(200);
  }

  if (L3 == 0 and L3_01 == 1) {
    delay(20);

  }

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


  //  Serial.print("String la = ");
  //  Serial.println(la);
  //  Serial.print("String lon = ");
  //  Serial.println(lon);




  delay(1000);

}

//------------------------------------------------------------------------------------------------------------------------//
//*********************************************      จบ void Loop       **************************************************//
//------------------------------------------------------------------------------------------------------------------------//



void sendThingSpeak()//1 วันได้แค่ 8200 ครั้ง (ฟรี)
{

  String L1_thingspeak = (String) L11; // แปลงเป็น string
  String L2_thingspeak = (String) L21;
  String L3_thingspeak = (String) L31;
  String data = "field1=" + L1_thingspeak + "&field2=" + L2_thingspeak + "&field3=" + L3_thingspeak; // แปลงเป็น string ให้หมดเพื่อจะส่ง

  if (client.connect(thingSpeakAddress, 80)) {
    client.print("POST /update HTTP/1.1\n");
    client.print("Host: api.thingspeak.com\n");
    client.print("Connection: close\n");
    client.print("X-THINGSPEAKAPIKEY: " + writeAPIKey + "\n");
    client.print("Content-Type: application/x-www-form-urlencoded\n");
    client.print("Content-Length: ");
    client.print(data.length());
    client.print("\n\n");
    client.print(data); // ข้อมูลเรานะครับ
  }



  delay(20000);


}

ลอง focus ไปที่ Line notify นะครับ

ต่อไปเป็นการ ใส่ชื่อ กำกับ ช่อง ที่เราได้สร้างขึ้นมา

ความต้องการของ Project
WiFiManager Version 0.14.0 //https://github.com/tzapu/WiFiManager

1

 WiFiManagerParameter custom_text ( " <p>  </p> " );
  WiFiManagerParameter custom_text0 ( " <label> ป้อน ID Line Token </label> " );
  WiFiManagerParameter custom_text1 ( " <label> ป้อน longitude </label> " );
  WiFiManagerParameter custom_text2 ( " <label> ป้อน longitude </label> " );
  WiFiManagerParameter custom_line_token("LINE", "line_token", line_token, 45);

  WiFiManagerParameter custom_latitude("latitude", "latitude", latitude, 15);
  WiFiManagerParameter custom_longitude("longitude", "longitude", longitude, 15);


  //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_text);
  wifiManager.addParameter (& custom_text0);
  wifiManager.addParameter(&custom_line_token);
  wifiManager.addParameter (& custom_text1);
  wifiManager.addParameter(&custom_latitude);
  wifiManager.addParameter (& custom_text2);
  wifiManager.addParameter(&custom_longitude);

  delay(1000);

ส่วน

แก้ใน C:\Users\MAXGOD\Documents\Arduino\libraries\WiFiManager\WiFiManager.h

const char HTTP_HEAD[] PROGMEM            = "<!DOCTYPE html><html lang=\"en-TH\"><head><meta charset=\"UTF-8\"name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no\"/><title>IOT PFAS</title>";
const char HTTP_STYLE[] PROGMEM           = "<style>.c{text-align: center;} div,input{padding:5px;font-size:1em;} input{width:95%;} body{text-align: center;font-family:verdana;} button{border:0;border-radius:0.3rem;background-color:#1fa3ec;color:#fff;line-height:2.4rem;font-size:1.2rem;width:100%;} .q{float: right;width: 64px;text-align: right;} .l{background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAALVBMVEX///8EBwfBwsLw8PAzNjaCg4NTVVUjJiZDRUUUFxdiZGSho6OSk5Pg4eFydHTCjaf3AAAAZElEQVQ4je2NSw7AIAhEBamKn97/uMXEGBvozkWb9C2Zx4xzWykBhFAeYp9gkLyZE0zIMno9n4g19hmdY39scwqVkOXaxph0ZCXQcqxSpgQpONa59wkRDOL93eAXvimwlbPbwwVAegLS1HGfZAAAAABJRU5ErkJggg==\") no-repeat left center;background-size: 1em;}</style>";
const char HTTP_SCRIPT[] PROGMEM          = "<script>function c(l){document.getElementById('s').value=l.innerText||l.textContent;document.getElementById('p').focus();}</script>";
const char HTTP_HEAD_END[] PROGMEM        = "</head><body><div style='text-align:left;display:inline-block;min-width:260px;'>";
const char HTTP_PORTAL_OPTIONS[] PROGMEM  = "<form action=\"/wifi\" method=\"get\"><button>Configure WiFi</button></form><br/><form action=\"/0wifi\" method=\"get\"><button>Configure WiFi (No Scan)</button></form><br/><form action=\"/i\" method=\"get\"><button>Info</button></form><br/><form action=\"/r\" method=\"post\"><button>Reset</button></form><br/><br/><br/><label>พัฒนาโดย :  xxxxxxxxxx</label><br/><label>ติดต่อ :  xxxxxxxxxx</label>";
const char HTTP_ITEM[] PROGMEM            = "<div><a href='#p' onclick='c(this)'>{v}</a>&nbsp;<span class='q {i}'>{r}%</span></div>";
const char HTTP_FORM_START[] PROGMEM      = "<form method='get' action='wifisave'><label>ชื่อ WiFi</label><input id='s' name='s' length=32 placeholder='SSID'><br/><label>ป้อนรหัสผ่าน WiFi</label><input id='p' name='p' length=64 type='password' placeholder='password'><br/>";
const char HTTP_FORM_PARAM[] PROGMEM      = "<br/><input id='{i}' name='{n}' maxlength={l} placeholder='{p}' value='{v}' {c}><br/>";
const char HTTP_FORM_END[] PROGMEM        = "<br/><button type='submit'>save</button></form>";
const char HTTP_SCAN_LINK[] PROGMEM       = "<br/><div class=\"c\"><a href=\"/wifi\">Scan</a></div>";
const char HTTP_SAVED[] PROGMEM           = "<div>Credentials Saved<br />Trying to connect ESP to network.<br />If it fails reconnect to AP to try again</div>";
const char HTTP_END[] PROGMEM             = "</div></body></html>";

ใส่กรอบ code ไม่เข้าครับ

อยากได้ code โปรแกรมสุดท้ายนี้ครับ ขอรบกวนด้วยนะครับ Email c.thanate@gmail ขอบคุณครับ

ลองเอาไปใช้ดูนะครับ ผมแชร์เผื่อคนอื่นๆ ที่สนใจด้วย
Node MCU ESP8266
ความต้องการของ Project (เพื่อป้องกันความผิดพลาดเรื่องของ Version และตรวจสอบย้อนหลังได้)
Arduino IDE Version 1.8.7
WiFiManager Version 0.14.0 (โหลด link ที่ให้ไป ผมปรับแต่งไว้แล้ว ด้านล่าง)
ArduinoJson Version 5.13.3

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

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#include <FS.h>
#include <DNSServer.h>
#include <ArduinoJson.h>
#include <ESP8266HTTPClient.h>
//------------------------------------------------------------------------------------------------------------------------//

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

String LineText;
String string1 = "https://www.google.com/maps/place/";
String string2 = ",+";
String string3 = "/@";
String string4 = "@";
String string5 = ",18z";

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

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

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


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


char latitude[15] = "7.795888";
char longitude[15] = "99.629156";




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

void setup() {

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

  // ให้ LED ทั้งหมดดับก่อน
  digitalWrite(D0, LOW);//ให้หลอด LED สีฟ้าดับก่อน

  Serial.begin(115200);


  //-----------------------------------------------------------------------------------------------------------------------//
  //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(line_token, json["line_token"]);
          strcpy(latitude, json["latitude"]);
          strcpy(longitude, json["longitude"]);
        } 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_text1("<label>1: ID Line กลุ่ม</label>");
  WiFiManagerParameter custom_text2("<label>2: latitude</label>");
  WiFiManagerParameter custom_text3("<label>3: longitude</label>");
  WiFiManagerParameter custom_line_token("LINE", "line_token", line_token, 45);
  WiFiManagerParameter custom_latitude("latitude", "latitude", latitude, 15);
  WiFiManagerParameter custom_longitude("longitude", "longitude", longitude, 15);


  //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_text1);
  wifiManager.addParameter(&custom_line_token);
  wifiManager.addParameter(&custom_text2);
  wifiManager.addParameter(&custom_latitude);
  wifiManager.addParameter(&custom_text3);
  wifiManager.addParameter(&custom_longitude);

  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(D3) == LOW) {
    digitalWrite(D0, LOW);
    Serial.println("Button Pressed");

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


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

    if (!wifiManager.autoConnect("PUY IOT")) {
      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(": Connected.......OK!)");

  strcpy(line_token, custom_line_token.getValue());
  strcpy(latitude, custom_latitude.getValue());
  strcpy(longitude, custom_longitude.getValue());
  delay(1000);

  //save the custom parameters to FS


  if (shouldSaveConfig1) {

    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();
    //------------------------------------------------------------------
    Serial.println("saving line config");
    json["line_token"] = line_token;
    File configFile1 = SPIFFS.open("/config1.json", "w");
    //------------------------------------------------------------------

    Serial.println("saving latitude config");
    json["latitude"] = latitude;
    File configFile2 = SPIFFS.open("/config1.json", "w");
    //------------------------------------------------------------------
    Serial.println("saving longitude config");
    json["longitude"] = longitude;
    File configFile3 = SPIFFS.open("/config1.json", "w");
    //------------------------------------------------------------------

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

    }
    json.printTo(configFile1);
    configFile1.close();

    json.printTo(configFile2);
    configFile2.close();

    json.printTo(configFile3);
    configFile3.close();

  }

  delay(1000);

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

  Serial.println();
  Serial.print("local ip : ");
  delay(100);
  Serial.println(WiFi.localIP());
  delay(100);

  //-----------------------------------------------------------------------------------------------------------------------//
  //Print เพื่อเชคว่าค่าที่บันทึกไว้ยังอยู่หรือไม่
  Serial.println("เชคว่าค่าที่บันทึกไว้ยังอยู่หรือไม่");

  Serial.print("line_token =");
  Serial.println(line_token);

  Serial.print("latitude = ");
  Serial.println(latitude);

  Serial.print("longitude = ");
  Serial.println(longitude);

  LINE.setToken(line_token);






  LineText = string1 + latitude + string2 + longitude + string3 + latitude + string4 + longitude + string5;

void loop() {
}

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

1


11

Wifi Manager ใช้คู่กัน Download

ผมปรับหน้า Interface ไว้แล้ว เอาไปศึกษาดูนะครับ

ขอบคุณนะครับสำหรับตัวอย่างที่กรุณาส่งมาให้ใช้ศึกษา

จุดแก้เกี่ยวกับสี ของ Web (แก้ใน WiFiManager.h ) ให้ทดสอบดูว่า สีที่เปลี่ยนอยู่ในตำแหน่งไหน

จุดแก้เกี่ยวกับข้อความ ของ Web (แก้ใน WiFiManager.ccp )
44

ลองทดสอบกันนะครับ ใครได้สีสัน ยังไง โพสต์รูปมา โชว์ + Code กันหน่อยนะครับ ผมทำได้ แต่ก็ไม่ดีมาก ก็พยายามจะเอามาแบ่งปันกัน โดยมีจุดประสงค์ เพื่อยกระดับ ความสามารถของคน GEN Y และ GEN Z นะครับ การแบ่งปันคือความสุข สุขที่เห็นคนอื่นๆ เค้าทำได้แล้วมีความสุข

1 Likes

พอดีหาข้อมูลแล้วตามเข้ามาเว็บตัวเอง แล้วเจอพอดีครับพี่ แก้ให้เรียบร้อย ตก ' ไปหนึ่งตัว