Pages: 1 [2] 3   Go Down
Author Topic: Webserver ansteuern  (Read 3521 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok. Analoger PIN ausgewählt.
Das Textfeld werde ich morgen mal einfügen.
Stellt sich nun die Frage wie ich genau diesen Wert aus der Adresszeile auslese und dann in eine Variable einlese.
(war wohl auch atoi() was ich gesehen hatte)
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ähm analoger Pin? Das wird nicht funktionieren. Analoge Pins können Spannungen (0-5V) "messen" (Analog-Digital Wandler) und können auch als digitale Ausgänge verwendet werden. Aber NICHT als analoge Ausgänge.
PWM-Pins sind beim Arduino die folgenden digitalen Pins (3,5,6,9,10,11). PWM "simuliert" ein analoges Signal durch schnelles an- und ausschalten der 5V (die bleiben dabei aber immer 5V). Durch die unterschiedlich lange Einschaltdauer stellt sich im zeitlichen Verlauf dann eine Art "Durchschnittswert" ein.
Verwirrenderweise wird der PWM-Wert aber mit analogWrite(PIN) auf ein digitales PIN gesetzt.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke smiley  Habe wohl auf Grund von analogWrite() gedacht, dass es ein analoger PIN wäre.
Dennoch bleibt für mich die Frage offen wie ich nun eine übermittelte Zahl aus der Adressleiste auslese.
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Schau Dir mal folgendes an:
http://www.arduino.cc/playground/Code/TextFinder
Damit kannst Du prima schon beim Lesen der Daten vom Netzwerkinterface nach bestimmten Daten suchen. TextFinder kann auch bereits den Text in eine Zahl umwandeln.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Habe mir die Librarie Textfinder nun einmal angeschaut und ihr Beispielprogramm versucht auszuführen.
(Laut in der Librarie enthaltenem Text ist diese in der Programmierumgebung 1.0 schon enthalten)

Da aber bei Verifizierung die Fehlermeldung:

Webserver_test.cpp:6:24: error: TextFinder.h: No such file or directory
Webserver_test:6: error: 'TextFinder' does not name a type


erscheint.

Habe ich die Librarie nochmal einzeln hinzugefügt.

Dennoch selber Fehler.
Zudem werde ich aus der Erklärung der Librarie auf Arduino.cc nicht wirklich schlau.
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wo hast Du denn die Lib hinkopiert? Die Meldung sagt ja, das die Lib nicht gefunden wird.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

1mal habe ich die Librarie so positioniert
.../Dokumene/Arduino/Libraries/Textfinder

und dann im eigenen Arduino-Ordner in dem Unterordner Libraries.

Inzwischen erhalte ich nurnoch die Fehlermeldung :

Webserver_test:6: error: 'client' was not declared in this scope
« Last Edit: February 29, 2012, 02:51:38 am by Magicrookie » Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dann poste doch mal den aktuellen Code, dann können wir Dir sicher auch weiterhelfen.
Logged

Germany
Offline Offline
Jr. Member
**
Karma: 0
Posts: 64
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wahrscheinlich hast Du dann "client" in einer Funktion deklariert und versuchst in einer anderen Funktion darauf zuzugreifen. Entweder deklarierst Du "client" global oder in der Unterfunktion, in der sie benötigt wird. Du könntest beim Funktionsaufruf auch einen Zeiger auf "client" übergeben, das hab ich auch schon gemacht. In diesem Falle muss die Variable nicht global deklariert werden.
Logged

twitter: @darktom

Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bisher sieht der Code so aus.

Code:
#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>");
   

           //Diode ein und aus schalten
                     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> ");
                      digitalWrite(LED, LOW);

                 
}
                   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> ");
                     digitalWrite(LED, HIGH);
}
 


    //RGB einlesen
   client.println(" <form name='rgb' action='/'> ");
  client.println(" <p> ");
 
 
 
  client.println("   <input type='hidden' name='' value=''> ");
   client.println("  Rotwert <br> ");
   client.println("  <textarea name='rot' rows='2' cols='20'></textarea><br> ");


  client.println("   <input type='hidden' name='' value=''> ");
     client.println("  Gruenwert <br> ");
   client.println("  <textarea name='gruen' rows='2' cols='20'></textarea><br> ");
 
 
  client.println("   <input type='hidden' name='' value=''> ");
     client.println("  Blauwert <br> ");
   client.println("  <textarea name='blau' rows='2' cols='20'></textarea><br> ");
   
   
   
   
  client.println("   <input type='submit' value='senden'><br> ");
 client.println("  </p> ");
client.println(" </form> ");



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


          Serial.println(readString);
          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 (){           //Diodenstatus ändern
   if (testdiode == false){
     testdiode=true;
     
   }
   else {
     testdiode=false; 
 
   }
}


An dieser Stelle würde ich nun gerne mit oder ohne Textfinder die Werte für gruen rot und blau auslesen.
Würde mich freuen wenn mir da einer der vielen lieben Helfer weiterhelfen könnte, da ich als nächstes Projekt plane mit dem selbigen Equipment meiner Freundin eine Steuerbare LED-Beleuchtung ins Zimmer zu bauen.
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Also erstmal zu deinem Formular. Was sollen die ganzen "<input type='hidden' name='' value=''> Felder? Die haben weder einen Namen noch einen Wert. Die verbrauchen nur Platz in Deinem Programm. <textarea> ist auch ungünstig für die Werte.
Besser wäre
Code:
<input type=text name=rot size=5 maxlength=3>
<input type=text name=gruen size=5 maxlength=3>
<input type=text name=blau size=5 maxlength=3>
Siehe auch http://de.selfhtml.org/html/formulare/eingabe.htm#felder
Dein Code compiliert unter IDE 1.0 ohne den von Dir genannten Fehler und TextFinder hast Du auch nicht eingebunden.
Wenn wir Dir helfen sollen, mußt Du schon den Code posten, der fehlerhaft ist.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

so hier der code

Habe die Textfelder vorerst mal so gelassen, da ich nicht mich zwar darin probiert habe diese abzuändern, aber die Funktion zu senden somit ausblieb.

Code:
#include <SPI.h>  //Anbindung microcontroller an Ethernet-Shield
#include <Ethernet.h>
#include <WString.h>
#include <Client.h>
#include <Server.h>
#include <TextFinder.h>
TextFinder finder( client );                <== scheinbar Problem

int LED =4, i;
String vergl, umwa;
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
                        }
                       
            //////////////////////////////////////////////////////////////////////////           
            // An dieser Stelle soll die Suche nach rot und ihrer Zahl stattfinden////
            //////////////////////////////////////////////////////////////////////////
                       

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

           //Diode ein und aus schalten
                     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> ");
                      digitalWrite(LED, LOW);

                 
}
                   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> ");
                     digitalWrite(LED, HIGH);
}
 


    //RGB einlesen
   client.println(" <form name='rgb' action='/'> ");
  client.println(" <p> ");
 

   client.println("  Rotwert <br> ");
   client.println("  <textarea name='rot' rows='2' cols='20'></textarea><br> ");

     client.println("  Gruenwert <br> ");
   client.println("  <textarea name='gruen' rows='2' cols='20'></textarea><br> ");
 
     client.println("  Blauwert <br> ");
   client.println("  <textarea name='blau' rows='2' cols='20'></textarea><br> ");
   

  client.println("   <input type='submit' value='senden'><br> ");
 client.println("  </p> ");
client.println(" </form> ");



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


          Serial.println(readString);
          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 (){           //Diodenstatus ändern
   if (testdiode == false){
     testdiode=true;
     
   }
   else {
     testdiode=false; 
 
   }
}


Ich habe die ersten zwei Zeilen schonmal eingefügt und das Programm mit diesen ausprobiert.
Bei Start erscheint die vorran gegangene Fehlermeldung.

Zudem muss ich zugeben nicht besonders viel und gut Englisch zu sprechen und zu verstehen.
Daher tue ich mich ziemlich schwer die verlinkten Informationen zu verstehen.

Hier nochmal der gepostete Link:
http://www.arduino.cc/playground/Code/TextFinder

Entschuldigt bitte, dass ich mich an dieser Stelle etwas dumm anstelle/stelle.
Bisher bin ich mit deutschen Seiten und Erklärungen ziemlich gut vorran gekommen.
Aber sobald es ans Englische geht, komme ich nichtmehr oder nur schleppend vom Fleck.
« Last Edit: February 29, 2012, 08:23:38 am by Magicrookie » Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

OK, wie nachtaktiv68 bereits "geglaskugelt" hat, ist die von Dir markierte Stelle tatsächlich das Problem.
Der Aufruf
Code:
TextFinder finder( client );
definiert eine Instanz von TextFinder, der Deinen "client" als Eingabe verwenden soll. Allerdings gibt es die Variable "client" an dieser Stelle noch gar nicht.
Du mußt also den TextFinde einfach später initialisieren. z.B. an folgende Stelle
Code:
  // listen for incoming clients
EthernetClient client = server.available(); //Client Verbindung herstellen
  if (client) {
      TextFinder finder( client );
Der Vorteil mit TextFinder ist dann, das Du die einzelnen Bytes nicht mehr selbst aus dem Stream fischen musst, sonder das Dir das abgenommen wird.
Wichtig ist dann nur die Reihenfolge der Parameter in der URL.
Der nächste Schritt ist dann nur noch das Absuchen des Streams. Damit das ganze einfacher zu programmieren ist, solltest Du aber erstmal Dein HTML-Formular aufräumen und da vor allem nur ein einziges Fomular draus bauen. Zur Zeit hast Du ja 2 Formulare, die unterschiedliche Parameter haben, das ist für das Lesen des Streams ziemlich ungünstig.
Logged

Wien
Offline Offline
Edison Member
*
Karma: 26
Posts: 1832
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hi, forum,

ich bin auch anfänger am arduino und muß noch auf den ethernet-shield warten. aber mal ne frage vorweg zu diesem formular-thema:
kann der arduino-webserver nur GET-daten verarbeiten oder auch POST ?
und kann man das ganze nicht auch über XMLHTTP laufen lassen? damit erspart man sich das formular-gelumpe und vor allen den neuerlichen seitenaufbau nach dem senden der daten an den arduino. die antwort verarbeitet man clientseitig übers DOM. gibts dazu schon projekte ?

entschuldigt bitte, wenn jemand findet, daß das hier nicht das thema ist, aber man würde doch einiges ersparen.

gruß bär
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Was der Webserver auf dem Arduino kann, liegt einzig an Deiner Programmierung. Es gibt einige Libs, die eine Art Framework für Webserver zur Verfügung stellen, allerdings sind die zwangsläufig recht Speicherintensiv.
Wir reden hier von einem Microcontroller mit einigen KB SD- und Flash-RAM. Alleine eine Webseite mit entsprechendem Ajax-Code auszuliefern (die muss ja irgendwo herkommen) sprengt im schlimmsten Fall schon die 32kb Flash-RAM die Du auf dem Arduino hast.
GET oder POST kannst Du auch selbst entscheiden. GET ist aber erstmal einfacher, weil Du auch die URL beim Aufruf besser manipulieren kannst.
Logged

Pages: 1 [2] 3   Go Up
Jump to: