Go Down

Topic: Button auf Webseite soll digitalen Port schalten. Hilfe (Read 3984 times) previous topic - next topic

michael_x

Quote
das man dann nicht extra das Programm wider neu einspielen muss?


Muss man nicht.

Quote
er also keine Spannung bekommt sind die Webserver Daten weg

Welche Daten sind weg ???

Der webserver startet natürlich von vorn, wie beim Reset.
Dass ein Client connected war, und welchen Button du  im Browser vorher gedrückt hattest, ist klar weg.

mkl0815


@mkl0815,

du bist wohl nicht glücklich, wenn du nicht deinen Kommentar dazu geben kannst. Ich kann dich aber beruhigen, wir haben hier keinen Bereich, der als "head" festgelegt wurde
und auch eine Suchmaschine, die sich vielleicht für Meta-Tags interessieren könnte, gibt es hier auch nicht.
Browser machen sich generell nichts daraus, ggf wird es nicht im Cache übernommen, aber wir wollen ja nun auch keinen HTML-Wettbewerb gewinnen.

Gruß Gerd


Quote

Es gibt hier schon ein paar eigenartige Verhaltensformen, die ich nicht teilen kann. Sich nicht am Tread zu beteiligen ist eine Sache,  aber später noch seinen Senf dazu geben, wie es noch perfekter sein könnte, ist etwas anderes.
Sicherlich gibt es bei den meisten Hinweisen oder Hilfen andere und sicherlich auch bessere Wege und Möglichkeiten, aber was soll das. Brauch ihr das, um euch selbst auf die Schulter zu klopfen.


Entschuldigung, aber DEINE Aussagen bestätigen ja wohl DEINE  eigenartige Verhaltensformen. Ich wüßte nicht, das ich mich für meinen Kommentar rechtfertigen müßte, zumal dieser sich gar nicht auf Dich bezog.
Daher der Satz "Kleine Ergänzung" ... und eben nicht "... das ist falsch ..."
Es geht auch nicht darum etwas "noch perfekter" zu machen, sondern es eben "korrekt" zu machen. Gerade solche Ungenauigkeiten sind die schlimmsten Fehler die mach suchen kann. Weil es eben in 4 von 5 Browsern funktioniert, aber in genau einem nicht.

Zum Technischen: HTML ist eine Auszeichnugssprache und als solche klar definiert (www.w3.org). Die Struktur hat einen Sinn, und nur weil etwas "irgendwie" funktioniert, bedeutet das eben NICHT das man davon ausgehen kann das es immer so ist. Es geht dabei mehr ums Prinzip. Ich kann auch Bauteile außerhalb ihrer Spezifikation betreiben, das wird sicher auch irgendwie funktionieren, muss es aber eben nicht.
Erklär mal Deiner Werkstatt, das es Dein Auto noch nie interessiert hat, das die Ölwarnlampe geleuchtet hat, Du bist immer noch 1000km gefahren, ehe das Öl gewechselt / aufgefüllt wurde. Mal sehen was die dazu sagen, wenn die Karre eben doch verreckt. Und bitte jetzt keine Kommentare wie ein Browser sei kein Auto. Das weiss ich selbst.

Und bevor hier jetzt ein Flamewar ausbricht, das ist mein letzter Kommentar in diesem Thread. Wer ein Problem mit meinen Kommentaren hat, kann der gerne per IM klären.
Danke.

Tobias93

@ Michael
Quote

Welche Daten sind weg ???

Der webserver startet natürlich von vorn, wie beim Reset.
Dass ein Client connected war, und welchen Button du  im Browser vorher gedrückt hattest, ist klar weg.


Wenn ich den Arduino von der Spannungsquelle trenne und danach wider mit Spannung versorge und im Browser die IP Adresse eingebe um die Oberfläche zu öffnen bekomme ich eine Fehlermeldung: "Webseite kann nicht geöffnet werden". Meine Frage ist wie man diesen Fehler verhindern kann.
Nobody is perfect but - impossible is nothing

michael_x


Wenn ich den Arduino von der Spannungsquelle trenne und danach wider mit Spannung versorge und im Browser die IP Adresse eingebe um die Oberfläche zu öffnen bekomme ich eine Fehlermeldung: "Webseite kann nicht geöffnet werden". Meine Frage ist wie man diesen Fehler verhindern kann.


