Go Down

Topic: Come inviare i dati da ARDUINO ad una pagina HTML  (Read 21404 times) previous topic - next topic

tototer

si, ma mi viene difficile comprendere questo passaggio della definizione della funzione, potresti farmi un esempio pratico partendo dal mio valore temperature? ti ringrazio tanto, se capisco un passaggio poi diventa meccanico farlo per tutti

SukkoPera

Beh oddio, devi fare praticamente tutto uguale, solo che nell'esempio dove stampo la data, tu devi stampare la temperatura. Mi sembra immediato.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

As_Needed

#32
Oct 18, 2016, 02:14 am Last Edit: Oct 18, 2016, 02:14 am by As_Needed
Ovvio che fare un server con Arduino è pur sempre una follia! Però webbino risolve molti problemi anche avendo un HW così ristretto, è per questo per me è stata una piacevole scoperta :)



Tototer, ora è notte sono da cellulare, domani vedo cosa posso aggiungere a quello che ha detto Sukko :)
MY PWS!
http://forum.arduino.cc/index.php?topic=413560.0
http://meteoflaminia.zapto.org:4600

gpb01

In ogni caso, Webbino o non Webbino, il problema qua è che voler fare un server web pubblico su Arduino è una mezza follia fin dall'inizio, le risorse sono estremamente ristrette ...
Vero, però viene spesso dimenticato Arduino MEGA 2560, volendo anche nella comodissima versione con le dimensioni di una UNO prodotto da SeeedStudio (... che ha anche il vantaggio di lavorare sia a 5V che a 3.3V) ... e li, come risorse, siamo certamente messi molto meglio ;)

Che poi è sicuramente meglio farlo con una Raspberry ... beh ... non ci piove :D

Guglielmo
Search is Your friend ... or I am Your enemy !

SukkoPera

#34
Oct 18, 2016, 09:56 am Last Edit: Oct 18, 2016, 10:24 am by SukkoPera
Ci sono più RAM e flash, vero, ma il clock è sempre quello e, soprattutto, l'Ethernet shield è sempre quello, che non è certo fatto per accettare centinaia di connessioni contemporanee. Mi pare sia limitato a 4. Se poi usi uno shield ENC28J60 forse le cose sono pure peggio :smiley-confuse:. Insomma, a mio parere rimane qualcosa il cui accesso deve essere estremamente controllato, indipendentemente dal software che ci gira, proprio per i limiti hardware.

Ci sono piattaforme più adatte ad ospitare un webserver. Il Raspi ne è un esempio, ma anche già la Yùn, e ce ne sono anche di più economiche, tipo l'Onion Omega, per cui esiste anche una espansione Arduino, tra l'altro.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

gpb01

Ci sono più RAM e flash, vero, ma il clock è sempre quello e, soprattutto, l'Ethernet shield è sempre quello ...
Beh, anche li qualche cosa si può fare ...
... le nuove Ethernet Shield (Arduino.org, SeeedStudio, ecc.) montano il W5500 che è decisamente superiore, come prestazioni, al vecchio W5100.

Per divertirmi ho giusto messo una Ethernet con il W5500 su una MEGA e devo provare a caricarci Webbino ...
... ti faccio sapere, anche perché, se tutto va bene, ci sarebbe una piccola modifica da fare per ragioni di compatibilità (... ma prima fammi fare un po' di prove).

Comunque NON dimantichiamo che stiamo parlado di webserver "giocattolo", per piccole applicazioni private, dove il numero di connessioni non è poi così importante, ovviamente ... nulla a che vedere con hosting e macchine dedicate ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

SukkoPera

#36
Oct 18, 2016, 10:22 am Last Edit: Oct 18, 2016, 10:23 am by SukkoPera
Comunque NON dimantichiamo che stiamo parlado di webserver "giocattolo", per piccole applicazioni private, dove il numero di connessioni non è poi così importante, ovviamente ... nulla a che vedere con hosting e macchine dedicate ;)
Ecco, è proprio questo il messaggio che sto cercando di comunicare :).

Aspetto una pull request per il supporto W5500 :D.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

nid69ita

#37
Oct 18, 2016, 10:24 am Last Edit: Oct 18, 2016, 10:26 am by nid69ita
Vero, però viene spesso dimenticato Arduino MEGA 2560, volendo anche nella comodissima versione con le dimensioni di una UNO prodotto da SeeedStudio (... che ha anche il vantaggio di lavorare sia a 5V che a 3.3V) ... e li, come risorse, siamo certamente messi molto meglio ;)
Guglielmo
Se posso segnalo anche Itead come produttore di una Mega 2560 in formato piccolo:  LINK

