enc28J60 e Arduino (17)

by luca

In alcuni tutorial precedenti, avete già imparato a realizzare semplici pagine web per comandare a distanza led, relay… oggi vi mostrerò come rendere queste pagine sicure grazie ad una password.

Form web

La pagina web pubblicata da Arduino contiene una semplice form, composta da due pulsanti e da un campo di input per la password:

Alla pressione del pulsante, viene inviato ad Arduino un comando POST contenente – oltre ad informazioni del browser – i dati della form:

Dallo screenshot si può notare come i dati siano concatenati dal carattere & e il valore del campo password sia specificato dopo l’etichetta pwd=.


Il codice in esecuzione su Arduino (lo trovate nel repository Github), alla ricezione di una nuova richiesta, esegue le seguenti operazioni:


  • verifica se la richiesta è di tipo POST
  • in questo caso, estrae dalla richiesta il valore della password e la confronta con quella memorizzata
  • se la password è corretta, estrae dalla richiesta il pulsante (ON|OFF) premuto
  • modifica lo stato dell’uscita
  • restituisce la pagina HTML


Vediamolo nel dettaglio:

char* led_password = "SesamE";

la password è inserita hardcoded nello sketch, di default sarà SesamE

pinMode(led_pin, OUTPUT);
digitalWrite(led_pin, LOW);
led_status = false;

all’interno del setup() avviene l’inizializzazione del PIN e dello stato dell’uscita (di default spenta)

if(strstr((char *)Ethernet::buffer + pos, "POST /") != 0) {

lo sketch verifica – tramite la funzione strstr() – se il pacchetto ricevuto contiene il comando POST /

char* password_position = strstr((char *)Ethernet::buffer + pos, "&pwd=");
if(password_position != 0) {
  strcpy(password, password_position + 5);
  if(strcmp(password, led_password) == 0) Serial.println("Valid password :)");

lo sketch cerca la stringa &pwd= nel pacchetto; se la trova estrae la password e la memorizza nella variabile password. Le due password sono quindi confrontate

if(strstr((char *)Ethernet::buffer + pos, "OFF=") != 0) {
digitalWrite(led_pin, LOW);
led_status = false;

se la password è corretta e il pacchetto contiene il comando OFF=, l’uscita viene spenta. Lo stesso controllo avviene per il comando ON=

if(led_status == true) bfill.emit_p(PSTR(

infine viene generata la pagina HTML, resa dinamica da due if:

  • in base allo stato dell’uscita, uno dei due pulsanti viene disabilitato (aggiungendo l’attributo disabled)
  • se la password non è corretta, viene visualizzato un messaggio di errore


Ecco due screenshot relativi all’inserimento di una password valida e una sbagliata:

Related Posts


nasim 20 dicembre 2013 - 10:43

hi …
i just want to simulate …
how i get enc28j60 mac address for proteus simulation..

luca 23 dicembre 2013 - 08:41

Hi Nasim,

I never used Proteus but the MAC I think you can use the same mac address I use in my sketches… while the IP address must belong to the same network (simulated one?) you’re using.

jmv 23 gennaio 2014 - 17:26

hi, luca, great site!.
how I send a TCP packet to a client tcp.
I intend to make a Modbus server.
sorry bad english.

luca 27 gennaio 2014 - 22:14

Hi Jonas,

mmm are you asking how to send a tcp packet to a server? give a look to my examples, basically you have to “create” the packet in a Stash object and send to the server using the tcpSend() method.

Tony 22 febbraio 2014 - 16:57

Hi Luca

how to keep password remember? each time i press the button, the password cleared and i have to enter again and again to control the LED

luca 2 marzo 2014 - 13:44

Hi Tony

you can include the password in the html page:

if(password_valid == true) bfill.emit_p(PSTR("

"), password);

Tunir Saha 8 marzo 2014 - 08:04

DHCP failed

Sir any explanation for this ? I don’t know how to figure this out.

luca 15 marzo 2014 - 10:45

Hi Tunir,

it seems Arduino can’t obtain an IP address from your DHCP: have you a DHCP server in your network?

meka 27 aprile 2014 - 21:19

how to add multiple input
if i use 3 input type time
like this
if i am runing com serial only see
i this only receive input time 1
do you any solution???
thanks luca

luca 29 aprile 2014 - 21:01

hi meka, unfortunately your code was lost, by the way in this example you can see how I control two leds… you can easily adapt it for more outputs.

Krunal 14 maggio 2014 - 13:24

Hi Luca…
Very Good Tutorials for a Ethernet beginner like me…
You have presented everything in very simple & understandable language.
Thanks a lot for posting them & making them available to all of us…
Have you compiled all the examples in one single document including codes?
can I get the link for the same?
Thanks a lot again…

luca 19 maggio 2014 - 20:30

Hi Krunal,

all the examples are on Github, you can download a zip with all the sources from there.

sergio 11 luglio 2014 - 16:06

hello, sorry for my english, I’m brasilian and were eliminated from the World Cup by Germany 7 x 1 shame. 🙁

you are my last hope, sorry.

I’m trying to connect a one arduno a ENC28J60 (http://www.dx.com/p/pcb-arduino-enc28j60-ethernet-module-blue-140971. U7_6DnWx3wI) module and a sd card.

The card will record data from a temperature sensor from time to time, so I can turn off the card most of the time.

Can you help me? I found a lot of theory about SPI but nothing practical that can help me, I am beginner.

I would be very grateful for your help, having seen his experience with the module ENC28J60, parabens, your site has helped much mem.

Thank you


luca 14 luglio 2014 - 15:23

Hi Sergio,

the only problem is if SD card and enc28j60 share the same “CS” pin… otherwise you can simply connect both to the other SPI pins without any problems. Are you using a shield for SD card?

Sérgio 14 luglio 2014 - 22:23

Hi Luca, thanks for your reply.

I’m using a sd done with resistors like this: http://forum.allaboutcircuits.com/showthread.php?t=27913

Today I called just the network module and tried to control port 8 which is the default (on and off with LOW and HIGH) but could not.

pinMode (chipSelectRede, OUTPUT);
digitalWrite (chipSelectRede, HIGH);

It still works, also tried to connect on port 10 and the same thing.

Should not have the right network?

thanks for your help. I’m desperate for this to work.

luca 16 luglio 2014 - 08:41

Hi Sergio,

which is the error you get from the sketch? Are you trying the most basic one (static or dinamic IP)?

sergio 16 luglio 2014 - 15:50

hello, I’m using testeDHCP, did some adaptation.
Follow but he printa MAC and.

I realized that if I comment out the lines:
pinMode (SD_SS, OUTPUT); / / 8
digitalWrite (SD_SS, HIGH);
the sample back to work.

Thank you for everything

Code —-
#include //add
#include //add

const int NW_SS = 10; //add
const int SD_SS = 4; //add
File myFile; //add

static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

byte Ethernet::buffer[700];

void setup () {
SPI.begin(); //add


Serial.println(“— STATUS —“);
pinMode(NW_SS, OUTPUT); //8
digitalWrite(NW_SS, HIGH);
Serial.print(“NW_SS apos pinMode = “);Serial.println(digitalRead(NW_SS));
pinMode(SD_SS, OUTPUT); //8
digitalWrite(SD_SS, HIGH);
Serial.print(“SD_SS apos pinMode = “);Serial.println(digitalRead(SD_SS));

digitalWrite(SD_SS, HIGH);
digitalWrite(NW_SS, LOW);


Serial.print(“MAC: “);
for (byte i = 0; i < 6; ++i) {
Serial.print(mymac[i], HEX);
if (i < 5)

if (ether.begin(sizeof Ethernet::buffer, mymac, NW_SS) == 0)
Serial.println( "Failed to access Ethernet controller");

Serial.println("Setting up DHCP");
if (!ether.dhcpSetup())
Serial.println( "DHCP failed");

ether.printIp("My IP: ", ether.myip);
ether.printIp("Netmask: ", ether.netmask);
ether.printIp("GW IP: ", ether.gwip);
ether.printIp("DNS IP: ", ether.dnsip);

// testa_sd();

void loop () {}

void testa_sd(){
Serial.print("Initializing SD card…");
if (!SD.begin(SD_SS)) {
Serial.println("initialization failed!");
Serial.println("initialization done.");
if (SD.exists("example.txt")) {
Serial.println("example.txt exists.");
// open a new file and immediately close it:
Serial.println("Creating example.txt…");
myFile = SD.open("example.txt", FILE_WRITE);
// chech if the file created
if (SD.exists("example.txt")){
Serial.println("example.txt createdexists.");
else {
Serial.println("example.txt doesn't exist.");

Ricardo 26 ottobre 2014 - 20:18

This post is perfect, literally! Sending info to the Arduino Webserver without having info on the url is a very good practice. There is a nice post on arduino forum by DaveO, with Zoomkat help, and they use millis() to provide session ID. Joining that with your code, we can make a login form and then turn off or on leds while the session is active. Maybe you can make one tutorial with this in mind. I’ll start my own and share it also.

Vlad 22 febbraio 2015 - 15:02

Great stuff!

Please help:
I have a problem submitting from smartphones.
It doesn’t work.
I enter any password and it gives “Unknown command” when submitting.


luca 24 febbraio 2015 - 20:54

Hi Vlad, another user reported me the same problem: it was his provider that was blocking port 80, try changing the port arduino listens on (for example 8080) and let me know…

Alex 12 maggio 2015 - 10:52

Hello Luca.

Can u implement locking for 15 sec. after 3 failed password attempts? Like routers …


Fabio 22 novembre 2016 - 14:48

perché quando carico questo progetto compare questo errore?

warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
char* led_password = “SesamE”;


luca 23 novembre 2016 - 08:39

Ciao Fabio, è solo un warning (avviso) che indica una conversione “deprecata”… dovrebbe comunque compilare giusto?

Fabio 24 novembre 2016 - 08:12

Compila carica da l’avviso si collega esce fuori il web server inserisci la password ma il led non si accende.
nel monitor scrive:

New POST request!
Unknown command 🙁

il bello è che fino a pochi giorni fa tutto funzionava correttamente nemmeno il warning compariva.

HO provato a caricai il tuo tutorial WebLed n.7 anche questo ora da lo stesso warning e non funziona

Fabio 29 novembre 2016 - 11:51

Notizie cosa sbaglio?

Fabio 2 dicembre 2016 - 14:05

Ora tutto chiaro con iMac e safari da errore:

Unknown command 🙁

mentre con iMac e chrome tutto funzionante!!!!

ronie 20 ottobre 2017 - 09:34

Can you publish/mail full code to me ? I wanted to see how exactly it is implemented.

luca 21 ottobre 2017 - 13:55

Hi, as wrote in the article, the source code is available on Github.

lucadentella.it – ESP32 (21) – Mutua autenticazione 24 gennaio 2018 - 13:45

[…] soluzione classica (utilizzata anche in questo mio tutorial) è quella di richiedere l’inserimento di una password. Tale soluzione è molto semplice da […]


Leave a Comment

cinque + uno =