Go Down

Topic: Caricare un file da microsd a server (Read 13800 times) previous topic - next topic

SukkoPera

E allora usavi un IP fisso, ecco perché:

IPAddress ip(192, 168, 1, 22);


Appena riesco ti permetterò nuovamente di farlo. Intanto indaga su netmask e gateway che usi all'interno della tua rete.
"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

E allora usavi un IP fisso, ecco perché:

IPAddress ip(192, 168, 1, 22);


Appena riesco ti permetterò nuovamente di farlo. Intanto indaga su netmask e gateway che usi all'interno della tua rete.
Ok ;)
Comunque la subnetmask è 255.255.255.0 e il gateway 192.168.1.1
Giusto per farti sapere che li so.
MY PWS!
http://forum.arduino.cc/index.php?topic=413560.0
http://meteoflaminia.zapto.org:4600

SukkoPera

Puoi fare così comunque per il momento:

Code: [Select]
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
byte ip[] = {192, 168, 1, 22};
byte gw[] = {192, 168, 1, 1};
byte mask[] = {255, 255, 255, 0};
netint.begin (mac, ip, gw, mask);
"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

Puoi fare così comunque per il momento:

Code: [Select]
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
byte ip[] = {192, 168, 1, 22};
byte gw[] = {192, 168, 1, 1};
byte mask[] = {255, 255, 255, 0};
netint.begin (mac, ip, gw, mask);


Ok provo subito visto che ho del tempo.
MY PWS!
http://forum.arduino.cc/index.php?topic=413560.0
http://meteoflaminia.zapto.org:4600

As_Needed

#154
May 23, 2016, 03:17 pm Last Edit: May 23, 2016, 03:20 pm by As_Needed
Ecco ;)
SITO
Mi pare che adesso tutti i tag vadano bene

Anche questi per entrare nella rete meteo
RETE

Infatti quando partiamo con mettere nei tag le variabili, partiamo per la rete meteo ;)


Quando accedo alle pagine, nel monitor seriale ho sempre e solo questo, stavolta niente bug sembrerebbe.
Using Webbino 20160522
Initializing SD card... done
Trying to get an IP address through DHCP
DHCP configuration done:
- IP: 192.168.1.22
- Netmask: 255.255.255.0
- Default Gateway: 255.255.255.0
MY PWS!
http://forum.arduino.cc/index.php?topic=413560.0
http://meteoflaminia.zapto.org:4600

SukkoPera

Posta quello che appare sulla Seriale quando apri la pagina.

E dimmi con cosa vuoi partire, temperatura?
"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

Posta quello che appare sulla Seriale quando apri la pagina.

E dimmi con cosa vuoi partire, temperatura?
C'è scritto sopra che ho modificato il messaggio.
Comunque voglio partire dalla $DATA$ e $ORA$
MY PWS!
http://forum.arduino.cc/index.php?topic=413560.0
http://meteoflaminia.zapto.org:4600

SukkoPera

Se apri una pagina non scrive altro? Abilita la stampa dei messaggi di debug commentando NDEBUG in webbino_config.h
"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

#158
May 23, 2016, 04:00 pm Last Edit: May 23, 2016, 04:00 pm by As_Needed
Se apri una pagina non scrive altro? Abilita la stampa dei messaggi di debug commentando NDEBUG in webbino_config.h
Era scommentato e l ho messo cosi:
//~ #define WEBBINO_NDEBUG

E non scrive niente nel seriale... forse ho scordato qualcosa da mettere nello sketch?
Code: [Select]

#include <SdFat.h>
#include <Webbino.h>
#include <avr/pgmspace.h>
#define SD_SS 4
WebServer webserver;
 #include <WebServer_WIZ5100.h>
  NetworkInterfaceWIZ5100 netint;

EthernetServer server(80);


#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
};

#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, 22};
byte gw[] = {192, 168, 1, 1};
byte mask[] = {255, 255, 255, 0};
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 ();

}
MY PWS!
http://forum.arduino.cc/index.php?topic=413560.0
http://meteoflaminia.zapto.org:4600

SukkoPera

#159
May 23, 2016, 04:56 pm Last Edit: May 23, 2016, 04:57 pm by SukkoPera
Boh, va bene così, se non scrive niente non ci saranno errori :).

