Pages: [1] 2   Go Down
Author Topic: Problemi trasmissione Ethernet schield e web server  (Read 1924 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti smiley
seguo il forum da un po' ed ora per la maturità devo creare un progetto con arduino, ma siccome sono le miei prime volte sto incontrando difficoltà
ho un arduino uno con un Ethernet Shield e SD da 2gb ... Io devo prendere in input dei dati di misura ( presi da sensori di temperatura, sensori di fumo), ed accendere delle luci ( dei led) per simulare una casa domotica... per fare questo volevo utilizzare l'arduino come web server, inserire li sopra ( sulla sd ) un sito html che quando lo richiedo inserendo l'ip dell'arduino, mi permette di vedere i dati e di accendere e spegnere le luci ... per ora mi accontento di questo, poi se avrò ancora tempo proverò a fare qualcosa con il php
Il mio problema è che l'arduino non comunica con il mio pc attraverso la ethernet ( ho windows 7) ... di fatti non mi funzionano nemmeno i file di esempio, perchè lampeggia solo il led rx ( e infatti il computer non riceve pacchetti ma invia solo). Con gli esempi client lampeggiano entrambi, però lo scambio di pacchetti è solo in ricezione e non funziona lo sketch
Curiosando sul forum ho trovato un file di un utente molto semplice, che dovrebbe funziuonare senza problemmi:
Code:
#include <SPI.h>
#include <Ethernet.h>

//Creao un array di byte per specificare il mac address
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//creo un array di byte per specificare l'indirizzo ip
byte ip[] = {192, 168, 1, 127};

char Data_RX;

//creao un oggetto server che rimane in ascolto sulla porta
//specificata
EthernetServer ArduinoServer(80);

void setup()
{
  //inizializza lo shield con il mac e l'ip 
  Ethernet.begin(mac, ip);
  //inizializza l'oggetto server
  ArduinoServer.begin();
 
  Serial.begin(9600);
}

void loop()
{

    EthernetClient pc_client = ArduinoServer.available();

    //controllo se pc_client è true
    if (pc_client != false)
    {
        //controllo continuamente che il client sia connesso
        while (pc_client.connected())
        {
            //Controllo se ci sono byte disponibili per la lettura
            if (pc_client.available())
            {
                //leggo i byte disponibili
                //provenienti dal client
                Data_RX = pc_client.read();

                //Attendo che tutti i byte siano letti
                //quando Data_RX contiene il carattere
                //di nuova line capisco tutti i byte sono
                //stati letti
                if (Data_RX == '\n')
                {
                    //Invio la risposta al client
                    //invio lo status code
                    pc_client.println("HTTP/1.1 200 OK");
                    //imposto il data type
                    pc_client.println("Content-Type: text/html");
                    pc_client.println();
                    //invio codice html
                    pc_client.print("<html><body><h1>Hello world Arduino Web Server</h1></body></html>");
                    //aspetto 1 ms affinche la risposta giunga al browser del client
                    delay(1);
                    //esco dal ciclo while una volta completato l'invio della risposta
                    break;
                }
            }
        }
        //chiudo la connessione
        pc_client.stop();
    }
}

Ma anche con questo ( una volta settato il MAC) non funziona nulla, dal browser non vedo nulla mi dice impossibile trovare il server, e il tx non lampeggia e non ho scambi

Come posso risolvere?
Grazie mille a tutti smiley
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2742
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho provato questo sketch e funziona.
Lo hai collegato al pc diretto, passi da uno switch, un router?
Sicuro che l'ip impostato appartenga allo stesso gruppo della tua rete?
{192, 168, 1, xxx};

ciao
Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

l'ho collegato diretto al mio pc portatile. Il computer l'ho messo con il wi fi spento, e non è connesso a internet.
da windows mi dice che la rete è settata male, ma questo discorso me lo fa anche su altri pc.
La porta è sempre 80 e l'ip ho lasciato quello perchè non avendo connessioni non vedo come non possa funzionare
mmi sembra strano che l'aurduino non trasmetta nulla...
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2742
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si ma bisogna strapparti le parole....
Usi un cavo cross?
http://it.wikipedia.org/wiki/Cavo_ethernet_incrociato

devi assegnare l'ip alla tua scheda di rete (del pc alla voce tcp/ip proprietà) ad esempio 192.168.1.100 subnet 255.255.255.0 gateway e DNS puoi tralasciarli e non rileva automaticamente l'ip.
http://www.elettroaffari.it/adsl/4541/come-impostare-indirizzo-ip-statico-windows-7/
l'importante è che la sottorete sia la stessa
192.168.1.xxx pc
192.168.1.xxx arduino

certo che se tu collegassi arduino al router del tuo gestore di rete e telefonia sarebbe più semplice
« Last Edit: June 09, 2012, 06:21:13 am by pablos » Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusa, cercherò di essere più preciso, se ti servono altre info chiedimi pure
Si ho usato un cavo cross, che ho testato e so di per certo che funziona
Ho prvato diversi ip e diverse porte, nulla da fare

Ho letto ora la modifica
Ora provo a modificare e mettere l'ip statico e ti dico
Non lo posso fare in rete poichè nella mia scuola durante la maturità la rete non funzionerà e mi mandarebbe tutto all'aria
Grazie
« Last Edit: June 09, 2012, 06:08:49 am by icarus93 » Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2742
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sullo sketch lascia quello che c'era prima, sono le impostazioni della scheda di rete del tuo pc da cambiare , come ti ho scritto prima

Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Allora, ho fatto come hai detto ed ora funziona.
Il problema che ho ora è sulla SD, poichè non riesco a visualizzare un file html dalla scheda
è possibile prendere i dati dai sensori, salvare i parametri in un file txt e visualizzarli sul sito presente sulla sd? c'è una via più veloce? Grazie per l'aiuto   
mi sto basando su questo sketch che ho trovato
Code:
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,1, 127 };
File htmlFile;
EthernetServer server(80);