Und den sketch neu aufspielen hilft ?! -- Das ist sicher nicht die vorgesehene Betriebsweise ;)

Hilft denn statt dessen auch, den Reset-Taster zu drücken?
Dann, rate ich mal, braucht das Ethernet-Shield bei Spannungswiederkehr zu lange für eine Initialiserung ??
Ein kleines delay in setup vor Ethernet.begin() ???

Das Problem müssten aber andere auch schon mal gehabt haben ...

Tobias93

da das ganze jetzt soweit schonmal funktioniert steht nun die grafische Gestaltung an.

Ich dachte das ich auf dem Webserver eine kleine Grafik darstelle.

Fragen hierzu wären nun:

1. Reicht der Speicherplatz hierzu aus (es ist keine externe Speicherkarte vorhanden)

1.1 Wie viel Speicher dürfte die Grafik maximal wegnehmen

2. Wie binde ich eine Grafik in meinen Webserver ein (Webserver läuft nur lokal)

Kann mir hierzu jemand helfen?

Gruß,
Tobi
Nobody is perfect but - impossible is nothing

Tobias93

Nobody is perfect but - impossible is nothing

Eisebaer

hi, Du kannst eine grafik mit base64 verschlüsseln und direkt in die webseite einbauen, ohne die grafikdatei selbst gespeichert zu haben.
ich hab' nur grade keine zeit, werde aber morgen versuchen, Dir zu helfen.

gruß stefan
nimm abblockkondensatoren!  100nF.  glaub mir, nimm abblockkondensatoren!

qualidat

Die Technik, wie man Bilddaten direkt ins HTML einbettet, ist hier beschrieben: http://aktuell.de.selfhtml.org/artikel/grafik/inline-images/
Der IE kann damit erst seit Version 8 umgehen, aber Firefox, Safari und Opera könen das schon immer ...

michael_x

#23
Nov 30, 2012, 11:37 am Last Edit: Nov 30, 2012, 12:07 pm by michael_x Reason: 1
Es reicht, wenn der client eine Verbindung "nach draussen" hat, der kleine Arduino-Webserver kann dann statische Grafik als externen Link in seine Seite einbinden.

Für dynamische Grafiken (Trends, Charts, etc.)  bietet sich an, die Hilfe von BigBrother ( chart.googleapis.com ) anzunehmen.
Der Webserver muss z.B. für das angehängte Beispiel nur ca. 1kB senden, das meiste davon aus dem Flash.  

edit: wohl ein encoding Problem? Das Beispiel war eigentlich nicht chinesisch ...

Tobias93

@ Eisebaer:   Habe mir hierzu gerade einen Link durchgelesen. Hast du eine art Tutorial hierzu ich suche nach sowas gerade im web.

Lg,
Tobi
Nobody is perfect but - impossible is nothing

michael_x

Sorry an alle die sich das vorige Beispiel schon versucht haben, anzusehen. Es war eigentlich nicht in Chinesisch, und ist jetzt auch nur noch - wie versprochen -  1 kB gross.

Eisebaer

hi,

hab' das jetzt mal rausgesucht.
Du erstellst ein gif-bild und gehst auf:
http://www.motobit.com/util/base64-decoder-encoder.asp
dort auf " or select a file to convert to a Base64 string." und lädst das bild hoch.
dann "convert the source data" und hast in der oberen textbox das bild in base64.
das kopierst Du alles und bettest es in die html-datei ein wie ich.
darauf achten, daß kein zeilenumbruch in der ganzen wurst sein darf.
das background-image: url(data:image/png;base64,R0lGODlhyAAyAPc....... muß bis zum schluß in einer zeile sein und am ende kommt dann );

versuchs einfach mal, wenn Du probleme hast, melde Dich.

gruß stefan
nimm abblockkondensatoren!  100nF.  glaub mir, nimm abblockkondensatoren!

Tobias93

hey,

ich habe einen Code erzeugen lassen:

Quote

R0lGODlhvwBMAPcAAAAAAAAAMwAAZgAAmQAAzAAA/wArAAArMwArZgArmQArzAAr/wBVAABVMwBV
ZgBVmQBVzABV/wCAAACAMwCAZgCAmQCAzACA/wCqAACqMwCqZgCqmQCqzACq/wDVAADVMwDVZgDV
mQDVzADV/wD/AAD/MwD/ZgD/mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMrADMrMzMrZjMrmTMr
zDMr/zNVADNVMzNVZjNVmTNVzDNV/zOAADOAMzOAZjOAmTOAzDOA/zOqADOqMzOqZjOqmTOqzDOq
/zPVADPVMzPVZjPVmTPVzDPV/zP/ADP/MzP/ZjP/mTP/zDP//2YAAGYAM2YAZmYAmWYAzGYA/2Yr
AGYrM2YrZmYrmWYrzGYr/2ZVAGZVM2ZVZmZVmWZVzGZV/2aAAGaAM2aAZmaAmWaAzGaA/2aqAGaq
M2aqZmaqmWaqzGaq/2bVAGbVM2bVZmbVmWbVzGbV/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkAM5kA
ZpkAmZkAzJkA/5krAJkrM5krZpkrmZkrzJkr/5lVAJlVM5lVZplVmZlVzJlV/5mAAJmAM5mAZpmA
mZmAzJmA/5mqAJmqM5mqZpmqmZmqzJmq/5nVAJnVM5nVZpnVmZnVzJnV/5n/AJn/M5n/Zpn/mZn/
zJn//8wAAMwAM8wAZswAmcwAzMwA/8wrAMwrM8wrZswrmcwrzMwr/8xVAMxVM8xVZsxVmcxVzMxV
/8yAAMyAM8yAZsyAmcyAzMyA/8yqAMyqM8yqZsyqmcyqzMyq/8zVAMzVM8zVZszVmczVzMzV/8z/
AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8Amf8AzP8A//8rAP8rM/8rZv8rmf8rzP8r//9VAP9V
M/9VZv9Vmf9VzP9V//+AAP+AM/+AZv+Amf+AzP+A//+qAP+qM/+qZv+qmf+qzP+q///VAP/VM//V
Zv/Vmf/VzP/V////AP//M///Zv//mf//zP///wAAAAAAAAAAAAAAACH5BAEAAPwALAAAAAC/AEwA
AAj/APcJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXFlSX7Qx
CGLKTCCzps2bOHPq3Mmzp8+fP2nKVMOSYZqYNB8keIBAKdOnS6M6lUp1qtWqWK9qzcp1q9euYK02
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
zzcs/9d23FYrePh6Pscv6oF6BRcQADs=



Jetzt bin ich mir nicht sicher wie ich das in der Arduino IDE in meinem Sketch einbaue. Das hier ist der Teilcode für den Webserver:

Quote

void Webserver(){
  EthernetClient myClient = myServer.available();
  if (myClient) {
    while (myClient.connected()) {
   if (myClient.available()) {
    char c = myClient.read();
       if (readString.length() < 100)
      {         
        readString += c;
       
      }           
        Serial.print(c);
       
         
        if (c == '\n') {

     if(readString.indexOf("aktion=AUF")>0)
     {
        digitalWrite(TuerPin, HIGH);      // Türöffner an
        TUERON = true;
     }
     if(readString.indexOf("aktion=ZU")>0)
     {
       //Tüeröffner  OFF
       digitalWrite(TuerPin, LOW);    //Tür zu
       TUERON = false;             
     }
     if(readString.indexOf("aktion=AUTO")>0)
     {
     //Türöffner im Automatikbetrieb
     digitalWrite(TuerPin,HIGH);
     delay(10000);
     digitalWrite(TuerPin,LOW);
                 }
     
          myClient.println("HTTP/1.1 200 OK");
          myClient.println("Content-Type: text/html");
          myClient.println();               
          myClient.print("<body style=background-color:powderblue>");
          myClient.println(" <font face=arial color='navy'><h1>JUMO GmbH & Co.KG Fulda</font></h1>");
          myClient.println("<font face=arial color='navy'><h2>Ausbildungszentrum - Elektrotechnik</font></h2>");
          myClient.print("<hr noshade width='32%' size='5' align='left' color='navy'>");         
    delay(1); // Kurze Pause für Web-Browser
   
           /* if (TUERON)*/
  myClient.println("<font face=arial color='navy'><h4> manuelle Bedienung :</font></h4>");
  myClient.print("<form method=get name=TUER><input type=submit name=aktion value=AUF></form>");

  myClient.print("<form method=get name=TUER><input type=submit name=aktion value=ZU></form>");     
                 myClient.print("<br />");   
                   
          if (TUERON){
            myClient.print("<font face=arial color='navy' size='2'>Die Lagertuer ist aktuell<font color='red' size='2'> geoeffnet");
            myClient.print("<br/>");
            myClient.print("<font face=arial color='navy' size='2'>ZU druecken um die Tuere zu schliessen");
           
           }
          else{
            myClient.print("<font face=arial color='navy' size='2'>Die Lagertuer ist aktuell<font color='red' size='2'> geschlossen ");
            myClient.print("<br/>");
            myClient.print("<font face=arial color='navy' size='2'>AUF druecken um die Tuere zu oeffnen");
            myClient.print("<br/>");
           }
           
   myClient.print("<hr noshade width='300' size='5' align='left' color='navy'>");
   myClient.println("<font face=arial color='navy'> <h3> Automatikmodus :</font></h3>");
   myClient.print("<form method=get name=TUER><input type=submit name=aktion value=AUTO></form>");
   myClient.print("<font face=arial color='navy' size='2'>Durch druecken des Automatik Buttons");
   myClient.print("<br/>");
   myClient.print("<font face=arial color='navy' size='2'>wird die Tuer fuer<font color='red' size='2' > 10 Sekunden");
   myClient.print("<font face=arial color='navy' size='2'> geoeffnet");
   
   
   
   
   
   
           readString="";
  myClient.stop(); // Client-Verbindung schließen
 
        }
       }
    }
  }


Ich weiß nun nicht wie ich den html code in den Sketch bekomme, weil so wie es in der txt datei ist kann es ja 1:1 nicht gehen es muss ja irgendwie in der Richtung

Quote
myClient.println(.....);


aufgebaut sein oder?


Gruß,
Tobi
Nobody is perfect but - impossible is nothing

mkl0815

Hmm, das Bild ist  BASE64-codiert gute 5kB gross und damit schon mal zu gross für den RAM des Arduino (außer es ist ein Mega2560 mit 8kB SRAM).
Du kannst die Daten als String im Flash-RAM ablegen, also da wo auch Dein Sketch liegt, dort hat der Uno 32kB Platz und der Mega sogar 256kB. Allerdings ist der Zugriff darauf auch langsamer hier musst Du schauen wie lange es dann dauert bis Dein Browser das Bild hat. Leider kann der Browser das Bild dann auch nicht in den Cache packen, da es ja Bestandteil der HMTL-Seite ist und nicht separat geladen wird. Es muss also bei jedem Aufruf mit übertragen werden.

Falls Du die Möglichkeit hast, Bilder und andere Elemente (z.B. Javascript) auf einen externen Server zu verlagern (intern oder im Web), würde ich diese Methode vorziehen, da der Browser sich dann die Daten nicht vom Arduino holt, sondern vom externen Server. Heisst der Arduino baut die HTML-Seite wie gewohnt zusammen und schickt hat als HTML-Code sowas mit wie <IMG SRC="http://192.168.178.25/img/bild.jpg">
Wobei dann 192.168.178.25 NICHT der Arduino ist, sondern ein Webserver, der die restlichen Daten liefert.

Noch ein Tip, den wir hier in letzter Zeit schon öfters hatten. Versuche in Deinem finalen Sketch die "String"-Klasse loszuwerden. Gerade das zeichenweise Einlesen im "readString += c;" zerstückelt bei jedem Request an Deinen Server den doch recht wenigen SRAM den Dein Arduino hat. Leider gibt es hier im Forum eine Menge Threads, die alle Probleme mit dem Speicher haben und wo häufig die String-Klasse verantwortlich ist.
ein "char readString[200];" und ein einfacher Zählindex in Verbindung mit der C-Funktion strcasecmp sollte sich recht positiv auf den Speicherverbrauch des Sketches auswirken.
Mario. (der sich nun doch wieder eingemischt hat :smiley-roll-sweat: )

Tobias93

danke für die Info Mario, ich werde den Sketch abändern.

Gruß,
Tobi
Nobody is perfect but - impossible is nothing

Go Up