Hallo zusammen,
ich möchte mir einen RS232-Datenlogger bauen. So weit so gut, um das ganze autark laufen lassen zu können, würde ich gerne per Webserver auf die Log-Daten zugreifen können. Die RS232-Daten sollen mit einem time-stamp versehen und dann in eine Textdatei: "log.txt" auf der SD-Karte geschrieben werden.
Code um eine HTML-Page von einer SD-Karte als Webserver zu laden, gibt es ja genug. Ich habe dann einfach mal folgenden Code von http://fluuux.de geklaut und angepasst.
#if ARDUINO > 18
#include <SPI.h> // Für Arduino Version größer als 0018
#endif
#include <Ethernet.h>
#include <TextFinder.h>
#include <SD.h>
byte mac[] = { 0x5A, 0xA2, 0xDA, 0x0D, 0x56, 0x7A }; // MAC-Adresse des Ethernet-Shield
byte ip[] = { 192, 168, 2, 102 }; // IP zum aufrufen des Webservers
byte sdPin = 4; // Pin der SD-Karte
EthernetServer server(80); // Server port
File webFile;
void setup()
{
Ethernet.begin(mac, ip); // Client starten
server.begin(); // Server starten
Serial.begin(9600);
Serial.println("ARDUINO - STEUERUNG");
Serial.println("Initialisiere SD-Karte...");
if (!SD.begin(sdPin))
{
Serial.println(" - Initialisierung der SD-Karte fehlgeschlagen!");
return;
}
Serial.println(" - SD-Karte erfolgreich initialisiert.");
if (!SD.exists("index.htm"))
{
Serial.println(" - Datei (index.htm) wurde nicht gefunden!");
return;
}
Serial.println(" - Datei (index.htm) wurde gefunden.");
Serial.println();
Serial.println("Verbraucher schalten");
}
void loop()
{
EthernetClient client = server.available(); // Auf Anfrage warten
if(client)
{
/************************
Webformular anzeigen *
************************/
boolean current_line_is_blank = true; // eine HTTP-Anfrage endet mit einer Leerzeile und einer neuen Zeile
while (client.connected())
{
if (client.available()) // Wenn Daten vom Server empfangen werden
{
char c = client.read(); // empfangene Zeichen einlesen
if (c == '\n' && current_line_is_blank) // wenn neue Zeile und Leerzeile empfangen
{ // Standard HTTP Header senden
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
// Website von SD-Karte laden
webFile = SD.open("index.htm"); // Website laden
if (webFile)
{
while(webFile.available())
{
client.write(webFile.read()); // Website an Client schicken
}
webFile.close();
}
break;
}
if (c == '\n')
{
current_line_is_blank = true;
}
else if (c != '\r')
{
current_line_is_blank = false;
}
}
}
delay(1);
client.stop();
}
}
HTML Page:
<!DOCTYPE html>
<html>
<head>
<title>WEBSERVER</title>
<style type="text/css">
h2 { margin-bottom:5px; }
</style>
</head>
<body>
<h1>Webserver</h1>
<p>
<object data="log.txt" type="text/plain" width="2000" height="1000">
</object>
</p>
<iframe name="ifr" style="display:none;" width="0" height="0"></iframe>
</body>
</html>
Und die log.txt vollgeschrieben.
Auf dem Rechner funktioniert das alles natürlich wundervoll mit der HTML-Page.
Alles auf dem Uno mit Ethernet-Shield geladen und es funktioniert natürlich nicht, weil der Arduino natürlich nur einmal Zugriff auf die SD-Karte bekommt und die HTML Page so die .txt-Datei nicht laden kann.
Hat jemand eine Idee wie ich das anders lösen könnte und würde sie mir verraten?