Save and load information in JS permanently

I have an ESP8266 sketch that will allow users to input their ip address and password and their thingSpeak write api when they power up the device (ESP8266 connected to Arduino UNO v3). I am using the attached code which I use the Arduino IDE to send to device. I use Flash Size: 512K (128K SPIFFS) when uploading to the ESP8266 because of the SPIFFS in the code and the FS is mounted and the custom parameters are supposedly saved to the config file. Anyway the serial printer says they are.
Once the ip address and password along with api.thingspeak.com and write api are entered and saved the ESP8266 restarts and connects and starts to upload the two sensor readings to ThingSpeak. This is great!!
However, I want my project to be self sufficient (batteries and solar charger) so I am trying to cut power usage as much as possible. The code that is on the Arduino turns on the ESP8266 every hr. when the pool is slowly dropping because of evaporation and every two minutes when the pool is filling.
The problem is that when I cut power to the ESP8266 and restart it nothing happens. The blue light on the ESP8266 blinks but it does not connect to the wifi and to thingSpeak and upload the sensor readings. NOTHING HAPPENS.
So my question is:
How do is connect to the wifi inside the (void) loop and get the information stored in the SPIFFS to connect to ThingSpeak and upload to my write API. I don’t understand why store information in the SPIFFS if you can’t retrieve it.

Here is my code:

