Ciao a tutti,
mi sto imbattendo nella memorizzazione dei dati sulla Eeprom,
purtroppo da quello che sono riuscito a trovare in giro nel forum o google non ho trovato nulla, poichè in poche parole dovrei memorizzare un numero di telefono digitato da una keypad in "char",
convertirla in una stringa (per la gestione del GSM) e salvarla sulla EEPROM.
da quello che ho capito la eeprom ha un valore massimo di 255 come posso fare a memorizzare un numero di 10 cifre?
Grazie anticipatamente a tutti
eeee memorizzare 1 numero ogni byte?... quindi 10 bytes per ogni numero
è quello il problema... vorrei memorizzare un numero di telefono sulla eeprom, e non riesco a capire come fare
se sai memorizzare una cifra ripeti per il numero di cifre, se i num di telefono sono fissi come lunghezza sai anche come leggerli altrimenti ci metti un carattere separatore così sai dove finisce uno e comincia l'altro
mi sembra che anche negli esempi dell'ide ci sia qualche cosa
Non so se si può fare, ma se i numeri avessero un massimo di 10 cifre basterebbe memorizzarli in un unsigned long (4bytes al posto di 10) e memorizzare quello in eeprom. Infatti nove alla decima (che é il massimo numero possibile se parlo di numeri di telefono a 10 cifre) é minore di 2 alla 32 (che é il massimo unsigned long possibile).
Se non bastasse allora sarebbe necessario salvarli byte a byte (oppure salvarli due numeri in un byte)
Silente:
... Infatti nove alla decima (che é il massimo numero possibile se parlo di numeri di telefono a 10 cifre) é minore di 2 alla 32 (che é il massimo unsigned long possibile).
Mi sa che ti sbagli ![]()
Un numero di 10 cifre può arrivare al valore 9'999'999'999 (pari a 0x2540BE3FF) che, come puoi ben vedere, è decisamente oltre i 4 bytes (0xFFFFFFFF), difatti, il massimo unsigned long (32 bit) è: 4'294'967'295 che è meno della meta del valore suddetto.
Guglielmo
>gio69t: Come ti è già stato indicato, NON vederlo come un numero, ma guardalo come, ad esempio, un array di 10 caratteri ... non dovrai fare altro che memorizzare ogni singolo carattere in una cella di EEPROM.
Guglielmo
Oppure memorizzi un array di 7 caratteri, ognuno dei quali é due cifre, e hai risolto pure il problema possibile del prefisso internazionale (se non hai tale problema basta un array di 5 caratteri come il precedente)
Ti han detto tutto, specifico solo meglio, non si sà mai:
scrivi "ho il numero in stringa..." una stringa è un array/vettore di char, ogni cella di memoria (qualsiasi) memorizza in byte 0-255 ovvero un char, quindi ...
Per accedere ad un singolo char della stringa usi le parentesi quadre e un indice da 0 a n-1
con un ciclo for, dove i va da 0 a numero cifre-1 fai tutto
@silente, mi pare che l'utente non sia molto esperto. Aiutiamolo per una soluzione semplice. ![]()
Grazie a tutti, oggi dovrei avere un po di tempo e provo le varie soluzioni che mi avete proposto così posso informarvi se sono riuscito allo scopo.
Ciao a tutti, abbozzato il programma è sembra che funziona, devo solo migliorarlo, grazie dei vostri preziosi consigli, come sempre
Scusate, rieccomi qui per i vostri consigli,
ho due problemi che non riesco a capire
1° non capisco perchè quando immetto il numero sul LCD i caratteri non sono consecutivi ma scrive sempre sullo stesso.
2° ho provato la funzione "ltoa" per convertire il numero intero in stringa, (mi serve in stringa per poi utilizzarla come numero telefonico al GSM)
posto il programma, sempre che riesca
![]()
Grazie ancora anticipatamente
Combinatore_prova.ino (10.6 KB)
Premesso che non ho capito tutta la logica del programma...
-
secondo me il problema sta nel lcd.setCursor(0, 1); prima di ogni lcd.print(key);
se metti coordinate fisse lui stampa il carattere sempre nella stessa posizione. visto che usi un indice per la posizione dell'array prova ad usarlo anche per la posizione su lcd -
perché converti da char* a nomero e poi da numero a string?
PS: so che i puristi del codice mi insulteranno, però a parte una questione puramente "educativa" o estreme necessità di prestazioni, che necessità c'è di fare tutto quel casino per salvare e leggere su eeprom quando si possono usare le funzioni get() e put()?
invece io non capisco questo:
K = Telefono; //<--qui hai il numero di telefono e lo copi in K ?
delay(2000); // aspetti 2 secondi, perchè ??
A = (K >> 24) & 0b11111111; // converti il numero in k nelle 4 variabili
B = (K >> 16) & 0b11111111;
C = (K >> 8) & 0b11111111;
D = K & 0b11111111;
Serial.println(A, DEC);//HEX // le stampi a video
Serial.println(B, DEC);//HEX
Serial.println(C, DEC);//HEX
Serial.println(D, DEC);//HEX
EEPROM.write(1, A); // e le usi per scrivere sulla eprom
EEPROM.write(2, B);
EEPROM.write(3, C);
EEPROM.write(4, D);
// poi usi le 4 variabili per ricomporre il numero di telefono
// che però hai ancora sia nella variabile K che nella variabile Telefono
Z = ((unsigned long)(A) << 24) | ((unsigned long)(B) << 16) | ((unsigned long)(C) << 8) | (unsigned long)(D);
// rileggi in numero dalla eprom (e qui va bene così controlli se è scritto giusto
p = ((unsigned long)(EEPROM.read(1)) << 24) | ((unsigned long)(EEPROM.read(2)) << 16) | ((unsigned long) (EEPROM.read(3)) << 8) | (unsigned long)(EEPROM.read(4));
Serial.print("Scrivo la eprom "); // e ristampi a video
Serial.println(Z, DEC);//HEX
Serial.print("Leggo la eprom ");
Serial.println(p, DEC);//HEX
Ciao,
in risposta a fratt, quello che ho postato è un pezzo del programma (sono abituato a provare piccoli pezzi prima di fare tutto il software), la mia idea è di fare un programma per un piccolo antifurto, ovvero:
io e il mio vicino abbiamo al lago due casette per gli attrezzi e ci è venuto in mente l'idea di segnalarci tramite sms quando qualcuno apre la porta.
con la possibilità di escludere il sensore mandando un messaggio ognuno per la propria porta.
per quanto riguarda la comunicazione per sms è tutto funzionante, ovvero mando e ricevo sms.
Questa parte di programma è la memorizzazione dei numeri di telefono e salvarli su eeprom, in modo tale che in mancanza di tensione per qualsiasi motivo i numeri impostati possano rimanere attivi.
Le conversioni da char a intero l'ho pensata, poichè immetto un numero da tastiera, quindi mi viene fornito una char, devo convertirlo per memorizzare nella Eeprom come intero.
La conversione da intero a String, perchè (se ho capito bene) il numero di telefono nella Sim800l accetta solo String. (almeno è quello che ho capito io anche perchè non mastico molto bene l'inglese).
E' vero a volte mi contorto la testa perchè trent?anni fà (poi ho smesso) programmavo PLC, i PLC accettavano solamente blocchi dati inter (binari, esadecimali, octali, ecc,)
forse alla mia tenera età sto azzardando troppo a conoscere Arduino, e con questo mi sembra di aver capito che il sistema non gli interessa se sia intero, Carattere, o stringa, l'importante è non mischiare le cose, per cui (sempre se ho capito bene) nella Eeprom posso memorizzare qualsiasi formato che sia Intero, Char, Stringa, ecc. o mi sbaglio?
Per quanto riguarda i vari print che ho messo nelo scorcio di programma sono solamente per puro debug, per controllare che effettui i giusti passaggi.
Per la visualizzazione su LCD ho provato altre soluzioni ma mi si sormontano sempre i numeri non cambiano di posizione ovvero ho provato:
lcd.setCursor(0, 1)("Telefono 1");
lcd.print(key);
ma la cifra digitata rimane sempre sul primo pixel della seconda riga.
Proverò a riscrivere il programma senza tante conversioni delle variabili cosi forse è piu veloce
e per LCD proverò a fare delle altre prove o proverò come consigliato da fratt di fare un array,
per quanto riguarda il get(); e put() non so cosa siano ho provato a veder in rete ma parla solamente per e dati internet
Grazie ancora a tutti
Scusa fratt se ti faccio questa domanda da profano e poco esperto:
"unsigned long" è un intero o sbaglio?
ecco perchè utilizzo un "atol" di conversione da char a intero
per poi spezzare in 4 byte e memorizzarlo nella Eeprom,
non è la procedura esatta?
Grazie ancora dei preziosi consigli
gio69t:
per quanto riguarda il get(); e put() non so cosa siano ho provato a veder in rete ma parla solamente per e dati
L'utente faceva riferimento alle funzioni che mette a disposizione la libreria EEPROM disponibile su Arduino, ti metto il link al reference
Get()
Put()
Più in generale i metodi della libreria EEPROM
Ancora più in generale il reference di arduino
ciao.
non prenderlo come un rimprovero, stavo solo esponendo il mio punto di vista.
EEPROM: come ha scritto anche fabpolli, nella libreria EEPROM ci sono 2 metodi che permettono di leggere e scrivere tipi di dato diversi dal byte. se guardi nei link del reference che vedi sopra, capisci come funzionano.
tutto il procedimento che hai fatto tu è assolutamente corretto. per come ragiono io, però, è più semplice e immediato usare un metodo già pronto che con una sola istruzione fa quello che altrimenti devi fare con 5 / 6 righe di codice... tutto qua.
LCD: prima di ogni lcd.print(key); metti un lcd.setCursor(0, 1);
così però usi sempre la prima posizione e sovrascrivi il carattere precedente. visto che usi la variabile j per salvare la cifra nella posizione corretta dell'array, puoi provare ad usarla anche per posizionarti sul LCD. qualcosa tipo lcd.setCursor(j,1);
ATOL: non contestavo l'uso di una funzione rispetto ad un'altra, ma il giro che fai... char array => numero => string...
sicuro che la libreria che usi non accetti anche gli array di char?
se proprio vuoi usare la classe string... sicuro che non ci sia un modo per convertire direttamente da char array a string?
e comunque probabilmente puoi usare direttamente le string anche per l'inserimento del numero col tastierino...
Ciao fratt,
non l'ho considerato un rimprovero anzi, dei bei consigli, ho voluto spiegare tutto abbastanza bene,
comunque questa sera ho modificato un po il codice penso di averlo migliorato e mi sembra più veloce.
Per LCD ho risolto, scrivo su LCD la variabile "keyInsert" direttamente.
posto il codice per eventuali consigli di dove sbaglio o possibili miglioramenti
Grazie ancora
![]()
Combinatore_new1.ino (9.75 KB)
un appunto al volo...
keyInsert la dichiari da 10 elementi, ma poi la inizializzi da 0 a 10... che fanno 11 elementi...