Come fare un piccolissimo webserver con ENC28J60 ?

Tempo fa un utente del forum scrisse di aver fatto delle guide per l' utilizzo del Chip Ethernet ENC28J60.
Io visitai di sfuggita il sito (con le guide) che mi sembrava ben fatto.

Oggi pero' non riesco a trovare quel post e di conseguenza il sito...

Chi mi aiuta ?

CIAO

il topic è questo
http://arduino.cc/forum/index.php/topic,112248.75.html
il link che dicevi tu è questo:

Buon lavoro XD

Oppure qui:
http://www.lucadentella.it/category/enc28j60-arduino/

amario57:
Oppure qui:
http://www.lucadentella.it/category/enc28j60-arduino/

Eccolo !!!
E' quello che cercavo !
Grazie.

la libreria di open electonic è completamente diversa da quella del sito di luca..purtroppo ho notato che la shield di Futura elettronica ha caratteristiche un pelino diverse. infatti serve lalibreria di oe.
quella di luca è adatta per le altre shield :wink:

Io ho provato la libreria indicata sul sito di Luca Dentella.
Con la shield che ho io funziona.

Adesso pero' ho bisogno di un po' di aiuto: (ho cambiato titolo al 3D)
Vorrei fare un webserver che mi restituisca via http il valore di una variabile.
Ho preso lo sketch di esempio da QUIhttps://github.com/lucadentella/enc28j60_tutorial/blob/d1b139410a436db39959372493369657d6030d5d/_5_BasicServer/_5_BasicServer.ino

Pero' non riesco a far inviare al browser il valore della variabile pippo.

bfill.emit_p(PSTR(pippo));

Non funziona, mi da errore in fase di compilazione.

igor97:
la libreria di open electonic è completamente diversa da quella del sito di luca..purtroppo ho notato che la shield di Futura elettronica ha caratteristiche un pelino diverse. infatti serve lalibreria di oe.
quella di luca è adatta per le altre shield :wink:

Libreria linkata da OpenElectronics: GitHub - njh/EtherCard: EtherCard is an IPv4 driver for the ENC28J60 chip, compatible with Arduino IDE

Libreria linkata da Lucadentella: GitHub - njh/EtherCard: EtherCard is an IPv4 driver for the ENC28J60 chip, compatible with Arduino IDE

Grazie comunque del link di OpenElectronics, ho trovato dei bei esempi per fare prove.

CIAO

Sono riuscito a far stampare delle variabili.
Il sistema e' un po' macchinoso ma ha la sua logica. L'ho scoperto analizzando altri software trovati in rete.

Se voglio visualizzare il valore di una temperatura, che ho messo nell' int b:

bfill.emit_p(PSTR("La temperatura e' di "
"$D$D"
"gradi centigradi"),
temp/10,temp%10);

(potevo fare tutto in una riga, ma nel caso di scritte corpose, il listato diventa difficilmente leggibile.

Puoi postare l'intero sketch che ci do un'occhiata
Grazie :smiley:

Eccolo qui:

#include <EtherCard.h>
static byte mymac[] = {0xDD,0xDD,0xDD,0x00,0x00,0x01};
static byte myip[] = {192,168,1,10};
byte Ethernet::buffer[700];

void setup () {  
ether.begin(sizeof Ethernet::buffer, mymac, 10);
ether.staticSetup(myip);
}
  
void loop() {
   word len = ether.packetReceive();
  word pos = ether.packetLoop(len);
   if(pos) {
    int ti = analogRead(0)/4;
    delay (10);
    int tp = analogRead(1)/4;
    delay (10);
    int tr = analogRead(2)/4;
    delay (10);
    int i = analogRead(3)/4;
    delay (10);
    
    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"
                      "<html><body><h1>"
                      "Temperatura I = $D$D$D
"
                      "Temperatura P = $D$D$D
"
                      "Temperatura R = $D$D$D
"
                      "Consumo tot.   = $D$D$D
"
                      "</h1></body></html>"),
                      ti/100,ti/10%10,ti%10,
                      tp/100,tp/10%10,tp%10,
                      tr/100,tr/10%10,tr%10,
                      i/100,i/10%10,i%10);
                      
    ether.httpServerReply(bfill.position());
  }
}

acik:
Sono riuscito a far stampare delle variabili.
Il sistema e' un po' macchinoso ma ha la sua logica. L'ho scoperto analizzando altri software trovati in rete.

Se voglio visualizzare il valore di una temperatura, che ho messo nell' int b:

bfill.emit_p(PSTR("La temperatura e' di "
"$D$D"
"gradi centigradi"),
temp/10,temp%10);

(potevo fare tutto in una riga, ma nel caso di scritte corpose, il listato diventa difficilmente leggibile.

in pratica esistono delle variabili: $D, $S, e $F

$D serve per includere nella pagina html un numero,
$S per includere del testo
$F per includere un'altar pagina html presente ello sketch

in pratica dove ci sono le due parentesi chiuse )); si mette il valore delle variabili in ordine dal prmo presente nella pagina html all'ultimo
esempio: dobbiam oscivere nella pagina una paola seguita da un numero ma prima di questa frase" abiamo l'header della pgina presente in un altra variabile memorizzata nllo sketch

char* parola="il numero e' : ";
int numero=10;

char htmlHeader[] PROGMEM =  //header pagina html
      "HTTP/1.0 503 test page\r\n"
      "Content-Type: text/html\r\n"
      "Retry-After: 600\r\n\r\n"
      "<html><head><title>Arduino test page</title></head>"
      "<body style='background-color:rgb(255,255,102);'>"
      "<h2 style='text-align: center;'><em><span style='color: rgb(153, 0, 0);'>This is a test page on my Arduino</span></em></h2>"
;

static word homePage() { //homepage visualizzata
    bfill = ether.tcpOffset();
  
   bfill.emit_p( PSTR ( 
      "$F<p><em>"    // qui viene incluso l'header con $F
"<p>$S</p>" //qui viene aggiunta la variabile parola con $S
"<p>$D</p>" //qui viene aggiunta la variabile numero con $D
"</body></html>" 
    ) , htmlHeader , parola, numero ) ; //quiviene assegnato ad ogni variabile con $ in ordine dal primo all'ultimo nella pagina con le varibile dello sketch

    return bfill.position(); 
}

Grazie Igor, ho capito finalmente la logica della rappresentazione dei valori con la ENC, quando ho un pochino di tempo posto il mio webserver per temperatura e umidità.

:smiley: :smiley: :smiley:

amario57:
Grazie Igor, ho capito finalmente la logica della rappresentazione dei valori con la ENC, quando ho un pochino di tempo posto il mio webserver per temperatura e umidità.

:smiley: :smiley: :smiley:

son contento, di solito non mi faccio capire :sweat_smile:
comunque esistono poi i comandi GET e POST per ineragire con altre pgine web oppure per dare comandi (che comunque vanno programmati) alla scheda nel senso che se io digito tipo 192.168.x.x/?cmd=on
dove l'indirizzo è quello della ethernet shield
e quello dopo il ? è un qualsiasi comando get
posso tramite un if accendere un pin digitale..
per l'esempio vedi quello che ti ho dao nell'altro topic :wink: avrai tutto piu chiaro

Grazie Igor (stavo giusto per mandare un PM a te e a Luca)

Oggi pomeriggio con l'iPhone ho scaricato il zippone ma dentro non c'erano istruzioni...
Ho guardato il wiki ma mi dava "pagina cercata inesistente"
Lo so che usare il cell per ste cose non e' il massimo ma ero in giro tutto il giorno !

Comunque mi sai dire dove trovo le istruzioni complete per quella libreria ?
Ad esempio a casa mia ho una netmask / 28 e non so come dirglielo alla libreria Ethercard.

acik:
Grazie Igor (stavo giusto per mandare un PM a te e a Luca)

Oggi pomeriggio con l'iPhone ho scaricato il zippone ma dentro non c'erano istruzioni...
Ho guardato il wiki ma mi dava "pagina cercata inesistente"
Lo so che usare il cell per ste cose non e' il massimo ma ero in giro tutto il giorno !

Comunque mi sai dire dove trovo le istruzioni complete per quella libreria ?
Ad esempio a casa mia ho una netmask / 28 e non so come dirglielo alla libreria Ethercard.

ma non c'è bisogno di specificarla. per dargli un indirizzo statico ad arduino basta dirgli l'ip e il mac
guardaquesto esempio che poi ho messo per amario in un altro topic:

#include <EtherCard.h>

int sensorPin = A3;
int LEDpin = 3;
char TextBox1[10];


// web page buffer
  byte Ethernet::buffer[1000];
  BufferFiller bfill;
  static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
// ethernet interface ip address
static byte myip[] = { 192,168,0,107 };
// store html header in flash to save memory
char htmlHeader[] PROGMEM = 
      "HTTP/1.0 503 test page\r\n"
      "Content-Type: text/html\r\n"
      "Retry-After: 600\r\n\r\n"
      "<html><head><title>Arduino test page</title></head>"
      "<body style='background-color:rgb(255,255,102);'>"
      "<h2 style='text-align: center;'><em><span style='color: rgb(153, 0, 0);'>This is a test page on my Arduino</span></em></h2>"
;


// ----------------------------------------------


// HTML page to display

static word homePage() {
    bfill = ether.tcpOffset();
    word sensorValue = analogRead(sensorPin);    
    
    char* ledstat;
    if ( digitalRead(LEDpin) == HIGH ) {
      ledstat = "On" ; }
    else {
      ledstat = "Off"; }
    

    // This is html code with embedded variables 
    //    put variables in the HTML area as $D for a number and $S for text then add the actual values after the comma at the end
    //
    // Notes  "<meta http-equiv=refresh content=5>"   tells the page to auto refresh every 5 seconds
    //        if you increase the size of the HTML code you may need to increase the buffer size (or it will stop working)
  
    bfill.emit_p( PSTR ( 
      "$F<p><em>"    // $F = htmlheader in flash memory
      "Reading of A0 input pin = $D 

"
      "The LED is $S 

"
      "Entered in text box = $S 
"
      "</em></p><div style='text-align: center;'><p><em>"
      "<A HREF='?cmd=on'>Turn on</A> 
"
      "<A HREF='?cmd=off'>Turn off</A> 
"
      "<A HREF='?cmd=blank'>Refresh Page</A> 
"
      "<FORM>Test input box <input type=text name=boxa size=10> <input type=submit value=Enter> </form> 

"
      "<FORM METHOD=LINK ACTION='http://www.alanesq.com/arduino.htm'> <INPUT TYPE=submit VALUE='More Info Here'> </FORM>"
      "</em></p></body></html>" 
    ) , htmlHeader , sensorValue , ledstat , TextBox1 ) ;

    return bfill.position(); 
}

void setup()
{
    pinMode(LEDpin, OUTPUT);  
 
    Serial.begin(57600);
    Serial.println("Arduino Ethernet Sketch Started.....");
  
    ether.begin(sizeof Ethernet::buffer, mymac);
    ether.staticSetup(myip);
}

void loop()
{
// check if anything has come in via ethernet
  word len = ether.packetReceive();
  word pos = ether.packetLoop(len);
  
  if (pos) { // check if valid tcp data is received
    // data received from ethernet

       char* data = (char *) Ethernet::buffer + pos;

       #if DEBUG       // display incoming data    
         Serial.println("----------------");
         Serial.println("data received:");
         Serial.println(data);
         Serial.println("----------------");
       #endif

       // "on" command received     
       if (strncmp( "GET /?cmd=on" , data , 12 ) == 0) {
         digitalWrite(LEDpin, HIGH);   // set the LED on
         #if DEBUG
           Serial.println("on received");
         #endif
       }

       // "off" command received     
       if (strncmp( "GET /?cmd=off" , data , 13 ) == 0) {
         digitalWrite(LEDpin, LOW);   // set the LED on
         #if DEBUG
           Serial.println("off received");
         #endif
       }

       // read data from text box
       if (strncmp( "GET /?boxa=" , data , 11 ) == 0) {
           Serial.print ( "text box input received - " );
           if (ether.findKeyVal(data + 6, TextBox1 , sizeof TextBox1 , "boxa") > 0) {
             // int value = atoi(TextBox1);   // command to convert a string to number
         #if DEBUG
             Serial.print ( "input = " );
             Serial.println ( TextBox1 );
         #endif
           }
       }



       ether.httpServerReply(homePage()); // send web page data
   }
}

Attento se hai altre librerie per l'ethernet...cancellale.. ripeto se hai questa shield:

usa la libreria di questa pagina.
se hai quella mini ethernet di amario usa sempre questa ma fatti dire da lui se funziona,
altrimenti devi provare quelle di altri o di luca ma significa cambiare per intero lo sketch di esempio (questo che ho messo).
ciao e buon lavoro :grin:

igor97:

acik:
Comunque mi sai dire dove trovo le istruzioni complete per quella libreria ?
Ad esempio a casa mia ho una netmask / 28 e non so come dirglielo alla libreria Ethercard.

ma non c'è bisogno di specificarla.

Si che devo specificarla !

Se voglio accedere all'Arduino dal computer di mia moglie che ha indirizzo IP 192.168.1.140, devo dire ad Arduino dove andare per raggiungerlo,altrimenti lui pensera' che stanno nella stessa rete !

Quindi se hai un po' di documentazione ti chiedo gentilmente di passarla :smiley: nel frattempo mi leggero' il contenuto dei files .c della libreria.

acik:

igor97:

acik:
Comunque mi sai dire dove trovo le istruzioni complete per quella libreria ?
Ad esempio a casa mia ho una netmask / 28 e non so come dirglielo alla libreria Ethercard.

ma non c'è bisogno di specificarla.

Si che devo specificarla !

Se voglio accedere all'Arduino dal computer di mia moglie che ha indirizzo IP 192.168.1.140, devo dire ad Arduino dove andare per raggiungerlo,altrimenti lui pensera' che stanno nella stessa rete !

Quindi se hai un po' di documentazione ti chiedo gentilmente di passarla :smiley: nel frattempo mi leggero' il contenuto dei files .c della libreria.

aspe, ma tu intendi assegnare un indirizzo ip ad arduino o specificare la maschera di rete?(la classica 255.255.255.0 ovvero la netmask)

igor97:
aspe, ma tu intendi assegnare un indirizzo ip ad arduino o specificare la maschera di rete?(la classica 255.255.255.0 ovvero la netmask)

Io devo specificare la maschera di rete, che nel mio caso deve essere 255.255.255.240

Se usi questa libreria (http://www.open-electronics.org/low-cost-ethernet-shield-with-enc28j60/)
il codice è

static byte mymask[] = { 255,255,255,240 };

PaoloP:
Se usi questa libreria (http://www.open-electronics.org/low-cost-ethernet-shield-with-enc28j60/)
il codice è

static byte mymask[] = { 255,255,255,240 };

Grazie, ma mi sa che manchi un pezzo di codice: quello dove mymask viene inviato alla libreria...
Una roba tipo:

ether.staticSetup(myip,mygw,mymask);