Salve,
ho collegato un sensore SRF02 alla mia Leonardo per misurare l'altezza d'acqua in una vasca e pubblico il risultato usando una risposta http, di seguito il codice:
// librerie usate nel progetto
#include "SPI.h"
#include "Wire.h"
#include "SRF02.h"
#include <Ethernet.h>
// costanti che contengono il mac e l'IP della scheda di rete
byte mac[] = { 0x90, 0xA2, 0x__, 0x__, 0x__, 0x__ };
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;
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 setup()
{
pinMode(led, OUTPUT);
digitalWrite(led, HIGH);
Serial.begin(9600);
Wire.begin();
sensor.setInterval(500);
//inizializza lo shield con il mac e l'ip
Serial.println("Ethernet initialization ...");
Ethernet.begin(mac, ip);
String secs_txt;
for(int i = 1; i < 6; i++){
secs_txt = String(30 - i * 5);
Serial.println("Ethernet ready in " + secs_txt + " sec.");
digitalWrite(led, HIGH);
delay(100);
digitalWrite(led, LOW);
delay(4900);
};
Serial.println("Ethernet ready");
//inizializza l'oggetto server
ArduinoServer.begin();
Serial.println("Webserver ready");
sensor.update();
Serial.println("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);
};
}
void loop()
{
//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
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')
{
Serial.println("richiesta http completata");
//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.println("<html>");
pc_client.println("<head>");
pc_client.println("<title>Water level</title>");
pc_client.println("<META HTTP-EQUIV=\"REFRESH\" CONTENT=\"10\">");
pc_client.println("<META HTTP-EQUIV=\"PRAGMA\" CONTENT=\"NO-CACHE\">");
pc_client.println("</head>");
pc_client.println("<body bgcolor=\"black\" text=\"white\" link=\"lime\" vlink=\"lime\">");
pc_client.println("<div align=\"center\" style=\"font-family:tahoma,verdana,arial;font-size:18px;font-style:italic\">");
// chiedo il valore all'SRF
Serial.println("before sensor.update");
sensor.update();
Serial.println("after sensor.update");
if (millis() > nextPrint)
{
Serial.println("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;
Serial.print("disponibilita = ");
Serial.println(disponibilita_litri);
colore = "white";
if (disponibilita_litri <= livello_attenzione) {
attenzione = true;
colore = "yellow";
Serial.println("stato attenzione");
};
if (disponibilita_litri <= livello_allerta) {
attenzione = false;
allerta = true;
colore = "orange";
Serial.println("stato allerta");
};
if (disponibilita_litri <= livello_allarme) {
attenzione = false;
allerta = false;
allarme = true;
colore = "red";
Serial.println("stato allarme");
};
Serial.println("stato attenzione");
Serial.println("after sensor.read");
Serial.println("livello = " + thelevel_txt);
nextPrint = millis () + 1000;
};
pc_client.print("valore al sensore ");
pc_client.print(real_level);
pc_client.println("
");
pc_client.println("valore per i calcoli ");
pc_client.println(thelevel_flt);
pc_client.println("</div>
");
pc_client.println("<div align=\"center\" style=\"font-family:tahoma,verdana,arial;font-size:72px\">");
pc_client.println(disponibilita_metricubi);
pc_client.println("m<sup>3</sup> di ");
pc_client.println(capienza_metricubi);
pc_client.println("m<sup>3</sup>");
pc_client.println("</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(" di ");
pc_client.println(capienza_litri);
pc_client.println("litri");
pc_client.println("</div>");
pc_client.println("</body>");
pc_client.println("</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.stop();
pc_client = false;
msg = "";
delay(7500);
digitalWrite(led, LOW);
} else {
digitalWrite(led, HIGH);
delay(80);
digitalWrite(led, LOW);
delay(80);
digitalWrite(led, HIGH);
delay(80);
digitalWrite(led, LOW);
delay(80);
digitalWrite(led, HIGH);
delay(80);
digitalWrite(led, LOW);
delay(250);
};
}
metto un pò di lampeggi del led per vedere cosa succede anche quando non ho l'IDE collegato.
Il problema sorge a random almeno 30 minuti dopo l'avvio: il led non lampeggia più, se effettuo una richiesta al webserver non ho alcuna risposta, ma se lancio un ping, la scheda mi risponde.
Infine, con la scheda in questo stato, se provo ad uploadare uno sketch, l'IDE resta su upload binary (o qualcosa del genere, adesso non ricordo).
Quale potrebbe essere il problema?
Grazie