Wo hast Du denn die Lib hinkopiert? Die Meldung sagt ja, das die Lib nicht gefunden wird.
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
Dann poste doch mal den aktuellen Code, dann können wir Dir sicher auch weiterhelfen.
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.
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
");
client.println(" <textarea name='rot' rows='2' cols='20'></textarea>
");
client.println(" <input type='hidden' name='' value=''> ");
client.println(" Gruenwert
");
client.println(" <textarea name='gruen' rows='2' cols='20'></textarea>
");
client.println(" <input type='hidden' name='' value=''> ");
client.println(" Blauwert
");
client.println(" <textarea name='blau' rows='2' cols='20'></textarea>
");
client.println(" <input type='submit' value='senden'>
");
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.
Also erstmal zu deinem Formular. Was sollen die ganzen " Felder? Die haben weder einen Namen noch einen Wert. Die verbrauchen nur Platz in Deinem Programm. 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#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.
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
");
client.println(" <textarea name='rot' rows='2' cols='20'></textarea>
");
client.println(" Gruenwert
");
client.println(" <textarea name='gruen' rows='2' cols='20'></textarea>
");
client.println(" Blauwert
");
client.println(" <textarea name='blau' rows='2' cols='20'></textarea>
");
client.println(" <input type='submit' value='senden'>
");
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.
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.
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
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.
hi,
naja, es gibt ja arduinos nicht nur mit 32kb. zweitens hatte ich gehofft, die SD-karte des ethernet-shields mitnutzen zu können. nicht zuletzt müssen die ajax-seiten nicht auf dem arduino liegen, wenn's nicht von JEDEM rechner im internet funktionieren muß. die seiten können ja auch lokal am pc, tablet oder handy hinterlegt sein.
gruß bär
Das ist natürlich richtig. Ich wollte ja auch nur darauf hinweisen das ein Webserver nicht die typische Anwendung auf dem Arduino ist.
hi mkl0815,
liebe freunde, zieht Euch warm an. wenn erstmal genug pc-programmierer draufgekommen sind, was der arduino kann, und wie leicht er über die IDE zu programmieren ist, werden sie Euch überrennen.
stellt Euch mal folgende situation vor:
da programmiert man jahrzehntelang unter windows herum und hat die großartigsten ergebnisse am bildschirm. leider kommt nie was davon in die reale welt.
UND DANN KAM ARDUINO !
keine elektronikkenntnisse erforderlich, und ich kann plötzlich den terminator bauen (ok, modell T-0.001 beta, aber immerhin).
hier im forum geht's bei den themen fast nur darum, wie der arduino programmiert werden kann, aber für meinereiner ist es wichtig, wie ich mit dem pc die reale welt bewegen kann. Mit dieser herrlichen kleinen platine geht das, und daß sich noch niemand gefunden hat, eine activeX-komponente zu bauen, die mit einem vorgegeben arduino-programm kommuniziert (wie firmata, aber ohne processing), wird sich ändern, und damit sicher auch der schwerpunkt des forums.
liebe grüße,
ein sich sehr sicherer wahrsagebär
Ist das mit den 2 Formularen nicht erstmal irrelevant?
Da es mir gerade hauptsächlich darum geht, die 3 Werte zu übertragen.
Ich werde später den Button für an und aus auch entfernen und durch ein textfeld ersetzen, welches Zahlen überträgt.
Ich habe nun den Beispielcode mal in mein Programm kopiert um zu schauen was passiert.
-> Keine Fehlermeldung, aber sobald ich eine Aktion auf der Webside vornehme, verfällt der Explorer in einen Dauerrefresh und der Arduino lässt sich kurz nichtmehr ansprechen.
#include <SPI.h> //Anbindung microcontroller an Ethernet-Shield
#include <Ethernet.h>
#include <WString.h>
#include <Client.h>
#include <Server.h>
#include <TextFinder.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
}
TextFinder finder( client );
finder.find("Results <b>");
finder.find("of about <b>"); // skip past this
long value = finder.getValue(); // get numeric value
Serial.print(value);
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
");
client.println(" <textarea name='rot' rows='2' cols='20'></textarea>
");
client.println(" Gruenwert
");
client.println(" <textarea name='gruen' rows='2' cols='20'></textarea>
");
client.println(" Blauwert
");
client.println(" <textarea name='blau' rows='2' cols='20'></textarea>
");
client.println(" <input type='submit' value='senden'>
");
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;
}
}
Kannst du mir vlt. die Befehle des Textfinders , welche ich benötige in kurzen Worten erklären?
Und soweit ich die Arduino-Seite zum Textfinder mit dem Googleübersetzer verstehen konnte, scheint es so als benötige der Textfinder einen Stream. Habe ich denn einen solchen?