Salve,
sto facendo le mie prime prove con la scheda Ethernet collegata ad Arduino Uno che fa da master e la possibilità di visualizzare i dati in ingresso provenienti da un'unità slave da seriale direttamente su un browser con IP assegnato. La visualizzazione dei dati viene rappresentata anche su un display lcd 16x2.
Il codice, modificato da uno di quelli a disposizione tra gli esempi per la scheda ethernet, visualizza su lcd e su html i dati in ingresso provenienti dalla scheda slave nella sola condizione di richiesta del client. Vorrei che la visualizzazione su lcd sia indipendente, quindi anche quando non ho un browser aperto. Ho quindi aggiunto un else alla fine del codice nel caso il browser non sia stato aperto. E fino qui tutto ok. All'avvio se il browser è aperto i dati vengono letti dalla prima parte del loop (su lcd e su html) e se invece il browser è chiuso vengono letti solo su lcd dall'else.
Il problema è quando si attiva il browser in un secondo tempo dall'avvio del codice, il codice sembra rimanere nell'else, e solo occasionalmente sembra leggere la parte precedente visualizzando i dati in html, come se ci fosse un problema di sincronizzazione.
I dati da parte dello slave arrivano circa una volta ogni 11 secondi con stringhe di 16 caratteri.
Potreste aiutarmi a capire dov'è l'errore? Avevo pensato ad un problema di tempi di comunicazione dati e avevo messo un delay alla fine... ma il problema persiste.
Questo è il codice che sto usando
/*
The circuit:
* LCD RS pin to digital pin 7
* LCD Enable pin to digital pin 6
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
*/
#include <SPI.h>
#include <Ethernet.h>
#include <LiquidCrystal.h>
char val = '0';
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,177);
EthernetServer server(80);
void setup() {
Ethernet.begin(mac);
server.begin();
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
lcd.print("IP:");
lcd.print(Ethernet.localIP());
Serial.begin(9600);
}
void loop() {
/*
*/
EthernetClient client = server.available();
if (client) {
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
// Serial.write(c);
if (c == '\n' && currentLineIsBlank) {
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close"); // the connection will be closed after completion of the response
client.println("Refresh: 10"); // refresh the page automatically every sec
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
String dataString = "";
if (Serial.available()>0)
{
val = Serial.read();
while ( val != 'v')
{
dataString += String(val);
val = Serial.read();
}
}
client.println(dataString);
client.flush();
client.println("</html>");
lcd.setCursor(0, 1);
lcd.print(dataString);
break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
}
else // if (!client)
{
String dataString = "";
if (Serial.available()>0)
{
val = Serial.read();
while ( val != 'v')
{
dataString += String(val);
val = Serial.read();
}
}
lcd.setCursor(0, 1);
lcd.print(dataString);
delay(2000);
}
}