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

ลองเอาไปใช้ดูนะครับ ผมแชร์เผื่อคนอื่นๆ ที่สนใจด้วย
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() {
}

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


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

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