Pages: [1] 2 3   Go Down
Author Topic: Come fare un piccolissimo webserver con ENC28J60 ?  (Read 3118 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 0
Posts: 361
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: July 12, 2012, 06:09:18 am by acik » Logged

Offline Offline
Edison Member
*
Karma: 28
Posts: 2031
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

il topic è questo
http://arduino.cc/forum/index.php/topic,112248.75.html
il link che dicevi tu è questo:
http://www.open-electronics.org/low-cost-ethernet-shield-with-enc28j60/
Buon lavoro   smiley-lol
Logged

"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein

BG (I)
Offline Offline
Full Member
***
Karma: 0
Posts: 202
Usus plura docet
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Sr. Member
****
Karma: 0
Posts: 361
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


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

Taranto, Puglia
Offline Offline
God Member
*****
Karma: 1
Posts: 758
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink
Logged


Offline Offline
Sr. Member
****
Karma: 0
Posts: 361
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Code:
bfill.emit_p(PSTR(pippo));
Non funziona, mi da errore in fase di compilazione.


Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 361
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink
Libreria linkata da OpenElectronics: https://github.com/jcw/ethercard

Libreria linkata da Lucadentella:      https://github.com/jcw/ethercard

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

CIAO
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 361
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

BG (I)
Offline Offline
Full Member
***
Karma: 0
Posts: 202
Usus plura docet
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Puoi postare l'intero sketch che ci do un'occhiata
Grazie  smiley-grin
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 361
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Eccolo qui:


Code:
#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<br>"
                      "Temperatura P = $D$D$D<br>"
                      "Temperatura R = $D$D$D<br>"
                      "Consumo tot.   = $D$D$D<br>"
                      "</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());
  }
}
Logged

Taranto, Puglia
Offline Offline
God Member
*****
Karma: 1
Posts: 758
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Code:
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();
}
« Last Edit: July 13, 2012, 07:51:18 am by igor97 » Logged


BG (I)
Offline Offline
Full Member
***
Karma: 0
Posts: 202
Usus plura docet
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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-grin smiley-grin smiley-grin
Logged

Taranto, Puglia
Offline Offline
God Member
*****
Karma: 1
Posts: 758
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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-grin smiley-grin smiley-grin
son contento, di solito non mi faccio capire  smiley-sweat
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 smiley-wink avrai tutto piu chiaro
Logged


Offline Offline
Sr. Member
****
Karma: 0
Posts: 361
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Taranto, Puglia
Offline Offline
God Member
*****
Karma: 1
Posts: 758
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
#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 <br/><br/>"
      "The LED is $S <br/><br/>"
      "Entered in text box = $S <br/>"
      "</em></p><div style='text-align: center;'><p><em>"
      "<A HREF='?cmd=on'>Turn on</A> <br/>"
      "<A HREF='?cmd=off'>Turn off</A> <br/>"
      "<A HREF='?cmd=blank'>Refresh Page</A> <br/>"
      "<FORM>Test input box <input type=text name=boxa size=10> <input type=submit value=Enter> </form> <br/><br/>"
      "<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:
http://www.open-electronics.org/low-cost-ethernet-shield-with-enc28j60/
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  smiley-mr-green
Logged


Pages: [1] 2 3   Go Up
Jump to: