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.
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.
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
// 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?
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
Guardati questi links: