Wie kann ich im Seriellen Monitor einen Text eingeben welcher er im Prog erkennt

Hey Leute, ich kenne es bisher nur, dass man im Seriellen Monitor bytes eingeben kann. Ich will aber es so machen, dass wenn ich z.b. "relais 1 an" eingebe das Programm dann abfragt ob der text so ist wie ich ihn eingebe und damit dann eine Aktion ausführt.

Wie kriege ich das hin ?

  1. Sache: Gibt es die Möglichlkeit eine HTML Datei zu schreiben auf der man 4 Flächen hat (kein Problem), aber man beim Drauf klicken einen Befehl an den Arduino sendet ? So dass ich über TeamViewer von fern auf meinen PC gehe, das HTML Dingen öffne und dann auf die Fläche "Relais 1 an" drücke und dann bei mir zuhause das licht angeht ?

MfG Max

hi,

zu 2:

uno und ethernetshield, und dann hier reinsehen:

da lauft der webserver auf dem arduino, kannst Du entweder vom smartphone/tablet aus steuern oder vom rechner, auch über teamviewer oder den arduino direkt übers internet anreden.

gruß stefan

Erst mal musst du den Text einlesen und wenn er empfangen wurde verarbeiten.

Einen Text Parser zu schreiben ist nicht extrem aufwendig, aber es ist auch nicht ganz trivial. Vor allem kommt es dabei ganz genau darauf an welchen Text du eingeben willst und mit welchen Zeichen die einzelnen Bestandteile voneinander getrennt sind. Da allgemeinen Code zu schreiben ist daher nicht wirklich möglich.

Du kannst dir mal das zur Handhabung von Strings in C anschauen: http://www.c-howto.de/tutorial-strings-zeichenketten-stringfunktionen.html

Es gibt auch String Objekte: http://arduino.cc/en/Reference/StringObject Die verhalten sich eher wie du Strings vielleicht aus anderen Sprachen kennst, mit Methoden wie indexOf(), substring() und compareTo()

In beiden Fällen zerlegt man entweder den String in seine Bestandteile, oder man sucht wo die entsprechenden Trennzeichen stehen (z.B. Leerzeichen oder Komma). Dann kann man die Teil-Strings (oder einzelne Zeichen wie '1' oder '2') mit Konstanten vergleichen und eine bestimmte Aktion ausführen.

z.B. wenn du mit strchr(), bzw. indexOf() die Position des ersten Leerzeichen hast, kannst du danach mit strncmp() (die Differenz der Adressen entspricht dabei der Länge des Teil-Strings) bzw. compareTo() bis zu dieser Stelle vergleichen und so rausfinden ob da z.B. "Relais" oder "LED" steht. In der Position nach dem Leerzeichen könnte dann ein einzelner Character für die Nummer stehen (wenn es weniger als 10 sind) und am Ende kann man wieder mit einer String-Konstante vergleichen ob da "an" oder "aus" steht. Du musst da aber mit den Start- und End-Indices aufpassen. Man kann aber einfach mit println() überprüfen ob die errechneten Indices passen.

EDIT: Habe mal schnell was zusammen gezimmert:

    char* firstSpace = strchr(input, ' ');            //Pointer auf das erste Leerzeichen
    if(firstSpace == NULL)
    {
        Serial.println("Invalid input");
    }
    else
    {
        int length = firstSpace - input;          //Länge des ersten Tokens

        if(strncmp(input, "LED", length) == 0)
            Serial.println("Controling LED");
        else if(strncmp(input, "Relay", length) == 0)
            Serial.println("Controling Relay");
        else 
            Serial.println("Invalid part");

        int number = strtol(firstSpace, NULL, 10);    //gibt bei einer ungültiger Wandlung 0 zurück. Daher robuster als atoi()
        if(number != 0)
                {
            Serial.print("Number: ")
                        Serial.println(number);
                }
        else
            Serial.println("Invalid number");

        char* secondSpace = strchr(firstSpace + 1, ' ');        //Pointer auf das zweite Leerzeichen
        if(secondSpace != NULL)
        {
            if(strcmp(secondSpace + 1, "an") == 0)
                Serial.println(New state : on");
            else if(strcmp(secondSpace + 1, "aus") == 0)
                Serial.println(New state : off");
            else
                Serial.println("Invalid state");
        }
        else
            Serial.println("Invalid input");
    }

Das geht davon aus dass der String in ein char Array namens "input" eingelesen wird. Der Teil fehlt natürlich

Was sich da auch anbietet ist strncasecmp() statt strncmp() (bzw. die Version ohne "n" am Ende): http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html#ga60b6f90e97d0574c5f5725d9db15cd9d Dann spielt Groß- und Kleinschreibung keine Rolle

Grob getestet in Visual C++ und nicht auf dem Arduino. Es kann auch sein, dass ich da noch nicht alle Fehl-Eingaben abgedeckt habe.

MaxPed: Hey Leute, ich kenne es bisher nur, dass man im Seriellen Monitor bytes eingeben kann. Ich will aber es so machen, dass wenn ich z.b. "relais 1 an" eingebe das Programm dann abfragt ob der text so ist wie ich ihn eingebe und damit dann eine Aktion ausführt.

Wie kriege ich das hin ?

Um bis zu 26 EIN/AUS Funktionen zu steuern, brauchst Du keine Romane zu senden, die Du hinterher nur schwierig wieder in die diversen lyrischen Bestandteile zerlegen kannst, sondern Du sendest einfach Buchstaben, z.B. einen Großbuchstaben zum Einschalten und einen Kleinbuchstaben zum Ausschalten. Etwa nach dem Schema: A= Relais 1 EIN a= Relais 1 AUS B= Relais 2 EIN b= Relais 2 AUS C= Relais 3 EIN c= Relais 3 aus etc.

Einzelne Buchstaben kannst Du aus der seriellen Schnittstelle leicht auslesen und darauf vergleichen.

MaxPed: 2. Sache: Gibt es die Möglichlkeit eine HTML Datei zu schreiben auf der man 4 Flächen hat (kein Problem), aber man beim Drauf klicken einen Befehl an den Arduino sendet ?

Wurden bei HTML eigentlich schon die "Links" erfunden, wo man draufklickt und es wird etwas an einen Webserver gesendet?

ich halt mal hinter jurs das sarkasmus-schild hoch.

Ich denke mal, dass hat er schon verstanden nur wie er nun die Parameter übergeben soll und diese ausliest ist ja nun das Problem :P

Wenn deine Links alle zu "?p=A" "?p=a" usw leiten, kann man dies aus der Anfrage recht leicht auslesen. Folgende Zeilen bis zur Leerzeile kannst du ignoriere. Bearbeiten musst du alles, dass mit "GET " beginnt.

IN deinem Formular auf der Website sollte die method="get" sein wenns erstmal weiter nicht stört und leichter zu entstören ist.

Als Antwort würde ich zum Üben immer die gleiche kleine HTML Seite senden. Im zweiten step kann man dann auch noch eine Statusanzeige einbringen die dir anzeigt ob ein Relais gerade offen oder geschlossen ist.

Gruß