void setup ()
{
 
  Ethernet.begin(mac, ip);
  server.begin();
  if (!SD.begin(4)) { return; }
 
  Serial.begin(9600);
 
}



void loop ()
{
 
  EthernetClient client = server.available();

    if (client) {
     
      boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c == '\n' && currentLineIsBlank) {
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
 
          htmlFile = SD.open("index.htm");
          if (htmlFile) {
            while (htmlFile.available()) {
                client.write(htmlFile.read());
            }
            // close the file:
            htmlFile.close();
          }
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
  }
}
Logged

Monselice PD Italy
Offline Offline
Faraday Member
**
Karma: 25
Posts: 5480
фон Крыса
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pure a me funziona lo sketch, prova con un cavo incrociato collegato direttamente al PC senza passare per lo switch..
Logged

Se corri veloce come un fulmine, ti schianterai come un tuono.

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ora mi funziona.... Vorrei prendere tutti i dati relativi ai sensori ( le temp che rilevano etc) e salvarli in un txt, e poi con un sito html messo sulla SD visualizzarli.. inoltre vorrei poter accendere ogni led utilizzando un pulsante html, è possibile farlo? ho guardato i file esempio datalogger e tutti gli altri ma non sono riuscito
Grazie per la disponibilità
Logged

Monselice PD Italy
Offline Offline
Faraday Member
**
Karma: 25
Posts: 5480
фон Крыса
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Questo non usa la SD però forse può aiutarti...
Code:
#include <SPI.h>
#include <Ethernet.h>
//Funzioni Ethernet
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 2 };          
Server server(80);                                 
int ledPin = 2; 
String readString = String(30);
boolean LEDON = false;

//Funzioni per la misura della temperatura
void termometro();
#define LM35_TEMP 3
#define LM35_REF 2
double temperatura;



void setup(){
  Ethernet.begin(mac, ip);
  pinMode(ledPin, OUTPUT); 
}


void loop(){
Client client = server.available();
  if (client) {
    while (client.connected()) {
   if (client.available()) {
    char c = client.read();
    if (readString.length() < 30)
      {
        readString +=c;
      } 
          if (c == '\n') {         
  if(readString.startsWith("L=LED_ON", 6))
           {
             digitalWrite(ledPin, HIGH);
             LEDON = true;
           }else{
             digitalWrite(ledPin, LOW);
             LEDON = false;             
           }           
          client.println("HTTP/1.1 200 OK");
          client.println("META HTTP-EQUIV=REFRESH CONTENT =5");
          client.println();
          client.print("<body style=background-color:#F5F5F5>");
          client.println("<font color='red'><h1>Piccolo esempio di web server in rete locale</font></h1>");
          client.println("<hr />");
          client.println("<font color='blue' size='5'>Temperatura attuale del laboratorio: ");       
          termometro();
          client.print(temperatura);
          client.println("<form><input type=submit value=AGGIORNA ></form>");
          client.println("<hr />");
          client.println("<font color='blue' size='5'>Laboratorio di Sistemi Informatici ed Elettronica/Telecomunicazioni");
          client.println("<BR>");           
          client.println("<hr />");
          client.println("<form><input type=submit name=L value=LED_ON> </form>");                       
          client.println("<hr />");
          client.println("<form><input type=submit name=L value=LED_OFF ></form>");                       
          client.println("<hr />");   
          client.print("<font size='5'>Stato LED: ");
          if (LEDON)
              client.println("<font color='green' size='5'>ON");
          else
              client.println("<font color='red' size='5'>OFF");
          client.print("<hr /><font color='black' size='4'><p>Questa pagina e' stata creata in HTML usando i Form, risiede in web server minimale basato sull' integrato W5100,");
          client.print("e' gestita da una (MCU micro controller unit) sostanzilmente micro computer programmato in C, ATmega 328P-PU (Pico-Power-Unit)..a risparmio energetico");
          client.println("</body></html>");
          readString="";
          client.stop();
            }
          }
       }
    }
 }     



