finalmente ho due minuti per scrivere ...
// librerie usate nel progetto
#include "Wire.h"
#include "SRF02.h"
#include "Ethernet.h"
#include "SPI.h"
#define DEBUG 0
// costanti che contengono il mac e l'IP della scheda di rete
//byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x50, 0x18 }; //ethernet shield mia
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0C, 0x00, 0x6D }; //ethernet shield mia 2
byte ip[] = { 192,168,1,50 };
// inizializzazione componente SRF con l'indirizzo 0x70
SRF02 sensor(0x70, SRF02_CENTIMETERS);
float larghezza_cisterna = 2;
float lunghezza_cisterna = 2;
float altezza_cisterna = 1.3;
float livello_acqua = 0;
float delta_sensore_galleggiante = 13;
const float capienza_metricubi = larghezza_cisterna * lunghezza_cisterna * altezza_cisterna;
const float capienza_litri = capienza_metricubi * 1000;
float disponibilita_metricubi = 0;
float disponibilita_litri = 0;
float livello_attenzione = 2000;
float livello_allerta = 1200;
float livello_allarme = 700;
bool attenzione = false;
bool allerta = false;
bool allarme = false;
String colore = "white";
unsigned long nextPrint = 0;
byte SD_CS = 4; // pin 4 is the SPI select pin for the SDcard
byte ETHER_CS = 10; // pin 10 is the SPI select pin for the Ethernet
int led = 12;
//creo una variabile char per memorizzare i byte letti dal client
char Data_RX;
String msg = "";
int cmd = 0;
int real_level = 0;
int thelevel = 0;
String thelevel_txt;
float thelevel_flt;
//creo un oggetto server che rimane in ascolto sulla porta
//specificata
EthernetServer ArduinoServer(80);
void ToSerial(String stringa)
{
#if DEBUG
Serial.println(stringa);
#endif
}
void ToSerial(float stringa)
{
#if DEBUG
Serial.println(stringa);
#endif
}
void setup()
{
pinMode(ETHER_CS, OUTPUT);
digitalWrite(ETHER_CS, HIGH);
pinMode(SD_CS, OUTPUT);
digitalWrite(SD_CS, HIGH);
pinMode(led, OUTPUT);
digitalWrite(led, HIGH);
#if DEBUG
Serial.begin(9600);
#endif
Wire.begin();
sensor.setInterval(500);
//inizializza lo shield con il mac e l'ip
ToSerial("Ethernet initialization ...");
Ethernet.begin(mac, ip);
msg = "1234567890123456789012345678901234567890123456789012345678901234567890";
String secs_txt;
for(int i = 1; i < 6; i++){
secs_txt = String(30 - i * 5);
ToSerial("Ethernet ready in " + secs_txt + " sec.");
digitalWrite(led, HIGH);
delay(100);
digitalWrite(led, LOW);
delay(4900);
};
ToSerial("Ethernet ready");
//inizializza l'oggetto server
ArduinoServer.begin();
ToSerial("Webserver ready");
sensor.update();
ToSerial("SRF ready");
// stato di fine setup e inizio loop
for(int j = 0; j < 5; j++){
digitalWrite(led, HIGH);
delay(250);
digitalWrite(led, LOW);
delay(250);
};
}
//String toWeb(lastringa
void loop()
{
// SRF02::update();
//IMPORTANTE pulisco la variabile msg
msg = "";
//Ascolto le richieste dei client controllo se ci sono dati da leggere
//e creo un oggetto relativo a client che sta interrogando l'Ethernet shield
EthernetClient pc_client = ArduinoServer.available();
//controllo se pc_client è diverso da false
if (pc_client != false)
{
digitalWrite(led, HIGH);
//controllo se il client è connesso
while (pc_client.connected())
{
//leggo i byte disponibili
//provenienti dal client
Data_RX = pc_client.read();
//invio i dati letti al Serial Monitor
ToSerial(Data_RX);
// Serial.write(Data_RX);
//Attendo che tutti i byte siano letti
//quando Data_RX contiene il carattere
//di nuova line capisco tutti i byte sono
//stati letti
msg += Data_RX;
if (Data_RX == '\n')
{
ToSerial("richiesta http completata");
//Invio la risposta al client
//invio lo status code
pc_client.println(F("HTTP/1.1 200 OK"));
//imposto il data type
pc_client.println(F("Content-Type: text/html"));
pc_client.println(F("\n"));
//invio codice html
pc_client.println(F("<html>"));
pc_client.println(F("<head>"));
pc_client.println(F("<title>Water level</title>"));
pc_client.println(F("<META HTTP-EQUIV=\"REFRESH\" CONTENT=\"10\">"));
pc_client.println(F("<META HTTP-EQUIV=\"PRAGMA\" CONTENT=\"NO-CACHE\">"));
pc_client.println(F("</head>"));
pc_client.println(F("<body bgcolor=\"black\" text=\"white\" link=\"lime\" vlink=\"lime\">"));
pc_client.println(F("<div align=\"center\" style=\"font-family:tahoma,verdana,arial;font-size:18px;font-style:italic\">"));
// chiedo il valore all'SRF
ToSerial("before sensor.update");
sensor.update();
ToSerial("after sensor.update");
if (millis() > nextPrint)
{
ToSerial("before sensor.read");
real_level = sensor.read();
thelevel = real_level;
thelevel = thelevel - delta_sensore_galleggiante;
thelevel_txt = String(thelevel, DEC);
thelevel_flt = (float) thelevel / 100;
livello_acqua = altezza_cisterna - thelevel_flt;
disponibilita_metricubi = livello_acqua * lunghezza_cisterna * larghezza_cisterna;
disponibilita_litri = disponibilita_metricubi * 1000;
ToSerial("disponibilita = ");
ToSerial(disponibilita_litri);
colore = "white";
if (disponibilita_litri <= livello_attenzione) {
attenzione = true;
colore = "yellow";
ToSerial("stato attenzione");
};
if (disponibilita_litri <= livello_allerta) {
attenzione = false;
allerta = true;
colore = "orange";
ToSerial("stato allerta");
};
if (disponibilita_litri <= livello_allarme) {
attenzione = false;
allerta = false;
allarme = true;
colore = "red";
ToSerial("stato allarme");
};
ToSerial("stato attenzione");
ToSerial("after sensor.read");
ToSerial("livello = " + thelevel_txt);
nextPrint = millis () + 1000;
};
pc_client.print(F("valore al sensore "));
pc_client.print(real_level);
pc_client.println(F("
"));
pc_client.println(F("valore per i calcoli "));
pc_client.println(thelevel_flt);
pc_client.println(F("</div>
"));
pc_client.println(F("<div align=\"center\" style=\"font-family:tahoma,verdana,arial;font-size:72px\">"));
pc_client.println(disponibilita_metricubi);
pc_client.println(F("m<sup>3</sup> di "));
pc_client.println(capienza_metricubi);
pc_client.println(F("m<sup>3</sup>"));
pc_client.println(F("</div>"));
pc_client.println("<div align=\"center\" style=\"color:" + colore + ";font-family:tahoma,verdana,arial;font-size:72px\">");
pc_client.println(disponibilita_litri);
pc_client.println(F(" di "));
pc_client.println(capienza_litri);
pc_client.println(F("litri"));
pc_client.println(F("</div>"));
pc_client.println(F("</body>"));
pc_client.println(F("</html>"));
//aspetto 10 ms affinche la risposta giunga al browser del client
delay(10);
//esco dal ciclo while una volta completato l'invio della risposta
break;
}
//chiudo la connessione
}
pc_client.flush();
pc_client.stop();
pc_client = false;
msg = "";
delay(7500);
digitalWrite(led, LOW);
} else {
digitalWrite(led, HIGH);
delay(80);
digitalWrite(led, LOW);
delay(2000);
};
}
ecco il codice montato sulla mia leonardo, ma dopo circa 12/15 ore di funzionamento si blocca.
Potrebbe essere guasta? La shield ethernet l'ho già cambiata.
Ho anche una mega 2560, provo con quella?
Ciao e grazie a tutti