Go Down

Topic: Webserver ansteuern (Read 4 times) previous topic - next topic

Magicrookie

#10
Feb 27, 2012, 09:04 am Last Edit: Feb 27, 2012, 09:30 am by Magicrookie Reason: 1
Hier mein aktueller Code
Code: [Select]

#include <SPI.h>  //Anbindung microcontroller an Ethernet-Shield
#include <Ethernet.h>
#include <WString.h>
#include <Client.h>
#include <Server.h>
int LED =4;
boolean testdiode=false;

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
byte ip[] = { 192,168,1, 190 };

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);
String readString = String(100);      // string for fetching data from address





void setup(){
  Ethernet.begin(mac, ip);  //Start der Ethernet-Verbindung und des Servers
  server.begin();
    pinMode(4, OUTPUT);
    Serial.begin(9600);
}

void loop(){

  // listen for incoming clients
EthernetClient client = server.available(); //Client Verbindung herstellen
  if (client) {
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (readString.length()< 100){
          readString = readString + c;
        }
        Serial.print(c);
          // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        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();
          // print something, in HTML format:
        }
        else if (c == '\n') {
if(readString.indexOf("diode=AN") > -1) {
   togglediode; // verändert den status von testdiode
                        }
                        if(readString.indexOf("diode=AUS") > -1) {
   togglediode; // verändert den status von testdiode
                        }
                       

   
         
         
           client.println("<html>");
           client.println("<head>");
            client.println("<TITLE>Sörens Testpage</TITLE>");
           client.println("</head>");
           client.println("<body>");

           
            /*
             if (testdiode==true) {
     client.println("<input type=submit value=AN  name=3 style=width:200;height:100;background-color:lightgreen;/>");
                     client.println("<input type=\'hidden\' name='anderung' value='AUS'> ");
}else if (testdiode==false) {
     client.println("<input type=submit  value=AUS name=3 style=width:200;height:100;background-color:red;/>");
                     client.println("<input type=\'hidden\' name='anderung' value='AN'> ");
}
           */
           
                     if (testdiode==false) {
      client.println(" <form action='/' method='get'><input type=submit name=3 value='einschalten'> ");
                      client.println(" <input type='hidden' name='diode' value='AN'> ");
                      client.println(" </form> ");

                 
}
                   else if (testdiode==true) {
     client.println(" <form action='/' method=get><input type=submit name=3 value='ausschalten'> ");
                     client.println(" <input type='hidden' name='diode' value='AUS'> ");
                      client.println(" </form> ");

 
 
}
           
           client.println("</body>");
           client.println("</html>");



          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
    readString=" ";
    delay(1);
    // close the connection:
    client.stop();
  }

}

void togglediode (){
   if (testdiode == false){
     testdiode=true;
     digitalWrite(LED, HIGH);
   }
   else {
     testdiode=false; 
     digitalWrite(LED, LOW);
   }
}



Wenn ich den Button "einschalten" drücke steht Folgendes in der Adressleiste 
"    http://192.168.1.190/?3=einschalten&diode=AN          "
Jedoch bleibt der LED status unverändert.

Wenn ich auf der Seite  "http://192.168.1.190/ "  den Befehl "diode=AN" anhänge, passiert das selbe.

Seriell wird ausgegeben:
GET /?3=einschalten&diode=AN HTTP/1.1
GET /?3=einschalten&diode=AN HTTP/1.1


Ich vermute an dieser Stelle, das das Suchen von diode=AN im String nicht funktioniert.
Kann mir allerdings nicht erklären warum nicht.

nachtaktiv68

Hallo!

Wenn Du die Funktion "togglediode" aufrufen möchtest, musst Du schreiben

togglediode(); // verändert den status von testdiode

Es wundert mich, dass sich Dein Code so überhaupt compilieren lässt :) Zum Debuggen würde ich mir die Variable "readString" direkt vor der Auswertung anzeigen lassen:

Serial.println(readString);

Das ist mir jetzt so auf die Schnelle aufgefallen und heisst nicht, dass nicht noch weitere Fehler im Code sind :)

Viel Erfolg!
twitter: @darktom

mkl0815

Um zu sehen, ob der String gefunden wird, kannst Du ja die Debugausgaben direkt an die passende Stelle schreiben:
Code: [Select]

        else if (c == '\n') {
if(readString.indexOf("diode=AN") > -1) {
                                         Serial.println("diode=AN gefunden");
   togglediode(); // verändert den status von testdiode
                        }
                        if(readString.indexOf("diode=AUS") > -1) {
                                         Serial.println("diode=AUS gefunden");
   togglediode(); // verändert den status von testdiode
                        }

Achso, das sich die Diode an- und ausschalten läßt, hast Du getestet, oder? Sorry für die Frage, aber manchmal ist es am Ende dann doch sowas simples.
Mario.

Magicrookie

Danke euch beiden.
Es war ein simpler Anfängerfehler. Das Unterprogramm hatte ich ohne die Klammern aufgerufen und es konnte somit nicht starten.
Programm läuft. Super! Nach 3 Wochen Rumknobelei war es nun doch so etwas Simples.

An dieser Stelle stehe ich allerdings schon wieder vor einer neuen Herrausforderung.
Ich würde gerne die LED dimmen und dafür über ein HTML-Textfeld eine Zahl übermitteln.

Kann mir dafür vielleicht jemand einen Tipp geben nach was ich dafür genau suchen müsste, vielleicht sogar einen Link zu einem Guide oder eine eigene kurze Erklärung eines Befehls und seiner Anwendung.
Ich habe bis jetzt etwas von einem "altio" Befehl gelesen, aber wurde noch nicht sehr schlau daraus.

Vielen Dank schonmal für die kommenden Antworten!
Ich freue mich drauf weiter zu machen.

PS: Falls sich jemand für den vorerst fertigen LED-Webserver-Ansteuerungcode interessiert, schreibt mir. Ich teile und helfe gerne, nachdem mir so toll geholfen wurde.

mkl0815

LED dimmen geht über PWM.
Siehe http://arduino.cc/en/Tutorial/Fading. Allerdings wirst Du dann die LED an einen anderen Ausgang anschliesse müssen. Pin 4 ist kein PWM Ausgang.
Wenn es um das HTML-Formular geht, brauchst Du nur innerhalb der Formulars ein
Code: [Select]

<input type=text name=dim></input>

Der Wert hängt dann als "&dim=111" mit an der URL dran, wenn Du das Formular abschickst. Du hast dann nur noch die Aufgabe, den Wert aus der URL zu filtern und in eine Zahl umzuwandeln.
Dabei ist wichtig, das der Wertebereich von 0 bis 255 geht.
Was soll denn "altio" sein? HTML, oder C-Code? Das sagt mir nämlich gar nix.
Falls Du "atoi()" meinst, ist das die Funktion die einen String ein Integer umwandeln kann.

Go Up