#include <FS.h>

 #include <ESP8266WiFi.h> //https://github.com/esp8266/Arduino

 //needed for library
 #include <DNSServer.h>
 #include <ESP8266WebServer.h>
 #include <WiFiManager.h> //https://github.com/tzapu/WiFiManager
 #include <ArduinoJson.h>

 //NEW STUFF START

 char apiKey[20]="";
 WiFiClient client;

 char defaultHost[100] = "api.thingspeak.com"; //Thing Speak IP address (sometime the web address causes issues with ESP's :/
     long itt = 500;
     long itt2 = 500;

 const byte wifiResetPin = 13;
 int interruptPinDebounce = 0;
 long debouncing_time = 1000;
 volatile unsigned long wifiResetLastMillis = 0;


 bool shouldSaveConfig = false;

 void saveConfigCallback () {
   Serial.println("Should save config");
   shouldSaveConfig = true;}

   void handleWifiReset(){
     if(millis()<wifiResetLastMillis){
       wifiResetLastMillis = millis();
     }
     if((millis() - wifiResetLastMillis)>= debouncing_time){
       Serial.println("Clearing WiFi data resetting");
       WiFiManager wifiManager;
       wifiManager.resetSettings();
       SPIFFS.format();
       ESP.reset();
       delay(1000);
     }
     wifiResetLastMillis = millis();
   }

 void setup() {
   WiFiManager wifiManager;
     // put your setup code here, to run once:
     Serial.begin(115200);
     pinMode(wifiResetPin, INPUT_PULLUP);
     attachInterrupt(digitalPinToInterrupt(wifiResetPin), handleWifiReset,FALLING);

     //NEW STUFF START
     //clean FS, for testing
   //SPIFFS.format();

   //read configuration from FS json
   Serial.println("mounting FS...");

   if (SPIFFS.begin()) {
     Serial.println("mounted file system");
     if (SPIFFS.exists("/config.json")) {
       //file exists, reading and loading
       Serial.println("reading config file");
       File configFile = SPIFFS.open("/config.json", "r");
       if (configFile) {
         Serial.println("opened config file");
         size_t size = configFile.size();
         // Allocate a buffer to store contents of the file.
         std::unique_ptr<char[]> buf(new char[size]);

         configFile.readBytes(buf.get(), size);
         DynamicJsonBuffer jsonBuffer;
         JsonObject& json = jsonBuffer.parseObject(buf.get());
         json.printTo(Serial);
         if (json.success()) {
           Serial.println("\nparsed json");
           strcpy(defaultHost, json["defaultHost"]);
           strcpy(apiKey, json["apiKey"]);
         } else {
           Serial.println("failed to load json config");
         }
       }
     }
   } else {
     Serial.println("failed to mount FS");
   }
   WiFiManagerParameter customHostServer("defaultHost", "Host Server", defaultHost, 100);
   WiFiManagerParameter customAPIKey("apiKey", "ThingSpeakWriteAPI", apiKey, 20);
 //END NEW STUFF
     //WiFiManager
     //Local intialization. Once its business is done, there is no need to keep it around
    //WiFiManager wifiManager;

     //NEW STUFF START
     wifiManager.setSaveConfigCallback(saveConfigCallback);
     wifiManager.addParameter(&customHostServer);
     wifiManager.addParameter(&customAPIKey);
      //END NEW STUFF
     //reset saved settings
   //wifiManager.resetSettings();

     //set custom ip for portal
     //wifiManager.setAPStaticIPConfig(IPAddress(10,0,1,1), IPAddress(10,0,1,1), IPAddress(255,255,255,0));

     //fetches ssid and pass from eeprom and tries to connect
     //if it does not connect it starts an access point with the specified name
     //here "AutoConnectAP"
     //and goes into a blocking loop awaiting configuration
     wifiManager.autoConnect("AutoConnectAP");
     Serial.println("Connected");
   //NEW STUFF START
   strcpy(defaultHost, customHostServer.getValue());
   strcpy(apiKey, customAPIKey.getValue());
   if (shouldSaveConfig) {
     Serial.println("saving config");
     DynamicJsonBuffer jsonBuffer;
     JsonObject& json = jsonBuffer.createObject();
     json["defaultHost"] = defaultHost;
     json["apiKey"] = apiKey;
     File configFile = SPIFFS.open("/config.json", "w");
     if (!configFile) {
       Serial.println("failed to open config file for writing");
     }
     json.printTo(Serial);
     json.printTo(configFile);
     configFile.close();
     //end save
   }
   Serial.println("local ip");
   Serial.println(WiFi.localIP());
   //END NEW STUFF
     //or use this for auto generated name ESP + ChipID
     //wifiManager.autoConnect();
 pinMode(2,INPUT);
 pinMode(1,INPUT);
     Serial.println("WriteApi");
     Serial.println(apiKey);
     //if you get here you have connected to the WiFi
     Serial.println("connected...yeey :)");
      //save the custom parameters to FS
      strcpy(defaultHost,customHostServer.getValue());
   strcpy(apiKey,customAPIKey.getValue());
 }
 //callback notifying us of the need to save config
 void loop() {
   delay(5000);

 char defaultHost[100] = "api.thingspeak.com";
   pinMode(2,INPUT);
   pinMode(1,INPUT);

   const int waterInPin = 2; // Analog input pin that the potentiometer is attached to
     const int BatteryInPin = 1; // Analog input pin that the potentiometer is attached to
     int waterSensorInValue;//reading our water lever sensor
 int waterSensorOutValue;//conversion of water sensor value
 int BatterySensorInValue;//reading our water lever sensor
 int BatterySensorOutValue;//conversion of water sensor value
     // put your main code here, to run repeatedly:
     waterSensorInValue = analogRead(waterInPin);
    BatterySensorInValue = analogRead(BatteryInPin);
   waterSensorOutValue = map(waterSensorInValue,0,1024,0,225);
   BatterySensorOutValue = map(BatterySensorInValue,0,1024,0,225);
  Serial.println("WaterOutValue = ");
   Serial.println(waterSensorOutValue );
   Serial.println("WaterInValue = ");
   Serial.println(waterSensorInValue );
   Serial.println("BatteryOutValue = ");
   Serial.println(BatterySensorOutValue );
   Serial.println("BatteryInValue = ");
   Serial.println(BatterySensorInValue);
     delay(18000);
     itt = waterSensorInValue;
     itt2 = BatterySensorInValue;
     if (client.connect(defaultHost,80))
     { // "184.106.153.149" or api.thingspeak.com
         itt++; //Replace with a sensor reading or something useful

         String postStr = apiKey;
         postStr +="&field1=";
         postStr += String(itt);
         postStr +="&field2=";
         postStr += String(itt2);
         postStr += "\r\n\r\n\r\n";

         client.print("POST /update HTTP/1.1\n");
         client.print("Host: api.thingspeak.com\n");
         client.print("Connection: close\n");
         client.print("X-THINGSPEAKAPIKEY: "+String (apiKey)+"\n");
         client.print("Content-Type: application/x-www-form-urlencoded\n");
         client.print("Content-Length: ");
         client.print(postStr.length());
         client.print("\n\n\n");
         client.print(postStr);
         Serial.println("% send to Thingspeak");
     }
     client.stop();
     Serial.println("Waiting…");
     delay(55000);
 }

Thanks for any help you can give me or directions to an example/tutorial on how to make this happen.

1 Like

Amigo usted podrĂ­a ayudarme?

Programe el esp8266 como repetidor wifi pero cuando intento conectarme a una red wifi que tiene un ssid con un espacio no se conecta y me devuelve poniendo un signo + donde estaba el espacio.
Que puedo hacer para poder conectarme a una ssid que tenga espacios?