Go Down

Topic: Arduino1 Ethernet web-Server e Client insieme (Read 3178 times) previous topic - next topic

pietro78

Volevo chiedere se è possibile far funzionare la scheda ethernet wiznet su arduino Uno come Client e nello stesso tempo anche come WEB-server .... mi spiego meglio :

-Il Client al momento manda dei dati di temperatura ( T1,T2,T3,T4) su un server Google Spreadsheet Drive e quindi l'arduino ogni 3 minuti legge i dati sui pin analogici,li elabora e tramite dei "Client.print" manda tutto sul server Google.

-Il Web-server vorrei farlo funzionare in altra maniera,ovvero in qualsiasi momento interrogando l'IP della scheda ethernet vorrei tramite mi rispondesse una pagina html semplice e funzionale dove ci siano in real-time le temperature(T1,T2,T3,T4) e se possibile anche dei <button> per controllare alcune uscite digitali ON-OFF...

Allego sketch funzionale del mio progetto Arduino che funziona da "Client" e spero che qualche anima pia mi aiuti in quanto non ho in chiaro la funzione che mi permette di separare i due funzionamenti sullo stesso Sketch... un saluto a tutti gli appassionati del giocattolino arduino....

Code: [Select]


//RX da seriale 4 temperature+stato valvola a Google


#include <SoftwareSerial.h> // libreria creazione porta seriale virtuale
#include <Ethernet.h>
#include <SPI.h>
SoftwareSerial mySerial(7, 8); // RX, TX


char formkey[] = "dFJfLVJfdXM0QVI0NE40NXEzUmdtTFE6MQ"; //Replace with your Key
byte mac[] = { 0x90,0xA2,0xDA,0x0D,0x1C,0xDA};  //Replace with your Ethernet shield MAC


byte subnet[] = { 255,255,255,0};
byte gateway[] = { 192,168,0,1};
byte ip[] = { 192,168,0,140};
String stv = "" ;
byte server[] = { 173,194,35,46 };

EthernetClient client;
//unsigned long time;
//IPAddress ip(192,168,0,140);




int I = 0;
int J = 0;
String Z = "";
byte Decimali = 1; 


String SerRx = "";                                 
const unsigned long TimeOut = 180000;                 
unsigned long Timer = millis();// timer partito
unsigned long Timer1 = millis();// timer partito


int Temp1=0 ;
int Temp2=0 ;
int Temp3=0 ;
int Temp4=0 ;
int Valvola=0 ;


void setup() {
  Serial.begin(9600);  // inizializza porta seriale
  //Ethernet.begin(mac, ip , gateway , subnet);
   //if (Ethernet.begin(mac) == 0) {                                                              // start the Ethernet connection
    Ethernet.begin(mac, ip, gateway, gateway, subnet );                                  // DHCP failed, so use a fixed IP address
    Serial.println("Failed to configure Ethernet using DHCP");
 
  client.connect(server, 80);
  Serial.println("seriale rx inizio");
  mySerial.begin(19200);
  mySerial.println("seriale virtuale rx inizio");  // inizializza porta seriale ausiliaria
  Serial.println("connecting...");
  Serial.print("My IP address: ");
  Serial.println(Ethernet.localIP());
}


