Buongiorno. Visto che nessuno ha potuto consigliarmi nulla su come inviare email da arduino per un mio progetto, vorrei chiedere se esiste un modo per prendere un file di pochi byte da una SD e caricarlo su un server tramite TFP. Grazie
Non so con R4 WiFi perché non l'ho ancora mai usato, ma io persino con i WeMos (ESP) ho usato la libreria "FTPClient_Generic.h".
Questa è una porzione del mio file "ftp.h" che ho usato per un progetto, vedi se può esserti utile (dirName, ftp_server, ftp_user e ftp_pass li ho nel file che contiene la configurazione):
#include <FTPClient_Generic.h>
#define USING_VSFTP_SERVER true
FTPClient_Generic ftp(ftp_server, ftp_user, ftp_pass, 10000);
bool FtpExists(String myFile) {
String list[128];
ftp.InitFile(COMMAND_XFER_TYPE_ASCII);
ftp.ContentListWithListCommand("", list);
for (uint16_t i = 0; i < sizeof(list); i++)
{
if (list[i].length() > 0) {
if (!list[i].startsWith(".")) {
if (list[i].substring(0,list[i].length()-1) == myFile)
return true;
}
}
else
break;
}
return false;
}
char dato[80];
void scriviGiorno(int pYear, int pMonth, int pDay) {
sprintf(nomeFile, "SolarLog2_%d.csv", pYear);
ftp.OpenConnection();
ftp.ChangeWorkDir(dirName);
sprintf(dato, "%04d/%02d/%02d;%d;%d\r\n", pYear, pMonth, pDay, totWh, maxWatt);
if (!FtpExists(String(nomeFile))) {
ftp.InitFile(COMMAND_XFER_TYPE_ASCII);
ftp.NewFile(nomeFile);
ftp.Write(csvHeader);
ftp.CloseFile();
Serial.print("Creo nuovo file: ");Serial.println(nomeFile);
}
ftp.InitFile(COMMAND_XFER_TYPE_ASCII);
ftp.AppendFile(nomeFile);
ftp.Write(dato);
ftp.CloseFile();
ftp.CloseConnection();
Serial.print("Scrivo dati del giorno: ");Serial.println(dato);
}
Grazie per la risposta. Con Arduino R4 WiFi sembra non funzionare, ma io non sono molto esperto e non riesco a settare la libreria.
Hm, mi spiace, ma non trovo nessuna libreria FTP per l'R4 Wifi quindi non so dirti. Aspettiamo qualcuno che abbia già avuto esperienza con questa cosa per capire se sia fattibile.
PS: ovviamente tutto è possibile, ma dipende dalla presenza o meno di librerie già fatte e testate, altrimenti dovresti scrivere tu "a manella" il tuo client FTP, non è impossibile ma insomma, se già esistesse una lbireria...
... che, detto così, significa ben poco
... che vuol dire? Non compila? da errori? non si connette? che messaggi da?
Guglielmo
Errori di compilazione. Non riesco a capire come devo settare il file defines.h
Cosa sarebbe "defines.h"? Per favore, posta il tuo codice insieme anche all'output della compilazione (entrambi racchiusi nel tag "code") perché dire solo "errori di compilazione" è come andare dal meccanico dicendo "il motore fa un rumore strano": dove ti manda il meccanico secondo te? ![]()
Prova questo che ho modificato per fare una prova con "FTPClient_DownloadFile":
defines.h (14.2 KB)
... non garantisco nulla, ma almeno ... compila senza errori ![]()
Guglielmo
... è il file di configurazione che usano i vari esempi.
Quella libreria, fortunatamente, è sotto forma di .hpp quindi ... compilata al momento della compilazione del .ino tenendo conto dei .h precedenti ![]()
Guglielmo
Grazie, domani faccio prove e poi vi faccio sapere
Ciao, sto facendo esattamente la stessa cosa caricando un file su un hosting gratuito italiano che supporta anche i trasferimenti via FTP. E mi funziona tutto, ma stranamente quando alimento da parete il file transfermi introduce caratteri strani. Invece da PC va sempre bene.
Il significato sono una data, alcune misure e un paio di flag, ma ottengo (a volte!) questo :
2024;08;08;00;07;45;25.79;98635.67;5356;21.00;21.50;30.00;0;0
2024;08;08;00;08ÿÿÿÿ;15;25.75;98639.87;5356;21.00;21.50;30.00;0;0
2024;08;08;00;08;45;25.73;98639.88;5356;21.00;21.50;30.00;0;0
Questi caratteri strani ÿ mi sballano tutto!
Ho letto qui e sembra che qualcun'altro abbia risolto cambiando la codifica: non va bene UTF ma ci vuole ASCII 'plain'.
Il tema è però che non so come fare... ![]()
Ora provo a fare come ha suggerito l'invicibile Guglielmo e se ottengo risultati condivido.
Non mi è chiaro però dove mettere questo file... ho cercato sul disco C: ma ne ho un sacco in sottocartelle di "\Documents\Arduino\libraries".
Mi puoi dare indicazioni?
Ciao, io non riesco a far funzionare niente. Mi puoi inviare il codice che hai usato per vedere cosa sbaglio. Ho errori di compilazione che non riporto perché sono lunghi. Se serve li posto.
Il file defines.h va dentro la cartella libraries/FTPClient_Generic-1.6.0/examples/WiFi/FTPClient_DownloadFile/ per quanto riguarda l'esempio di Guglielmo.
... ma hai provato a compilare l'esempio che ti ho detto (FTPClient_DownloadFile) sostituendo il "defines.h"??? Perché NON deve dare alcun errore di compilazione ... ![]()
Guglielmo
Scusa non so se ho capito bene: quei caratteri spuri sono in più esatto? Visto che sembra far parte dell'orario, credo che tu non ti aspettassi altro dopo ";08".
Se sono caratteri spuri considera che "ÿ" compare in genere al posto del byte 255 (o 0xFF), e non credo sia legato al discorso UTF-8 (che ti consiglio comunque di NON usare se non realmente necessario), e quando apri il trasferimento FTP devi impostarlo in ASCII "plain".
Se tutto questo è verificato, allora dipende da cosa stai trasmettendo ossia se per caso hai ad esempio qualche stringa che non hai terminato e che quindi "sfora" di tanto in tanto. Ma dato che non hai postato il tuo codice non ti possiamo dire nulla...
Buongiorno a tutti. Scusate il ritardo con cui rispondo ma ho avuto problemi. Rispondo a Guglielmo dicendo che sì ho provato a compilare l'esempio che mi avevi indicato con il file defines.h modificato ma mi continuava a dare errori di compilazione. Ho fatto alcune ricerche su internet e ho trovato questa libreria TinyFTPClient-main con la quale sono riuscito a fare quello che volevo, cioè prendere un file memorizzato su SD e inviarlo tramite FTP ad un server su altervista.
Impossibile, hai o il "core" Arduino NON aggiornato o librerie NON aggiornate ... prima di scrivere provo sempre le cose e la compilazione NON da alcun errore (... magari qualche warning) ![]()
Guglielmo
Grazie spero di riuscire ad estrarre la parte che mi serve.
Ma si, se ti devo dire la mia dal metodo doFTP() in poi ti serve tutto. Tienti presente che oltre al nome del file io uso due parametri anno_da_nomefile e mese_da_nomefile per scendere sul server FTP in due sottocartelle anno/mese in modo da avere al massimo 31 file per ogni cartella e non metterle tutte in un unica cartella su server.