Caricare numeri da EEPROM

Ciao gente,
ho un problema per definire la condizione che il numero che leggo la prima volta dalla EEPROM non sia quello che è quando non è mai stata scritta.
Quindi si suppone che sia tutti 0xff, se vergine.
Ma se provo a caricare un valore come questo programma, come può succedere che un un unsigned long sia evaluato come negativo ?

#include <EEPROM.h>
int address = 0;
unsigned long value;

void setup() {
  Serial.begin(9600);
  while (!Serial) {
  }
}

void loop() {
   value = EEPROM.read(address);

  Serial.print(address);
  Serial.print("\t");
  Serial.print(value, DEC);
  Serial.println();
  if (value < 360000) Serial.println("Small");

  address += 4;
  if (address == EEPROM.length()) {
    address = 0;
  }
  delay(500);
}

Io credo che ci sia questa condizione, altrimenti 2^32 non è minore di 360`000, salvo che sia signed
Inoltre il risultato non è un valore long, ma solo un byte. Forse sto sbagliando, ma non so quale errore sto commettendo.

EEPROM.read() legge singoli byte, per leggere un tipo più grosso devi usare EEPROM.get(). Di conseguenza credo che tu stia leggendo 255 che è sì < 360000.

Ho poi trovato una soluzione

long EEPROMReadlong(uint16_t address) {
    //Read the 4 bytes from the eeprom memory.
    long four = EEPROM.read(address);
    long three = EEPROM.read(address + 1);
    long two = EEPROM.read(address + 2);
    long one = EEPROM.read(address + 3);

    //Return the recomposed long by using bitshift.
    return ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) +\
            ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF);
}

Ma è anche facile che sia poco recente.
Tutto sommato entrambe i metodi dovrebbero darmi il risultato necessario.

Se ti piace complicarti la vita, va bene. :slight_smile:

Per una certa prospettiva hai ragione. Nel codice appare poche righe e si fa leva su OOP.
Mentre se si va a vedere quando il codice è compilato, forse non c'è quella enorme differenza (tra quello con questa funzione piuttosto che quella della libreria standard)