#define REQ_BUF_SZ ??????

Ho un problema che mi sta facendo impazzire: ho preso spunto da uno sketch trovato online (Arduino Webserver Input and Output) per modificarlo a mio piacere. Ma ho un problema: se cambio la riga "#define REQ_BUF_SZ 60" con un valore del buffer più alto, quando vado a cercare la mia pagina web non me la visualizza più. Ovviamente se tengo il buffer a quelle dimensioni vedo la pagina web ma non posso modificare alcuni settaggi. Se però la pagina web è in cache del mio pc, e se ho aumentato il buffer fino al valore che mi serve, allora tutto funziona finchè non provo a ricaricare la pagina, che a quel punto non mi trova più.
Perchè con un valore del biffer più alto non riesco a vedere la pagina??????

Allego sketch e pagina web

index.htm (5.97 KB)

prova_progetto_7.ino (12 KB)

maxpcc:
Perchè con un valore del biffer più alto non riesco a vedere la pagina??????

Forse, no siccuramente perché Arduino UNO ha solo 2kByte di RAM.
Ciao Uwe

Se usi

client.println(F("**************"));

qualcosa recuperi
Togli i serial.print inutili e recuperi ancora

A0 used by Ethernet shield
A1 used by Ethernet shield

Ma che dice??

Intanto grazie!
E c'è modo di sapere qual è il valore limite del buffer?
Prima di iniziare a compattare tutto il codice racimolando byte su byte mi piacerebbe sapere se questi sforzi serviranno a qualcosa! Anche perchè la previsione è di aumentare ancora i settaggi e con loro il buffer

Oppure: può avere senso passare ad un Arduino Mega? Riesco a recuperare sia il codice che la scheda di rete? Fino ad adesso ho sempre fatto i miei esperimenti sull'Uno, per cui scusate se la domanda può sembrare banale, ma del Mega non so nulla!

Intanto cerco e mi informo!

Mi rispondo da solo (in parte)

Intanto grazie perchè con F() ho risolto quasi tutti i miei problemi. Ho anche accorciato le stringhe (Settingxx è diventata STGxx) per cui ora mi funziona a dovere.

Ho visto anche che volendo un Mega è compatibile con la mia ethernet shield, ma per il momento mi faccio durare la Uno.

Continuo in questo thread per un'altra domanda:
pablos ha dei dubbi su A0 e A1 usati dall'ethernet shield. Effetticvamente è un dubbio che mi devo togliere, perchè dovrei collegare anche un orologio RTC, che se ho ben capito usa gli stessi pin analogici. Mi sapete dare un consiglio per collegare insieme ethernet e orologio? Se è lunga apro un nuovo thread!!

Grazie ancora dei preziosissimi consigli!

I dubbi di pablos sono dovuti al fatto che ... dove hai visto che lo shield Ethernet usi i pin A0 e A1 ??? :astonished: :astonished: :astonished:

Dal reference :

"Arduino communicates with both the W5100 and SD card using the SPI bus (through the ICSP header). This is on digital pins 10, 11, 12, and 13 on the Uno and pins 50, 51, and 52 on the Mega. On both boards, pin 10 is used to select the W5100 and pin 4 for the SD card. These pins cannot be used for general I/O. On the Mega, the hardware SS pin, 53, is not used to select either the W5100 or the SD card, but it must be kept as an output or the SPI interface won't work."

Magari, nell'articolo, è stato usato un chissà quale modulo ethernet esterno che hanno collegato su A0 e A1 ... ma NON di certo lo shield ethernet standard !!!

Guglielmo

Dall'articolo si parla di Arduino ed ethernet shield arduino, è del 2013 quindi molto probabile rev3 ma anche rev 2, dallo skerch specifica che il pin 10 è il cs e che l' 11-12-13 non vanno usati, quindi avevo dati sufficienti per comprendere che si trattava dello shield ufficiale.
Però se vuoi toglierti il dubbio togli alimentazione, estrai lo shield e mettilo sotto una luce, anche se la basetta è verniciata si evidenziano le piste che vanno sotto lo strip, se osservi ambo i lati dello shield vedrai che da A0 ad A5 non c'è assolutamente nulla (tutto liscio :slight_smile: ) sul lato superiore ne vedrai una andare sotto il 10 e sul lato inferiore ne troverai una andare al 4 e anche un'altra andare al 2 ma interrotta da 2 piazzole stagnate non unite.

guardaci per conferma, ho letto anch'io diverse volte sta cosa, è molto probabile che sia una condizione reale riportata negli anni dai primi sheld, perciò trascinata oggi come errore... ora faccio una ricerca sulle vecchie shield eth
ciao