l'Ethernet shield è sempre quello, che non è certo fatto per accettare centinaia di connessioni contemporanee. Mi pare sia limitato a 4. Se poi usi uno shield ENC28J60 forse le cose sono pure peggio
Togli pure il forse. La ENC richiede al sw di fare una parte del lavoro che la W5xxx fa in hw
my name is IGOR, not AIGOR

gpb01

Aspetto una pull request per il supporto W5500 :D.
Molto semplice ...

... seguendo lo standard del IDE 1.7.11 di Arduino.org, per la libreria vecchia per il W5100 occorre fare "#include <Ethernet.h>" mentre per la nuova W5500 si deve fare "#include <Ethernet2.h>". TUTTO il resto rimane uguale, inclusi tutti i metodi.

Devi quindi semplicemente aggiungere una "#define WEBBINO_USE_WIZ5500" e modificare i codici di conseguenza per includere la <Ethernet2.h> al posto della <Ethernet.h>

Ti allego la libreria Ethernet2 ... così la puoi inserire tra le librerie dell'IDE ... ;)

Guglielmo

P.S.: Tutto questo naturalmente se NON sei andato ad usare cose interne della libreria Ethernet e ti sei limitato ai metodi esposti, altrimenti tocca cambiare anche qualche nome ;)
Search is Your friend ... or I am Your enemy !

SukkoPera

"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

gpb01

Ah ottimo, grazie!
... ho modificato il post con una piccola annotazione finale ... verifica ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

pablos71

Visto che me lo chiedi

-webserver con file ini di impostazione remota di tutti i parametri
-16 Accessi con password MD5 a 128bit dal Master all'utente xx con livelli di operatività
-Controllo dei 4 socket separatamente del w5100 dando spazio al micro di fare le sue cose
-Controllo del MAC remoto che si collega per aumentare le restrizioni
-Controllo dell'IP remoto che si connette per aumentare le restrizioni
-Controllo del sistema OP, del tipo di macchina che si connette per spedire la corretta formattazione e adattare le pagine
-Controllo delle connessioni multiple enable/disable e impostazione del num minimo e massimo
-Uso dei cookies per facilitare e velocizzare le operazioni
-Upload delle pagine via web su SD
-Modifica delle pagine e file vari da remoto
-Download delle pagine e file vari su SD
-Controllo dei codici HTTP vari dal 200 400 301 ecc ecc
-Distinzione automatica di richieste GET POST HEAD e altre
-Possibilità di attivare sulla stessa lib il protocollo websoket, che fornisce un real time e porta via pochissime risorse al micro

altre cosette che non mi vengono in mente





L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

As_Needed

#42
Oct 18, 2016, 01:49 pm Last Edit: Oct 18, 2016, 01:50 pm by As_Needed
Carissimo As_Needed, ho fatto tutti i passaggi che mi hai detto di fare fin ora.
adesso mi spieghi come precedere?
penso che dovrei dire al mio sketch di prendere il valore temperature e tradurlo nel tag #temperatura# che è presente in una pagina nelle stesse modalità di quella che mi hai postato tu, della tua stazione meteo.
Per prima cosa, ti ripropongo un codice che ti ho fatto nella prima pagina di questo topic, per provare a vedere se vedi la pagina, senza TAG per ora ;) Giusto per visualizzarla sul tuo ip!

Nel setup guarda BENE, in un punto bisogna specificare le tue impostazioni di rete, l'ip del tuo sito, subnet e l'ip del tuo Modem (di solito è quello che c'è già)
Praticamente carica solo questo codice nel tuo Arduino per ora (tenendo conto della parte in grassetto sopra prima di caricare), scheda micro SD inserita nell'ethernet shield con la tua pagina htm.

Code: [Select]
#include <Webbino.h>
#include <avr/pgmspace.h>

#define SD_SS 4
WebServer webserver;

#include <WebServer_WIZ5100.h>
NetworkInterfaceWIZ5100 netint;
EthernetServer server(80);

/******************************************************************************
   DEFINITION OF TAGS
 ******************************************************************************/

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

static PString& evaluate_ip (void *data __attribute__ ((unused))) {
  subBuffer.print (netint.getIP ());

  return subBuffer;
}

static PString& evaluate_netmask (void *data __attribute__ ((unused))) {
  subBuffer.print (netint.getNetmask ());

  return subBuffer;
}

static PString& evaluate_gw (void *data __attribute__ ((unused))) {
  subBuffer.print (netint.getGateway ());

  return subBuffer;
}

static PString& evaluate_mac_addr (void *data __attribute__ ((unused))) {
  const byte *buf = netint.getMAC ();

  for (byte i = 0; i < 6; i++) {
    if (buf[i] < 16)
      subBuffer.print ('0');
    subBuffer.print (buf[i], HEX);

    if (i < 5)
      subBuffer.print (':');
  }

  return subBuffer;
}

static PString& evaluate_ip_src (void *data __attribute__ ((unused))) {
  if (netint.usingDHCP ())
    subBuffer.print (F("DHCP"));
  else
    subBuffer.print (F("MANUAL"));

  return subBuffer;
}

static PString& evaluate_webbino_version (void *data __attribute__ ((unused))) {
  subBuffer.print (WEBBINO_VERSION);

  return subBuffer;
}

static PString& evaluate_uptime (void *data __attribute__ ((unused))) {
  unsigned long uptime = millis () / 1000;
  byte d, h, m, s;

  d = uptime / 86400;
  uptime %= 86400;
  h = uptime / 3600;
  uptime %= 3600;
  m = uptime / 60;
  uptime %= 60;
  s = uptime;

  if (d > 0) {
    subBuffer.print (d);
    subBuffer.print (d == 1 ? F(" day, ") : F(" days, "));
  }

  if (h < 10)
    subBuffer.print ('0');
  subBuffer.print (h);
  subBuffer.print (':');
  if (m < 10)
    subBuffer.print ('0');
  subBuffer.print (m);
  subBuffer.print (':');
  if (s < 10)
    subBuffer.print ('0');
  subBuffer.print (s);

  return subBuffer;
}

static PString& evaluate_free_ram (void *data __attribute__ ((unused))) {
  extern int __heap_start, *__brkval;
  int v;

  subBuffer.print ((int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval));

  return subBuffer;
}



// Max length of these is MAX_TAG_LEN (24)
static const char subMacAddrStr[] PROGMEM = "NET_MAC";
static const char subIPAddressStr[] PROGMEM = "NET_IP";
static const char subNetmaskStr[] PROGMEM = "NET_MASK";
static const char subGatewayStr[] PROGMEM = "NET_GW";
static const char subNetConfSrcStr[] PROGMEM = "NET_CONF_SRC";
static const char subWebbinoVerStr[] PROGMEM = "WEBBINO_VER";
static const char subUptimeStr[] PROGMEM = "UPTIME";
static const char subFreeRAMStr[] PROGMEM = "FREERAM";

static const var_substitution subMacAddrVarSub PROGMEM = {subMacAddrStr, evaluate_mac_addr, NULL};
static const var_substitution subIPAddressVarSub PROGMEM = {subIPAddressStr, evaluate_ip, NULL};
static const var_substitution subNetmaskVarSub PROGMEM = {subNetmaskStr, evaluate_netmask, NULL};
static const var_substitution subGatewayVarSub PROGMEM = {subGatewayStr, evaluate_gw, NULL};
static const var_substitution subNetConfSrcVarSub PROGMEM = {subNetConfSrcStr, evaluate_ip_src, NULL};
static const var_substitution subWebbinoVerVarSub PROGMEM = {subWebbinoVerStr, evaluate_webbino_version, NULL};
static const var_substitution subUptimeVarSub PROGMEM = {subUptimeStr, evaluate_uptime, NULL};
static const var_substitution subFreeRAMVarSub PROGMEM = {subFreeRAMStr, evaluate_free_ram, NULL};

static const var_substitution * const substitutions[] PROGMEM = {
  &subMacAddrVarSub,
  &subIPAddressVarSub,
  &subNetmaskVarSub,
  &subGatewayVarSub,
  &subNetConfSrcVarSub,
  &subWebbinoVerVarSub,
  &subUptimeVarSub,
  &subFreeRAMVarSub,
  NULL
};


/******************************************************************************
   MAIN STUFF
 ******************************************************************************/

// Avoid some bug reports :)
#if !defined (WEBBINO_ENABLE_SD) && !defined (WEBBINO_ENABLE_SDFAT)
#error Please enable WEBBINO_ENABLE_SD or WEBBINO_ENABLE_SDFAT in webbino_config.h
#endif


void setup() {
  Serial.begin (9600);
  Serial.println (F("Using Webbino " WEBBINO_VERSION));

  byte mac[] = {
    0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
  };
  byte ip[] = {
    192, 168, 1, 51//l'ip usato dalla scheda ethernet              //////////////////////////////////////////////////////////////////////
  };                                                               //////////////////////////////////////////////////////////////////////
  byte gw[] = {                                                    //////////////////////////////////////////////////////////////////////
    192, 168, 1, 1//il vostro ip del modem o router                //GW E MASK SONO VISIBILI NELLE IMPOSTAZIONI DI RETE DEL VOSTRO PC////
  };                                                               //////////////////////////////////////////////////////////////////////
  byte mask[] = {                                                  //////////////////////////////////////////////////////////////////////
    255, 255, 255, 0//la net mask                                  //////////////////////////////////////////////////////////////////////
  };                                                               //////////////////////////////////////////////////////////////////////
  //netint.begin (mac);
  netint.begin (mac, ip, gw, mask);

  Serial.print (F("Initializing SD card..."));
  if (!webserver.enableSD (SD_SS)) {
    Serial.println (F(" failed"));
    while (42)
      ;
  }
  Serial.println (F(" done"));

  Serial.println (F("Trying to get an IP address through DHCP"));
  if (!webserver.begin (netint, NULL, substitutions)) {
    Serial.println (F("Failed to get configuration from DHCP"));
    while (42)
      ;
  }
  else {
    Serial.println (F("DHCP configuration done:"));
    Serial.print (F("- IP: "));
    Serial.println (netint.getIP ());
    Serial.print (F("- Netmask: "));
    Serial.println (netint.getNetmask ());
    Serial.print (F("- Default Gateway: "));
    Serial.println (netint.getGateway ());
  }
}

void loop() {
  webserver.loop ();

}




N.B. Prima di caricare lo sketch con le opportune modifiche, siccome la tua pagina iniziale si chiama a come ho capito, 'index.htm' ti consiglio di andare di nuovo nel file webbino_config e cambiare questa riga:

#define REDIRECT_ROOT_PAGE "index.html"

così:

#define REDIRECT_ROOT_PAGE "index.htm"

Una volta caricato in modo corretto il codice, prova ad accedere al tuo ip del sito ;)
MY PWS!
http://forum.arduino.cc/index.php?topic=413560.0
http://meteoflaminia.zapto.org:4600

As_Needed

#43
Oct 18, 2016, 01:54 pm Last Edit: Oct 18, 2016, 01:55 pm by As_Needed
Riguardo al discorso che avete fatto, mi trovo d'accordo e aggiungo che usando varie schede migliori, con ad esempio la W5500, si può migliorare ancora di più il server, però si tratterà sempre di cose amatoriali, ma comunque molto efficaci per il loro scopo!
Risponderà Sukko, ma quello che chiede pablos, forse non è adatto proprio ad Arduino...

P.S. Io uso Arduino Mega e ethernet W5100 con webbino e dura da tre mesi senza blocchi.
MY PWS!
http://forum.arduino.cc/index.php?topic=413560.0
http://meteoflaminia.zapto.org:4600

gpb01

Per i possessori di Ethernet Shield basate su W5500 come quella ufficiale di Arduino.org o quella di SeeedStudio ...
... prendete l'ultima versione dell'IDE 1.6.12, nella cartella /libraries aggiungete la libreria Ethernet2 che trovate allegata (... NON dovete togliere la Ethernet che va lasciata al suo posto).

A questo punto, TUTTA DA VERIFICARE, in allegato anche la libreria Webbino modificata per gestire la W5500. Ho aggiunto, nel file "webbino_config.h" la riga "#define WEBBINO_USE_WIZ5500" ... la logica rimane la stessa, si deve decommentare SOLO la riga relativa alla scheda che si possiede.

Ho aggiornato anche tutti gli esempi ... un paio li ho provati e girano tranquillamente ... ;)

Però ripeto ... È TUTTA DA VERIFICARE ... e magari poi SukkoPera la includerà direttamente nella distribuzione ;)

Fatemi sapere se vi funziona :)

Guglielmo

P.S.: I miei complimenti a SukkoPera per la modularità e la facilità di manutenzione di questa sua libreria :)
P.P.S.: NON ho aggiornato la versione in library.properties ... lo farà SukkoPera quando deciderà di rilasciarla ufficialmente. Nel sorgente la versione è aggiornata a 20161018.
Search is Your friend ... or I am Your enemy !

Go Up