Wie ein html Eingabefeld am Arduino-Webserver auslesen?

vor 32 weeks 18 hours von andil

HI,

Ich habe mir einen Webserver gebastelt mit dem ich einen Schrittmotor ansteuere. Ich habe
ein html Eingabefeld erstellt:
client.print("");

welches auch am Server aufscheint. Mein Problem ist, das ich nicht weiss wie ich es auslese!
Ich möchte in dieses Eingabefeld einen Wert zB.: 123 eingeben, und mit diesem Wert dann im Programm weiterarbeiten.
Hat von euch jemand eine Ahnung wie das funktioniert??
Danke!!!
LG

Ähnliche Posts

16 Antworten auf “Wie ein html Eingabefeld am Arduino-Webserver auslesen?”


Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.
  1. Spot sagt:

    Hallo

    Ein paar mehr Informationen wären nicht schlecht um dir zu helfen! Ich schätze zwar einfach mal das du die Webduino Library verwendest aber das hilft mir jetzt auch noch nicht so sonderlich weiter.
    Wenn es die Webduino Library ist dann schau dir mal das Buzzer Beispiel an, da ist beschrieben wie das ganze funktioniert.

    Poste doch mal deinen Source Code und dann können wir weiterschaun.

    mfg
    Spot

    Login or register to post comments

  1. Jan sagt:

    Du baust einfach ein HTML formular und sendest die Werte als GET oder POST Parameter an eine URL. Der Webserver empfangt diese und reagiert entsprechend

    Login or register to post comments

  1. andil sagt:

    Hallo, danke für die Hilfe erstmal. Boards:(Arduino uno und webshield und easydriver)
    Ich verw. nicht die Webduino Library.(include SPI,include Ethernet.h) Und habe gerade gesehen das bei meinem obigen post nicht alles eingefügt wurde. sorry.

    Dies erstellt mir das Eingabefeld:
    client.print form method=get input type=text size=10 value=Eingabe form

    versteh nicht ganz wie ich das an die URL dann übergebe.
    danke
    LG

    Login or register to post comments

  1. andil sagt:

    So, habs jetzt mal so gemacht:

    form method=get Enter a text: input type=text size=10 name=wert   input type=submit value=sendData form

    Ich bekomme jetzt den eingegebenen Wert als URL. Möchte den eingebenen Wert dann als INT im Prg. weiterverwenden. Wie kann ich den diesen Umwandeln?
    LG

    Login or register to post comments

  1. Spot sagt:

    Hallo

    Die Funktion die du suchst heißt atoi. Sie ist in der stdlib.h und sollte eigentlich auch ohne dein zu tun schon inkludiert sein.

    Du musst dazu den String den du als URL erhältst so zurecht stückeln, bzw. raus kopieren, das du nur noch den Wert hast und das übergibst du dann der atoi. Die genaue Beschreibung der Funktion findest du leicht über Google.

    mfg
    Spot

    Login or register to post comments

  1. andil sagt:

    Danke für die Info. Ich habs befürchtet das sowas kommt :). Werd mich morgen damit beschäftigen.
    LG

    Login or register to post comments

  1. andil sagt:

    Hallo,

    Hab nun den ersten Teil geschaft. Habe den string aus der URL zurechtgestückelt.
    Und habe dann mit der atoi Funktion probiert daraus einen INT Wert zu machen. Leider
    klappt das irgendwie nicht, ich bekomme immer eine 0 zurück.

    hier mal ein Codeschnipsel:

    String theText = receivedText.substring firstPos+10, lastPos

    Serial.println(theText); // bekomme hier den richtigen wert als String
    }

    int a;
    a = atoi(theText);

    Serial.println(a); //bekomme hier immer wieder 0
    client.stop();
    }
    }

    warum wird das nicht richtig übergeben, was mache ich falsch?
    danke für die Hilfe, LG

    Login or register to post comments

  1. Spot sagt:

    Hallo

    Das einzige das mir auffällt ist die Sache mit deinem String. Bekommst du eine Warnung beim Comilieren?

    Der Datentyp String ist kein Standart C Typ. Dabei handelt es sich um eine Arduino Klasse, die atoi() ist aber auf einen "C String" ausgelegt.

    Ich hab dir mal schnell einen Bastelcode geschrieben, er ist nicht getestet.
    Ersetze mal die Zeilen:

    int a;
    a = atoi(theText);
     
    Serial.println(a); //bekomme hier immer wieder 0

    durch
    unsigned char uctext[10];
    signed int siWert;
     
    theText.toCharArray(uctext, 10);
    siWert = atoi(uctext);
     
    Serial.println(siWert);

    Ich bin mir zwar nicht sicher ob es daran liegt aber einen Versuch ist es wert.

    mfg
    Spot

    Login or register to post comments

  1. andil sagt:

    Danke erstmal!

    Fehlermeld. hab ich bei meinem Altcode nicht bekommen.

    Hab nun deinen Code eingefügt und bekomme beim compilieren die Meld:

    String_HTML_lesen.cpp: In function 'void loop()':
    String_HTML_lesen:82: error: request for member 'toCharArray' in 'theText', which is of non-class type 'char*'
    String_HTML_lesen:83: error: invalid conversion from 'unsigned char*' to 'const char*'
    String_HTML_lesen:83: error: initializing argument 1 of 'int atoi(const char*)'

    sagt dir das was? ich bin leider überfragt damit.

    Login or register to post comments

  1. Spot sagt:

    Hallo

    Ein bisschen was kann ich zwar mit den Fehlermeldungen anfangen, ganz schlau werde ich allerdings nicht.

    Poste doch mal deinen ganzen Sourcecode aber bitte zwischen [ c o d e ] [ / c o d e ](Leerzeichen weglassen).

    mfg
    Spot

    Login or register to post comments

  1. andil sagt:

    Hallo,
    das ganze Projekte wär eine bischen zu gross zum posten und würde unübersichtlich werden.

    hier der Code mit dem erstellen vom String:

    Declariert:
    String receivedText = String(maxLength);

    int firstPos = receivedText.indexOf("?");
    if (firstPos > -1) {
    int lastPos = receivedText.indexOf(" ", firstPos);
    String theText = receivedText.substring(firstPos+10, lastPos); // 10 is the length of "?the_text="
    // if your text contains spaces they will be replaced with "+"
    Serial.println(theText);
    }

    unsigned char uctext[10];
    signed int siWert;
    theText.toCharArray(uctext, 10);
    siWert = atoi(uctext);

    Fehlermeldung beim compilieren:
    Webserver_V1_Schrittmotor.cpp: In function 'void loop()':
    Webserver_V1_Schrittmotor:216: error: invalid conversion from 'unsigned char*' to 'char*'
    Webserver_V1_Schrittmotor:216: error: initializing argument 1 of 'void String::toCharArray(char*, unsigned int)'
    Webserver_V1_Schrittmotor:217: error: invalid conversion from 'unsigned char*' to 'const char*'
    Webserver_V1_Schrittmotor:217: error: initializing argument 1 of 'int atoi(const char*)'

    Login or register to post comments

  1. Spot sagt:

    Hallo

    Ich hab mir jetzt deine Sourcecode und auch den Sourcecode vom Arduino angesehen.
    Ich hab jetzt eine gute und eine schlechte Nachricht. Die schlechte kommt immer zuerst.
    Ich verstehe immer noch nicht alle Fehlermeldungen. Damit kommen wir auch schon zur guten Nachricht, ich hab eine Funktion im Arduino Sourcecode entdeckt die nicht Dokumentiert ist.
    Sie nennt sich .toInt() und könnte das Problem lösen.

    Versuch mal das:

    String receivedText = String(maxLength);
     
    int firstPos = receivedText.indexOf("?");
    if (firstPos >= 0) 
    {
        int lastPos = receivedText.indexOf(" ", firstPos);
        String theText = receivedText.substring(firstPos+10, lastPos);
     
        Serial.println(theText);
    }
     
    long lWert;
    lWert = theText.toInt();
    Serial.println(lWert);

    Login or register to post comments

  1. andil sagt:

    Hallo,
    Danke für den neuen Code.
    Hätte mir nie gedacht das dies so ein Aufwand wird einen String zu wandeln...
    Ich hab mal das relavante aus meinem Hauptprg. rauskopiert,
    damit nur mehr diese Funktion aktiv ist.
    Habe jetzt deinen letzten Vorschlag im source und bekomme eine Fehlermlg. beim compilieren.
    Habe auch schon einiges herumprobiert, aber leider keinen Erfolg gehabt mit der toInt Funktion.

    Fehlermeldung ist ganz unten gepostet.
    Hier der ganze code:

    Quote:

    //*******************************

    #include <SPI.h>
    #define maxLength 255
    #include <Ethernet.h>
     
    byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
    byte ip[] = { 192, 168, 1, 115 }; // ip in lan
    byte gateway[] = { 192, 168, 1, 100 }; // internet access via router
    byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
    Server server(80); //server port
    int sampledata = 50; //some sample data – outputs 2 (ascii = 50 DEC)
    int steps;
    int ledPin = 9; // LED pin
     

    String receivedText = String(maxLength);
    char* theText = "";

    void setup()
    {
      Serial.begin(9600);
      Ethernet.begin(mac, ip);
      server.begin();
    }

    void loop()
    {
      Client client = server.available();
      if (client) {
        boolean currentLineIsBlank = true;
        while (client.connected()) {
          if (client.available()) {
            char c = client.read();
            if (receivedText.length() < maxLength) {
              receivedText += c;
            }
            if (c == '\n' && currentLineIsBlank) {
              client.println("HTTP/1.1 200 OK");
              client.println("Content-Type: text/html");
              client.println();

              client.print("Arduino Webserver");
              client.println("Arduino Webserver");
              client.print("Enter a text:  ");
              client.println("");
              break;
            }
            if (c == '\n') {
              currentLineIsBlank = true;
            } 
            else if (c != '\r') {
              currentLineIsBlank = false;
            }
          }
        }
        delay(1);
       
     
    int firstPos = receivedText.indexOf("?");
    if (firstPos >= 0)
    {
        int lastPos = receivedText.indexOf(" ", firstPos);
        String theText = receivedText.substring(firstPos+10, lastPos);
     
        Serial.println(theText);
    }
     
    long lWert;
    lWert = theText.toInt();// hier Fehlermeld beim compilen
    Serial.println(lWert);
        client.stop();
      }
    }

    Die Fehlermeldung beim compilieren:
    String_HTML_lesen.cpp: In function 'void loop()':
    String_HTML_lesen:69: error: request for member 'toInt' in 'theText', which is of non-class type 'char*'

    thx,SG

    Login or register to post comments

  1. Spot sagt:

    Hallo

    Ah, ich glaub jetzt hab ich ihn. Eigentlich auch ein ganz einfacher Fehler den ich nur wegen der nicht ganz aussagekräftigen Fehlermeldung übersehen habe.

    Schreib mal diese Zeile:

    long lWert;
    lWert = theText.toInt();// hier Fehlermeld beim compilen
    Serial.println(lWert);

    in das if(firstPos >= 0) ganz unten mit rein. Es sollte dann so aussehen:
    if (firstPos >= 0)
    {
        int lastPos = receivedText.indexOf(" ", firstPos);
        String theText = receivedText.substring(firstPos+10, lastPos);
     
        Serial.println(theText);
     
        long lWert;
        lWert = theText.toInt();
        Serial.println(lWert);
    }

    Ich bin hoffe das es das jetzt gewesen ist. Das Problem ist das du den String theText in dem if(...) deklariert hast. In C ist es so das Variablen immer nur in dem Bereich in dem sie deklariert werden gültig sind, das ist in deinem Fall das if(...). Wir haben dann versucht außerhalb des if(...) auf die Variable zu zu greifen und da war sie schon nicht mehr gültig(bekannt).

    mfg
    Spot

    Login or register to post comments

  1. andil sagt:

    :) :) :)

    Code funktionert jetzt ausgezeichnet!! Musste nur noch ein receivedText=""; am Schluss einfügen um den Wert wieder zu löschen und frei zumachen für den nächsten.
    Deine Fehlerbeschreibung leuchtet auch absolut ein, wg Zugriff auf unbekannte Variable.
    Echt super, kann mich nur groß bei dir für deine Hilfe und Zeit bedanken!!
    SG

    Login or register to post comments

  1. Spot sagt:

    Kein Problem, freut mich wenn es jetzt geht.

    mfg
    Spot

    Login or register to post comments