Veniamo ai tag. Per ogni tag devi scrivere una funzione. Webbino la chiamerà automaticamente quando, mentre invia una pagina, incontra il tag, e sostituirà quest'ultimo con quel che la funzione ritorna. Semplice, no? Per semplificare ulteriormente, sono passato ad utilizzare la libreria PString, che permette di fare print() in un array di caratteri.

Il primo passo è quello di definire l'array e associarlo ad una PString. Questo è già fatto nell'esempio:

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


L'unica cosa che potresti dover cambiare è quel 32: rappresenta la lunghezza massima - 1 di TUTTE le stringhe che andranno a sostituire i tag. Visto che sulla Mega hai parecchia RAM forse puoi alzarlo un po' sulla fiducia, ma potrebbe anche bastare così, vedi tu. In ogni caso se è troppo basso le stringhe verranno troncate, non succede niente di eclatante, per cui dovresti accorgertene facilmente.


Fatto questo, definiamo una funzione per l'ora ad esempio. Qualcosa tipo:
Code: [Select]
PString& evaluate_time (void *data __attribute__ ((unused))) {
int x;

x = hour ();
if (x < 10)
subBuffer.print ('0');
subBuffer.print (x);
subBuffer.print (':');

x = minute ();
if (x < 10)
subBuffer.print ('0');
subBuffer.print (x);
subBuffer.print (':');

x = second ();
if (x < 10)
subBuffer.print ('0');
subBuffer.print (x);

return subBuffer;
}


La definizione della funzione deve essere essenzialmente quella, puoi cambiare solo il nome. Nel corpo della funzione vai a riempire il subBuffer con delle print() esattamente come faresti con la Serial, e quindi lo ritorni. Mi sembra semplice.

L'ultima cosa da fare è associare la funzione al tag. Questo si fa con in fondo, dove ci sono già cose simili a queste:

Code: [Select]
static const char subTimeStr[] PROGMEM = "TIME";
const var_substitution subTimeVarSub PROGMEM = {subTimeStr, evaluate_time, NULL};


La prima riga dichiara una variabile che contiene nome del tag (TIME), la seconda associa questa variabile (subTimeStr) alla funzione dichiarata prima (evaluate_time).

Per completare l'opera, l'associazione va inserita nell'array substitutions, aggiungendo al suo interno il nome dell'associazione:

Code: [Select]
&subTimeVarSub

Forse sembra un po' cervellotico, ma è perché ho fatto di tutto per tenere solo nella flash tutto quanto possibile. Il target di Webbino è la Uno e la RAM è molto preziosa lì (soprattutto se usi un ENC28J60 come scheda di rete...). Però penso che una volta fatte un paio di ste cose il tutto diventi abbastanza meccanico.

Vedi se riesci a far funzionare l'ora e fai da solo altrettanto per la data! :)
"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

Anzi anzi, mi sembra molto semplice, grande :D :D
Ci provo subito!!

Comunque quello che tu chiami "TIME" io lo devo chiamare "ORA"
MY PWS!
http://forum.arduino.cc/index.php?topic=413560.0
http://meteoflaminia.zapto.org:4600

SukkoPera

Puoi chiamarlo anche Giuseppe se preferisci ;).
"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

Puoi chiamarlo anche Giuseppe se preferisci ;).
Si si lo so, però dico deve essere uguale al mio TAG nel pagina htm giusto? :D
MY PWS!
http://forum.arduino.cc/index.php?topic=413560.0
http://meteoflaminia.zapto.org:4600

SukkoPera

Beh, il nome è quello che scrivi nella pagina, se lo chiami ORA da una parte e TIME dall'altro ovviamente non funzionerà mai!
"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

#164
May 23, 2016, 05:16 pm Last Edit: May 23, 2016, 05:17 pm by As_Needed
Beh, il nome è quello che scrivi nella pagina, se lo chiami ORA da una parte e TIME dall'altro ovviamente non funzionerà mai!
Ecco :D Comunque su questo
const var_substitution subTimeVarSub PROGMEM = {subTimeStr, evaluate_time, NULL};

ce lo devo mettere static all'inizio?

Anche subTimeVarSub posso chiamarlo Giuseppe no? :) Rispettando ovviamente dappertutto le diciture
MY PWS!
http://forum.arduino.cc/index.php?topic=413560.0
http://meteoflaminia.zapto.org:4600

Go Up