// 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 filenames
Config config ; // <- global configuration object
// Loads the configuration from a file
void 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 file
void 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 Serial
void 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 ❤❤❤❤❤