Caricare un file da microsd a server

Ecco :wink:
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 :wink:

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

Posta quello che appare sulla Seriale quando apri la pagina.

E dimmi con cosa vuoi partire, temperatura?

SukkoPera: 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$

Se apri una pagina non scrive altro? Abilita la stampa dei messaggi di debug commentando NDEBUG in webbino_config.h

SukkoPera:
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?

#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 ();

}

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:

#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:

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:

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:

&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! :slight_smile:

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

Comunque quello che tu chiami "TIME" io lo devo chiamare "ORA"

Puoi chiamarlo anche Giuseppe se preferisci ;).

SukkoPera: Puoi chiamarlo anche Giuseppe se preferisci ;).

Si si lo so, però dico deve essere uguale al mio TAG nel pagina htm giusto? :D

Beh, il nome è quello che scrivi nella pagina, se lo chiami ORA da una parte e TIME dall'altro ovviamente non funzionerà mai!

SukkoPera: 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

static non dovrebbe fare differenza in questo caso, io l'avevo messo nella speranza di risparmiare flash ma temo che non serva a niente in questo contesto, poi ho dimenticato di toglierlo.

Puoi chiamare tutto come ti pare e piace, non ci sono restrizioni se non quelle relative ai nomi delle variabili in C: solo caratteri alfanumerici e underscore, il primo carattere non può essere un numero. Tieni comunque presente che avrai una marea di tutte ste cose, per cui se usi un pattern ricorrente contenente il nome stesso del tag (come ho fatto io, in cui compare Time dappertutto) ti semplifichi la vita.

FA!! Intanto questo tag è apposto :D :D Controlla pure QUI

Stavolta risponde sulla seriale così:

Using Webbino 20160522
Using Arduino Ethernet library
Server is at 255.255.255.255
Initializing SD card...Initializing SD card... done
 done
Trying to get an IP address through DHCP
Pages available in flash memory:
Tags available:
0. NET_MAC
1. NET_IP
2. NET_MASK
3. NET_GW
4. NET_CONF_SRC
5. WEBBINO_VER
6. UPTIME
7. FREERAM
8. ORA
DHCP configuration done:
- IP: 192.168.1.22
- Netmask: 255.255.255.0
- Default Gateway: 255.255.255.0
New client
Request for "/meteo.txt"
Sending page from SD file /meteo.txt
Processing replacement tag: "DATA"
Tag not found
Processing replacement tag: "ORA"
Replacement is: "17:21:56"
Processing replacement tag: "TEMPERATURA"
Tag not found
Processing replacement tag: "UMIDITA"
Tag not found
Processing replacement tag: "PRESSIONE"
Tag not found
Processing replacement tag: "VENTO"
Tag not found
Processing replacement tag: "DIREZIONE"
Tag not found
Processing replacement tag: "PIOGGIA"
Tag not found
Processing replacement tag: "MINTEMP"
Tag not found
Processing replacement tag: "MAXTEMP"
Tag not found
Processing replacement tag: "RAFFICA"
Tag not found
Processing replacement tag: "RAINRATE"
Tag not found
Client disconnected
New client
Request for "/favicon.ico"
Client disconnected
New client
Request for "/meteo.txt"
Sending page from SD file /meteo.txt
Processing replacement tag: "DATA"
Tag not found
Processing replacement tag: "ORA"
Replacement is: "17:22:02"
Processing replacement tag: "TEMPERATURA"
Tag not found
Processing replacement tag: "UMIDITA"
Tag not found
Processing replacement tag: "PRESSIONE"
Tag not found
Processing replacement tag: "VENTO"
Tag not found
Processing replacement tag: "DIREZIONE"
Tag not found
Processing replacement tag: "PIOGGIA"
Tag not found
Processing replacement tag: "MINTEMP"
Tag not found
Processing replacement tag: "MAXTEMP"
Tag not found
Processing replacement tag: "RAFFICA"
Tag not found
Processing replacement tag: "RAINRATE"
Tag not found
Client disconnected
New client
Request for "/index.htm"
Sending page from SD file /index.htm
Processing replacement tag: "DATA"
Tag not found
Processing replacement tag: "ORA"
Replacement is: "17:22:09"
Processing replacement tag: "TEMPERATURA"
Tag not found
Processing replacement tag: "UMIDITA"
Tag not found
Processing replacement tag: "DEWPOINT"
Tag not found
Processing replacement tag: "PIOGGIA"
Tag not found
Processing replacement tag: "RAINRATE"
Tag not found
Processing replacement tag: "VENTO"
Tag not found
Processing replacement tag: "DIREZIONE"
Tag not found
Processing replacement tag: "PRESSIONE"
Tag not found
Processing replacement tag: "WINDCHILL"
Tag not found
Processing replacement tag: "HEATINDEX"
Tag not found
Processing replacement tag: "MEDIATEMP"
Tag not found
Processing replacement tag: "TEMPINSIDE"
Tag not found
Processing replacement tag: "MAXTEMP"
Tag not found
Processing replacement tag: "MAXTEMP_ORA"
Tag not found
Processing replacement tag: "MINTEMP"
Tag not found
Processing replacement tag: "MINTEMP_ORA"
Tag not found
Processing replacement tag: "UMIDITAMAX"
Tag not found
Processing replacement tag: "UMIMAX_ORA"
Tag not found
Processing replacement tag: "UMIDITAMIN"
Tag not found
Processing replacement tag: "UMIMIN_ORA"
Tag not found
Processing replacement tag: "DEWPOINTMAX"
Tag not found
Processing replacement tag: "DEWPOINTMAX_ORA"
Tag not found
Processing replacement tag: "DEWPOINTMIN"
Tag not found
Processing replacement tag: "DEWPOINTMIN_ORA"
Tag not found
Processing replacement tag: "RAINRATEMAX"
Tag not found
Processing replacement tag: "RAINRATEMAX_ORA"
Tag not found
Processing replacement tag: "RAFFICA"
Tag not found
Processing replacement tag: "RAFFICA_ORA"
Tag not found
Processing replacement tag: "PRESSIONEMAX"
Tag not found
Processing replacement tag: "PRESSIONEMAX_ORA"
Tag not found
Processing replacement tag: "PRESSIONEMIN"
Tag not found
Processing replacement tag: "PRESSIONEMIN_ORA"
Tag not found
Processing replacement tag: "WINDCHILLMIN"
Tag not found
Processing replacement tag: "WINDCHILLMIN_ORA"
Tag not found
Processing replacement tag: "HEATINDEXMAX"
Tag not found
Processing replacement tag: "HEATINDEXMAX_ORA"
Tag not found
Client disconnected
New client
Request for "/index.htm"
Sending page from SD file /index.htm
Processing replacement tag: "DATA"
Tag not found
Processing replacement tag: "ORA"
Replacement is: "17:22:38"
Processing replacement tag: "TEMPERATURA"
Tag not found
Processing replacement tag: "UMIDITA"
Tag not found
Processing replacement tag: "DEWPOINT"
Tag not found
Processing replacement tag: "PIOGGIA"
Tag not found
Processing replacement tag: "RAINRATE"
Tag not found
Processing replacement tag: "VENTO"
Tag not found
Processing replacement tag: "DIREZIONE"
Tag not found
Processing replacement tag: "PRESSIONE"
Tag not found
Processing replacement tag: "WINDCHILL"
Tag not found
Processing replacement tag: "HEATINDEX"
Tag not found
Processing replacement tag: "MEDIATEMP"
Tag not found
Processing replacement tag: "TEMPINSIDE"
Tag not found
Processing replacement tag: "MAXTEMP"
Tag not found
Processing replacement tag: "MAXTEMP_ORA"
Tag not found
Processing replacement tag: "MINTEMP"
Tag not found
Processing replacement tag: "MINTEMP_ORA"
Tag not found
Processing replacement tag: "UMIDITAMAX"
Tag not found
Processing replacement tag: "UMIMAX_ORA"
Tag not found
Processing replacement tag: "UMIDITAMIN"
Tag not found
Processing replacement tag: "UMIMIN_ORA"
Tag not found
Processing replacement tag: "DEWPOINTMAX"
Tag not found
Processing replacement tag: "DEWPOINTMAX_ORA"
Tag not found
Processing replacement tag: "DEWPOINTMIN"
Tag not found
Processing replacement tag: "DEWPOINTMIN_ORA"
Tag not found
Processing replacement tag: "RAINRATEMAX"
Tag not found
Processing replacement tag: "RAINRATEMAX_ORA"
Tag not found
Processing replacement tag: "RAFFICA"
Tag not found
Processing replacement tag: "RAFFICA_ORA"
Tag not found
Processing replacement tag: "PRESSIONEMAX"
Tag not found
Processing replacement tag: "PRESSIONEMAX_ORA"
Tag not found
Processing replacement tag: "PRESSIONEMIN"
Tag not found
Processing replacement tag: "PRESSIONEMIN_ORA"
Tag not found
Processing replacement tag: "WINDCHILLMIN"
Tag not found
Processing replacement tag: "WINDCHILLMIN_ORA"
Tag not found
Processing replacement tag: "HEATINDEXMAX"
Tag not found
Processing replacement tag: "HEATINDEXMAX_ORA"
Tag not found
Client disconnected

OK, sembra tutto a posto. L'output dovrebbe anche aiutarti a capire quali tag vengono riconosciuti e processati correttamente e quali no:

Processing replacement tag: "ORA"
Replacement is: "17:21:56"

SukkoPera:
OK, sembra tutto a posto. L’output dovrebbe anche aiutarti a capire quali tag vengono riconosciuti e processati correttamente e quali no:

Processing replacement tag: "ORA"

Replacement is: “17:21:56”

Sì si già ci facevo caso :slight_smile: :slight_smile:
La data pure è già pronta :slight_smile:

Ma nel loop se ci metto questo per l’umidità, dopo come faccio?

int ur = floor(dht.readHumidity());

  if (dht.readHumidity() >= 99.8)
  {
    ur = 100;
  }

Dopo qui ovviamente mi dice che non è dichiarata ur

PString& umidita_notime (void *data __attribute__ ((unused))) {
  int x;

  x = ur;

  return subBuffer;
}

Ah ho detto una cavolata :slight_smile: Devo mettere tutto nella funzione, anche questo

int ur = floor(dht.readHumidity());

  if (dht.readHumidity() >= 99.8)
  {
    ur = 100;
  }

Aspetta un attimo per i sensori, volevo proporti un approccio diverso per fare le cose in maniera ordinata e gestibile.

SukkoPera: Aspetta un attimo per i sensori, volevo proporti un approccio diverso per fare le cose in maniera ordinata e gestibile.

Va bene allora mi fermo alla data ;)

Togli anche i tag che c'erano nell'esempio e che non prevedi di usare: NET_MAC, ecc. UPTIME magari puoi anche mostrarlo da qualche parte. WEBBINO_VER puoi usarlo per un "Powered by" :D.

Si infatti praticamente di quelli tengo solo uptime e webbinover per il powered :D Uptime che sarebbe, da quanto tempo hai aggiornato la pagina?