[Risolto] Scambio dati tra SD e sito Web

Buongiorno a tutti. Dopo la dovuta presentazione vi illustro qual'è il problema per il quale non ho ancora trovato la soluzione. Prima di tutto l'hardware utilizzato: per questo progetto utilizzo un Arduino mega con la ethernet shield, una prototype shield, una RTC 3231, una serie di sonde Ds18b20 e una scheda con 8 relè. Il risultato da ottenere è una centralina per il controllo di una centrale termica che sfrutta pannelli solari, una parte di geotermico, uno scambiatore acqua-acqua e altre cosette, non sto a tediarvi con i particolari anche perché è abbastanza contorta. Il sistema è perfettamente funzionante: la centralina carica dati e parametri dalla scheda SD, si comporta in base a quanto programmato, aziona le 4 pompe in base ai parametri rilevati dalle 5 sonde, visualizza su una serie di LED lo stato dei componenti principali e invia quotidianamente una mail con il file dei log rilevati ogni 10 minuti per una successiva analisi dei rendimenti. Il listato completo del programma sfiora le 700 righe di codice.

Ora il problema: devo poter variare i file dei parametri residenti sulla SD senza dovere per forza andare sul posto e smontare il quadro per togliere la microsd, metterla nel PC, correggere il file e rimettere tutto a posto.

Avevo pensato a varie soluzioni che però ho dovuto abbandonare forse erroneamente: - Istallare una funzione che attivi un serverino FTP basato su Arduino, ma oltre alla difficoltà della gestione del protocollo bisogna anche aprire le porte sul router, attivare il DNS dinamico ecc... Scartata. - Leggere una mail dall' Arduino, scaricare il corpo del messaggio o un allegato e salvarlo sulla SD, ma non ho trovato il modo di gestire il protocollo POP3... scartata. - Creare una pagina web basata su Arduino in cui posso modificare i files di configurazione (dimenticavo, sono dei semplici file di testo), ma anche qui oltre alle difficoltà della pagina web dovrei attivare il virtual server, avere un minimo di sicurezza con una user e password... troppo complicato. Scartata.

L'unica via che mi sembrava percorribile era quella di mettere su un sito web vuoto il solo file di testo che voglio cambiare e Arduino a intervalli di 15 minuti va a vedere se c'è qualcosa di nuovo, scarica il file e lo cancella... avevo visto da qualche parte qualcosa di simile ma non riesco più a trovare dove, qualcuno sa come aiutarmi?

Ogni altra idea è ben accetta, grazie a tutti e scusate la mia prolissità.

Scusa le domande, ma sono propedeutiche a cercare una soluzione

tu vuoi leggere e scrivere i parametri dei sngoli file di configurazione o trasferire prorpio un generico file da e per la SD?

il secondo caso sarebbe molto più generale, e corrisponde a quello che hai descritto e chiesto

ma il primo sarebbe più semplice,

se per esempio tu avessi i file di configurazione divisi un parametro per riga, riga che comincia col nume del parametro; si tratterebbe di un metodo standard in questo caso non ti sarebbe difficile far leggere ad arduino la riga che ti interessa e far trasmettere solo il parametro, non l'intero file

in scrittura le cose si complicrebbero un po', dovendo gestire sia il caso di correzzione del valore che il caso di parametro aggiunto "ex novo", ma non vedo nulla di impossibile

La struttura dei file di configurazione è molto semplice: un parametro per riga senza nessun indicatore, praticamente su ogni riga c'è scritto il valore della temperatura di una pre determinata fascia oraria. La lunghezza del file è invariabile, le ore sono 24 e 24 sono le righe. Ogni 10 minuti la centralina va a leggere dalla SD il file corrispondente al giorno della settimana e ne carica i parametri in un array di 24 posizioni, dopodiché agisce di conseguenza. Stesso discorso per il file di parametri generali, lunghezza fissa con un valore per riga.

Io pensavo che trasferire tutto il file di botto fosse più semplice, l'editazione secondo me presupponeva la presenza col PC vicino alla centralina.

Anche il discorso di leggere e scrivere... io so già cosa c'è scritto su ogni riga, non mi interessa tanto leggere i parametri ma sostituire quelli che reputo errati. Ribadisco che la mia idea di trasferire l'intero file era dettata da un discorso di praticità, non vedo così facile cambiare da remoto i valori di un file senza una interfaccia "server" su Arduino, ma non aver paura di smentirmi.

Grazie per l'attenzione, a presto

Oh no,

Un interfaccia server serve, scusa il gioco di parole

Ma anche nel caso di ftp o trasferimento file serve qualcosa di interfaccia su arduino

Si tratta di decidere cosa sia più semplice da fare

Magari posta programma, se ti va, che ci guardo

