diff --git a/Software/Software.ino b/Software/Software.ino index 56418515..3b0cb5db 100644 --- a/Software/Software.ino +++ b/Software/Software.ino @@ -2,6 +2,7 @@ /* Only change battery specific settings in "USER_SETTINGS.h" */ #include +#include #include "HardwareSerial.h" #include "USER_SETTINGS.h" #include "src/battery/BATTERIES.h" @@ -18,6 +19,8 @@ #include "src/devboard/webserver/webserver.h" #endif +Preferences preferences; // Parameter storage + // Interval settings int intervalUpdateValues = 4800; // Interval at which to update inverter values / Modbus registers const int interval10 = 10; // Interval for 10ms tasks @@ -102,6 +105,8 @@ bool inverterAllowsContactorClosing = true; void setup() { init_serial(); + init_storage(); + #ifdef WEBSERVER init_webserver(); #endif @@ -169,6 +174,37 @@ void init_serial() { Serial.println("__ OK __"); } +void init_storage() { + preferences.begin("batterySettings", false); + +#ifdef CLEAR_SAVED_SETTINGS + preferences.clear(); // If this clear function is executed, no parameters will be read from storage +#endif + + static uint16_t temp = 0; + temp = preferences.getUInt("BATTERY_WH_MAX", false); + if (temp != 0) { + BATTERY_WH_MAX = temp; + } + temp = preferences.getUInt("MAXPERCENTAGE", false); + if (temp != 0) { + MAXPERCENTAGE = temp; + } + temp = preferences.getUInt("MINPERCENTAGE", false); + if (temp != 0) { + MINPERCENTAGE = temp; + } + temp = preferences.getUInt("MAXCHARGEAMP", false); + if (temp != 0) { + MAXCHARGEAMP = temp; + } + temp = preferences.getUInt("MAXDISCHARGEAMP", false); + if (temp != 0) { + MAXDISCHARGEAMP = temp; + } + preferences.end(); +} + void init_CAN() { // CAN pins pinMode(CAN_SE_PIN, OUTPUT); @@ -669,3 +705,13 @@ void init_serialDataLink() { Serial2.begin(9600, SERIAL_8N1, RS485_RX_PIN, RS485_TX_PIN); #endif } + +void storeParameters() { + preferences.begin("batterySettings", false); + preferences.putUInt("BATTERY_WH_MAX", BATTERY_WH_MAX); + preferences.putUInt("MAXPERCENTAGE", MAXPERCENTAGE); + preferences.putUInt("MINPERCENTAGE", MINPERCENTAGE); + preferences.putUInt("MAXCHARGEAMP", MAXCHARGEAMP); + preferences.putUInt("MAXDISCHARGEAMP", MAXDISCHARGEAMP); + preferences.end(); +} diff --git a/Software/USER_SETTINGS.cpp b/Software/USER_SETTINGS.cpp index 77c5a7d9..e47eef34 100644 --- a/Software/USER_SETTINGS.cpp +++ b/Software/USER_SETTINGS.cpp @@ -22,5 +22,5 @@ const char* ssid = "REPLACE_WITH_YOUR_SSID"; // Maximum of 63 character const char* password = "REPLACE_WITH_YOUR_PASSWORD"; // Minimum of 8 characters; const char* ssidAP = "Battery Emulator"; // Maximum of 63 characters; const char* passwordAP = "123456789"; // Minimum of 8 characters; set to NULL if you want the access point to be open -const char* versionNumber = "4.4.0"; // The current software version, shown on webserver +const char* versionNumber = "4.5.0"; // The current software version, shown on webserver #endif diff --git a/Software/USER_SETTINGS.h b/Software/USER_SETTINGS.h index ee6f809b..28e32e86 100644 --- a/Software/USER_SETTINGS.h +++ b/Software/USER_SETTINGS.h @@ -17,7 +17,7 @@ //#define RENAULT_ZOE_BATTERY //#define SANTA_FE_PHEV_BATTERY //#define TESLA_MODEL_3_BATTERY -//#define TEST_FAKE_BATTERY +#define TEST_FAKE_BATTERY /* Select inverter communication protocol. See Wiki for which to use with your inverter: https://github.com/dalathegreat/BYD-Battery-Emulator-For-Gen24/wiki */ //#define BYD_CAN //Enable this line to emulate a "BYD Battery-Box Premium HVS" over CAN Bus @@ -36,7 +36,8 @@ //#define DUAL_CAN //Enable this line to activate an isolated secondary CAN Bus using add-on MCP2515 controller (Needed for FoxESS inverters) //#define SERIAL_LINK_RECEIVER //Enable this line to receive battery data over RS485 pins from another Lilygo (This LilyGo interfaces with inverter) //#define SERIAL_LINK_TRANSMITTER //Enable this line to send battery data over RS485 pins to another Lilygo (This LilyGo interfaces with battery) -//#define WEBSERVER //Enable this line to enable WiFi, and to run the webserver. See USER_SETTINGS.cpp for the Wifi settings. +#define WEBSERVER //Enable this line to enable WiFi, and to run the webserver. See USER_SETTINGS.cpp for the Wifi settings. +//#define CLEAR_SAVED_SETTINGS //Enable this line to clear all data that has been saved via the webserver page /* Battery limits: These are set in the USER_SETTINGS.cpp file, or later on via the Webserver */ extern volatile uint16_t BATTERY_WH_MAX; diff --git a/Software/src/devboard/webserver/webserver.cpp b/Software/src/devboard/webserver/webserver.cpp index 6a44cf2d..1ff67d6d 100644 --- a/Software/src/devboard/webserver/webserver.cpp +++ b/Software/src/devboard/webserver/webserver.cpp @@ -1,4 +1,7 @@ #include "webserver.h" +#include + +Preferences preferences3; // Create AsyncWebServer object on port 80 AsyncWebServer server(80); @@ -65,6 +68,7 @@ void init_webserver() { if (request->hasParam("value")) { String value = request->getParam("value")->value(); BATTERY_WH_MAX = value.toInt(); + storeParameters(); request->send(200, "text/plain", "Updated successfully"); } else { request->send(400, "text/plain", "Bad Request"); @@ -76,6 +80,7 @@ void init_webserver() { if (request->hasParam("value")) { String value = request->getParam("value")->value(); MAXPERCENTAGE = value.toInt() * 10; + storeParameters(); request->send(200, "text/plain", "Updated successfully"); } else { request->send(400, "text/plain", "Bad Request"); @@ -87,6 +92,7 @@ void init_webserver() { if (request->hasParam("value")) { String value = request->getParam("value")->value(); MINPERCENTAGE = value.toInt() * 10; + storeParameters(); request->send(200, "text/plain", "Updated successfully"); } else { request->send(400, "text/plain", "Bad Request"); @@ -98,6 +104,7 @@ void init_webserver() { if (request->hasParam("value")) { String value = request->getParam("value")->value(); MAXCHARGEAMP = value.toInt() * 10; + storeParameters(); request->send(200, "text/plain", "Updated successfully"); } else { request->send(400, "text/plain", "Bad Request"); @@ -109,6 +116,7 @@ void init_webserver() { if (request->hasParam("value")) { String value = request->getParam("value")->value(); MAXDISCHARGEAMP = value.toInt() * 10; + storeParameters(); request->send(200, "text/plain", "Updated successfully"); } else { request->send(400, "text/plain", "Bad Request"); diff --git a/Software/src/devboard/webserver/webserver.h b/Software/src/devboard/webserver/webserver.h index 41c5c309..30a14d2c 100644 --- a/Software/src/devboard/webserver/webserver.h +++ b/Software/src/devboard/webserver/webserver.h @@ -1,7 +1,7 @@ #ifndef WEBSERVER_H #define WEBSERVER_H -// Load Wi-Fi library +#include #include #include "../../../USER_SETTINGS.h" // Needed for WiFi ssid and password #include "../../lib/ayushsharma82-ElegantOTA/src/ElegantOTA.h" @@ -128,4 +128,7 @@ void onOTAEnd(bool success); template String formatPowerValue(String label, T value, String unit, int precision); +extern void storeParameters(); +extern void restoreParameters(); + #endif