si era la rev 1 ufficiale del 2009 che usava A0 e A1
http://smallshire.org.uk/sufficientlysmall/2012/01/01/an-atlas-of-arduino-ethernet-shields/ si vede anche dalla foto che ci sono delle piste su quei pin

ciao

pablos:
si era la rev 1 ufficiale del 2009 che usava A0 e A1 ...

Azz ... una cosetta recente ... XD :grin: XD :grin: XD

Guglielmo

Verissimo, grazie: solo piste sulla 4 e sulla 10. Dunque questi pin li tengo liberi e gli altri li posso usare.
Ne approfitto ancora della vostra sapienza:

Ogni volta che stacco l'alimentazione e la riattacco, prima che la scheda diventi attiva e si accendano i led gialli (link, 100M, fulld) devo necessariamente fare un reset. Come mai? Ciò è molto vincolante per l'utilizzo che ne intendo fare! Esiste un modo di fare un reset "software" ad ogni avvio?

maxpcc:
Ogni volta che stacco l'alimentazione e la riattacco, prima che la scheda diventi attiva e si accendano i led gialli (link, 100M, fulld) devo necessariamente fare un reset. Come mai? Ciò è molto vincolante per l'utilizzo che ne intendo fare! Esiste un modo di fare un reset "software" ad ogni avvio?

Questo è un comportamento anomalo che non dovrebbe accadere posso vedere il setup() che usi?

ciao

Grazie pablos, ecccolo qui:

void setup()
{

#define OutPut_1 6 // definisco il primo carico da gestire
#define OutPut_2 7 // definisco il secondo carico da gestire
#define OutPut_3 8 // definisco il terzo carico da gestire
#define fotoresistenza A2 // definisco la fotoresistenza
#define Pir_1 5 // definisco il pin del Pir_1


  // disable Ethernet chip
    pinMode(10, OUTPUT);
    digitalWrite(10, HIGH);
    
    Serial.begin(9600);       // for debugging
    
    // initialize SD card
    Serial.println("Initializing SD card...");
    if (!SD.begin(4)) {
        Serial.println("ERROR - SD card initialization failed!");
        return;    // init failed
    }
    Serial.println("SUCCESS - SD card initialized.");
    // check for index.htm file
    if (!SD.exists("index.htm")) {
        Serial.println("ERROR - Can't find index.htm file!");
        return;  // can't find index file
    }
    Serial.println("SUCCESS - Found index.htm file.");
    // Output
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);
    pinMode(A2,INPUT); //il pin a cui è collegata la fotoresistenza
    pinMode(5, INPUT); //il pin a cui è collegato il pir
    
    Ethernet.begin(mac, ip);  // initialize Ethernet device
    server.begin();           // start to listen for clients

    Wire.begin();             // inizializzo l'orologio

}

Rettifico in parte quanto ho detto, ma a questo punto credo che rimanga una curiosità:

questo comportamento (necessità di reset) me lo fa solo se (?!?!?!?!?) stacco l'alimentatore dal muro e lo riattacco. Se stacco il cavo da Arduino e lo riattacco non lo fa (?!?!?!?)

questo comportamento (necessità di reset) me lo fa solo se stacco l'alimentatore dal muro e lo riattacco.

E se staccando l'alimentatore dal muro aspetti 30 secondi prima di reinserirlo?

Neppure, sembra quasi (azzardo) che il trasformatore abbia un transitorio che dà fastidio ad Arduino.
Purtroppo non ho altri trasformatori per verificare, farò sapere!

Se faccio la stessa opeazione alimentando da USB, non ho problemi!

prova con un delay iniziale nel setup in modo da inizializzare l'spi e il server begin quando tutto è alimentato e stabile

Allora, il problema è ancora aperto.
Ho scoperto che alcuni shield vecchi hanno questo baco, e ci sono vari metodi per risolverlo.
In pratica bisogna resettare la scheda, ma non Arduino! (ovviamente, se no si è di nuovo da capo!)

Allego qualche link con alcune soluzioni, che però con me ancora non hanno funzionato. I prossimi giorni dovrò dedicargli più attenzione (appena risolvo il problema del NTP ;))

(Aggiungere un condensatore tra il pin reset e il ground, Aggiungere un delay iniziale)

http://forum.arduino.cc/index.php?topic=28175.45
http://forum.arduino.cc/index.php/topic,25634.0.html

http://forum.arduino.cc/index.php/topic,28175.0.html

Ho anche provato (non ho il link su due piedi, ma lo troverò) a mettere un cavetto sul pin del reset, a piegare il pin che mi va dal reset dello shield a Arduino e provare a comandare il reset con il pin: nulla! Il problema è che quando resetto la scheda mi si resetta anche Arduino. Per separare i due reset dovrei anche tagliare un pin (quello del ICSP) su Arduino, ma al momento non me la sento e lascio l'arma fine di mondo come ultima spiaggia!

Infine: poichè al momento sono collegato in wi-fi con la ethernet shield e con un router della TP-LINK, volevo provare a fare a meno della ethernet shield. Ma ancora ci devo sbattere il muso!

Hai altre idee Pablos?

Ho anche provato (non ho il link su due piedi, ma lo troverò) a mettere un cavetto sul pin del reset, a piegare il pin che mi va dal reset dello shield a Arduino e provare a comandare il reset con il pin: nulla! Il problema è che quando resetto la scheda mi si resetta anche Arduino.

Certo perchè il reset è anche sul connettore dell ICSP http://arduino.cc/en/pmwiki.php?n=Reference/SPI
Riavviare lo shield eth mentre è connesso alla UNO che sta facendo le sue cose non è il massimo della soluzione, fai un pasticcio, perchè essa va inizializzata insieme ad arduino.
Un reset del w5100 lo puoi fare in modo software (sempre che non sia inchiodata la comunicazione) facendo un

init() dell'spi,
reimpostare i 4 socket del w5100 chiudendoli e rimettendoli in listen
un init() del w5100, #include "utility/w5100.h" ... #include "utility/socket.h"
rifacendo il server.begin
riavviando EthernetServer server(80)

Tutto questo va a complicare non poco la vita e ti infili in altri mal di testa

Però ancora non ho capito perchè devi per forza aumentare le dimensioni del buffer e perchè la ethernet la devi resettare ...

Le due cose sono ovviamente separate:

Il reset mi occorre perchè, ogni volta che do alimentazione alla scheda, questa per iniziare a comunicare ha bisogno di un reset. Credo che sia appunto un baco delle vecchie schede. La mia è questa:
http://www.miniinthebox.com/it/w5100-ethernet-shield-per-arduino-201211270080060_p478895.html
A memoria (non ho davanti arduino) mi sembra che sulla shield ci sia stampigliata una data: 31/05/2012
Poichè devo installare il tutto in un posto inaccessibile, e il tutto collegato ad un normale interruttore per riavviare quando occorre, non posso permettermi di dover ogni volta prendere la scala per premere un reset!

Il buffer è un discorso diverso: il progetto da cui sono partito prevedeva soltanto poche variabili da passare alla pagina web. Io ho voluto fare "lo sborone" e ho iniziato a passargli di tutto, ragione per cui ho dovuto aumentare il buffer. Aumentandolo però ha iniziato a darmi dei malfunzionamenti, dovuti alla mancanza di RAM. La soluzione più veloce, visto che pensavo (ed è effettivamente accaduto) che le variabili sarebbero aumentate, è stata quella di passare ad un Arduino Mega. Da lì mi funziona tutto come un orologio.
A futura memoria allego le specifiche e lo sketch:

-Ho tre carichi da controllare: due luci e una sirena
-Una pagina web mi permette di settare il tipo di controllo
-Le luci possono essere impostate con 4 differenti valori: ON, acceso su luce ambiente, acceso su PIR, acceso con timer
-La sirena è controllata da due valori: ON e timer; se attivo il setting, in presenza del segnale del PIR mi si attiva l'allarme
-L'allarme fa suonare la sirena, lampeggiare le luci ed invia una mail
-Se l'allarme è già scattato negli ultimi minuti, non scatta ancora (altrimenti finisco le mail gratuite con smtp2go)
-Sulla pagina web mostro anche l'ora del RTC di Arduino

I bachi ancora presenti:
-il reset come sopra
-l'orologio che mi sgarra di un minuto scarso al giorno, da sincronizzare con NTP
-i timer, se accensione e spegnimento cadono a cavallo della mezzanotte, ancora ci devo mettere mano seriamente

Uno per volta li devo sistemare tutti!!

prova_progetto_17.ino (17.1 KB)

Ora che hai linkato lo shield mi fai ricordare che il tuo stesso problema lo hanno avuto altri, 1-2 anni fa proprio dal fatto che le schede non originali non prevedo una R e un C che crea un certo ritardo tra il reset arduino e quello dello shield, in poche parole mancano dei pezzi.

O ti costruisci un circuito reset esterno con un NE555 o in qualche modo usi l'Watchdog per riavviare parzialmente lo sketch