Problemi di lettura e scrittura su eeprom

Buongiorno, sono Paolo ed ho conoscenze da autodidatta basse, ma non bassissime con arduino e 8266.
Avrei bisogno di un aiuto per superare un ostacolo.
Vorrei configurare un 8266 come access point e da pagina web registrare su eeprom le credenziali della rete domestica o altra eventuale che poi lui al riavvio mi legga per connersi come client.
in questo progetto sono bloccato in una fase, quando registro le credenziali su eeprom le registro come String scrivendo per tutta la lunghezza stringa e mettendo un carattere finestringa. quando la leggo e recupero la recupero come stringa leggendo fino al carattere di finestringa.
Il mio problema è che la registrazione sulla rete domestica per poter eseguire il programma vero e proprio la devo fare impostando le credenziali come const char* ed io non riesco a far si che possa associare al testo letto dalla stringa.
Cioè non voglio che la const char mi si modifichi, ma vorrei assegnare ad esempio nel setup un valore fisso, che sia lo stesso che ho letto e registrato nella String di lettura dell'eeprom ad inizio del setup.
c'è qualcuno che possa farmi vedere la luce?
grazie dell'aiuto

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

chiedo scusa per l'irruenza :slight_smile:

Non so se ho ben capito la domanda ... ::slight_smile:
... tu cerchi un modo per avere una stringa classica dal 'C' a partire da un oggetto String? Se è così, ogni oggetto string ha un metodo che è restituisce il suo valore come char array.

Esempio, copiare i caratteri di un oggetto String in un char array:

String pippo = "1234567890";
char pluto [15];
...
strcpy (pluto, pippo.c_str());
...

Se invece intendevi altro ... beh, prova a chiarire meglio :smiley:

Guglielmo

Ma evitare del tutto le deleterie variabili "String" e convertire le tue credenziali in semplici char array no?

Facci vedere il codice (oscura eventuali ID e password...) se vuoi.

Grazie,
Guglielmo, ho provato il tuo esempio per il mio uso, ma mi restituisce errore, il codice che ho testato solo per vedere se fa ial caso mio è questo:

String pippo = "12345678";
char pluto [15];
strcpy (pluto, pippo.c_str());

const char* newpippo = pluto;

void setup() {
 

}

void loop() {
  

}

dove sbaglio??

@ docdoc hai ragione, ho letto che le stringhe causano più problemi, ma nei miei tentativi di lettura/scrittura su eeprom sono quelle che mi hanno reso la vita più facile..ho provato con gli array, ma mi sono arenato

se serve vi posso allegare gli schetch di scrittura e quello di lettura della String su eeprom

signorbarro:
@ docdoc hai ragione, ho letto che le stringhe causano più problemi, ma nei miei tentativi di lettura/scrittura su eeprom sono quelle che mi hanno reso la vita più facile..ho provato con gli array, ma mi sono arenato

Ma veramente quel pezzo di codice, usando gli array di char, diventa semplicemente:

char pippo[15] = "12345678";

