SDWebServer – enc28J60 e Arduino (20)

by luca
97 comments

Nel precedente articolo, vi ho mostrato come sia ora possibile inviare in rete documenti di grandi dimensioni usando uno shield con chip ENC28J60. Oggi vi presento il progetto di un completo web server!

Descrizione

Il browser dell’utente invia la richiesta, tramite rete, al modulo ENC28J60. La richiesta viene quindi interpretata dallo sketch in esecuzione su Arduino il quale prepara la risposta. Sia il modulo ENC28J60 che quello per la SD card sono connessi ad Arduino tramite il bus SPI:

webserver-1

Il webserver supporta sia risorse statiche, che risorse dinamiche:

[checklist]

  • le risorse statiche (pagine html, immagini…) vengono lette da SD card
  • le risorse dinamiche (richieste AJAX…) vengono generate direttamente dallo sketch

[/checklist]

Lo sketch utilizza il metodo spiegato nel precedente articolo per inviare risorse statiche di qualsiasi dimensione.

Collegamenti

Sia il modulo SD card che quello ethernet utilizzano il bus SPI. Tale bus prevede la possibilità di collegare contemporaneamente più dispositivi, utilizzando un apposito PIN (detto di chip-select) per indicare a quale dispositivo il comando inviato sul bus è destinato. E’ quindi necessario collegare i PIN di CS dei vari moduli a diversi PIN di Arduino e configurare di conseguenza le librerie.

Purtroppo mi sono accorto che gli shield spesso utilizzano il medesimo PIN (ad esempio il 10) oppure che – peggio – non sono collegabili in cascata. Ho quindi dovuto utilizzare due moduli ed effettuare i collegamenti tramite cavetti:

webserver-2

I collegamenti da realizzare sono:

  • alimentazione (5Vmassa);
  • MOSI (da Arduino al dispositivo), PIN 11
  • MISO (dal dispositivo ad Arduino), PIN 12
  • CLK (clock), PIN 13
  • CS (chip select) -> modulo SD PIN 4 di Arduino, modulo ENC28J60 PIN 10 di Arduino

I PIN utilizzati per il segnale di chip select sono configurati all’inizio dello sketch:

#define SD_CS_PIN   4
#define ETH_CS_PIN  10

Risorse statiche da SD card

Per accedere alla SD card, ho utilizzato la libreria tinyFAT invece di quella inclusa nell’IDE perché occupa molto meno memoria RAM.

All’interno del setup(), viene configurato il PIN Arduino collegato al chip select del modulo SD card e viene inizializzata la libreria:

file.setSSpin(SD_CS_PIN);
res = file.initFAT();

Quando viene richiesto un file, per prima cosa lo sketch verifica se il file è presente; in caso negativo viene inviato al browser l’errore 404 (= file non trovato):

if(!file.exists(filename)) {
[...]
bfill.emit_p(PSTR("HTTP/1.0 404 Not Found\r\n\r\nNot Found"));

Se invece il file è presente, questo viene aperto e letto a blocchi di 512 bytes. Ogni blocco è inviato singolarmente (un blocco, un pacchetto) in rete:

res = file.openFile(filename, FILEMODE_BINARY);
[...]
bytesRead = file.readBinary();
uint8_t* payloadBuffer = ether.tcpOffset();
for(int i = 0; i < bytesRead; i++)
  payloadBuffer[i] = file.buffer[i];

Default webpage

Un caso particolare di risorsa statica è la default webpage: quando inseriamo nel browser un indirizzo Internet, la richiesta inviata è semplicemente GET /. Sta a chi configura il server web definire quale è la pagina di default inviata se non ne viene chiesta una specifica. Nello sketch tale pagina è configurata come costante:

static char* defaultPage = "index.htm";
[...]
if(strncmp("GET / ", request, 6) == 0) {
  sendFile(defaultPage);

Risorse dinamiche

Nello sketch è presente un esempio di risorsa dinamica: la pagina uptime.ino.

Tale pagina non viene cercata sulla scheda SD ma viene generata dallo sketch inviando al browser il valore della funzione millis(), che conta il numero di millisecondi da quando lo sketch è in esecuzione (e quindi l’uptime del webserver):

bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n"
  "$L"), millis());
ether.httpServerReply(bfill.position());

Esempio

Ho preparato un completo esempio: un sito che visualizza una homepage dove, tramite chiamate AJAX ogni 30 secondi, viene visualizzato l’uptime del server:

sdweb

ecco il dettaglio delle chiamate AJAX effettuate dal browser:

uptime

Trovate sketch e risorse per il sito di esempio nel mio repository su Github!

Related Posts

97 comments

marco arigliani 2 dicembre 2014 - 21:53

ciao..
ho seguito in questi giorni un po dei tuoi post per quanto riguarda il modulo enc28j60 per arduino..
volevo solo chiederti se c’è un modo per gestire le richieste “url” e creare una cosa simile a dei file …
ho fatto un programma che va a leggere la richiesta dell’utente esempio http://ip_arduino/file1 e il programma restituisce la variabile testuale file1 e cosi via per altri file..
ho solo il problema che se l’url ho l’html delle pagine sono troppo lunghe il programma salta e restituisce sempre una scermata bianca ….
[…]

Reply
luca 13 dicembre 2014 - 17:33

Ciao Marco (ho rimosso lo sketch per non appesantire il commento): se ti da problemi con URL molto lunghe, significa che stai superando la dimensione massima del buffer di ricezione: a quanto lo hai impostato?

Reply
Abhishek Joshi 21 febbraio 2015 - 18:00

Hello sir, after learning from your tutorials about the enc28j60 module, i managed to make an IR remote out of an arduino connected with the enc28j60 to my wifi router and an ios app to go along with it. Now, i dont need to be in line of sight to control my tv. Keep up the good work thanks!.
Check it out here : https://github.com/abhiace/arduino-IRemote-iOS

Reply
luca 24 febbraio 2015 - 20:58

Hi! Great work, thanks for sharing!

Reply
Luigi 18 marzo 2015 - 19:22

Ciao Luca, inutile farti i complimenti per i tuoi tutorial, li sto divorando con grande voracità. Bravo, soprattutto per gente come me alle prime armi. Sto cercando di estrarre il numero di likes dalla pagina facebook ma non riesco con la procedura GET mentre leggere una pagina html grazie alle tue informazioni non ci sono più difficoltà. Mi puoi dare delle dritte in proposito.

Reply
luca 19 marzo 2015 - 11:28

Ciao Luigi, per leggere i likes usi le API di Facebook o vuoi cercare di “interpretare” la pagina HTML?

Reply
Samuel 9 aprile 2015 - 20:27

Ciao Luca e grazie per il tuo interessante articolo. Sto cercando di far visualizzare sulla mia pagina html un valore di temperatura piuttosto che il valore della funzione “millis() adattando opportunamente il seguente frammento di codice:

else if(strncmp(“GET /temp.ino “, request, 16) == 0) {

Serial.print(F(“Requested dynamic page: temp.ino”));

BufferFiller bfill = ether.tcpOffset();
bfill.emit_p(PSTR(“HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n”
“$L”), temperatura());
ether.httpServerReply(bfill.position());
Serial.println(F(” …sent :)”));
}

Il valore fornito dalla funzione “temperatura()” non viene visualizzato nella pagina html.

Ciao e grazie ancora!

Reply
luca 10 aprile 2015 - 08:08

Ciao Samuel, $L è un “segnaposto” per un valore di tipo long, che cosa restituisce la tua funzione temperatura()? Prova anche a salvarti prima in una variabile locale il valore restituito e poi usare quella variabile nel bfill.emit_p

Reply
Samuel 10 aprile 2015 - 18:52

Ho dichiarato “long num=100000;” e usato tale variabile nella “bfill.emit_p” ma la pagina mi restituisce l’errore 404: temp.ino non trovata.

Non capisco come la tua pagina “uptime.ino” viene invece trovata.

Reply
luca 10 aprile 2015 - 19:07

L’errore sta qui: strncmp("GET /temp.ino ", request, 16): il valore 16 indica il numero di caratteri da confrontare, essendo il nome della tua pagina più corto, dovrai correggerlo di conseguenza (GET /temp.ino con lo spazio finale è lungo 14 caratteri)

Reply
Samuel 13 aprile 2015 - 14:51

Grazie era proprio quello. Adesso ho assemblato vari sketch che gestiscono un lcd, un tastierino numerico, il modulo per le chiamate e gli sms. Ma provando a visualizzare la pagina web (sia sul pc che sul cellulare) arduino non riesce a ricevere la richiesta e quindi la pagina non viene visualizzata: sul monitor seriale, infatti, non stampa il messaggio “nome della pagina.estensione sent :). Questo problema può derivare dal fatto che arduino sta svolgendo troppe operazioni? Preciso che ogni loop impiega circa 3 sec.

Reply
luca 13 aprile 2015 - 17:04

3 secondi sono davvero tanti per gestire i pacchetti di rete… come mai il loop dura così tanto? Hai dei delay? Se fai uno sketch con la sola parte relativa all’enc28j60 funziona? Al ping arduino risponde?

Reply
Samuel 13 aprile 2015 - 19:45

Avevo un delay di 2 secondi alla fine del loop che ho tolto ma il problema persiste. Ho caricato su sd una pagina html contenente solo un tag ma invano. Se carico solo la parte di sketch relativa all’enc28j60 riesco invece a visualizzare la pagina.

Reply
Samuel 13 aprile 2015 - 20:17

Ho appena notato che aumentando la dimensione del l’ethernet buffer (da byte Ethernet::buffer[8000]; a byte Ethernet::buffer[1600];) e ricaricando lo sketch nel microcontrollore, la pagina web viene visualizzata solo una volta: se riaggiorno la pagina o provo a visualizzarla una seconda volta con un altro dispositivo, non visualizzo nulla.

Reply
luca 13 aprile 2015 - 21:34

il problema sembra essere di consumo di RAM, ci puoi fare poco: probabilmente il tuo sketch è troppo complesso per le risorse di Arduino. Se già non lo hai fatto e hai delle stringhe di testo, puoi provare a metterle in PROGMEM per risparmiare RAM come spiegato qui: http://playground.arduino.cc/Learning/Memory

Reply
Samuel 14 aprile 2015 - 07:27

Ma l’ide 1.6.1. di arduino, in fase di compilazione, mi dice che ho usato soltanto il 49% di memoria dinamica, ovvero di RAM (correggimi se sbaglio). Per questo motivo, ho scelto di utilizzare Arduino Mega2560.

Reply
Igor 14 aprile 2015 - 12:56

Complimenti per i vari tutorial. In quest’ultimo avresti la possibilità di inserire un link ad una seconda pagina presente su SD ? Secondo me così sarebbe più completo come esempio. Spesso sul forum Arduino ci sono persone che richiedono proprio il multipagina prelevandole da SD (a meno che non lo hai già spiegato in un altro tutorial) ^-^

Reply
luca 14 aprile 2015 - 16:08

Ciao, questo esempio gestisce qualsiasi pagina o risorsa statica da SD

Reply
majdi 17 aprile 2015 - 23:59

Hello, it is possible convert tinyFAT with SD.h library for sd card function. Im using MEGA2560.

Reply
luca 18 aprile 2015 - 09:22

Hi! It should work fine (I used TinyFAT due to the limited RAM memory of Arduino UNO) but I don’t own a Mega and I can’t test it… if you try, let us know the result!

Reply
krp 18 maggio 2015 - 12:00

Hello Luca! have you any scheme for connection encj->sd->arduino ? or maybe other pics ? i can’t connec properly my one and it can’t work ;< greetings!

Reply
Maurizio 7 settembre 2015 - 11:07

I complimenti per il tuo lavoro sono dovuti ma per saltare subito al problema: tu hai implementato la tinyFAT.h mentre io utilizzo SdFat.h;
ho tentato la conversione ma, evidentemente, ho sbagliato qualcosa! Non è che potresti ………

Reply
luca 7 settembre 2015 - 11:24

Ciao Maurizio, purtroppo avevo provato anch’io ad usare la SdFat ma è troppo “pesante” in termini di RAM, non rimane sufficiente spazio per il buffer ethernet… quindi sono stato costretto ad usare la TinyFAT.

Reply
Maurizio 8 settembre 2015 - 08:37

Grazie Luca, allora provo anch’io il … trapianto!

Reply
Maurizio 8 settembre 2015 - 09:40

Rieccomi in panne!
Al di là della sostituzione del riferimento WProgram.h -> Arduino.h (sia in tinyFat.h che .cpp) la compilazione riporta una sequenza di errori in mmc.h.

che fare????

Reply
luca 10 settembre 2015 - 07:39

Ciao Maurizio, ma stai usando questa libreria? Non ho dovuto modificare nulla, è già compatibile con le versioni >1.0

Reply
Maurizio 10 settembre 2015 - 18:56

A me ha dato una prima serie di errori; da un blog ho trovato la soluzione ovvero sostituire WProgram.h -> Arduino.h. Gli errori aono cambiati e sono quelli che ti ho elencato.

Ora sta emergendo un altro strano problema: sviluppando le tue rountine per la gestione web di 2 led fino a 18 a volte il Mega risponde subito aggiornando la pagina, a volte ci mette anche un minuto e a volte … non risponde!
Questa instabilità nei risultati mi mette un po’ in difficoltà!

Reply
Maurizio 11 settembre 2015 - 11:20

In merito alla tinyFat quella presente al link da te segnalato è operativa; io l’ho scaricata da gitHub e quella ha problemi.

Reply
Gale 1 dicembre 2015 - 12:12

Ciao Luca, thank you for sharing your work with us.
Please help me, I’m your code use for Arduino Pro Micro (Chinese copy), the Ethernet module ENC28J60 and SD Card module LcSoft.
Everything is done according to your instructions and everything nice upload to the Arduino, but I have no info on serial monitor, and my website is not working.
Best regards, Gale

Reply
luca 2 dicembre 2015 - 20:12

Gale, start using one of the simpler sketches, testing only the “ethernet” part with a ping… if it works we’re sure the connection to the ethernet module is ok and we can investigate further.

Reply
Gale 3 dicembre 2015 - 08:45

Dear Luca, I connect separately Ethernet shield with Arduino – and it works.
Then I connect only the SD card shield with Arduino – and it works.
But when both modules connect to the Arduino, I do not get anything
Was thinking that there might be a problem that tinyFat library does not support the Arduino Leonardo (my Arduino Pro Micro is classified as Leonardo).
Thank you for your quick reply.
Best regards

Reply
luca 7 dicembre 2015 - 09:07

Hi! Yes, TinyFAT doesn’t support Leonardo so that could be your issue… anyway with Leonardo you should be able to use the “standard” SD library

Reply
Leandro 10 dicembre 2015 - 14:24

can you explain the connections you made ​​? I do not know how to connect the SD module and ENC28J60 simultaneously on the Arduino

Reply
Jan 6 gennaio 2016 - 14:15

Hi,
when i use EtherCard and TinyFAT library i and declare ethernet buffer to 500 i have problem with dynamic memory – Arduino inform me about that it used about 89% dynamic memory and board can not work correct. When i decrese buffer i have problem with ICMP ethernet module etc.

Reply
luca 7 gennaio 2016 - 09:39

Hi Jan, unfortunately it’s a common problem: the enc28j60 does not include a buffer and therefore you’re forced to use the Arduino RAM… moving to the W5100 chip or using a more “powerful” Arduino may solve.

Reply
Piero 12 maggio 2016 - 18:47

Ciao Luca, ho un problema riguardo SD, in primis ho utilizzato una SD da 1GB e tutto funzionava, poi all’improvviso non andava più .. nemmeno leggerla con il PC.. ho provato con altre SD da 2 GB ma non le legge, mi sai dare qualche dritta? Grazie mille

Reply
luca 16 maggio 2016 - 07:51

Ciao Piero, controlla come sono formattate le SD… la libreria usata (TinyFAT) supporta solo memory fino a 2Gb in FAT16.

Reply
Riccardo 6 luglio 2016 - 15:46

Ho una domanda ma il modulo ethernet con enc28j60 non va alimentato a 3.3 volt ?

Reply
luca 25 luglio 2016 - 09:27

ciao, dipende: molti moduli (incluso quello che ho io) hanno a bordo un regolatore quindi puoi alimentarli a 5V

Reply
Lada 29 settembre 2016 - 10:04

Thx for yours tuturials about enc28j60. You are very smart! How can I receive big post request (700 kB) from web browser client and save it on the SD card (TinyFAT)?

Reply
luca 30 settembre 2016 - 15:55

Hi Lada, well you may try to save the different packets to a file on your sd but you’ll probably find some problems due to the limited memory of both arduino and the ethernet driver.

Reply
Lada 2 ottobre 2016 - 15:02

Thx 🙂 Can you please write, how to store packets? I have problems with oveloading buffer. Your examples are only about reading from the sd card… Thank you.

Reply
Avrah 11 ottobre 2016 - 09:10

help! Failed to initialize SD card

ethernet shield work but sd shield not work.

Reply
luca 13 ottobre 2016 - 14:53

are you sure that the CS pin is connected correctly? Is the SD formatted in FAT?

Reply
Wenderson Cunha Campos 9 novembre 2016 - 14:23

I’m trying to make an application to the master Arduino communicates with the ENC28J60 and other Arduino as a slave. But I do not know how to disable the select chip ENC28J60 and enable the chip select slave according to the command master receives the Arduino ENC28J60. How I could disable it only to send the byte to the slave and then enable it again.
Grateful
Wender

Reply
luca 12 novembre 2016 - 14:45

Hi! you need to setup a different CS pin for each SPI device you connect to the “master” Arduino

Reply
Massimo 5 gennaio 2017 - 13:07

Ciao, sono riuscito a far funzionare l’esempio qui sopra e ti ringrazio, ma volevo riportare la mia esperienza per evitare a qualcun altro di perdere un sacco di tempo: all’inizio non funzionava nulla (ping saltuari, alcune volte si bloccava sull’apertura della SD)
Alla fine ho cambiato i collegamenti portando direttamente da Arduino a ENC28J60 i 3.3V (prima era collagato ai 3.3V della scheda SD) e lasciando la scheda SD alimentata con i 5V arduino: per magia tutto si è messo a funzionare. Il mio modulo ethernet per completezza è il HanRun HR9111105A 16/02
Spero di essere stato utile a qualcuno!

Reply
luca 9 gennaio 2017 - 08:25

grazie per il commento Massimo!

Reply
Waruna Abayarathna 27 aprile 2017 - 15:00

Dear
How this 2 module connect to Arduino mega
Thank you

Reply
luca 29 aprile 2017 - 16:03

Hi! you can find the required connections on the library’s webpage.

Reply
Waruna Abayarathna 3 maggio 2017 - 12:05

Thank you for your reply
I already use this 2 module individually
But my problem is How this 2 module connect in simultaneously

Reply
luca 6 maggio 2017 - 15:48

Hi! You can connect both the modules to the SPI bus (use the same pins) but use two different pins for the SS (slave select) signal

Reply
jacopo 28 luglio 2017 - 11:25

ciao, non riesco a far funzionare entrambe le schede insieme , che fare ? i collegamenti sono corretti .

Reply
luca 28 luglio 2017 - 12:45

ciao, collegate singolarmente vanno? Il pin CS delle due schede è collegato a due diversi PIN di Arduino?

Reply
jacopo 28 luglio 2017 - 17:31

si, da sole funzionano entrambe e quando insieme solo la ethernet funziona. i cs sono separati 4 sd e 10 ethernet

Reply
jacopo 28 luglio 2017 - 17:50

mi correggo da sola la sd non va con la libreria tinyfat (la sd è una 2 GB in configurazione FAT) mentre con la libreria SD funziona

Reply
jacopo 28 luglio 2017 - 19:07

Per chiunque si trovi come nel mio caso ad usare l’esempio proposto da Luca Dentella e non riesca ad inizializzare la SD: assicurarsi che sia formattata correttamente e non corrotta. Provate ad usare l’esempio cardinfo della libreria SD e nel caso in cui vi siano problemi formattatela con il programma SD Formatter utilizzando l’azione di overwrite totale !

Reply
Andrea 30 ottobre 2017 - 14:45

Ciao Luca,

Provo da giorni lo sketch relativo alla stampa su seriale dell’aforisma presente sulla pagina aphorisms.php ma tutto ciò che ottengo sono delle informazioni relative alla pagina stessa e non l’aforisma, ovvero :
HTTP/1.1 200 OK
Date: Mon, 30 Oct 2017 13:45:17 GMT
Server: Apache
Content-Length: 62
Content-Type: text/html; charset=UTF-8
X-Cache: MISS from localhost
X-Cache-Lookup: HIT from localhost:3128
Via: 1.1 localhost (squid/3.5.23)
Connection: close

Nell’arduino loop ho questo :
ether.packetLoop(ether.packetReceive());

if (millis() > timer)
{
timer = millis() + 5000;
Serial.println();
Serial.print(“<<< REQ ");
ether.browseUrl(PSTR("/demo/aphorisms.php"),"", website, my_callback);
}

Puoi aiutarmi ?

Reply
luca 31 ottobre 2017 - 11:08

Ciao Andrea, dai logs vedo che la tua connessione passa x un proxy (Squid)… ho appena provato lo sketch da un arduino connesso diretto su internet e funziona senza problemi, è possibile che il tuo proxy blocchi la connessione?

Reply
Ross 9 gennaio 2018 - 22:23

Ciao, ho seguito tutti i tuoi tutorial in cui hai utilizzato il modulo ethernet enc28j60. Volevo a tal proposito chiedere una cosa:
Ci sono tuoi progetti o tutorial che includano della crittografia utilizzando tale modulo?
Spiego, devo realizzare un progetto di automazione di una casa, quindi una pagina web con pulsanti per l’accensione di led e magari l’aggiornamento di form per lo stato dei led o qualcosa ancora non ben specificata. Vorrei però “proteggere” le informazioni inviate online sia con l’autenticazione e quella è visibile in un tuo tutorial, sia con una crittografia che sia lo sha o una crittografia simmetrica o asimmetrica. Online ho trovato varie librerie che potrebbero fare al caso, ma non so come implementarle nel caso specifico, ossia cosa serva criptare, come e se è conveniente criptare, ad esempio, la richiesta “GET/LED1ON”. Al momento utilizzo l’sd card, un arduino uno e il modulo ethernet.
Ti ringrazio della disponibilità.

Rossella Stomati

Reply
luca 10 gennaio 2018 - 15:55

ciao! la soluzione classica sarebbe utilizzare il protocollo HTTPS ma un Arduino Uno non ha abbastanza risorse per gestirlo. Purtroppo fare soluzioni custom è possibile ma complesso (non puoi utilizzare il browser cosi com’è ma devi anche lato client sviluppare un tuo modulo, es in javascript, che cifra la richiesta prima di inviarla tramite protocollo HTTP). Forse è pìù semplice cambiare piattaforma, se guardi i miei tutorial sul chip esp32 vedrai come è semplice in quel caso implementare un webserver in HTTPS.

Reply
Jacopo 23 gennaio 2018 - 12:45

Ciao, ho un problema con questo esempio: finchè mi connetto in wi-fi la pagina si carica completamente ma se la richiedo dall’esterno della rete privata me la carica fino ad un certo punto. Puoi verificare tu stesso il server è http://jellyserver.ddns.net sapresti dirmi come posso risolvere questo problema ?

Reply
luca 23 gennaio 2018 - 16:50

ciao, dovresti vedere usando ad esempio la console sviluppatori di Chrome quali parti della pagina non vengono caricate e se ottieni degli errori (reset o altro…)

Reply
Jacopo 23 gennaio 2018 - 18:25

Non mi carica la parte finale di ogni pagina htm del server tranne quelle che hanno pochi caratteri ma il bello è che prima c erano anche foto e video mentre ora tutti i media sono su un sito di altervista privato come repository di dati e la mia SD contiene solo file htm

Reply
Jacopo 23 gennaio 2018 - 18:34

mancano tutti i tag di chiusura pagina etc ma ci sono nei file e con wifi tutto fila più che liscio

Reply
Jacopo 23 gennaio 2018 - 18:45

Ora provando a togliere parti in mezzo alla pagina ho visto che carica esattamente tanti caratteri in più quanti ne ho tolti. Problemi come dimensioni del file ? strano dato che le foto le mandava pure da 10 KB

Reply
luca 24 gennaio 2018 - 20:39

prova a verificare se ricevi esattamente 512 bytes, che è la dimensione di un pacchetto TCP inviato… sembra che passando su Internet non ti arrivino i pacchetti successivi al primo.

Reply
Jacopo 28 gennaio 2018 - 12:10

ho controllato e sembra che spedisca sempre i primi 54 pacchetti (ne mancherebbero circa 3 per concludere la pagina più “pesante”) per poi non spedirne più alcuno se non riaggiornando la pagina ma allora mi spedisce gli stessi pacchetti iniziali

Jacopo 29 gennaio 2018 - 18:29

e a volte si blocca cioè non arriva nemmeno la richiesta della pagina ad arduino, ho provato a inserire Connection: close ma uguale

salvo 3 marzo 2018 - 13:55

Ciao Luca, ho replicato il tuo progetto e a volte funziona a volte si fermaho durante l’inizializzazione del ip, il modulo micro sd funziona a 5v mentre il modulo enc28j60 funziona a 3,3v, presumo sia un problema di livelli che per qualche caso fortuito a volte funziona ma la maggior parte no, la micro sd da sola funziona e il modulo enc28j60 da solo funziona, hai qualche consiglio da darmi??, grazie e complimenti per i tuoi progetti.

Reply
salvo 5 marzo 2018 - 23:58

Ciao Luca, ho capito il mio problema, le prove fatte erano le seguenti..singolarmente la enc28j60 funzionava tranquillamente, e la micro sd da sola funzionava pure….ma “le prove della micro sd le facevo con un esempio che conteneva la libreria SD di arduino”…….quindi rifacendo le prove mi da errore di formato…probabilmente la mia micro sd non è compatibile con la libreria tynyFAT….mi sapresti consigliare che test fare magari toccando qualche paramentro di questa libreria?? o qualcosaltro che possa trovare riscontro??…grazie 1000

Reply
luca 6 marzo 2018 - 09:24

ciao Salvo, la TinyFAT supporta SD di capacità massima 2Gb e formattata FAT16… prova così

Reply
salvo 6 marzo 2018 - 10:54

Ciao Luca, ne ho provate 3, due sundisk da 2gb, e 1 kingston da 1 gb tutte fat 16, con la libreria SD funzionano tutte, con questa libreria mi esce questo errore..
***** ERROR: Unsupported filesystem
Grazie

Reply
salvo 6 marzo 2018 - 11:34

Luca, un passo in avanto l’ho fatto….la sd era stata formattata con il mac, adesso l’ho formattata con un pc e adesso la sd la riconosce…ma ancora il problema persiste…separatamente funzionano entrambi, insieme no!, forse è un problema di velocità SPI??? mi sapresti indicare cosa provare a fare?? grazie 1000

Reply
luca 6 marzo 2018 - 13:37

ciao, se non funzionano insieme o hai qualche problema nei collegamenti, oppure hai qualche conflitto sul pin di CS (devono essere diversi!). Potrebbe essere anche un problema di risorse arduino, fai uno sketch minimale, ti da qualche warning quando compila?

Reply
salvo 6 marzo 2018 - 13:58

Ciao Luca, i collegamenti sono apposto, sto provando con il tuo sketch nessun’altra cosa aggiunta, nessun warning..l’unico indizio…se leggo dalla sd tutto ok, se invece mando il tuo sketch in esecuzione devo togliere il pin 5v dalla scheda sd (che chiaramente mi da l’errore di inizializzazione ma almeno la parte web non rimane bloccata su (“SD Webserver”)); è veramente strano!! sono disperato 🙁

Reply
salvo 10 marzo 2018 - 11:45

Ciao Luca, risolto!!!,…avevo un problema con il modulo sd card….provando provando sono riuscito a farlo fuori.. 🙂 adesso l’ho cambiato e tutto va alla grande….Grazie

Reply
salvo 10 marzo 2018 - 12:41

Luca scusa il disturbo, ma se io volessi mandare anzichè il millis una stringa di testo…..”non statica” ci sto sbattendo la testa ma non riesco…ho provato con la String prova=”blablabla”; $S in modo che io di volta in volta possa riorganizzarci il contenuto ma non la accetta….idee………?? grazie

Reply
luca 12 marzo 2018 - 09:04

ciao, devi usare $F, guarda questo mio esempio

Reply
salvo 11 marzo 2018 - 18:56

Ciao Luca, RISOLTO anche il problema delle stringhe…adesso ho un’altro problema e “credo sia l’ultimo” Ethernet::buffer[600]; mi porta via un sacco di memoria…è possibile gestire questo buffer sulla micro sd?? temo non sia possibile ma te lo chiedo lo stesso…o magari qualche scappatoia per recuperare memoria…grazie 1000

Reply
luca 12 marzo 2018 - 09:15

ciao Salvo, purtroppo quello è il problema del chip enc28j60… non ha memoria interna quindi tutto il pacchetto deve essere memorizzato nella memoria RAM di Arduino (è il “buffer”).

Reply
salvo 13 marzo 2018 - 02:07

Ciao Luca, ho risolto anche questa…grazie a te!, adesso mi piacerebbe poter inviare delle notifiche email “magari tramite Gmail” ho cercato in rete ma senza esito”almeno per quanto riguarda la componentistica adottata in questo tuo tutorial” ne sai qualcosa????Non so nemmeno come ringraziarti…. 🙂

Reply
salvo 13 marzo 2018 - 11:40

Ciao Luca, Scusami tanto se ti scrivo a raffica….perdonami!!! ma ho provato a far andare sul mio “iphone 5 aggiornato”
questo esempio e non funziona, ho provato anche su android…nemmeno li, c’è qualche motivo per cui non funziona?? grazie e buonagiornata

Reply
salvo 14 marzo 2018 - 20:22

Ciao Luca, dopo aver fatto centinaia di ricerche ancora non riesco a far girare sui miei cellulari iphone e android il tuo progetto, sul pc funziona regolarmente mentre sui cellulari no!, o fatto puntare il jquery anche sul repository ma non è questo il problema, hai qualche consiglio?? grazie

Reply
salvo 19 marzo 2018 - 15:06

Ciao Luca, sono riuscito a far funzionare in ambiente Android, ma su iphone non ne vuole discutere!!, ho l’impressione che sia un problema legato o alla rirhiesta da parte del client o alla risposta che arduino da, come se l’iphone trovasse rischioso accedervi per via della comunicazione che si verrebbe a creare, ho cercato tantissimo su google e quanto pare forse che iphone troverebbe NON VALIDA la url e quindi la ignora del tutto senza restituire errori.
Ne sai qualcosa?? grazie

Reply
salvo 22 marzo 2018 - 09:47

Ciao Luca, non riesco a fare andare le cose… ho pensato di acquistare la ethernet shield originale…prima che aquisto a vuoto…questo codice funziona anche li??…grazie

Reply
luca 23 marzo 2018 - 08:41

ciao, no se usi lo shield ufficiale devi cambiare sketch e librerie (trovi molti esempi su internet)

Reply
Mahmoudbh 3 maggio 2018 - 13:13

can this work with the micro sd card and enc28J60 ??
i can’t done it..
the sd adapter: https://d3s5r33r268y59.cloudfront.net/27271/products/thumbs/2014-05-16T16:00:29.024Z-237.jpg.855x570_q85_pad_rcrop.jpg

Reply
luca 3 maggio 2018 - 13:24

yes it should work if everything is connected properly

Reply
Mahmoudbh 3 maggio 2018 - 13:58

when i unplug the micro sd adapter it write ethernet initialized and Failed to initialize SD card

Reply
Mahmoudbh 3 maggio 2018 - 13:55

serial monitor sais: SD Webserver
and stock there..

Reply
DARIO 28 ottobre 2018 - 11:36

Ciao Luca, innanzi tutto i miei complimenti per la tua preparazione.
Ho da sottoporti una problematica e spero tu possa darmi delle dritte sulla fattibilità o meno.
E’ possibile inviare ad arduino una foto da cellulare via bluetooth e questa venga interpretata in base ai colori (tipo rettangolini colorati intendo) che ci sono in sequenza sulla foto e che arduino si regoli perciò di conseguenza?

Reply
luca 1 novembre 2018 - 16:16

ciao Dario… la vedo difficile usando un arduino Uno… la poca memoria non è sufficiente per gestire una fotografia

Reply
DARIO 2 novembre 2018 - 16:31

OK. arduino mega? ma a parte la memoria, è un porgetto fattibile? in che modo?

Reply
luca 10 novembre 2018 - 21:46

io per progetti di questo tipo (interazione con cellulari…) starei su schede che eseguono Linux, sicuramente ti semplifica la vita perché molti layer di comunicazione già sono fatti…

Reply
DARIO 18 novembre 2018 - 11:08

OK. grazie. Non sapevo dell’esistenza di schede che lavorano su linux. Mi informo subito.

Alessandro 27 settembre 2019 - 19:58

Ciao Luca, ho un problema con l’ENC28J60, provo a spiegarti il mio progetto:
1) ho realizzato un circuito con arduino + display 128×64 + sensore per microparticolato che usa la libreria SdsDustSensor.h + ENC28J60.
2) ho realizzato un sketch SOLO per il display 128×64 e il sensore di microparticolato –> funziona bene
2) ho provato uno sketch SOLO per ENC28J60 “backsoon” –> funziona bene
3) se li metto assieme vengono caricati su arduino senza errori ma il programma si blocca prima del void setup.
4) ho provato a cambiare la scheda di rete con una W5100 con la sua libreria ma si blocca lo stesso.

Hai qualche consiglio?
Siccome i due sketch singolarmente funzionano può essere che le librerie vadano in conflitto?

Grazie in anticipo.

Reply

Rispondi a marco arigliani Cancel Reply

nove + 4 =