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 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....
//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);
}
}