Arduino UNO + ENC28J60 + WebServer jQueryMobile

Salve a tutti amici arduiniani!

vengo in questo luogo di pace cercando lumi su una questione che mi affligge da un paio di giorni a questa parte: è possibile inviare e ricevere informazioni ad/da arduino solo ed esclusivamente tramite ethernet ad un webserver? Ovviamente il progetto è tutto casalingo, quindi stessa rete e nessun accesso all'esterno. Nonostante numerosi tentativi non sono riuscito a trovare una soluzione. Qualcuno sa dirmi di più?!?

Grazie di cuore in anticipo
Luca

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

Si che si può, ci sono abbastanza informazioni in rete e sul forum, anche sul perchè non conviene usare la ENC e arduino UNO per fare un webserver, che l'accesso sia esterno o interno non grava sullo sketch, cosa non ti è chiaro?

Ps: non hai specificato il modello arduino che possiedi

Chiedo scusa per la presentazione, ero convintissimo di averlo fatto, al tempo, quando mi sono registrato al forum =)

Il modello di arduino in uso è arduino UNO (come da titolo).
Permettetemi di spiegare meglio cosa intendo fare (e vi chiedo comprensione perché ho sempre difficoltà a spiegare quello che intendo dire :stuck_out_tongue: ):

Ho un webserver apache+PHP+mySQL su una macchina nella mia rete locale (intendo poi spostare il webserver su un raspberry PI).
Ho poi un arduino collegato alla rete tramite enc28j60 usando libreria etherCard (piccola precisazione: non ho trovato documentazione alcuna su questa libreria, se avete link a portata di mano che spiegano o almeno elencano i metodi invocabili sarebbe grandioso).

Quello che cerco di realizzare e che vorrei sapere se è possibile fare, prima di perdere tempo salute e lavoro, è:

E’ possibile usare uno o più arduino in rete da interrogare sia per input che per output dati e far processare questi dati al webserver?

vi posto un piccolo sketch poco ottimizzato e scritto male ma che diciamo “funziona”:

#include <EtherCard.h>

#define pinLed 9

#define STATIC 1  

#if STATIC
// ethernet interface ip address
static byte myip[] = { 192,168,109,161 };
// gateway ip address
static byte gwip[] = { 192,168,109,254 };
#endif

// ethernet mac address - must be unique on your network
static byte mymac[] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};

byte Ethernet::buffer[500]; // tcp/ip send and receive buffer


void setup(){
  Serial.begin(57600);
  pinMode(pinLed,OUTPUT);
  
  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) 
    Serial.println( "Failed to access Ethernet controller");
#if STATIC
  ether.staticSetup(myip, gwip);
#else
  if (!ether.dhcpSetup())
    Serial.println("DHCP failed");
#endif

  ether.printIp("IP:  ", ether.myip);
  ether.printIp("GW:  ", ether.gwip);  
  ether.printIp("DNS: ", ether.dnsip);  
}

void loop(){
  word len = ether.packetReceive();
  word pos = ether.packetLoop(len);

  if (pos)
   {
    char* request = (char *)Ethernet::buffer + pos;
    
    // if the request is for the "default" page
    if(strncmp("GET /?", request, 6) == 0) {
      
      Serial.println("trovata stringa di GET");
      String richiesta= (String)request;
      int posizioneHTTP = richiesta.indexOf('HTTP');
      Serial.println("Posizione HTTP nella stringa: " + posizioneHTTP);
      
      String parametri = richiesta.substring(6,posizioneHTTP-4);
      Serial.println(parametri);
      
      
      
      
    }

    if(strncmp("GET /?pippo=1", request, 13) == 0) {
      
      Serial.println("status=1");
      digitalWrite(9, HIGH);
      
      
    }
    
    if(strncmp("GET /?pippo=0", request, 13) == 0) {
      
      Serial.println("status=0");
      digitalWrite(9, LOW);
      
      
    }
    
    
   }
}

