I have some difficulties setting the wifimanager's configuration page. In the attached screenshot, the text input is shown in the wrong position.
The used code is below:
#include <WiFiManager.h>
#include <EEPROM.h>
String lineToken = "";
String threshold = "";
String breakfastTime = "08:00";
String lunchTime = "12:00";
String dinnerTime = "17:00";
String eveningTime = "18:00";
int notificationThreshold = 5;
bool sendNotification = true; // Notification toggle
bool soundAlarm = true; // Sound alarm toggle
// Buffers for Custom HTML Checkboxes
char customHtml_checkbox_sendNotification[50] = "type=\"checkbox\"";
char customHtml_checkbox_soundAlarm[50] = "type=\"checkbox\"";
// EEPROM Configuration
#define EEPROM_SIZE 512
// EEPROM Addresses for Various Settings
#define EEPROM_LINE_TOKEN_ADDRESS 0
#define EEPROM_SEND_NOTIFICATION_ADDRESS 200
#define EEPROM_SOUND_ALARM_ADDRESS 201
#define EEPROM_THRESHOLD_ADDRESS 202
#define EEPROM_BREAKFAST_TIME_ADDRESS 300
#define EEPROM_LUNCH_TIME_ADDRESS 350
#define EEPROM_DINNER_TIME_ADDRESS 400
#define EEPROM_EVENING_TIME_ADDRESS 450
// Flag for saving data
bool shouldSaveConfig = false;
void setup() {
Serial.begin(115200);
// Load Settings from EEPROM
loadSettings();
WiFiManager wifiManager;
wifiManager.setSaveConfigCallback(saveConfigCallback);
WiFiManagerParameter lineTokenParam("lineToken", "Line Token", "", 100, "", WFM_LABEL_BEFORE);
WiFiManagerParameter thresholdParam("threshold", "Notification Threshold (minutes)", String(notificationThreshold).c_str(), 5, "", WFM_LABEL_BEFORE);
// Correct the position and attributes for meal time parameters
WiFiManagerParameter breakfastTimeParam("breakfastTime", "Breakfast Time", "", 10, "", WFM_LABEL_AFTER);
WiFiManagerParameter lunchTimeParam("lunchTime", "Lunch Time", "", 10, "", WFM_LABEL_AFTER);
WiFiManagerParameter dinnerTimeParam("dinnerTime", "Dinner Time", "", 10, "", WFM_LABEL_AFTER);
WiFiManagerParameter eveningTimeParam("eveningTime", "Evening Time", "", 10, "", WFM_LABEL_AFTER);
WiFiManagerParameter custom_sendNotification_checkbox("sendNotification", "Enable Notification", "T", 2, customHtml_checkbox_sendNotification, WFM_LABEL_AFTER);
WiFiManagerParameter custom_soundAlarm_checkbox("soundAlarm", "Enable Sound Alarm", "T", 2, customHtml_checkbox_soundAlarm, WFM_LABEL_AFTER);
// Add Parameters to WiFiManager
wifiManager.addParameter(&lineTokenParam);
wifiManager.addParameter(&thresholdParam);
wifiManager.addParameter(&breakfastTimeParam);
wifiManager.addParameter(&lunchTimeParam);
wifiManager.addParameter(&dinnerTimeParam);
wifiManager.addParameter(&eveningTimeParam);
wifiManager.addParameter(&custom_sendNotification_checkbox);
wifiManager.addParameter(&custom_soundAlarm_checkbox);
// Start AutoConnect
wifiManager.autoConnect("HomeAP");
lineToken = String(lineTokenParam.getValue());
breakfastTime = String(breakfastTimeParam.getValue());
lunchTime = String(lunchTimeParam.getValue());
dinnerTime = String(dinnerTimeParam.getValue());
eveningTime = String(eveningTimeParam.getValue());
notificationThreshold = String(thresholdParam.getValue()).toInt();
// Save Updated Settings to EEPROM if Needed
if (shouldSaveConfig) {
saveSettings();
}
}
void loop(){
}
// Callback Function to Indicate Configuration Save is Needed
void saveConfigCallback() {
Serial.println("Configuration change detected. Saving settings...");
shouldSaveConfig = true;
}
// Function to Save Settings to EEPROM
void saveSettings() {
EEPROM.begin(EEPROM_SIZE);
// Debugging: Print the values before saving
Serial.println("Saving settings...");
Serial.println("Line Token: " + lineToken);
Serial.println("Breakfast Time: " + breakfastTime);
Serial.println("Lunch Time:: " + lunchTime);
Serial.println("Dinner Time: " + dinnerTime);
Serial.println("Evening Time: " + eveningTime);
Serial.println("Send Notification: " + String(sendNotification));
Serial.println("Sound Alarm: " + String(soundAlarm));
Serial.println("Notification Threshold: " + String(notificationThreshold));
// Save Line Token as Strings
char lineTokenArray[100];
lineToken.toCharArray(lineTokenArray, sizeof(lineTokenArray));
EEPROM.put(EEPROM_LINE_TOKEN_ADDRESS, lineTokenArray);
char breakfastTimeArray[10];
breakfastTime.toCharArray(breakfastTimeArray, sizeof(breakfastTimeArray));
EEPROM.put(EEPROM_BREAKFAST_TIME_ADDRESS, breakfastTimeArray);
char lunchTimeArray[10];
lunchTime.toCharArray(lunchTimeArray, sizeof(lunchTimeArray));
EEPROM.put(EEPROM_LUNCH_TIME_ADDRESS, lunchTimeArray);
char dinnerTimeArray[10];
dinnerTime.toCharArray(dinnerTimeArray, sizeof(dinnerTimeArray));
EEPROM.put(EEPROM_DINNER_TIME_ADDRESS, dinnerTimeArray);
char eveningTimeArray[10];
eveningTime.toCharArray(eveningTimeArray, sizeof(eveningTimeArray));
EEPROM.put(EEPROM_EVENING_TIME_ADDRESS, eveningTimeArray);
// Save Boolean Flags and Threshold
EEPROM.write(EEPROM_SEND_NOTIFICATION_ADDRESS, sendNotification ? 1 : 0);
EEPROM.write(EEPROM_SOUND_ALARM_ADDRESS, soundAlarm ? 1 : 0);
EEPROM.write(EEPROM_THRESHOLD_ADDRESS, notificationThreshold);
// Commit Changes and End EEPROM
EEPROM.commit();
EEPROM.end();
Serial.println("Settings saved.");
}
// Function to Load Settings from EEPROM
void loadSettings() {
EEPROM.begin(EEPROM_SIZE);
// Read Line Token and Token
char lineTokenArray[100] = {0};
char breakfastTimeArray[10] = {0};
char lunchTimeArray[10] = {0};
char dinnerTimeArray[10] = {0};
char eveningTimeArray[10] = {0};
EEPROM.get(EEPROM_LINE_TOKEN_ADDRESS, lineTokenArray);
lineToken = String(lineTokenArray);
EEPROM.get(EEPROM_BREAKFAST_TIME_ADDRESS, breakfastTimeArray);
breakfastTime = String(breakfastTimeArray);
EEPROM.get(EEPROM_LUNCH_TIME_ADDRESS, lunchTimeArray);
lunchTime = String(lunchTimeArray);
EEPROM.get(EEPROM_DINNER_TIME_ADDRESS, dinnerTimeArray);
dinnerTime = String(dinnerTimeArray);
EEPROM.get(EEPROM_EVENING_TIME_ADDRESS, eveningTimeArray);
eveningTime = String(eveningTimeArray);
// Read Boolean Flags and Threshold
sendNotification = (EEPROM.read(EEPROM_SEND_NOTIFICATION_ADDRESS) == 1);
soundAlarm = (EEPROM.read(EEPROM_SOUND_ALARM_ADDRESS) == 1);
notificationThreshold = EEPROM.read(EEPROM_THRESHOLD_ADDRESS);
// Debugging: Print the loaded values
Serial.println("Settings loaded:");
Serial.println("Line Token: " + lineToken);
Serial.println("Breakfast Time: " + breakfastTime);
Serial.println("Lunch Time:: " + lunchTime);
Serial.println("Dinner Time: " + dinnerTime);
Serial.println("Evening Time: " + eveningTime);
Serial.println("Send Notification: " + String(sendNotification));
Serial.println("Sound Alarm: " + String(soundAlarm));
Serial.println("Notification Threshold: " + String(notificationThreshold));
EEPROM.end();
}
Any help is appreciated.