esportate variabile da arduino verso html

Non ne esco ma sono certo che si può fare!!!
trasferire il valore di una variabile da arduino a un file html che successivamente viene richiamato da arduino per compilare una pagina visionabile mediante webserver.
ho trovato esempi in giro ma sono troppo complessi e non riesco a comprendere il funzionamento basilare.
tento pertanto di copiare lo Sketch che sicuramente lo posterò in maniera sbagliata! abbiate pietà!
vi allego anche il file index.htm che viene richiamato è tutto appositamente semplificato perchè vorrei capire una volta per tutte.
grazie per la comprensione e per l’aiuto

html_su_sd.ino.ino (2.93 KB)

Se ti va, puoi provare il mio webserver Webbino. Guarda l'esempio ReplacementTags, dovrebbe essere immediato capire come fare quello che vuoi.

grazie, per l'aiuto.... ho visto ora il mio messaggio che ho postato e molto probabilmente non si capisce la domanda che ho fatto. nello sketch ho inizializzato una variabile di nome DATO dandogli un ipotetico valore 100. nella sd ho un semplice file index.htm vorrei che l'htm acquisisse la variabile (che in questo momento è fissa per comprendere meglio) mediante webserver mi collego mediante browser ad arduino, che dovrebbe mostrarmi la variabile

sugli esempi di SukkoPera comprendo che la variabile sul file index viene richiamata con il comando NET non ancora chiaro ma un punto di partenza mentre decisamente in alto mare la comprensione dello sketch per valorizzare la variabile.

1) qual'è la cartella degli esempi indicati da SukkoPera che si adatterebbe maggiormente al mio caso? 2) esiste un comando per creare la variabile nello sketch che possa però essere utilizzata poi dal file htm sulla sd? spero di non aver complicato maggiormente la spiegazione grazieper i contributi!!! In debito!!!

Si era capito, e Webbino fa proprio al caso tuo. Provo a spiegarti rapidamente come funziona. Prendiamo l'esempio SDOnly, visto che hai una SD (potresti farne a meno se hai poche pagine che stanno in flash).

Come prima cosa devi mettere il file HTML sulla SD. Supponiamo che si chiami index.htm. Nel punto del file in cui vuoi compaia il valore della variabile dato, scrivi #DATO#, proprio così, maiuscolo e tra due cancelletti.

Se ora carichi lo sketch così com'è, dovresti poter accedere al tuo file HTML.

Ora prendi lo sketch, vai verso il fondo e modifica come segue:

static const char subDatoStr[] PROGMEM = "DATO";
static const ReplacementTag subDatoVarSub PROGMEM = {subDatoStr, evaluate_dato, NULL};

static const ReplacementTag * const substitutions[] PROGMEM = {
    &subDatoVarSub
};

Con queste righe (lo ammetto, un po' criptiche...) stai essenzialmente dicendo a Webbino: "quando incontri #DATO#, chiama la funzione evaluate_dato() e sostituiscilo con il valore che ritorna". Per cui non ti rimane che definire tale funzione:

#define REP_BUFFER_LEN 32
static char replaceBuffer[REP_BUFFER_LEN];
PString subBuffer (replaceBuffer, REP_BUFFER_LEN);

static PString& evaluate_dato (void *data) {
    subBuffer.print (dato);
    return subBuffer;
}

La funzione deve ritornare una PString riempita con il valore da sostituire.

oggi provo, sembra che la tua spiegazione sia stata anche recepita dal mio cervello…

grazie infinite vi faccio sapere

so che dovrò vergognarmi di questa domanda, ma lo sketch mi chiede la libreria <Webbino.h> e <avr/pgmspace.h> come si fa ad importarle
l’ho trovata a questo sito ma non capisco come scaricare o fare il file webbino.h
intanto provo a continuare a sbatterci la testa

menu librerie importa file zip

Semplice, scarichi da github di sukkopera cliccando sul download e poi da Arduino IDE l'import dal menu di gestione librerie.

so che sembra una domanda sciocca ma non è la prima libreria che includo dalla pagina https://github.com/SukkoPera/Sukkino/tree/sd_support ho scaricato il file zip (sukkino-sd_support.zip) e dal programma arduino includo libreria da zip ma il risultato è la cartella zip specificata non contiene una libreria valida

io sto lavorando con arduino uno. probabilmente sto scaricando il zip sbagliato! mannaggia!!!!

Uhm no, è giusto. Ma fai che scompattare lo zip nella tua cartella arduino\libraries. Deve rimanere una cartella Webbino con dentro i vari file e cartelle tra cui examples, secondo, ecc…

cykuve: dalla pagina https://github.com/SukkoPera/Sukkino/tree/sd_support ho scaricato il file zip (sukkino-sd_support.zip)

Io pensavo che si facesse solo dalla pagina principale. A destra c'è il pulsante di download e scelta di scaricare in zip. Il che significherebbe avere una copia del git. Che poi in certi casi non servono tutti i files. Ma se si addentra in un ramo del git, succede che mancherà qualche dipendenza.

In ogni caso, per le mie esperienze. Ho fatto sia con zip che con git. Alla fine basta che si copia la struttura (necessaria) nella cartella delle librerie. Il percorso dipende poi dal SO

trasferire il valore di una variabile da arduino a un file html che successivamente viene richiamato da arduino per compilare una pagina visionabile mediante webserver.

Non funziona proprio così, il dato non finisce su un file che poi chiami dopo, prima chiami il file html da browser, poi con le dovute istruzioni javascript vai a compilare i campi per visualizzare i dati a schermo, l'html+js è un programma attivo vero e proprio, non è un file formato testo che carichi e lo guardi, come un documento excel può contenere uno script che raccoglie i dati da qualche parte e te li mette in tabella in posizioni predefinite dallo script.

A prescindere da quali librerie usi, l'html dovrà contenere una funzione nel js che fa la richiesta e ascolta la risposta, prendi la risposta e ne fai quello che vuoi dal lato html

ES:

$.ajax({
  // definisco il tipo della chiamata
  type: "POST",
  // specifico la URL della risorsa da contattare in questo caso l'IP di arduino
  url: "http://192.168.......",
  // passo dei dati alla risorsa remota
  data: "miodato=ciao",
  // imposto un'azione per il caso di successo
  success: function(risposta){
    // dentro a success quindi (risposta) c'è il dato che arduino ti ha mandato e lo piazzi dove vuoi nella pag html o lo tratti come variabile nel javascript
  },
  // ed una per il caso di fallimento
  error: function(){
    alert("Chiamata fallita!!!");
  }
}

Scarica tutto lo zip del git e poi copia la cartella Webbino in libraries, basta quella, ma le altre non fanno comunque male ;). Scusa ma sono via per qualche giorno e non leggo il forum di frequente, da martedì sarò nuovamente più presente.

grazie per l'aiuto e scusatemi per il ritardo, l'acquisizione della libreria ha funzionato (grz SukkoPera), proverò il tuo sketch sdonly a breve.

grazie anche a Pablo... ma lì ho paura che dovrò allenare ancora un pò i neuroni!!!

nel frattempo l'idea di comprendere e fare qualcosa si è evoluta e la prossima domanda è: è possibile con un ciclo for incrementare la variabile esempio ho 3 sensori temperatura DHT11 per scrivere sul serverweb uso client.print(dht1.readTemperature()); client.print(dht2.readTemperature()); client.print(dht3.readTemperature());

è possibile con un ciclo for ridurre le righe di programmazione? client.print(dht X .readTemperature());

dove la X sarebbe il numero da incrementare ma non conosco la forma di come scrivere lo sketch.

grazie

integro la richiesta... lo stesso dicasi se passassi da una variabile tipo:

float h1 = dht1.readHumidity(); float h2 = dht2.readHumidity(); float h3 = dht3.readHumidity();

per poi stampare la singola variabile che però dovrebbe incrementarsi con il for e quindi invece di:

client.print(h1); client.print(h2); client.print(h3);

for.... client.print(hX);

Ciao, se stai usando la libreria del playground allora puoi definire una sola variabile dht e leggerla come

int chk;
double results[3];
//Esempio il primo sensore è collegato al pin 3, il secondo al 4, ecc.
byte sensorBasePin = 3;
for(byte i=0;i<3;i++){
   chk = DHT.read11(i+sensorBasePin);
   results[i] = DHT.temperature;
}

poi lo invii al client

for(byte i=0;i<3;i++){
   client.print(results[i]);
}

ovvio che se non devi farci altro con i risultati puoi evitare l’array e fare subito l’invio al client.
Nel for ho omesso il costrutto switch che controlla se la lettura è andata a buon fine, se guardi nel playground comunque puoi verificare facilmente ciò che manca

Che poi se usa la libreria con html su SD dovrà usare client.write(temp1,temp2,temp3) in sequenza con separatore interpretati da un js, altrimenti visualizza 3 righe di testo su una pag html Credo che debba ancora decidere cosa fare ....

grazie a tutti,
no il progetto prosegue a rilento per il tempo che riesco a dedicarci e perchè cerco di comprendere e non fare copia incolla di cose che trovo.
pertanto se può servire a qualcuno momentaneamente ho risolto con un FOR di una variabile generica e poi una sequenza di IF in base alla variabile
per spiegarmi se serve a qualcuno ( ne dubito):

for (int d = 1; d < 3; d++)
         {
           //  int sensorReading = analogRead(analogChannel);
           if (d == 1) {
             t1 = (dht1.readTemperature());
           } else {
             t1 = (dht2.readTemperature());
           }
           client.println("<body><h4>");
           client.print("<progress value==t1 max=100></progress>");
           client.println("<font color=black>ROOM");
           client.print(d);
           client.print(" = ");
           client.print(t1);
         }

ora il comando in html progress non ne vuole sapere di prendere di prendere la variabile t1
client.print("");
se metto un valore numerico funziona
client.print("");

altra domanda da neofita sul forum
e’ preferibile continuare sullo stesso post a far domande o per una miglior ricerca degli utenti aprire più post in base alla domanda?
grazie ancora a tutti

**>cykuve: **ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (in basso a destra del post, bottone More → Modify) e racchiudere il codice (anche se poche righe) all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra). Grazie.

Guglielmo

pablos: Credo che debba ancora decidere cosa fare ....

Dal post successivo credo che stia tentando di saturare la memoria di arduino :D (Scusate non ho resistito)

Il for messo in quel modo serve a poco se non a nulla, non diminuisce la facilità di lettura del codice e non incrementa le prestazioni o diminuisce l'occupazione di memoria, oltretutto non hai tratto spunto dal codice postato prima e definisci una int per ospitare un valore da 0 a 3 che è uno spreco di risorse. Per il problema della variabile passata all'html se dal browser fai analizza pagina noterai che l'html generato è esattamente ciò che hai scrito tra i doppi apici, non puoi aspettarti che il compilatore sostituisca la variabile con il relativo valore se questa è tra i doppi apici (che per il compilatore è una stringa unica), devi fare più o meno ciò che hai fatto due righe sotto con la variabile d anche se come consiglio spassionato dovresti passare immediatamente alla libreria che ti permette di usare l'html da sd e affrontare i vari problemi (tra cui uno indicato da @pablos ) perché la strada intrapresa ti porterà a breve a superare i limiti di memoria di arduino o di sperimentare "strani ed incomprensibili blocchi casuali del programma" ovvero per un po' funziona poi smette di funzionare finché non restetti ecc. sintomi di memoria piena ecc.