Eine html-Datei von SD-Karte lesen und an YunClient senden

Hallo

Nach einigem Probieren und Suchen unter Suchmaschinen poste ich doch ins Forum.
Dieser Code ist stark an das Bridge-Beispiel und an andere Posts über das Einlesen einer SD-Karte angelehnt.
Es geht hierbei weiter darum, eine html-Datei “index.html”, die sich unter “/mnt/sda1/index.html” auf einer SD-Karte befindet, einzulesen und dann an den YunClient, der das ganze auslöst zu schicken.
Diese html-Datei stellt ein GUI für die Steuerung der einzelnen Pins da. (Datei im Anhang) Öffne ich die Datei auf meinem Computer, kann ich die Pins problemlos ansteuern.
Ausgabe im Serial-Monitor ebenfalls im Anhang.
Danke schonmal

P.S.: Inerressant ist, dass die Variable String text (Nahe Anfang loop())leer bleibt.

#include <Bridge.h>
#include <YunServer.h>
#include <YunClient.h>
#include <FileIO.h>

// Listen on default port 5555, the webserver on the Yun
// will forward there all the HTTP requests for us.
YunServer server;

void setup() {
  Bridge.begin();
  FileSystem.begin();
  Serial.begin(9600);
  while(!Serial);

  server.begin();
}

void loop() {
  YunClient client = server.accept();

  if (client) {
    Serial.println("client connected");
    client.println("Status: 200");
    client.println("Content-type: text/html");
    // any other header
    client.println(); //mandatory blank line
    File datafile = FileSystem.open("/mnt/sda1/index.html", FILE_READ);
    Serial.println(datafile);
    String text = "";
    while(datafile.available()){
      client.print(datafile.read());
      char c = datafile.read();
      Serial.print(c);
      text.concat(c);
    }
//    Serial.println(text);
    client.println(text);
    datafile.close();
//    client.print("<html><body>fuck up</body></html>");
    
    process(client);
    client.stop();
  }
  delay(50); // Poll every 50ms
}

void process(YunClient client) {
  String command = client.readStringUntil('/');

  if (command == "digital") {
    digitalCommand(client);
  }

  if (command == "analog") {
    analogCommand(client);
  }
  
  if (command == "mode") {
    modeCommand(client);
  }
}

void digitalCommand(YunClient client) {
  int pin, value;
  pin = client.parseInt();

  if (client.read() == '/') {
    value = client.parseInt();
    digitalWrite(pin, value);
  }
  else {
    value = digitalRead(pin);
  }

  client.print(F("Pin D"));
  client.print(pin);
  client.print(F(" set to "));
  client.println(value);

  String key = "D";
  key += pin;
  Bridge.put(key, String(value));
}

void analogCommand(YunClient client) {
  int pin, value;
  pin = client.parseInt();

  if (client.read() == '/') {
    value = client.parseInt();
    analogWrite(pin, value);

    client.print(F("Pin D"));
    client.print(pin);
    client.print(F(" set to analog "));
    client.println(value);

    String key = "D";
    key += pin;
    Bridge.put(key, String(value));
  }
  else {
    value = analogRead(pin);

    client.print(F("Pin A"));
    client.print(pin);
    client.print(F(" reads analog "));
    client.println(value);

    String key = "A";
    key += pin;
    Bridge.put(key, String(value));
  }
}

void modeCommand(YunClient client) {
  int pin;
  pin = client.parseInt();

  if (client.read() != '/') {
    client.println(F("error"));
    return;
  }

  String mode = client.readStringUntil('\r');

  if (mode == "input") {
    pinMode(pin, INPUT);
    client.print(F("Pin D"));
    client.print(pin);
    client.print(F(" configured as INPUT!"));
    return;
  }

  if (mode == "output") {
    pinMode(pin, OUTPUT);
    client.print(F("Pin D"));
    client.print(pin);
    client.print(F(" configured as OUTPUT!"));
    return;
  }

  client.print(F("error: invalid mode "));
  client.print(mode);
}

guiForPinControl.html (3.3 KB)

Hi stonebreaker, hast du die Lösung gefunden.
Ich soll für einen Projekt (VOC-Messungen in Kammer) etwas ähnliches machen.
Aber anstelle dieser Buttons, soll ich den "Aktuellen Wert", "Wochenverlauf(Durchschnittlichen Werten pro tag)", und Graphen vom Sensor darstellen lassen.

Dein Code würde mir helfen, wenn du schon eine Lösung gefunden hast. :open_mouth:

Hardware: Arduino Yun, VOC-Sensor

Danke