void loop() {
 
  Serial.println("inizio loop");

  SerRx = "";                                        // azzera buffer ricezione
  Timer = millis();     // timer partito
  Timer1 = millis(); 


  while (millis() - Timer < TimeOut) {               // attesa timeout
    while (mySerial.available() > 0) {              // ricezione da modulo
      SerRx += char(mySerial.read());           // aggiungi carattere al buffer         
      Timer = millis();                              // reset timer
    }
  }


  if (SerRx.length() > 0) {
    {                          // ci sono dei dati nel buffer (Temp1<CR><LF>Temp2<CR><LF>...Temp5<CR><LF>
    J = 0;
    I = SerRx.indexOf(13, J);                        // cerca CR (carriage return) a partire dal carattere J
    if (I > 0) {
      Z = SerRx.substring(J, I);                      // sotto stringa dal carattere J al carattere I-1
      Temp1 = Z.toInt();
      J = I + 2;       // nuova posizione di ricerca
      mySerial.println(Temp1, Decimali);
      Serial.print("Temp1 = ");
      Serial.println(Temp1, Decimali);
     
    }
    I = SerRx.indexOf(13, J);                        // cerca CR (carriage return) a partire dal carattere J
    if (I > 0) {
      Z = SerRx.substring(J, I);                      // sotto stringa dal carattere J al carattere I-1
      Temp2 = Z.toInt();
      J = I + 2;                                     // nuova posizione di ricerca
      mySerial.println(Temp2, Decimali);
      Serial.print("Temp2 = ");
      Serial.println(Temp2, Decimali);
    }
    I = SerRx.indexOf(13, J);                        // cerca CR (carriage return) a partire dal carattere J
    if (I > 0) {
      Z = SerRx.substring(J, I);                      // sotto stringa dal carattere J al carattere I-1
      Temp3 = Z.toInt();
      J = I + 2;                                     // nuova posizione di ricerca
      mySerial.println(Temp3, Decimali);
      Serial.print("Temp3 = ");
      Serial.println(Temp3, Decimali);
    }
    I = SerRx.indexOf(13, J);                        // cerca CR (carriage return) a partire dal carattere J
    if (I > 0) {
      Z = SerRx.substring(J, I);                      // sotto stringa dal carattere J al carattere I-1
      Temp4 = Z.toInt();
      J = I + 2;                                     // nuova posizione di ricerca
      mySerial.println(Temp4, Decimali);
      Serial.print("Temp4 = ");
      Serial.println(Temp4, Decimali);
    }
    I = SerRx.indexOf(13, J);                        // cerca CR (carriage return) a partire dal carattere J
    if (I > 0) {
      Z = SerRx.substring(J, I);                      // sotto stringa dal carattere J al carattere I-1
      Valvola = Z.toInt();
      mySerial.println(Valvola);
      Serial.print("Valvola = ");
      Serial.println(Valvola);
     
    }
    }
   
    Serial.println("inizio stringa");
   
     String data;
   
 
    if ( millis() > Timer1 + 5000)
  {
    Serial.println("inizio dati");
   
    data+="";
    data+="entry.0.single=";// prima label temperatura IN acqua
    data+=Temp1;
   
    data+="&entry.3.single=";// seconda label temperatura OUT acqua
    data+=Temp2;
   
    data+="&entry.4.single=";// terza label Stato elettrovalvola 1
   
    data+=Temp3;
   
    data+="&entry.5.single=";// quarta label Stato circolatore caldaia
    data+=Temp4;
   
   
    data+="&entry.6.single=";// quinta label Stato valvola
    if (Valvola == 1){
     stv = ("aperta");       // stampa aperta
    }
   
    if (Valvola == 0) {
     stv = ("chiusa");       // stampa chiusa
    }
   
   
    //data+=Valvola;
    data+=stv;
    data+="&submit=Submit";
   


  Serial.println("connecting Ethernet");
   
 
    client.connect(server,80) ;
    //if (client.connected(server, 80)) {
      if (client.connected()) {
    Serial.println("connected");

    client.print("POST /formResponse?formkey=");
    client.print(formkey);
    client.println("&ifq HTTP/1.1");
    client.println("Host: spreadsheets.google.com");
    client.println("Content-Type: application/x-www-form-urlencoded");
    client.println("Connection: close");
    client.print("Content-Length: ");
    client.println(data.length());
    client.println();
    client.print(data);
    client.println();

    Serial.print("POST /formResponse?formkey=");
    Serial.print(formkey);
    Serial.println("&ifq HTTP/1.1");
    Serial.println("Host: spreadsheets.google.com");
    Serial.println("Content-Type: application/x-www-form-urlencoded");
    Serial.println("Connection: close");
    Serial.print("Content-Length: ");
    Serial.println(data.length());
    Serial.println();
    Serial.print(data);
    Serial.println();
    Timer1 = millis();
   
    }
   
   


    client.stop();

 
  }
    delay(500);
     }
   }

pietro78

Qualche anima d'Arduinomane che magari ha qualche idea ??
Peccato che su internet non ho trovato niente che mi possa aiutare e poi per poter fare con Arduino devi anche sapere cosa fare...
Aspettiamo...

pablos71

#2
Nov 04, 2012, 05:44 pm Last Edit: Nov 04, 2012, 05:55 pm by pablos Reason: 1
Si che lo puoi fare aggiungi nel loop il pezzo di sketch che fa da server

Code: [Select]
EthernetClient  client = server.available();

 if (client) {
   boolean currentLineIsBlank = true;
 
   while (client.connected()) {
     if (client.available()) {
       char c = client.read();
       readString.concat(c);  
       if (c == '\n' && currentLineIsBlank) {
         //Serial.print(readString);
             
       client.println("HTTP/1.1 200 OK");
       client.println("Content-Type: text/html");
       client.println();
...
...
...

chiaramente devi essere sicuro che non sia aperta la connessione per l'invio. Quindi lo metti dopo client.stop Non sarà in contemporanea o invia dati o riceve richieste

Dici di non aver trovato niente
Google "arduino client server" il primo risultato, che tra l'altro ricordo bene che DanielaES doveva inviare dei dati della sua serra a pachube e potersi connettere ad arduino in modalità webserver

http://arduino.cc/forum/index.php?topic=90210.0

ciao
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

Go Up