enc28J60 e Arduino (19)

by luca
11 comments

In un precedente articolo, vi ho già parlato della libreria UIPEthernet, che consente di utilizzare gli sketch pensati per l’ethernet shield ufficiale anche con il chip ENC28J60.

Ho aggiornato l’articolo con alcune nuove indicazioni

Qualche giorno fa Giorgio (sito ufficiale), appassionato di Arduino della provincia di Torino, mi ha gentilmente inviato un suo sketch che utilizza tale libreria per creare un webserver che consente di cambiare lo stato a 4 uscite… il tutto utilizzando una interfaccia AJAX:

uip-1

L’idea di utilizzare AJAX è tratta da un tutorial sul sito di StartingElectronics.

Non essendo possibile utilizzare contemporaneamente la libreria UIPEthernet e quella SD (occupano troppa memoria), la pagina HTML è salvata nella memoria programma (PROGMEM) come un array di caratteri rispettando la sintassi delle stringhe in C (il carattere di a capo è stato sistituito con ‘\n’ e le virgolette sono state inserite con il carattere di escape \).

La funzione printPage(const char *str) si occupa proprio di recuperare la pagina dalla memoria programma e di inviarla al client.

Per evitare che Arduino si blocchi e sia necessario un reset, conviene aumentare il buffer di lettura del client:

#define REQ_BUF_SZ 120

ed inserire un delay di 10ms prima di inviare il file.

Per risparmiare memoria RAM, conviene utilizzare la macro F() con tutte le stringhe statiche in modo da memorizzarle nella memoria programma.

Per evitare che il browser faccia caching della pagina AJAX (e quindi non richieda l’aggiornamento ad Arduino ogni tot secondi), alla URL di tale pagina Giorgio ha aggiunto una variabile randomica, che quindi cambia ad ogni richiesta:

uip-3

Utilizzando il monitor seriale si possono vedere tutte le richieste a cui Arduino risponde:

uip-2

Sketch e documentazione

Trovate lo sketch su Github… grazie Giorgio!

Vi segnalo anche il thread ufficiale sul forum di Arduino relativo alla libreria UIPEthernet, ottimo punto di partenza per informazioni e consigli.

Il consiglio è di utilizzare sempre l’ultima versione della libreria; inoltre – sempre per risparmiare RAM – si possono disabilitare determinati protocolli (UDP, DHCP) se non utilizzati: nella sottocartella Utility all’interno della cartella della libreria modificare il file uipethernet­-conf.h:

UIP_CONF_UDP = 0
UIP_CLIENT_TIMER = -­1
UIP_CONF_MAX_CONNECTIONS = 1

La prima riga disabilita il protocollo UDP, la seconda (libreria 1.08 o superiore) libera altra RAM mentre la terza limita il numero di connessioni simultanee a 1.

Related Posts

11 comments

Davide 25 novembre 2014 - 23:47

Salve, devo dire che i tuoi articoli sono davvero molto interessanti.
Ho provato ad usare la libreria UIPEthernet e sono riuscito a far funzionare gli esempi che hai proposto.
Ho solo un piccolo grande problema: tutti gli esempi che provato, funzionano perfettamente in rete Locale LAN ma se provo ad indirizzare arduino tramite WEB, non riesco ad accedervi.
Mi spiego meglio: connettendomi(dallo smartphone tramite 3g) al mio indirizzo ip pubblico es: “75.10.25.111:4665” non riesco ad accedere al webserver, nonostante abbia abilitato la porta TCP remota 4665 all’indirizzo ip locale di Arduino + ENC28j60.
Ora quello che volevo capire è se per caso la Libreria UIPEthernet non sia in grado di gestire connessioni tcp/ip dal web oppure c’è qualcosa che non va nella mia configurazione.
Grazie

Reply
luca 26 novembre 2014 - 11:10

Ciao Davide, Arduino non sa neppure che la connessione non arriva dalla rete locale: il tuo router se configurato correttamente fa NAT quindi Arduino pensa di parlare con il router (che poi gira le connessioni al vero client). Questo per dire che sicuramente il problema sta o nel router o nel fatto che la porta che hai scelto viene filtrata (non tutti i providers consentono connessioni dall’esterno su porte non standard).

Reply
domenico 18 dicembre 2015 - 09:55

ho utilizzato con successo questo progetto per chreare una presa comandata da remoto, ma ho aggiunto un display per visualizzare se e connesso o no alla rete perche ho inserito un client wifi. il tutto funziona ma vorrei fare del codice che faccia un ping , ma ho poche basi per fare questo. mi potresti aiutare? grazie in anticipo

Reply
luca 7 gennaio 2016 - 09:45

Ciao Domenico, sto preparando un tutorial proprio con questa tematica (PING).

Reply
Nino 19 marzo 2016 - 16:09

Ciao Luca, complimenti! Punto (e virgola, vista la tematica!).
Ho caricato lo sketch e funziona benissimo in locale ed in remoto.
Vorrei fosse controllato l’accesso ma altri esempi usano la WebServer e non riesco ad implementare.
Inoltre, vorrei essere sicuro di spegnere il controllo. comunque, ad un certo punto. Pensi che col timer interno sia possibile o col timer “cinese” che ho ordinato oppure pesa troppo sulla ram?

Reply
luca 21 marzo 2016 - 21:04

Ciao Nino! per l’autenticazione guarda questo mio tutorial. Io utilizzerei un RTC esterno collegato ad arduino, così sei sicuro che se anche Arduino viene riavviato, il timer continua a funzionare e ti da sempre l’ora esatta.

Reply
Nino 21 marzo 2016 - 22:21

Ciao Luca, grazie per la tempestiva risposta.
Mi accingo a provare e ti faccio sapere.
Avevo dubbi sull’implementazione del codice descritto nel tutorial 19 poiché non c’è scheda SD per memorizzare la pagina web e nel tutorial hai espresso preoccupazioni per la saturazione della RAM.
Ho abilito parti del codice relativi ad alcuni attuatori (mi serve attivare un relais, al massimo due) spero che l’aggiunta non faccia bloccare tutto…

Reply
Nino 25 marzo 2016 - 23:45

Ciao Luca,
non sono riuscito a fare le prove di “sicurezza”.
Però mi succede un’altra cosa e non so se è normale, vista la mia ignoranza.
Ho modificato lo sketch per utilzzare un solo pulsante per accendere due led. Provando da un client in rete locale, dato il comando di accensione, accesi i led, chiuso il client, e dopo attivato il monitor seriale, si spengono i led. Se non capisco male, l’apertura del monitor “resetta” il client. Che dici?

Reply
luca 4 aprile 2016 - 07:56

confermo, ogni volta che apri il serial monitor arduino si resetta

Reply
Amit 11 novembre 2017 - 14:27

Actually I want to acquire data from 6 to 7 arduinos using enc28j60 ethernet shields. I want the information to be displayed on single web page I shall dedicate single PC to fetch information from all these arduinos. I think I shall need ajax web page which shall fetch required data from each arduinos..Can you guide me how to proceed.?

Reply
luca 11 novembre 2017 - 14:52

Amit, the best way to do it in my opinion is to use an MQTT broker and an ajax page that fetches data from it… you can find some tutorials on my website and on the Internet

Reply

Rispondi a Nino Cancel Reply

19 − sei =