Stringa sull'EEPROM

Salve ragazzi, fra i progettini che stavo realizzando sono incappato in un problemino.
Ho bisogno di memorizzare sull'eeprom una stringa da riandare a confrontare con un eventuale parola inserita in seriale.
Adesso ho qualche domandina, essendo l'eeprom di soli 512 kb questo vuol dire che la stringa può contenere massimo 512 caratteri?
Come faccio a scrivere una stringa, cioè come gli dico che gli indirizzi di memoria da X1 a X2 devono essere occupati dalla stringa?
E successivamente come la recupero?

Per quanto riguarda la seriale, come faccio ad acquisire un carattere numerico come valore numerico?!
Mi spiego meglio, se inserisco il numero 31 nel serial monitor, l'arduino lo interpreta come 1F, come faccio per acquisire su una variabile il valore numerico e non il valore dei caratteri in base esadecimale?

Avevo pensato di provare così:

    while(Serial.available() > 0){
      int c = Serial.read();
      valore += c;
    }

Ma con scarso risultato.

P.S.
Ultima domanda che avevo fatto anche nel topic precedente, è una cosa un po banale, come faccio a pulire il serial monitor?

Per la memoria per leggere:

  Serial.println("Stampo numero da memoria: ");
  for(int l=0; l<10; l++){
    number=number.concat(EEPROM.read(l));
  }

per scriver:

for(int l=0; l<10; l++){
      EEPROM.write(l,number.charAt(l));
    }

tramite l quindi vai a puntare i dati che hai memorizzato.Vedi:

esistono pero altre librerie, basta che cerchi EEPROM sul forum.
Per convertire da hex a int basta fare:

(int)number

Prendo il tuo esempio della scrittura...
Se la parola è sotto i 10 caratteri?!
Esempio prendiamo la parola "Ciao",
Indirizzo di memoria / Carattere
0 / C
1 / i
2 / a
3 / o

Lui continua a salvare fino all'indirizzo 10, ma cosa salva dall'indirizzo 4 in poi?

P.S.
Per il serial monitor nessun consiglio?

  1. 512 kb sono 512.000 byte. E poi 512 byte di Eeprom si trovano sui vecchi Atmega168. I 328 (quelli dell'Arduino Uno e delle ultime 2009) hanno 1 kB di EEPROM.
  2. se la lunghezza è sotto i 10 caratteri o vari l'indice nel ciclo For oppure il codice ti salverà caratteri senza senso.
  3. se assegni la lettura ad una variabile di tipo int o byte dovresti avere il dato convertito in numero senza altri passaggi. L'importante è che tu abbia la certezza di ricevere dei valori numerici, altrimenti il codice va in errore.

leo72:

  1. 512 kb sono 512.000 byte. E poi 512 byte di Eeprom si trovano sui vecchi Atmega168. I 328 (quelli dell'Arduino Uno e delle ultime 2009) hanno 1 kB di EEPROM.

Errore di distrazione :blush:

leo72:
2) se la lunghezza è sotto i 10 caratteri o vari l'indice nel ciclo For oppure il codice ti salverà caratteri senza senso.

Non c'è un modo per controllare quanti caratteri abbia una parola e automaticamente impostare l'indice?

leo72:
3) se assegni la lettura ad una variabile di tipo int o byte dovresti avere il dato convertito in numero senza altri passaggi. L'importante è che tu abbia la certezza di ricevere dei valori numerici, altrimenti il codice va in errore.

Una cosa non mi è chiara:

  while(Serial.available() > 0){
    int numero = Serial.read();
    }

Se scrivo un numero a due cifre, il ciclo si ripeterà due volte (es scirvo 23), una volta immagazinerà sulla variabile "numero" il valore 3 ed una volta il valore 2, come le concateno queste cifre?

Quando invii una stringa avrai un comando del tipo:

Serial.println("........")

che invia (in ascii) il codice \n\r al termine della stringa quindi puoi creare ad esempio un array di 100 caratteri
e salvi fino a che non trovi il \n o \r con un ciclo while (ci devi mettere ovviamente una scappatoia in caso non vengano ricevuti). i numeri che puoi salvare in ogni byte vanno da 0 a 255 quindi ogni carattere verrà salvato come decimale:

ypkdani:
Quando invii una stringa avrai un comando del tipo:

Serial.println("........")

che invia (in ascii) il codice \n\r al termine della stringa quindi puoi creare ad esempio un array di 100 caratteri
e salvi fino a che non trovi il \n o \r con un ciclo while (ci devi mettere ovviamente una scappatoia in caso non vengano ricevuti). i numeri che puoi salvare in ogni byte vanno da 0 a 255 quindi ogni carattere verrà salvato come decimale:
ASCII - Wikipedia

Scusami non ho capito, non puoi farmi un esempio?

Cioè dovrei salvare tutti i caratteri su una stringa giusto? E poi come lo converto in valore integer?

Si salvi i dati su una stringa es:

char array[100];

Per salvarli in memoria non fai altri che

EEPROM.write(l,array[l])

ypkdani:
Si salvi i dati su una stringa es:

char array[100];

Per salvarli in memoria non fai altri che

EEPROM.write(l,array[l])

Ah ma tu stavi parlando del salvare i dati sulla EEPROM, li ci sono arrivato.
Il mio problema era ricevere un valore integer dal serial monitor!

A questo ti ho risposto io.
int temp;
temp = Serial.read();

leo72:
A questo ti ho risposto io.
int temp;
temp = Serial.read();

Ma se io invio in seriale un numero a due cifre lui li riconosce come due caratteri!

Per esempio invio "23" e do il comando valore = Serial.read() lui leggerà solamente il primo byte (che credo sia 3) e quindi immagazinerà nella variabile valore solamente il 3.

Devi usare serial.write:

ypkdani:
Devi usare serial.write:
Serial.write() - Arduino Reference

Forse non mi sono spiegato bene, io lo scrivo sul serial monitor il numero, l'arduino deve riceverlo e interpretarlo come un valore int!

Dovrebbe essere int temp=(int)Serial.Read();

Già provato ma così memorizza solo il primo byte che riceve!

Xfox:
Prendo il tuo esempio della scrittura...
Se la parola è sotto i 10 caratteri?!
Esempio prendiamo la parola "Ciao",
Indirizzo di memoria / Carattere
0 / C
1 / i
2 / a
3 / o

Lui continua a salvare fino all'indirizzo 10, ma cosa salva dall'indirizzo 4 in poi?

mi sembra che con un ciclo for continui a leggere finchè non trovi il carattere '\0' che indica la fine della stringa....quindi se scrivi 'ciao' in realtà stai scrivendo 'ciao\0' e occupi uno spazio char in più...
almeno mi sembra che sia così...

Devi fare un ciclo do..while che legga finché ci sono byte sulla linea, salvare tutto in un char* e poi convertire.
do {
..
} while (Serial.available()>0);

leo72:
Devi fare un ciclo do..while che legga finché ci sono byte sulla linea, salvare tutto in un char* e poi convertire.
do {
..
} while (Serial.available()>0);

Caspita come ho fatto a non pensarci?!
Potrei fare un ciclo while del tipo:

int l = 0;
while(Serial.available() > 0){
EEPROM.write(l, testo.charAt(l));
l++;
}

UP!

Nessun aiuto su come ricevere da seriale un valore int?

Un int è un numero a 2 byte. Mandalo scomposto nel byte-alto e byte-basso e poi ricomponi il numero usando magari le operazioni sui bit