-
Notifications
You must be signed in to change notification settings - Fork 13.3k
Closed
Description
I would like to call EEPROM.begin()
with the exact amount of storage needed to save memory.
I want to put
a struct composed of:
- 1
boolean
(1 byte) - 1
byte
(1 byte) - 5
char[33]
(165 bytes) - 1
unsigned int
(4 bytes) - for a total of 1 + 1 + 165 + 4 = 171 bytes
So calling begin
with 171 should be okay. But it's not. It does not crash or anything, it just seems the data doesn't get written. But calling it with at least 173 does work.
Here is the test code:
#include <Arduino.h>
#include <EEPROM.h>
const int EEPROM_OFFSET = 0;
const int EEPROM_OFFSET_SETUP = EEPROM_OFFSET;
const int EEPROM_LENGTH_SETUP = 1;
const int EEPROM_OFFSET_BOOT_TYPE = EEPROM_OFFSET_SETUP + EEPROM_LENGTH_SETUP;
const int EEPROM_LENGTH_BOOT_TYPE = 1;
const int EEPROM_OFFSET_HOSTNAME = EEPROM_OFFSET_BOOT_TYPE + EEPROM_LENGTH_BOOT_TYPE;
const int EEPROM_LENGTH_HOSTNAME = 32 + 1;
const int EEPROM_OFFSET_WIFI_SSID = EEPROM_OFFSET_HOSTNAME + EEPROM_LENGTH_HOSTNAME;
const int EEPROM_LENGTH_WIFI_SSID = 32 + 1;
const int EEPROM_OFFSET_WIFI_PASSWORD = EEPROM_OFFSET_WIFI_SSID + EEPROM_LENGTH_WIFI_SSID;
const int EEPROM_LENGTH_WIFI_PASSWORD = 32 + 1;
const int EEPROM_OFFSET_MQTT_HOST = EEPROM_OFFSET_WIFI_PASSWORD + EEPROM_LENGTH_WIFI_PASSWORD;
const int EEPROM_LENGTH_MQTT_HOST = 32 + 1;
const int EEPROM_OFFSET_MQTT_PORT = EEPROM_OFFSET_MQTT_HOST + EEPROM_LENGTH_MQTT_HOST;
const int EEPROM_LENGTH_MQTT_PORT = 4;
const int EEPROM_OFFSET_MQTT_BASE_TOPIC = EEPROM_OFFSET_MQTT_PORT + EEPROM_LENGTH_MQTT_PORT;
const int EEPROM_LENGTH_MQTT_BASE_TOPIC = 32 + 1;
const int EEPROM_SIZE = EEPROM_OFFSET_MQTT_BASE_TOPIC + EEPROM_LENGTH_MQTT_BASE_TOPIC;
enum BootType : byte {
NORMAL = 1,
CONFIG = 2
};
struct ConfigStruct {
bool configured;
BootType boot_type;
char hostname[EEPROM_LENGTH_HOSTNAME];
char wifi_ssid[EEPROM_LENGTH_WIFI_SSID];
char wifi_password[EEPROM_LENGTH_WIFI_PASSWORD];
char mqtt_host[EEPROM_LENGTH_MQTT_HOST];
unsigned int mqtt_port;
char mqtt_base_topic[EEPROM_LENGTH_MQTT_BASE_TOPIC];
};
void setup() {
Serial.begin(115200);
Serial.print("EEPROM of ");
Serial.print(EEPROM_SIZE);
Serial.println(" bytes");
EEPROM.begin(EEPROM_SIZE);
ConfigStruct config;
config.configured = true;
EEPROM.put(EEPROM_OFFSET, config);
EEPROM.commit();
ConfigStruct config_read;
EEPROM.get(EEPROM_OFFSET, config_read);
if (config_read.configured) {
Serial.println("OK");
} else {
Serial.println("Not OK");
}
}
void loop() {
}
Maybe i've made a mistake somewhere, but I just don't understand what happens.
Thanks.
Metadata
Metadata
Assignees
Labels
No labels