Offline
Newbie
Karma: 0
Posts: 18
|
 |
« Reply #15 on: February 27, 2012, 02:22:55 pm » |
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
Edison Member
Karma: 18
Posts: 1295
|
 |
« Reply #16 on: February 27, 2012, 02:27:17 pm » |
Ä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
Newbie
Karma: 0
Posts: 18
|
 |
« Reply #17 on: February 28, 2012, 02:15:59 am » |
Danke  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
Edison Member
Karma: 18
Posts: 1295
|
 |
« Reply #18 on: February 28, 2012, 02:28:48 am » |
Schau Dir mal folgendes an: http://www.arduino.cc/playground/Code/TextFinderDamit 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
Newbie
Karma: 0
Posts: 18
|
 |
« Reply #19 on: February 28, 2012, 03:20:31 am » |
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
Edison Member
Karma: 18
Posts: 1295
|
 |
« Reply #20 on: February 28, 2012, 05:59:04 am » |
Wo hast Du denn die Lib hinkopiert? Die Meldung sagt ja, das die Lib nicht gefunden wird.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 18
|
 |
« Reply #21 on: February 29, 2012, 02:47:48 am » |
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
Edison Member
Karma: 18
Posts: 1295
|
 |
« Reply #22 on: February 29, 2012, 04:17:33 am » |
Dann poste doch mal den aktuellen Code, dann können wir Dir sicher auch weiterhelfen.
|
|
|
|
|
Logged
|
|
|
|
|
Germany
Offline
Jr. Member
Karma: 0
Posts: 64
|
 |
« Reply #23 on: February 29, 2012, 04:24:26 am » |
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
Newbie
Karma: 0
Posts: 18
|
 |
« Reply #24 on: February 29, 2012, 07:15:24 am » |
Bisher sieht der Code so aus. #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
Edison Member
Karma: 18
Posts: 1295
|
 |
« Reply #25 on: February 29, 2012, 07:28:52 am » |
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 <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#felderDein 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
Newbie
Karma: 0
Posts: 18
|
 |
« Reply #26 on: February 29, 2012, 08:20:04 am » |
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. #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/TextFinderEntschuldigt 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
Edison Member
Karma: 18
Posts: 1295
|
 |
« Reply #27 on: February 29, 2012, 09:31:05 am » |
OK, wie nachtaktiv68 bereits "geglaskugelt" hat, ist die von Dir markierte Stelle tatsächlich das Problem. Der Aufruf 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 // 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
God Member
Karma: 9
Posts: 774
|
 |
« Reply #28 on: February 29, 2012, 11:22:02 am » |
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
Edison Member
Karma: 18
Posts: 1295
|
 |
« Reply #29 on: February 29, 2012, 11:51:03 am » |
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
|
|
|
|
|
|