void setup() {
...

non vedo la difficoltà.

se serve vi posso allegare gli schetch di scrittura e quello di lettura della String su eeprom

Eh, si direi che sarebbe meglio,grazie. :wink:

ok
parte di schetch di scrittura su eeprom:

String Rete = "Lamiaretedomestica";
String Password = "lamiapassword";

for(int i=0;i<Rete.length();i++) {
    EEPROM.write(0x20+i,Rete[i]); 
  }
  EEPROM.write(0x20+Rete.length(),'\0');
  
  for(int t=0;t<Password.length();t++) {
    EEPROM.write(0x40+t,Password[t]); 
  }
  EEPROM.write(0x40+Password.length(),'\0');  
  EEPROM.commit();

poi per riprenderla dall'eeprom:

String Rete;   
String Password;

for(int i=0;i<32;i++){
    Rete = Rete + char(EEPROM.read(0x20+i)); 
    if (char(EEPROM.read(0x20+i))== '\0'){i == 31;}
  }

  for(int t=0;t<32;t++){
    Password = Password + char(EEPROM.read(0x40+t)); 
    if (char(EEPROM.read(0x40+t))=='\0'){t == 31;}
  }

però per poterle leggere come password e nome rete in un'altra parte di schetch non posso usare le string, ma const char* come qui sotto:

const char* MY_SSID = "nome rete";
const char* MY_PWD = "nomepassword";


void setup_wifi() { 
  delay(10);
 
 WiFi.begin(MY_SSID, MY_PWD);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

}

quindi mi servirebbe qualcosa che mi riuscisse a rendere utilizzabile quello che ho come String nella parte di codice 2 facendo si di riuscire a "trasformarla" nelle credenziali const char* del codice 3

spero di non essermi arenato in una cosa troppo stupida...

signorbarro:
dove sbaglio??

... emmm ... direi che il problema maggiore è la tua scarsa conoscenza dell'ambiente e del linguaggio ... ::slight_smile:

Quel codice, buttato li così, ovviamente NON può funzionare ... NON puoi richiamare una funzione (strcpy()) così fuori da tutto !

Che ne dici di fermarti un'istante e dedicare qualche giornata allo studio? Potresti cominciare con con studiare QUESTO proseguire con QUESTO ed acquistare un buon libro (es. QUESTO) ... vedrai che ti si chiariranno parecchie cose :wink:

Guglielmo

Sì: deve stare nel setup o nel loop.

@ Guglielmo: su questo hai ragione, non avevo mai utilizzato lo strcpy() ed ho provato di getto senza troppo ragionare.

@ Datman: grazie, effettivamente provato nel setup e mi funziona.

@ Docdoc: si ma a me serviva una possibilità di "trasformare" una String dichiarare una const char*= al testo presente nella string. quindi Guglielmo mi aveva risposto alla prima, ma io posizionando a vanvera la funzione strcpy() non ho sfruttato la dritta.

Grazie a tutti

signorbarro:
@ Docdoc: si ma a me serviva una possibilità di "trasformare" una String dichiarare una const char*= al testo presente nella string.

Si, ma è proprio la "String" che devi imparare ad evitare del tutto, non crearla, magari modificarla, e poi assegnarla ad una stringa C ossia una char[] o char*, perché la (pessima) gestione della memoria indotta dalla classe String mette a rischio il funzionamento di Arduino sul medio-lungo termine sicuramente in quanto non esiste un "garbage collector" come in sistemi di più alto livello, quindi se crei una variabile String lui alloca dello spazio, poi quando vuoi modificarla alloca ALTRO spazio e rilascia quello precedente ma senza "liberarlo" ossia non lo userà più nessun'altra variabile (a meno di piccole ottimizzazioni per noi trasparenti). E quando poi la variabile "muore" (perché magari locale ad una funzione) succede la stessa cosa.

Ah, per uscire da una for() non serve impostare l'indice, basta usare "break".

Quindi butta via String, ed il tuo primo codice diventa:

char Rete[32] = "Lamiaretedomestica";
char Password[32] = "lamiapassword";

for(int i=0;i<strlen(Rete);i++) {
    EEPROM.write(0x20+i,Rete[i]);
  }
  EEPROM.write(0x20+Rete.length(),'\0');
 
  for(int t=0;t<strlen(Password);t++) {
    EEPROM.write(0x40+t,Password[t]);
  }
  EEPROM.write(0x40+strlen(Password),'\0'); 
  EEPROM.commit();

mentre il secondo:

char Rete[32];
char Password[32];

for(int i=0;i<32;i++){
    Rete[i]= EEPROM.read(0x20+i);
    if ( Rete[i] == '\0')
      break;
  }

  for(int t=0;t<32;t++){
    Password[i] = EEPROM.read(0x40+t);
    if ( Password[i] == '\0')
      break;
  }

Ma invece di andare a scrivere carattere per carattere, non sarebbe meglio usare i metodi put e get della classe eeprom per scrivere e leggere l'intero array in un unico colpo!?

Il reference è ambiguo,per i metodi get e put viene indicato come dato, tutti i tipi primitivi e le struct, non fa accenno di array. Ma anche se non fosse possibile salvare direttamente un array si potrebbe comunque creare una struct contenente un array. :slight_smile:

Si dici giusto, anche se non so se nel suo codice si possa fare visto che non lo abbiamo interamente, non vorrei confondergli le idee stravolgendo il suo codice ed introducendo cose "nuove"...

ok grazie di nuovo e quindi gli step saranno:

1 ricostruire lo schetch con la funzione (strcpy()), anche se ho capito che è meglio non usare le String.

2 provare ad eliminare le String ed utilizzare al loro posto char come suggerito da docdoc per alleggerire

3 studiare metod put e get per vedere di semplificare il tutto

lo schetch per intero non lo ho postato solo perché pensavo di focalizzare il solo topic.

ciao Paolo

signorbarro:
1 ricostruire lo schetch con la funzione (strcpy()), anche se ho capito che è meglio non usare le String.
2 provare ad eliminare le String ed utilizzare al loro posto char come suggerito da docdoc per alleggerire

Se applichi il 2, visto che ti ho anche dato il codice, non perdere tempo con la 1.... :wink:

in realtà sono passato direttamente alla 3, è più snella come codice e funziona bene

grazie di nuovo