Se vuoi il programma non ci sono problemi ma devi aspettare che tolgo i vari parametri personali da mail e quant'altro; ad ogni modo non c'è alcun riferimento allo scambio dati da Web a SD. L'unica cosa che ho già previsto è, come accennavo prima, il fatto che ogni 10 minuti vado a rileggere il file in modo che, se nel frattempo ho applicato qualche correzione "da fuori", il programma procede coi nuovi parametri.

... che voglia che hai a volerti sfogliare 684 righe di codice... poi però non prendermi in giro per quello che ho scritto :) :)

Tornando a noi senti un po' la mia idea e dimmi se secondo te è una strada percorribile:

  • Su un "sito web" (ho un web server personale e non ho di questi problemi) metto un file di testo che è il file modificato che voglio passare alla centralina. Arduino alle 3 del mattino si collega al sito (client ethernet), si autentica, controlla se c'è un file e, nel caso che lo trova, cancella il corrispondente file sulla SD, scarica il file dal sito e lo salva sulla SD cancellandolo dal sito.

  • Altra alternativa è che sul sito lascio tutti gli 8 files di configurazione (7 giorni della settimana più il file di parametri generali), ogni tot Arduino legge i files e li compara riga per riga con quelli che ha su SD, sostituendo i parametri discordanti. Solo che in questo modo devo tenere aperti due files (non si può mi sembra) o muovermi coi seek tra un file e l'altro, non è difficile ma è macchinoso... mi vengono le idee mentre ti scrivo e sembra di vedere uno spiraglio di luce in fondo al tunnel

In questa maniera la parte server viene espletata dal server web e non devo inventare niente di strano, solo non trovo più la parte di codice da cui partire che avevo visto non ricordo dove sul web.

Che dici, non mi sembra difficile ma sto affogando in un bicchiere d'acqua, non trovo il punto di partenza su cui poi sviluppare il tutto.

Grazie ancora.

MircoZ: - Su un "sito web" (ho un web server personale e non ho di questi problemi) metto un file di testo che è il file modificato che voglio passare alla centralina. Arduino alle 3 del mattino si collega al sito (client ethernet), si autentica, controlla se c'è un file e, nel caso che lo trova, cancella il corrispondente file sulla SD, scarica il file dal sito e lo salva sulla SD cancellandolo dal sito.

Questa è semplice, recuperi con una GET il file di testo e manipoli la stringa/char array come vuoi. Prima scarica, DOPO cancella.

Grazie Silvio Riesci a postare un esempio anche non troppo contestualizzato di come posso salvare il file su SD? Mi serve solo un punto di partenza....

Ho cercato un po' in giro ma il metodo file non mi porta a nessuna funzione get... non è che per caso stai parlando di PHP o qualche altro linguaggio che non conosco? io conosco solo il C++ e neppure troppo bene, potete darmi qualche altra idea o spiegarmi meglio questa? Grazie mille

Intendo dire che con EthernetClient recuperi direttamente tramite una GET il contenuto del file testo, senza server FTP o programmazione lato web server o altro. Hai mai provato ad aprire con un browser un file di testo? Viene visualizzato senza che compaia alcuna finestra di download, perchè è un tipo MIME: text/html

...quindi stai parlando di questo, giusto?? preso da https://www.arduino.cc/en/Tutorial/WebClient

// if you get a connection, report back via serial: if (client.connect(server, 80)) { Serial.println("connected"); // Make a HTTP request: client.println("GET /search?q=arduino HTTP/1.1"); client.println("Host: www.google.com"); client.println("Connection: close");

io ci capisco niente, ma quello è HTTP e mi ci perdo ancora prima di iniziare. Tu sei un ex programmatore, io faccio il sistemista Windows e il tecnico hardware...

Se non ti è di troppo disturbo riesci a indicarmi un link dove imparare ad usare quel set di istruzioni? Quello che devo fare lo hai capito bene, riesci a darmi un'altra spintarella?

Ho letto anche questo: https://forum.arduino.cc/index.php?topic=138127.0 ma non capisco dove finisce il file che prelevo col GET, perdonami ma la mia preparazione ha dei seri limiti....

Grazie mille

E' più semplice di quel che pensi, quando fai una GET di un file txt il web server ti invia direttamente il contenuto di quel file. La classe client dell'esempio che hai postato non riceve un oggetto file da manipolare, devi tu leggere lo stream dati con read() Ti girerei del codice ma non ne ho perché in queste cose sono un fedele parrocchiano di ESP8266 :D Guardati questi links: https://www.arduino.cc/en/Reference/ClientRead http://forum.arduino.cc/index.php?topic=261715.0 https://www.arduino.cc/en/Reference/EthernetClient

Vedi?? da noi si dice che un esperto è uno che sa dirti più di quello che vuoi sapere... in due parole SEI GRANDE.

Credo che farò in modo di popolare una stringa da 200 caratteri (tra cui CR e LF, giusto??) con i dati dello stream e poi la giro su un file.

Grazie di tutto, a risentirci.