Questo argomento contiene 6 risposte, ha 2 partecipanti, ed è stato aggiornato da  Novatium 2 mesi, 1 settimana fa.

Stai vedendo 7 articoli - dal 1 a 7 (di 7 totali)
  • Autore
    Articoli
  • #3841

    Novatium
    Partecipante

    Buongiorno community, mi rivolgo a voi perché ho un problema che mi perplessa notevolmente:
    ho bisogno di portare il mio fishino mega in giro per diversi luoghi e in ogni luogo ha una connessione wireless con un nome e una password diversa ogni volta. Io non ho voglia di ricaricare sempre il mio programma sulla scheda cambiando di volta in volta SSID e PASSWORD, anche perché è un programma molto pesante dato che è una stazione meteorologica piuttosto avanzata. Ho provato a vedere in giro per il web, ma sembra che nessun altro ha avuto il mio stesso problema e chiedere a diversi altri forum i quali mi consigliano, dato che uso una microSD, di creare due file, uno dove inserisco il nome della rete e uno la password e dopo leggerli con la scheda per creare la connessione. Il problema è questo: quando vado ad associare il contenuto sia del file della SSID e della PASSWORD a variabili tipo String, dato che l’IDE di Arduino non permette di utilizzare #define, e provo a caricare il programma, l’IDE mi dice che non posso associare una variabile di tipo string a una di tipo string*. Provo di nuovo dichiarando le variabili di tipo string* e mi dice che non posso associare le variabili string* a variabili di tipo string&. Cambiando nuovamente la variabili in string& e mi dice che non posso associare una variabile di tipo string& a una string*.

    Riporto di seguito un esempio di errore generatosi:

    Arduino:1.6.13 (Windows 10), Scheda:"Arduino/Genuino Uno"
    
    C:\...\FishinoWiFiWebServer.ino: In function 'void setup()':
    
    FishinoWiFiWebServer:187: error: no matching function for call to 'FishinoClass::begin(String&, String&)'
    
      while(!Fishino.begin(MY_SSID, MY_PASS))
    
                                           ^
    
    C:\...\FishinoWiFiWebServer.ino:187:39: note: candidates are:
    
    In file included from C:\...\FishinoWiFiWebServer.ino:9:0:
    
    C:\.../Fishino.h:331:11: note: uint8_t FishinoClass::begin(const char*)
    
       uint8_t begin(const char *ssid);
    
               ^
    
    C:\.../Fishino.h:331:11: note:   candidate expects 1 argument, 2 provided
    
    C:\.../Fishino.h:333:11: note: uint8_t FishinoClass::begin(const __FlashStringHelper*)
    
       uint8_t begin(const __FlashStringHelper *ssid);
    
               ^
    
    C:\.../Fishino.h:333:11: note:   candidate expects 1 argument, 2 provided
    
    C:\.../Fishino.h:338:11: note: uint8_t FishinoClass::begin(const char*, const char*)
    
       uint8_t begin(const char* ssid, const char *passphrase);
    
               ^
    
    C:\.../Fishino.h:338:11: note:   no known conversion for argument 1 from 'String' to 'const char*'
    
    C:\.../Fishino.h:340:11: note: uint8_t FishinoClass::begin(const __FlashStringHelper*, const __FlashStringHelper*)
    
       uint8_t begin(const __FlashStringHelper *ssid, const __FlashStringHelper *passphrase);
    
               ^
    
    C:\.../Fishino.h:340:11: note:   no known conversion for argument 1 from 'String' to 'const __FlashStringHelper*'
    
    exit status 1
    no matching function for call to 'FishinoClass::begin(String&, String&)'
    
    Questo report potrebbe essere più ricco di informazioni abilitando l'opzione
    "Mostra un output dettagliato durante la compilazione"
    in "File -> Impostazioni"
    #3843

    Massimo
    Amministratore del forum

    prova con

    
     while(!Fishino.begin(MY_SSID.c_str(), MY_PASS.c_str()))
    
    #3845

    Novatium
    Partecipante

    Grazie Massimo per la risposta.
    Ho testato il programma cambiando while(!Fishino.begin(MY_SSID, MY_PASS)) nel codice come da te consigliatomi while(!Fishino.begin(MY_SSID.c_str(), MY_PASS.c_str()))
    Ha funzionato, anche se mi restituisce un errore strano sul serial monitor:

    Error waiting handshake HIGH for 304
    spiDeselect FAILED1
    
    Error : CODE :11
    
    Error waiting handshake HIGH for 304
    spiDeselect FAILED1
    
    Error : CODE :11
    
    Error waiting handshake HIGH for 304
    spiDeselect FAILED1
    
    Error : CODE :11
    
    ........OK

    Ma alla fine, come dimostra l’OK che mi compare alla fine, il mio Fishino si è connesso alla rete.
    Scusami l’ignoranza, avrei due domande:
    Cosa significa .c_str() che hai aggiunto dopo le due variabili MY_SSID e MY_PASS?
    Tu hai idea del perché mi compaia questo errore?
    Grazie mille per l’aiuto datomi per risolvere il mio problema.

    #3846

    Massimo
    Amministratore del forum

    Ciao,

    la funzione Fishino.begin() accetta O 2 parametri di tipo const char * (puntatore a carattere del C) oppure 2 parametri del tipo const __FlashStringHelper * che servono quando usi una stringa nella memoria flash per risparmiare RAM.
    Non c’è una funzione che accetta direttamente una stringa, per il semplice motivo che le stringhe occupano spazio; la funzione c_str() ritorna semplicemente un const char * equivalente alla stringa.

    L’errore invece è un problema di comunicazione SPI tra l’atmega ed il modulo wifi… non è un vero errore, nel senso che il firmware è in grado di ripetere le richieste che danno problemi; ho lasciato il messaggio per vedere quante ne vengono fuori… di solito appaiono solo all’inizio.

    #3847

    Novatium
    Partecipante

    Ciao
    Grazie per le delucidazioni.
    Effettivamente l’errore SPI mi compare dalle 3 alle 5 volte al massimo.
    Quindi se io dichiarassi le mie variabili di tipo char, la libreria di fishino le accetta, oppure devono essere per forza delle costanti di tipo char?

    #3848

    Massimo
    Amministratore del forum

    il char* è un array di caratteri… ma spiegarti qui la differenza diventa una cosa lunghetta 😉
    Mettiamola così : la classe String contiene al suo interno proprio un array di caratteri, ma ci aggiunge un po’ di funzioni per lavorarci su comodamente senza pensieri. Se usi direttamente un array di caratteri, leggendolo dalla SD, o sai cosa fai o fai casini.
    Se vuoi imparare ad usare le “stringhe” del C standard (che NON sono quelle del C++…) ti serve un buon libro sul linguaggio C.
    Io le uso nelle librerie perchè con quelle risparmi memoria e puoi ottimizzare. Oltretutto evitando le String in toto se tu non le usi nei tuoi sketch non carica la libreria String, quindi si risparmia spazio. Ma non è semplice usarle… devi fare manualmente più o meno quel che fa la classe String al suo interno. Nel tuo caso non ne vale la pena.
    Nei miei esempi, se noti, le ho messe con F(….), perchè sono valori FISSI definiti nello sketch e non caricati da fuori, e con la F le piazzo nella memoria flash, risparmiando RAM. Nel tuo caso ovviamente non puoi farlo.

    Non per portare acqua al mio mulino, ma se ti interessa approfondire, c’è il Fishino Book 😉
    Parte da zero e da una discreta infarinatura su array e puntatori del C standard, senza andare troppo sul pesante.
    In alternativa, in rete trovi un po’ di tutto, ma solitamente si fa fatica a trovare qualcosa di semplice.

    Ciao

    Massimo

    #3857

    Novatium
    Partecipante

    Grazie mille per il tuo aiuto.
    Grazie per il libro, a me fa sempre piacere imparare cose nuove.
    Ciao e ancora grazie. 😉

Stai vedendo 7 articoli - dal 1 a 7 (di 7 totali)

Devi essere loggato per rispondere a questa discussione.