Arduino con openwrt webserver

ciao a tutti volevo condividere e magari migliorare il mio progettino fatto con arduino e un router "alice gate voip" con installato sopra openwrt.
cosa server:
un router che supporti openwrt, nel mio caso avevo a disposizione un alice gate voip . Ho seguito una delle tante procedure per installarlo "ovviamente tramite seriale"
un arduino con ethernet shield.

il codice arduino è molto semplice

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 
byte ip[] = { 192, 168, 1, 177 }; // ip in lan
EthernetServer server(80);
String readString;

void setup()
{
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  Ethernet.begin(mac, ip);
  server.begin();
}

void loop()
{
  EthernetClient client = server.available();
  if (client) 
  {
    while (client.connected()) 
    {
      if (client.available()) 
      {
        char c = client.read();
        if (readString.length() < 100) readString += c;
        if (c == '\n') 
        {
             if(readString.indexOf('?') >=0) 
             { 
               client.println("HTTP/1.1 204 ");
             }
             else 
             {
              client.println("HTTP/1.1 200 OK"); 
              client.println("Content-Type: text/html");
             }
          delay(1);
          client.stop();
       
          if(readString.indexOf("on2") >0)
          {
            digitalWrite(2, HIGH);   
            Serial.println("Led On");
          }
          if(readString.indexOf("off2") >0)
          {
            digitalWrite(2, LOW);
            Serial.println("Led Off");
          }
          
          if(readString.indexOf("on3") >0)
          {
            digitalWrite(3, HIGH);   
            Serial.println("Led On");
          }
          if(readString.indexOf("off3") >0)
          {
            digitalWrite(3, LOW); 
            Serial.println("Led Off");
          }
          
           if(readString.indexOf("on4") >0)
          {
            digitalWrite(4, HIGH);   
            Serial.println("Led On");
          }
          if(readString.indexOf("off4") >0)
          {
            digitalWrite(4, LOW); 
            Serial.println("Led Off");
          }
          
           if(readString.indexOf("on5") >0)
          {
            digitalWrite(5, HIGH);   
            Serial.println("Led On");
          }
          if(readString.indexOf("off5") >0)
          {
            digitalWrite(5, LOW); 
            Serial.println("Led Off");
          }
          
           if(readString.indexOf("on6") >0)
          {
            digitalWrite(6, HIGH);   
            Serial.println("Led On");
          }
          if(readString.indexOf("off6") >0)
          {
            digitalWrite(6, LOW); 
            Serial.println("Led Off");
          }
          
           if(readString.indexOf("on7") >0)
          {
            digitalWrite(7, HIGH);   
            Serial.println("Led On");
          }
          if(readString.indexOf("off7") >0)
          {
            digitalWrite(7, LOW); 
            Serial.println("Led Off");
          }
          
           if(readString.indexOf("on8") >0)
          {
            digitalWrite(8, HIGH);   
            Serial.println("Led On");
          }
          if(readString.indexOf("off8") >0)
          {
            digitalWrite(8, LOW); 
            Serial.println("Led Off");
          }
          
           if(readString.indexOf("on9") >0)
          {
            digitalWrite(9, HIGH); 
            delay(1000);
            digitalWrite(9, LOW);
            Serial.println("Led On");
          }
          
          if(readString.indexOf("spegnitutto") >0)
          {
             digitalWrite(2, LOW);
             digitalWrite(3, LOW);
             digitalWrite(4, LOW);
             digitalWrite(5, LOW);
             digitalWrite(6, LOW);
             digitalWrite(7, LOW);
             digitalWrite(8, LOW);
             digitalWrite(9, LOW);
             
          }
             
       
          
          readString="";
        }
      }
    }
  }
}

praticamente è uno di quelli che si trova facilmente online e l'ho adattato al mio scopo.
Ho scelto di usare openwrt in primis perchè ha una protezione maggiore per quanto riguarda gli accessi "nome utente e password" poi è accessibile anche da esterno e infine possiede un suo webserver interno.

in allegato trovate i file da inserire nella cartella www del router tramite il programma winSCP. Vi posso assicurare che funziona alla perfezione e dopo tante accensioni e spegnimenti dei led non si è mai impallato.
In pratica i vari pulsanti quando premuti non caricano una nuova pagina ma rimangono sempre su la stessa.

ecco come si presenta la parte grafica.

Adesso volevo un piccolo aiutino per fare interaggire la pagina htm con arduino che mi segnali lo stato del led se è acceso o spento.
Si può fare?? Vi informo inoltre che tutto quello che ho fatto è uno scopiazzamento generale e dopo vari topic letti e copia e incolla di codici sono riuscito a trovare una soluzione.

www.rar (207 KB)

volevo informarvi inoltre che il pulsante 7 che corrisponde all'uscita 9 di arduino è temporizzato, cioè attiva l'uscita per 1 secondo e poi la disattiva per un eventuale apertura di un portone a distanza oppure per rettare un server .

ottimo lavoro!!! il

attualmente il tuo arduino è in attesa di connessioni, ora in pratica hai due vie:
aggiungi un comando dove arduino anzichè fare qualcosa risponde con lo stato del led;
Arduini crea un socket client, si collega al router, invia l'avviso di modifica stato led.

puoi aiutarmi con qualche codice , oppure qualcosa dove posso prendere spunto.

Adesso volevo un piccolo aiutino per fare interaggire la pagina htm con arduino che mi segnali lo stato del led se è acceso o spento.
Si può fare??

Hai detto che il router ha una porta seriale. Potresti collegare direttamente arduino a quella per farli comunicare.
A quel punto in effetti potresti anche fare a meno dell'ethernet shield...

Un bel lavoretto, purtroppo sei molto scoperto nei comadi inviandoli direttamente da link,
Usa il json o ajax se vuoi avere risposte immediate sugli status delle porte, come ti hanno detto creare un soket o connessione persistente, se poi vuoi esagerare applica codifica in MD5 unidirezionale, la base64 è come se non la facessi dato che la chiave è nota a tutti.

uno spunto: http://arduino.cc/forum/index.php/topic,63747.0.html, lavora mi pare con 0022-0023, ma si può adeguare ai tempi

ciao

kernak:

Adesso volevo un piccolo aiutino per fare interaggire la pagina htm con arduino che mi segnali lo stato del led se è acceso o spento.
Si può fare??

Hai detto che il router ha una porta seriale. Potresti collegare direttamente arduino a quella per farli comunicare.
A quel punto in effetti potresti anche fare a meno dell'ethernet shield...

è vero.....sei un grande non ci avevo pensato. Adesso bisogna capire come potrebbe funzionare.

pablos:
Un bel lavoretto, purtroppo sei molto scoperto nei comadi inviandoli direttamente da link,
Usa il json o ajax se vuoi avere risposte immediate sugli status delle porte, come ti hanno detto creare un soket o connessione persistente, se poi vuoi esagerare applica codifica in MD5 unidirezionale, la base64 è come se non la facessi dato che la chiave è nota a tutti.

uno spunto: http://arduino.cc/forum/index.php/topic,63747.0.html, lavora mi pare con 0022-0023, ma si può adeguare ai tempi

ciao

provo a documentarmi ma la vedo dura per uno che ha iniziato da un mese.

Adesso bisogna capire come potrebbe funzionare.

Colleghi arduino alla porta seriale del router (al limite usando un adattatore di livelli se necessario; non conosco il tuo router, vedi se trovi documentazione..)

ARDUINO ROUTER
TX --------(adatt.) -------- RX
RX --------(adatt.) -------- TX
GND -------------------------- GND

Lato pc invii dati alla seriale con un qualche linguaggio; mi viene subito in mete php, dato che parli di pagina web, ma niente ti vieta di usare python, perl o quel-che-vuoi.
Potresti ad esempio inviare una stringa tipo "1on", per dire Uscita 1 ON.

Lato arduino ci sarà uno sketch che:

  1. riceve tali stringhe da seriale
  2. esegue le opportune eleborazioni
  3. invia di nuovo una stringa sulla seriale per comunicare lo stato dell'uscita/e

Questa stringa verrà infine interpretata dal programma sul pc, che si occuperà di mostrare tale stato a video.

kernak:

Adesso bisogna capire come potrebbe funzionare.

Colleghi arduino alla porta seriale del router (al limite usando un adattatore di livelli se necessario; non conosco il tuo router, vedi se trovi documentazione..)

ARDUINO ROUTER
TX --------(adatt.) -------- RX
RX --------(adatt.) -------- TX
GND -------------------------- GND

Lato pc invii dati alla seriale con un qualche linguaggio; mi viene subito in mete php, dato che parli di pagina web, ma niente ti vieta di usare python, perl o quel-che-vuoi.
Potresti ad esempio inviare una stringa tipo "1on", per dire Uscita 1 ON.

Lato arduino ci sarà uno sketch che:

  1. riceve tali stringhe da seriale
  2. esegue le opportune eleborazioni
  3. invia di nuovo una stringa sulla seriale per comunicare lo stato dell'uscita/e

Questa stringa verrà infine interpretata dal programma sul pc, che si occuperà di mostrare tale stato a video.

ciao ho provato a collegare l'arduino al router ovviamente scaricando tutti i pacchetti necessari completo anche di python e pyserial. L'arduino viente riconosciuto tranquillamente infatti la riconoscer come ttyUSB0 . Ho creato due script .py che mi fanno accendere e spegnere il led. Adesso vorrei capire....Come faccio a creare la pagina web?

L'arduino viente riconosciuto tranquillamente infatti la riconoscer come ttyUSB0

Aaah ma per seriale intendevi una usb...
Ok è lo stesso.

Ho creato due script .py che mi fanno accendere e spegnere il led. Adesso vorrei capire....Come faccio a creare la pagina web?

Non sono ferratissimo in python, ma credo che tu debba integrare html e script con il metodo dei CGI.
Sicuramente google ti sarà amico; intanto prova a dare un'occhiata qui:
http://docs.python.org/howto/webservers.html

sono ritornato sui i miei vecchi passi. Mi sto dedicando all'interfaccia grafica di arduino con il router tramite lan. python per il momento lo lascio da parte.
Ho modificato il codice e adesso mi stampa nel webserver interno di arduino lo stato dei led , vi chiedo come posso visualizzarle anche nell'interfaccia grafica del router.

ecco lo snapshot

ho abbandonato il progetto, c'è un errore! in pratica da esterno con mi faceva controllora arduino. In pratica mi collegamo al router ma non mandava i comandi. Bisognava abbilitare anche su arduino il servizio dyndns ..........troppi passaggi.

Aprirò un'altro topic per quanto riguarda l'applicazione python che avevo messo da parte. Intanto vi dico che sono riuscito ad avere una connessione stabile da il mio router Alice gate voip con arduino tramite USB "ovviamente tramite python". Quindi non c'è nemmeno il bisogno di comprare la ethernet shield.