Dopo la fase di inizializzazione del controller ethernet ricerco “HTTP” per isolare la richiesta che passo col get dal webserver e poi l’if/else elabora la stringa settando HIGH/LOW sul pin 9 al quale ho collegato un led. Roba semplicissima insomma.

Lato server la paginetta basilare che ho scritto, con l’ausilio di jQueryMobile, è la seguente:

<!DOCTYPE html> 
<html>
 
    <head> 
    
    <title>Web Server Domotica</title> 
 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
 
    <link rel="stylesheet" href="http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.css" />
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
    <script type="text/javascript" src="http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.js"></script>
    <link rel="stylesheet" href="resources/css/domotica_custom.min.css" />

</head> 
<body> 
 
<div data-role="page" data-theme="d" id="pagina1">
 
    <div data-role="header" data-theme="d">
        <h1>Domotica</h1>
    </div><!-- /header -->
 
    <div data-role="content" data-theme="d"> 
        
        <label for="flip">Pin 9 di Arduino:</label>
        <select name="flip" id="flip" data-role="slider">
         <option value="off">O</option>
            <option value="on">I</option>
         </select>
         
         
        
    </div><!-- /content -->

</div><!-- /page -->
 
</body>
</html>

    <script>
 var val;
 $('#flip').on('slidestop', function() {
 val=$('#flip').val();
 console.log(val);
 if(val=='off'){
 $.ajax({
 url: "http://192.168.109.161",
  data: "pippo=0",
  type: 'GET'
 });
 }
 else{
 $.ajax({
 url: "http://192.168.109.161",
  data: "pippo=1",
  type: 'GET'
 });
     }
 
 

});
        </script>

Il funzionamento di tutto l’apparato è altalenante. A volte va, a volte no. A volte si accodano una serie di get prima di essere processati, per poi apparire nella console 7/8 di fila (credo che sia una questione di buffer non ottimizzato o l’assenza di un’istruzione flush() che non so nemmeno se esista nella libreria ethercard).

Inutile dire che un funzionamento altalenante equivale ad un non funzionamento ergo spero che qualcuno più bravo e capace di me (e non ce ne vuole molto, sinceramente) mi dia una dritta o un’illuminazione su dove correggere eventuali errori o qualche tips per rendere più stabile il funzionamento.

Se fosse poco chiaro e confusionario, sarò ben lieto di tentare di spiegarmi ancora per quanto mi sia possibile :slight_smile:

Grazie in anticipo di cuore
Luca

http://www.lucadentella.it/2014/11/04/sdwebserver-enc28j60-e-arduino-20/

hai dato un occhiata a questo link?

Il chip W5100 e' quello montato dallo shield supportato direttamente da Arduino e che quindi funziona direttamente con gli sketch presenti nell'IDE mentre il secondo chip e' denominato ENC28J60 non ha un supporto diretto con la necessita' quindi di installare una libreria apposita. Quale e' la differenza tra i due: il W5100 gestisce in modo nativo lo stack TCP/IP mentre ENC28J60 usa il processore dell'Arduino per le operazioni di rete. Ovviamente il secondo costa decisamente meno del primo a causa delle capacita' piu' limitate
il w5100 ha un buffer di 16K la ENC no

tutto quello che fa il w5100 usando la enc lo deve fare il micro 328 della UNO impegnando risorse, rallentando il tutto e perdendo per strada alcuni eventi che al tuo server non arriveranno.

La enc è poco supportata, quindi ti devi arrangiare con quello che trovi in rete e ottimizzarla tu eventualmente, dovrai scegliere un protocollo che impegni poco la rete, non tanto per la rete, ma per gli arduini che saranno più impegnati a trasmettere e ricevere pacchetti piuttosto che controllare cosa succede realmente sugli INPUT e OUTPUT dei pin.

puoi vedere node.js, o spedire piccoli pacchetti con UDP, e non con TCP/IP polling, ma se hai tanti arduini sparsi per la casa, l'ultima cosa che farei e farli colloquiare via ethernet, piuttosto usa il protocollo 485, tanto la tua intenzione è quella di arrivare comunque con un cavo ad ogni arduino.

ciao