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 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 ❤❤❤❤❤
|