Arduino Webserver soll Daten von Arduino anzeigen

Hallo,

ich benutze einen fertigen Code als Webserver, das ist diese hier:

http://playground.arduino.cc/Code/WebServerST
(der obere)

Die HTML-Seiten werden auf der SD-Karte gespeichert. Der Code leitet nichts anderes als HTML-Dateien weiter an den Abfrager. Jetzt möchte ich dass manche HTML-Dateien Werte von Arduino auslesen und anzeigen kann. Zum Beispiel für mein HomeAutomation Projekt soll er anzeigen welche Relais eingeschaltet sind und welchen Temperatur der Zimmer hat, wenn ein Sensor angeschlossen ist.

Genau das geht aber nicht, weil HTML passiv ist! Normalerweise nimmt man dazu PHP, doch Arduino ist zu schwach um ein PHP-Server zu betreiben. Gibt es jemanden hier der es anders gelöst hat?

Ich möchte die HTML Befehle nicht im Code einbauen, weil das sonst irgendwann sehr lang wird.

Zurück zu diesem Code, in diesem Abschnitt:

while(myFile.available()) {
clientCount = myFile.read(tBuf,64);
client.write((byte*)tBuf,clientCount);
}

leitet er den Inhalt einer Datei (in meinem Fall HTML) weiter.

Eine Idee von mir wäre, bestimmte Marker im HTML einzubauen, welche vom Arduino-Code erkannt und ersetzt wird, bevor er weiterleitet. Allerdings weiss ich nicht welche Funktionen gut wären. Es müsste ja Strings bearbeiten oder?

Wie würdet ihr vorgehen?

Ich würde ein Sonderzeichen, das möglichst sonst nicht auf der html Seite vorkommt, als Marker nehmen.
Entweder die Datei Zeichen für Zeichen auslesen, oder mit strchr(tbuf,MARKER); suchen.
Zeichenweise zum client senden ist allerdings Mist, da sollten schon, wie im Beispiel, einigermassen große Blöcke ( 64 byte wie im Beispiel, abwechselnd mit dynamichen Daten

Hallo,

selbige Herausforderung hatte ich vor einigen Jahren auch.
Hatte erst auch die HTML-Seite auf der SD Karte aber das war mir auf Dauer zu langsam, daher habe ich die später dann auf einen Webserver ausgelagert.
Hier habe ich das mal beschrieben:
Funkschalter per Webseite steuern

Gruß
trib

HTML-Datei in mehrere Dateien aufteilen und durch Informationen vom Arduino ergänzen. Also

  • Datei t1 übertragen
  • Info vom Arduino ergänzen
  • Datei t2 übertragen
  • Info vom Arduino ergänzen
  • Datei t3 übertragen
    Wobei ich den Arduino nur Daten (XML zum Trennen von Daten und Layout?) schicken lassen würde, die an anderer Stelle in eine HTML-Präsentation integriert werden.

Trib:
Hallo,

selbige Herausforderung hatte ich vor einigen Jahren auch.
Hatte erst auch die HTML-Seite auf der SD Karte aber das war mir auf Dauer zu langsam, daher habe ich die später dann auf einen Webserver ausgelagert.
Hier habe ich das mal beschrieben:
Funkschalter per Webseite steuern

Gruß
trib

Wann wird es denn langsam? Noch lädt bei mir alles schnell. Ich benutze hierfür Arduino Mega. D.h. die HTML von SD werden schnell geladen.

So wie ich sehe, verwendest du JavaScript und XML. Da muss ich wohl erst verstehen wie die genau funktionieren, denn ich habe noch keine Erfahrung mit XML und JavaScript hab ich auch schon längst nicht mehr verwendet. Noch verstehe ich nicht was es bei Dir macht: Nimmt JavaScript Informationen aus der URL-Adresse und setzt dann in HTML ein ? Gibt es den ganzen Code von Dir zum testen?

Ich kenne halt andere Codes für Haussteuerung. Da ist die Ansteuerung von Relais langsam. Starke Verzögerungszeit, was bei mir nicht der Fall ist.

Ansonsten überlege ich ob ich das mit Sonderzeichen als Marker mache und wie schnell die Seiten dann noch laden. Da gibt es ein kleines Problem mit 64 byte Blöcken da manche Sonderzeichen mit Definition genau zwischen zwei Blöcken stehen kann. Da mir nicht so ganz klar ist, wie man sowas elegant löst und wie stark solch Funktionsaufwand verlangsamen können.

Grüße

michael_x:
Ich würde ein Sonderzeichen, das möglichst sonst nicht auf der html Seite vorkommt, als Marker nehmen.
Entweder die Datei Zeichen für Zeichen auslesen, oder mit strchr(tbuf,MARKER); suchen.
Zeichenweise zum client senden ist allerdings Mist, da sollten schon, wie im Beispiel, einigermassen große Blöcke ( 64 byte wie im Beispiel, abwechselnd mit dynamichen Daten

Also Zeichenweise einlesen und überprüfen ob es ein Sonderzeichen ist und in ein 64 Block nach und nach einfügen bis es voll wird und dann an client senden?

forgoden:
Wann wird es denn langsam? Noch lädt bei mir alles schnell. Ich benutze hierfür Arduino Mega. D.h. die HTML von SD werden schnell geladen.

So wie ich sehe, verwendest du JavaScript und XML. Da muss ich wohl erst verstehen wie die genau funktionieren, denn ich habe noch keine Erfahrung mit XML und JavaScript hab ich auch schon längst nicht mehr verwendet. Noch verstehe ich nicht was es bei Dir macht: Nimmt JavaScript Informationen aus der URL-Adresse und setzt dann in HTML ein ? Gibt es den ganzen Code von Dir zum testen?

Hi forgoden,
ich hatte zuerst nur einen UNO in Verwendung, der kam schnell an seine Grenze, auch gerade wenn man noch ein favicon.ico, CSS oder kleine Bilder für eine Farbauswahl verwendet hat (Kann damit einen LED-Tisch steuern).
XML ist ein Datenformat, das benutze ich nicht :slight_smile:
Die Seite selbst besteht aus HTML. Das JavaScript schickt eine Anfrage an den Arduino: Gib mir den Wert von Pin 5 und baut auf Basis der Antwort eine HTML-Zeile zusammen, die dann den Wert ausgibt (Und noch einen Button zum steuern des Pins).
Das ist quasi die komplette Magie dahinter.

So musst Du nämlich gerade nicht Zeilenweise die Datei durchsuchen und ersetzen. Sondern die HTML Seite wird an den Browser gesendet und der Browser zieht sich dann die Status der Pins.

Den kompletten Code habe ich gerade noch gefunden, der wichtige Teil in dem von mir Verlinkten Thread hätte Dir aber eigentlich ausgereicht.
Prinzipiell müsstest Du nichtmal verstehen was das JavaScript genau macht, bin aber überzeugt davon, dass das von alleine kommt, wenn Du das nachbaust :slight_smile:

Hier müsste das Icon und das CSS entfernt, oder selbst erstellt werden.

<html>
<head>
<link rel="stylesheet" type="text/css" href="style.css" />
<script type="text/javascript">

function WritePin(PinNo, State)
{
    document.write("<tr bgColor='#222222'><td bgcolor='#222222'><font face='Verdana' color='#CFCFCF' size='2'>Ausgang "+PinNo+"
</font></td>");

    switch(State)
    {
      case '0':
        document.write("<td align='center' bgcolor='#222222'><input type='submit' name='pin" + PinNo + "' value='off' class='buttonOn'></td>");
        document.write("<td align='center'><font color='green' size='5'>ON</font></td>");
        break;
      case '1':
        document.write("<td align='center' bgcolor='#222222'><input type='submit' name='pin" + PinNo + "' value='on' class='buttonOff'></td>");
        document.write("<td align='center'><font color='#FF0000' size='5'>OFF</font></td>");
        break;
      default:
        document.write("<td align='center' bgcolor='#222222'><input type='button' value='Analog Input' class='buttonNone'></td>");
        document.write("<td align='center'><font color='#CFCFCF' size='5'>" + State + "</font></td>");
        break;
    }
    document.write("</tr>");
}

document.include = function(url)
{
 var oRequest = new XMLHttpRequest();
 var sURL  = '/?pin'+url;

 oRequest.open("GET",sURL,false);
 oRequest.setRequestHeader("User-Agent",navigator.userAgent);
 oRequest.send(null)

 if (oRequest.status==200)
   {
     var txt = oRequest.responseText;
     if(txt != "")
     {
       WritePin(url,txt);
     }
     else
       document.write(txt);
   }
 else
   document.write("<td align='center'><font color='#CFCFCF' size='5'>Error executing XMLHttpRequest call! "+url+"</font></td>");
}
</script>
<title>Arduino Pins</title>
<meta name="viewport" content="width=480" />
<link rel="shortcut icon" href="favicon.ico" />
</head>
<body bgcolor='#444444'>
<table border='0' width='480' cellpadding='5'>
<tr><td>

<hr/>
<h2><div align='center'><font color='#2076CD'>Arduino Pins</font color></div></h2>
<hr/>

<div align='left'><font face='Verdana' color='#FFFFFF'>PIN Control</font></div>


<form method="get" action="../?">
<table border='1' width='460'cellpadding='5'>
<script>
document.include("2");
document.include("3");
document.include("5");
document.include("6");
document.include("7");
document.include("8");
document.include("9");
document.include("A0");
document.include("A1");
document.include("A5");
</script>
</tr>
</table>
</form>


<form method=get><input type="submit" name="pin" id="pin" value="Deactivate all"></form>
</td></tr>
</table>
<a href="INDEX.HTM">zur&uuml;ck</a>
</body></html>

Der Arduino wertet die Anfrage aus und gibt entweder den Wert zurück, oder setzt den Pin um:

void ProcessWebInput(Client client, char *filename)
{
 char pw[21] = "&pw=XXX&btn=Absenden"; 
  if(strstr(filename,"?action=") !=0)
  {
    filename = filename + 8; // look behind "?action=" (8 chars) 
    if(strstr(filename,pw) !=0)
    {
      (strstr(filename, pw))[0] = 0;
        //Show Pins
        if(strstr(filename, "pin") != 0)
        {
          char * thisChar;
          filename = filename + 4; //Remove "?pin"
          Serial.println(filename);
          //Set DigitalPIN
          if(strstr(filename, "=") != 0)
          {        
            //PgmPrint("Switch Pins");
            thisChar = &filename[0];
            if(filename+2 == "on")
              digitalWrite(atoi(thisChar), HIGH);
            if(filename+2 == "off")
              digitalWrite(atoi(thisChar), LOW);
            client.print(filename);
          }else
           {
              if(strstr(filename, "A") != 0)
              {
              //Read Analog Pin        
                filename = filename+1;//Remove A
                thisChar = &filename[0];
                //Serial.println(thisChar);
                client.print(String(analogRead(atoi(thisChar)))); 
                //Serial.println(String(analogRead(atoi(thisChar))));
              }
              else
              {        
                //Read DigitalPin
                thisChar = &filename[0];
                Serial.println(thisChar);
                client.print(String(digitalRead(atoi(thisChar))));        
                //Serial.println(String(analogRead(atoi(thisChar))));
                //PgmPrint("digital Read funzt");
              }
          }
        }        
    }
  }
    client.println("");
}

Vielen Dank. Ich hab zwar auf meine Eigenart das Problem gelöst indem Arduino JavaScript Variablen generiert. Diese erscheint im Quelltext immer ganz oben und ist immer unsichtbar. Dann kommt der Aufbau mit HTMLs aus der Sd-Karte und mit werden die wieder eingefügt.
War nur eine schnelle Lösung von mir.

Aber ich werd mir mal xml request später genauer anschauen.