void termometro(){
  int cont,ref,sensoreTemperatura;
  int ref_medio = 0;
  int sensoreTemperatura_medio = 0;
  float prev_temperatura = 0;
 
  for( cont = 0; cont < 10; cont++)
  {
    sensoreTemperatura = analogRead(LM35_TEMP);
    sensoreTemperatura_medio += sensoreTemperatura;
    ref = analogRead(LM35_REF);
    ref_medio += ref;
    delay(50);
  }
  if(cont == 10)
  {
    cont = 0;
    sensoreTemperatura_medio = sensoreTemperatura_medio / 10;
    ref_medio = ref_medio / 10;
    temperatura = (sensoreTemperatura_medio - ref_medio) * 100/2.56;
    temperatura = temperatura * 5/1024;
    prev_temperatura = temperatura;
    sensoreTemperatura_medio = 0;
    ref_medio = 0;
  }
  else{
    temperatura = prev_temperatura;
  }
}





Logged

Se corri veloce come un fulmine, ti schianterai come un tuono.

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie per l'aiuto,
Però da quello che vedo il sito è nella Flash di arduino, e quando inserisco l'ip nel browser mi da tutte le misure. Invece io vorrei fare lo stesso ma con un sito caricato da SD, ma non so come fare comunicare il sito con le variabili del codice di arduino... inoltre devo poter accendere dei led con un pulsante o un collegamento ipertestuale in html ( sempre nel sito presente sulla SD)
Grazie ancora
Logged

Monselice PD Italy
Offline Offline
Faraday Member
**
Karma: 25
Posts: 5480
фон Крыса
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Devi usare il tiny web server di ovidou o qualcosa di simile, provai ad usarla tempo fà però non mi è mai funzionata la libreria che gestisce la SD..
Logged

Se corri veloce come un fulmine, ti schianterai come un tuono.

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Allora, con tiny non mi funziona nulla... Ho guardato veramente ogni sorta di topic di questo forum, ma mi trovo ora a riuscire ad aprire il file index.htm da SD, ma non riesco ad aprire altri file htm presenti sulla scheda dai link ipertestuali che ho messo nella pagina html. Qualche idea? inoltre per i led l'unico modo che ho trovato è usare il GET e POST, ma funzionano anche solo con le normali librerie?
Grazie ancora
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2742
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Allora, con tiny non mi funziona nulla... Ho guardato veramente ogni sorta di topic di questo forum, ma mi trovo ora a riuscire ad aprire il file index.htm da SD
La libreria tiny funziona benissimo sia con la 0022-23 (ormai abbandonate) che con la 1.0, non spieghi però che cosa hai provato, che IDE usi, che errori hai nell'usarla, che post hai letto, che browser usi perchè ad esempio la tiny funziona solo con firefox.
Puoi anche vedere la webduino.h che è molto simile.
  
inoltre per i led l'unico modo che ho trovato è usare il GET e POST, ma funzionano anche solo con le normali librerie?
Si funziona anche con le normali librerie, il princio di funzionamento delle librerie webduino, tinywebserver è quello di fare il parsing dettagliato delle richieste del client e/o delle sue risposte, analizzano anche il Path (quello che vai a scrivere nel link HTTP://.......  
Analizzando i messaggi puoi riconoscere se sono GET, POST, le authentication, i file richiesti, ecc. Non tutte le librerie che trovi lo fanno in automatico, lo devi fare tu a mano.

ciao





Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

uso la 1.0 e ora provo con firefox, prima ho usato IE 9 e Chrome.
Ma se io ho un sito index.htm da SD posso prendere i dati delle variabili che ho nello sketch e visualizzarli nel sito presente su SD o devo usare l'html direttamente nel codice sketch? non so se mi sono espresso bene
Quello che voglio alla fine è un sito caricato su scheda SD con pulsanti che mi facciano cambiare i valori delle variabili ( quindi accendere i led) e delle textbox che mi dicono la temperature dai sensori vari
è fattibile?
grazie mille ancora
Logged

Pages: [1] 2   Go Up
Jump to: