| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 | // ArduinoJson - https://arduinojson.org// Copyright © 2014-2022, Benoit BLANCHON// MIT License//// This example shows how to store your project configuration in a file.// It uses the SD library but can be easily modified for any other file-system.//// The file contains a JSON document with the following content:// {//   "hostname": "examples.com",//   "port": 2731// }//// To run this program, you need an SD card connected to the SPI bus as follows:// * MOSI <-> pin 11// * MISO <-> pin 12// * CLK  <-> pin 13// * CS   <-> pin 4//// https://arduinojson.org/v6/example/config/#include <ArduinoJson.h>#include <SD.h>#include <SPI.h>// Our configuration structure.//// Never use a JsonDocument to store the configuration!// A JsonDocument is *not* a permanent storage; it's only a temporary storage// used during the serialization phase. See:// https://arduinojson.org/v6/faq/why-must-i-create-a-separate-config-object/struct Config {  char hostname[64];  int port;};const char *filename = "/config.txt";  // <- SD library uses 8.3 filenamesConfig config;                         // <- global configuration object// Loads the configuration from a filevoid loadConfiguration(const char *filename, Config &config) {  // Open file for reading  File file = SD.open(filename);  // Allocate a temporary JsonDocument  // Don't forget to change the capacity to match your requirements.  // Use https://arduinojson.org/v6/assistant to compute the capacity.  StaticJsonDocument<512> doc;  // Deserialize the JSON document  DeserializationError error = deserializeJson(doc, file);  if (error)    Serial.println(F("Failed to read file, using default configuration"));  // Copy values from the JsonDocument to the Config  config.port = doc["port"] | 2731;  strlcpy(config.hostname,                  // <- destination          doc["hostname"] | "example.com",  // <- source          sizeof(config.hostname));         // <- destination's capacity  // Close the file (Curiously, File's destructor doesn't close the file)  file.close();}// Saves the configuration to a filevoid saveConfiguration(const char *filename, const Config &config) {  // Delete existing file, otherwise the configuration is appended to the file  SD.remove(filename);  // Open file for writing  File file = SD.open(filename, FILE_WRITE);  if (!file) {    Serial.println(F("Failed to create file"));    return;  }  // Allocate a temporary JsonDocument  // Don't forget to change the capacity to match your requirements.  // Use https://arduinojson.org/assistant to compute the capacity.  StaticJsonDocument<256> doc;  // Set the values in the document  doc["hostname"] = config.hostname;  doc["port"] = config.port;  // Serialize JSON to file  if (serializeJson(doc, file) == 0) {    Serial.println(F("Failed to write to file"));  }  // Close the file  file.close();}// Prints the content of a file to the Serialvoid printFile(const char *filename) {  // Open file for reading  File file = SD.open(filename);  if (!file) {    Serial.println(F("Failed to read file"));    return;  }  // Extract each characters by one by one  while (file.available()) {    Serial.print((char)file.read());  }  Serial.println();  // Close the file  file.close();}void setup() {  // Initialize serial port  Serial.begin(9600);  while (!Serial) continue;  // Initialize SD library  const int chipSelect = 4;  while (!SD.begin(chipSelect)) {    Serial.println(F("Failed to initialize SD library"));    delay(1000);  }  // Should load default config if run for the first time  Serial.println(F("Loading configuration..."));  loadConfiguration(filename, config);  // Create configuration file  Serial.println(F("Saving configuration..."));  saveConfiguration(filename, config);  // Dump config file  Serial.println(F("Print config file..."));  printFile(filename);}void loop() {  // not used in this example}// Performance issue?// ------------------//// File is an unbuffered stream, which is not optimal for ArduinoJson.// See: https://arduinojson.org/v6/how-to/improve-speed/// See also// --------//// https://arduinojson.org/ contains the documentation for all the functions// used above. It also includes an FAQ that will help you solve any// serialization or deserialization problem.//// The book "Mastering ArduinoJson" contains a case study of a project that has// a complex configuration with nested members.// Contrary to this example, the project in the book uses the SPIFFS filesystem.// Learn more at https://arduinojson.org/book/// Use the coupon code TWENTY for a 20% discount ❤❤❤❤❤
 |