Issue with wifimanager

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.

you have WFM_LABEL_AFTER

1 Like

It works. Thank you very much.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.