Motor per Digitalinput anhalten auf Webserver - MotorShield&Ethernetshield

Hallo

Ich bin daran mittels einem ArduinoUno&Ethernetshield&Motorshield einen Motor anzusteuern. Dies funktioniert mittels Befehlen für den Motor (Testprogramm) auch soweit (Pinning von Shields entsprechend hardwaremässig angepasst.). Der Motor lässt sich korrekt ansteuern.

Als Webserver (nur lokal im Netz) habe ich nun folgendes Problem. Den Motor kann ich mittels Button auf dem Webpanel ansteuern, allerdings kann ich den Stoppbefehl mittels Digital-Input nicht generierern (bzw. hier liegt das Problem). Das Refreshen der Page bringt nur ein Zyklisches an/ausschalten des Motores. Ohne die Zeile:

      client.println("Refresh: 1");  // refresh the page automatically every 1 sec

wird dies nie ausgeführt bzw. erst beim Klicken auf einen Button oder ein manuelles Refreshen der Webpage:

       GetSwitchState(client);

Frage: Wie kann ich eine Webpage mit Buttons erstellen, welche den Motor ansteuern und dann bei einem DigitalIn den Motor automatisch stoppen lassen(Sicherheitsschaltung Motor aus)?

Hier der Code:

#include <SPI.h>
#include <Ethernet.h>
#include <Servo.h>


byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xEE, 0xED };   //physical mac address
byte ip[] = { 192, 168, 1, 88 };                      // ip in lan (that's what you need to use in your browser. ("192.168.1.179")
byte gateway[] = { 192, 168, 1, 1 };                   // internet access via router
byte subnet[] = { 255, 255, 255, 0 };                  //subnet mask
EthernetServer server(80);                             //server port
String readString;


boolean  endschalterOben;
boolean  endschalterUnten;

const int switchPin1 = 5;
const int switchPin2 = 3;


// Timer funktionen
int ifstatus          = 0;

unsigned long      stepTime     =   2000; // ( 2 * 1000) = 2s;

void setup() {

    // disable the SD card by switching pin 4 high
    // not using the SD card in this program, but if an SD card is left in the socket,
    // it may cause a problem with accessing the Ethernet chip, unless disabled
    pinMode(4, OUTPUT);
    digitalWrite(4, HIGH);
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  // while (!Serial) {
  //  ; // wait for serial port to connect. Needed for Leonardo only
  //  }



  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip, gateway, subnet);
  //Ethernet.begin(mac);

  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());


  //Endschalter - Initialisierung
  pinMode(switchPin1, INPUT_PULLUP); //Digital- In to Ground, Endschalter oben / LOW-Aktiv
  pinMode(switchPin2, INPUT_PULLUP); //Digital- In to Ground, Endschalter unten


  // Motor Code - neu
  /*************************************************************
    Motor Shield 1-Channel DC Motor Demo
    by Randy Sarafan
    For more information see:
    http://www.instructables.com/id/Arduino-Motor-Shield-Tutorial/
  **************************************************************/

  //Setup Channel A
  pinMode(7, OUTPUT); //Initiates Motor Channel A pin
  pinMode(9, OUTPUT); //Initiates Brake Channel A pin

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

  digitalWrite(9, HIGH); //Engage the Brake for Channel A

  Serial.println("Setup initialisiert!");
  Serial.print("Status: "); Serial.print(ifstatus);
  Serial.println("----------------------------------------------");

}//setup ////////////////////////////////////////


void loop() {


  // Create a client connection
  EthernetClient client = server.available();

  if (client) {
    while (client.connected()) {

      if (client.available()) {
        // Begin Ethernetserverfunctions
        char c = client.read();

        // Serial.write(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

        endschalterOben = digitalRead(switchPin1);
        endschalterUnten = digitalRead(switchPin2);
        Serial.println("Endschalter: "); Serial.println(endschalterOben); Serial.println(endschalterUnten);
        Serial.println("----------------------------------------------");



        // Endschalter abfragen
        if ((endschalterOben == LOW) || (endschalterUnten == LOW ))
        {
          digitalWrite(9, HIGH); //Engage the Brake for Channel A //motorStop
          Serial.println("Endschalter");
          Serial.println("----------------------------------------------");
        }



        //read char by char HTTP request
        if (readString.length() < 100) {
          //store characters to string
          readString += c;
          //  Serial.print(c);
        }

        //if HTTP request has ended
        if (c == '\n') {

          Serial.println(readString); //print to serial monitor for debuging

          client.println("HTTP/1.1 200 OK"); //send new page
          client.println("Content-Type: text/html");
          //client.println("<meta http-equiv=\"refresh\" content=\"1\">");
         client.println("Refresh: 1");  // refresh the page automatically every 1 sec
          client.println();
          client.println("<HTML>");
          client.println("<HEAD>");
          client.println("<meta name='apple-mobile-web-app-capable' content='yes' />");
          client.println("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />");
          client.println("<link rel='stylesheet' type='text/css' href='http://randomnerdtutorials.com/ethernetcss.css' />");
          client.println("<TITLE>Arduino TV-Motor Fernsteuerung</TITLE>");

          client.println("</HEAD>");
          client.println("<BODY>");
          client.println("<H1>Motor Control  Webserver</H1>");
          client.println("<hr />");
          client.println("
");
          client.println("<H2>Arduino with Ethernet/Motor Shield</H2>");
          client.println("
");
          client.println("<h1>Endschalter</h1>");
          client.println("<p>State of Endschalter is:</p>");
          GetSwitchState(client);
          client.println("
");
          client.println("
");
          client.println("<a href=\"/?button1on\"\">TV runterfahren</a>");
          client.println("<a href=\"/?button1off\"\">TV hochfahren</a>
");
          client.println("
");
          client.println("
");
          client.println("<a href=\"/?button2on\"\">TV  Step runterfahren</a>");
          client.println("<a href=\"/?button2off\"\">TV Step hochfahren</a>
");
          client.println("
");
          client.println("<p>modified by neonightmare, nov. 2016</p>");
          client.println("
");
          client.println("</BODY>");
          client.println("</HTML>");

          delay(1);
          //stopping client
          client.stop();

          //controls the Arduino if you press the buttons
          if (readString.indexOf("?button1on") > 0) {
            digitalWrite(7, HIGH); //Establishes forward direction of Channel A
            digitalWrite(9, LOW);   //Disengage the Brake for Channel A
            analogWrite(3, 255);   //Spins the motor on Channel A at ful =255 speed
            Serial.println("motorHoch()");

          }
          
          }
          if (readString.indexOf("?button2on") > 0) {
            //forward @ half speed
            digitalWrite(7, HIGH); //Establishes forward direction of Channel A
            digitalWrite(9, LOW);   //Disengage the Brake for Channel A
            analogWrite(3, 123);   //Spins the motor on Channel A at ful =255 speed
            delay(stepTime);
            digitalWrite(9, HIGH); //Engage the Brake for Channel A
          }

       

          //clearing string for next read
          readString = "";
        } //if c==

      } // if client.available
    } // while client.connected
  } // if client
} //loop

void GetSwitchState(EthernetClient cl)
{
  if ((!digitalRead(switchPin1) || !digitalRead(switchPin2))) {
    cl.println("<p>ON</p>");
    digitalWrite(9, HIGH);   //Engage the Brake for Channel A

  }
  else {
    cl.println("<p>OFF</p>");
  }
}

Bin für jeden Tipp dankbar :slight_smile:
Neo

Also bei der Verknüpfung von "Sicherheitsschaltung" und "über Webserver" wird mir übel.

Gruß Tommy

Hi Tommy

wollte dich nicht um den schönen Tag bringen... :frowning:

das ganze läuft nur im lokalen Netz, bzw. die Ansteuerung erfolgt per http-Anfrage
http://192.168.1.88/?button1on, welche ich via homebridge-http gedenke zu generieren.

Danke

Neo

Auch im lokalen Bereich hat eine Sicherheitsschaltung (und Deine klingt nach Notaus) auf direktem Weg zu wirken und nicht erst durch mehrere Geräte weitergereicht zu werden.

Gruß Tommy

Richtig, bin deiner Meinung, wollte doch nur einen Endschalter abfangen....

Geht das irgendwie, oder schlägst du eine andere Möglichkeit vor?

thx

Moment, jetzt sprichst Du von Endschaltern und vorhin von Abschaltung.
Was soll es denn nun tatsächlich werden?
Endschalter sollten direkt im System wirken. Du liest sie ja schon ein.

Was Du auf alle Fälle lassen solltest, ist die Verwendung der Stringklasse. Lies die Bytes aus client.read() lieber in ein char-Array ein. Bei Bedarf hier schauen.

Hast Du Dir mal angeschaut, wie viel der Browser sendet? Das ist nicht nur der kleine Teil, der Dich interessiert.
Bau mal einen kleinen Sketch nur mit dem Webserver auf und lass Dir mal die Betätigung eines Buttons im seriallen Monitor anzeigen.

Gruß Tommy

Moment, jetzt sprichst Du von Endschaltern und vorhin von Abschaltung.
Was soll es denn nun tatsächlich werden?
Endschalter sollten direkt im System wirken. Du liest sie ja schon ein.

Sorry, mein Fehler, meine Endschalter oben/unten (mit dem Motor wird ein Seilzug gebaut).

Was Du auf alle Fälle lassen solltest, ist die Verwendung der Stringklasse. Lies die Bytes aus client.read() lieber in ein char-Array ein. Bei Bedarf hier schauen.

Werde dies umbauen, hat dies mit dem beschriebenen Problem zu tun oder ist dies eine Perfomancesache?

Hast Du Dir mal angeschaut, wie viel der Browser sendet? Das ist nicht nur der kleine Teil, der Dich interessiert.

Nein, die Thematik Webserver ist mir relativ neu, hänge mich rein...

Bau mal einen kleinen Sketch nur mit dem Webserver auf und lass Dir mal die Betätigung eines Buttons im seriallen Monitor anzeigen.

okidoki

Danke für die Infos.

Neo

neonightmare:
Werde dies umbauen, hat dies mit dem beschriebenen Problem zu tun oder ist dies eine Perfomancesache?

Das ist eine Speicherproblematik. Die Stringklasse fragmentiert Deinen Speicher und keiner räumt (wie z.B. bei JAVA) die Leichen weg, die Dir den Speicher verstopfen.

Du hast in Deinem Code viele eigene Schleifen, aus denen Du nicht raus kommst, bis etwar erreicht ist. Damit kommen weder Deine Endschalter, noch eine Abschaltung zum Zuge.

Du hast eine große Schleife: loop. In der musst Du alles unterbringen, ohne blockierenden Code.
Suchbegriffe: Statusmaschine / state machine, BlinkWithoutDelay, Nachtwächtererklärung (kein Witz)

Gruß Tommy

Hi Thommy

Danke soweit!

Das ist eine Speicherproblematik. Die Stringklasse fragmentiert Deinen Speicher und keiner räumt (wie z.B. bei JAVA) die Leichen weg, die Dir den Speicher verstopfen.

Alles klar, Stringklasse ist gestrichen...

Du hast in Deinem Code viele eigene Schleifen, aus denen Du nicht raus kommst, bis etwar erreicht ist. Damit kommen weder Deine Endschalter, noch eine Abschaltung zum Zuge.

hmmm... welche schleifen sind relevant bzw. blockieren, dass die Statusabfrage der Digitaleingänge nicht funktionieren?

Du hast eine große Schleife: loop. In der musst Du alles unterbringen, ohne blockierenden Code.
Suchbegriffe: Statusmaschine / state machine, BlinkWithoutDelay, Nachtwächtererklärung (kein Witz)

Wie könnte ein FSM- Konstrukt mit dem Webserver aussehen? Grundsätzlich kenne ich die Konstrukte und auch das BlinkWithoutDelay (habe dies schon einen anderen Uno verwendet), für mich ist allerdings der Webserverteil das Problem...

Danke

Das Rausschreiben der Website kann normal mit den Print/Println erfolgen.
Das Lesen ist dann etwas aufwendiger:
Ungetestet, nur runter geschrieben!

Alter Code:
While (client.connected() {
  while (client.available() {
    c = client.read();
  }
}

müsste dann so was werden:

char c;
if (client.connected && client.available()) {
  c = client.read();
  Serial.print(c);
}

// aus Deinem Code umgesetzt
if (c == 10) client.stop;

Hier ist noch nicht das Schreiben in einen Buffer drin!

Schauen, wo noch while oder for drin sind.

Gruß Tommy

Hi Tommy

Danke vielmal für den Support, habe es nun verstanden und es läuft nun auch :slight_smile: :slight_smile:

Hier ein Auszug:

// Endlagen universell
    if ((endschalterUnten == LOW ) || (endschalterOben == LOW) && (endschalterState == 1))
  {
    digitalWrite(9, HIGH); //Engage the Brake for Channel A //motorStop
      Serial.println("Endschalter");
      Serial.println("----------------------------------------------");
      endschalterState = 0;
    }

  // Timebase abfragen
  actualTime = millis() - memoryTime;
  if ((actualTime  > maxTime) && (state == 1))
  {
    digitalWrite(9, HIGH); //Engage the Brake for Channel A
    memoryTime = millis();
    state = 0;
    endschalterState = 0;

  }

  if (client) {
    boolean currentLineIsBlank = true;
    if (client.connected() && client.available()) {
      c = client.read();
      Serial.print(c);

      if (req_index < (REQ_BUF_SZ - 1)) {
        HTTP_req[req_index] = c;          // save HTTP request character
        req_index++;
      }

      //if HTTP request has ended
      if (c == '\n' && currentLineIsBlank) {
        client.println("HTTP/1.1 200 OK"); //send new page
        client.println("Content-Type: text/html");
        client.println();
        client.println("<HTML>");
        client.println("<HEAD>");
        client.println("<meta name='apple-mobile-web-app-capable' content='yes' />");
        client.println("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />");
        client.println("<link rel='stylesheet' type='text/css' href='http://randomnerdtutorials.com/ethernetcss.css' />");
        client.println("<TITLE>Arduino TV-Motor Fernsteuerung</TITLE>");
        client.println("</HEAD>");
        client.println("<BODY>");
        client.println("<H1>Motor Control  Webserver</H1>");
        client.println("<hr />");
        client.println("
");
        client.println("<H2>Arduino with Ethernet/Motor Shield</H2>");
        client.println("
");
        client.println("<h1>Endschalter</h1>");
        client.println("<H2>State of Endschalter is:</H2>");
        GetSwitchState(client);
        client.println("
");
        client.println("
");
        client.println("<a href=\"/?button1on\"\">TV runterfahren</a>");
        client.println("<a href=\"/?button1off\"\">TV hochfahren</a>
");
        client.println("
");
        client.println("
");
        client.println("<a href=\"/?button2on\"\">TV  Step runterfahren</a>");
        client.println("<a href=\"/?button2off\"\">TV Step hochfahren</a>
");
        client.println("
");
        client.println("<p>modified by neonightmare, nov. 2016</p>");
        client.println("
");
        client.println("</BODY>");
        client.println("</HTML>");


        //controls the Arduino if you press the buttons
        // if (readString.indexOf("?button1on") > 0) {

        if (StrContains(HTTP_req, "?button1on")) {
          digitalWrite(7, HIGH); //Establishes forward direction of Channel A
          digitalWrite(9, LOW);   //Disengage the Brake for Channel A
          analogWrite(3, 255);   //Spins the motor on Channel A at ful =255 speed
          Serial.println("motorHoch()");
          memoryTime = millis();
          state = 1;
          endschalterState = 1;


        }

THX NEo

Glückwunsch. Schön, dass es läuft und danke für die Rückmeldung.

Gruß Tommy

Hi Tommy

Leider habe ich mich zu früh gefreut… irgendwie funktioniert das ganze nicht mehr. Die IP- Adresse sehe ich (ping i.O). allerdings erscheint die Website nicht. Kann ggf. jemand den Code testen oder hat eine Idee??
Arbeite nun mit einem Leonardo ETH (Ethernet2.lib), ein Webserversketch-Beispiel läuft:

void loop() {

  // Create a client connection
 EthernetClient client = server.available();

 // static int state = S_IDLE; // initial state is 1, the "idle" state.
 // static unsigned long ts;  // To store the "current" time in for delays.

      Serial.println(state);
      if (client) {
        boolean currentLineIsBlank = true;
       if (client.connected() && client.available()) {

          c = client.read();
          Serial.print(c);

          if (req_index < (REQ_BUF_SZ - 1)) {
            HTTP_req[req_index] = c;          // save HTTP request character
            req_index++;
          }

          //if HTTP request has ended
          if (c == '\n' && currentLineIsBlank) {
            client.println("HTTP / 1.1 200 OK"); //send new page
            client.println("Content - Type: text / html");
            client.println();
            client.println("<HTML>");
            client.println("<HEAD>");
            client.println(" < meta name = 'apple-mobile-web-app-capable' content = 'yes' / > ");
            client.println(" < meta name = 'apple-mobile-web-app-status-bar-style' content = 'black-translucent' / > ");
            client.println(" < link rel = 'stylesheet' type = 'text/css' href = 'http://randomnerdtutorials.com/ethernetcss.css' / > ");
            client.println("<TITLE>Arduino TV - Motor Fernsteuerung < / TITLE > ");
            client.println(" < / HEAD > ");
            client.println("<BODY>");
            client.println("<H1>Motor Control  Webserver < / H1 > ");
            client.println(" < hr / > ");
            client.println(" < br / > ");
            client.println("<H2>Arduino with Ethernet / Motor Shield < / H2 > ");
            client.println(" < br / > ");
            client.println("<h1>Endschalter < / h1 > ");
            client.println("<H2>State of Endschalter is: < / H2 > ");
            GetSwitchState(client);
            client.println(" < br / > ");
            client.println(" < br / > ");
            client.println(" < a href = \"/?button1on\"\">TV hochfahren</a>");
            client.println("<a href=\"/?button1off\"\">TV runterfahren</a>
");
            client.println("
");
            client.println("
");
            client.println("<a href=\"/?button2on\"\">TV  Step hochfahren</a>");
            client.println("<a href=\"/?button2off\"\">TV Step runterfahren</a>
");
            client.println("
");
            client.println("<p>modified by neonightmare, nov. 2016</p>");
            client.println("
");
            client.println("</BODY>");
            client.println("</HTML>");

            //controls the Arduino if you press the buttons
            if (StrContains(HTTP_req, "?button1on")) {
              state = S_UP;
              ts = millis();
            }
            if (StrContains(HTTP_req, "?button1off")) {
              state = S_DOWN;
              ts = millis();
            }
            if (StrContains(HTTP_req, "?button2on")) {
              state = S_STEPUP;
            }
            if (StrContains(HTTP_req, "?button2off")) {
              state = S_STEPDOWN;
            }

            // display received HTTP request on serial port
            Serial.print(HTTP_req);
            // reset buffer index and all buffer elements to 0
            req_index = 0;
            StrClear(HTTP_req, REQ_BUF_SZ);

          } //if c==
          // every line of text received from the client ends with \r\n
          if (c == '\n') {
            // last character on line of received text
            // starting new line with next character read
            currentLineIsBlank = true;
          }
          else if (c != '\r') {
            // a text character was received from client
            currentLineIsBlank = false;
          }
           } // if client.available

        delay(1);
        //stopping client
        if (c == 10) client.stop();
         } // if client

      delay(1);
    //  break; //S_IDLE


} //loop
////////////////////////FUNCTIONS////////////////////////////////////////////////////////

void GetSwitchState(EthernetClient cl)
{
  if (!digitalRead(endschalterObenPin))  {
    cl.println("<p>ON Endschalter unten</p>");
  }

  else if
  ( !digitalRead(endschalterUntenPin)) {
    cl.println("<p>ON Endschalter oben</p>");
  }

  else {
    cl.println("<p>OFF</p>");
  }
}


// sets every element of str to 0 (clears array)
void StrClear(char *str, char length)
{
  for (int i = 0; i < length; i++) {
    str[i] = 0;
  }
}

// searches for the string sfind in the string str
// returns 1 if string found
// returns 0 if string not found
char StrContains(char *str, char *sfind)
{
  char found = 0;
  char index = 0;
  char len;

  len = strlen(str);

  if (strlen(sfind) > len) {
    return 0;
  }
  while (index < len) {
    if (str[index] == sfind[found]) {
      found++;
      if (strlen(sfind) == found) {
        return 1;
      }
    }
    else {
      found = 0;
    }
    index++;
  }

  return 0;
}

thx Neo

Wie soll jemand den Code testen, wenn Du ihn nicht komplett postest?

Aber Du hast ja geschrieben, es funktioniert. Was hast Du danach noch geändert?

Ich habe keinen Leonardo, kann also nicht testen.

Gruß Tommy

:confused:

eigentlich habe ich nichts geändert…

kann es sein, dass beim Aufrufen der Seite, welche noch im Browsercache ist/war dies funktioniert hat, bei einem neuen reload dies nicht mehr funktioniert?

Der Wechsel auf Leonardo ETH ist meiner Meinung nach irrellevant, hatte das selbe Verhalten auch schon mit dem Ethernetshield.

Anbei der Code, aktuell mit deaktivierter Case-STruktur zum reinen Testen des WEbserver-Verhaltens…

Vielen Dank.

THX Neo

arduino_with_ethernet_shield_motor_timer_endswitch_FSM_TESTING.ino (17.5 KB)

Ich habe mir nicht alles angeschaut. Warum verwendest Du eine eigene Suchroutine StrContains und nicht die Standardfunktion strstr?

“Funktioniert nicht” ist auch etwas stark unscharf.
Was funktioniert nicht? Kompiliert nicht, zeigt nichts an (was sagt der Seitenquelltext?), steuert nichts?

Gruß Tommy

Hallo Thommy

So, hatte nun wieder Zeit ein wenig zu tüftlen (kurz Babypause 8) … )

Status: mit Keypad 1-4 kann ich nun den Motor ansteuern und die Endschalterabfrage inkl. Timerfunktion läuft.

Allerdings: Der Webserver funktionierte nur ganz kurz beim ersten Versuch/Upload, (statt einer schönen Html-Seite erschien aber nur Text, also keine Buttons, der Aufruf http://192.168.1.88/?button1on funktionierte aber), nun wird seither im Browser nichts angezeigt, habe nichts im Code modifiziert ?!. Pingen kann ich das Board…

Hier der Ausschnitt des loops, welche den webserver betrifft:

 if (client) {
    boolean currentLineIsBlank = true;
    if (client.connected() && client.available()) {
      c = client.read();
    //  Serial.print(c);

      if (req_index < (REQ_BUF_SZ - 1)) {
        HTTP_req[req_index] = c;          // save HTTP request character
        req_index++;
      }

      //if HTTP request has ended
      if (c == '\n' && currentLineIsBlank) {
        client.println("HTTP / 1.1 200 OK"); //send new page
        client.println("Content-Type:text/html");
        client.println();
        client.println("<HTML>");
        client.println("<HEAD>");
        client.println("< meta name = 'apple-mobile-web-app-capable' content = 'yes' / > ");
        client.println("< meta name = 'apple-mobile-web-app-status-bar-style' content = 'black-translucent' / > ");
        client.println("< link rel = 'stylesheet' type = 'text/css' href = 'http://randomnerdtutorials.com/ethernetcss.css' / > ");
        client.println("<TITLE>Arduino TV - Motor Fernsteuerung < / TITLE > ");
        client.println(" < / HEAD > ");
        client.println("<BODY>");
        client.println("<H1>Motor Control  Webserver < / H1 > ");
        client.println(" < hr / > ");
        client.println(" < br / > ");
        client.println("<H2>Arduino with Ethernet / Motor Shield < / H2 > ");
        client.println(" < br / > ");
        client.println("<h1>Endschalter < / h1 > ");
        client.println("<H2>State of Endschalter is: < / H2 > ");
        GetSwitchState(client);
        client.println(" < br / > ");
        client.println(" < br / > ");
        client.println(" < a href = \"/?button1on\"\">TV hochfahren</a>");
        client.println("<a href=\"/?button1off\"\">TV runterfahren</a>
");
        client.println("
");
        client.println("
");
        client.println("<a href=\"/?button2on\"\">TV  Step hochfahren</a>");
        client.println("<a href=\"/?button2off\"\">TV Step runterfahren</a>
");
        client.println("
");
        client.println("<p>modified by neonightmare, nov. 2016</p>");
        client.println("
");
        client.println("</BODY>");
        client.println("</HTML>");


        //controls the Arduino if you press the buttons

        if (StrContains(HTTP_req, "?button1on")) {
          digitalWrite(12, HIGH); //Establishes forward direction of Channel A
          digitalWrite(9, LOW);   //Disengage the Brake for Channel A
          analogWrite(3, 255);   //Spins the motor on Channel A at ful =255 speed
          Serial.println("motorHoch()");
          memoryTime = millis();
          state = 1;
          myStatus = 2;

        }
        if (StrContains(HTTP_req, "?button1off")) {
          //backward @ half speed
          digitalWrite(12, LOW); //Establishes backward direction of Channel A
          digitalWrite(9, LOW);   //Disengage the Brake for Channel A
          analogWrite(3, 255);   //Spins the motor on Channel A at ful speed
          Serial.println("motorRunter()");
          memoryTime = millis();
          state = 1;
          myStatus = 3;

        }
        if (StrContains(HTTP_req, "?button2on")) {
          //forward @ half speed
          digitalWrite(12, HIGH); //Establishes forward direction of Channel A
          digitalWrite(9, LOW);   //Disengage the Brake for Channel A
          analogWrite(3, 255);   //Spins the motor on Channel A at ful =255 speed
          delay(stepTime);
          digitalWrite(9, HIGH); //Engage the Brake for Channel A
          myStatus = 2;

        }
        if (StrContains(HTTP_req, "?button2off")) {
          //forward @ half speed
          digitalWrite(12, LOW); //Establishes forward direction of Channel A
          digitalWrite(9, LOW);   //Disengage the Brake for Channel A
          analogWrite(3, 255);   //Spins the motor on Channel A at ful =255 speed
          delay(stepTime);
          digitalWrite(9, HIGH); //Engage the Brake for Channel A
          myStatus = 3;
        }

        // display received HTTP request on serial port
        Serial.print(HTTP_req);
        // reset buffer index and all buffer elements to 0
        req_index = 0;
        StrClear(HTTP_req, REQ_BUF_SZ);


      } //if c==
      // every line of text received from the client ends with \r\n
      if (c == '\n') {
        // last character on line of received text
        // starting new line with next character read
        currentLineIsBlank = true;
      }
      else if (c != '\r') {
        // a text character was received from client
        currentLineIsBlank = false;
      }
      // } // if client.available
    } // while client.connected

    delay(1);
    //stopping client
    if (c == 10) client.stop();

  } // if client
} //loop

Wie kann ich dies debuggen bzw. ist irgendwas offensichtlich falsch?

Big THX
Neo

MyHalterung_V0.3.ino (12.4 KB)

Schreibe in die Auswertungsteile mehr Serial.println-Aufrufe rein, die Dir die Steuervariablen (wie currentLineIsBlank ) anzeigen. Das hilft, den Fehler einzugrenzen.
Stelle bitte auch wieder den Code in Code-Tags, wenn Du willst, dass ihn jemand liest.

Gruß Tommy

Hi Tommy

So, die Hardware ist fertig, und der Code funktioniert mit dem Tasten, habe nun den Webserver angepasst/eine andere Version impementiert. Nun erhalte ich als Serielle Ausgabe im Monitor immer client disonnected via Ping antortet das Leonardo.

hier der code de Leonardo ETH als Ausschnitt, ohne KeypadEventhandling:

#include <SPI.h>
#include <Ethernet2.h>
#include <Keypad.h>

byte mac[] = { 0xDA, 0xA2, 0xDA, 0x1F, 0xA3, 0x27 };   //physical mac address

byte ip[] = { 192, 168, 1, 88};                      // ip in lan (that's what you need to use in your browser. ("192.168.1.179")
byte gateway[] = { 192, 168, 1, 1 };                   // internet access via router
byte subnet[] = { 255, 255, 255, 0 };                  //subnet mask

EthernetServer server(80);                             //server port

boolean  endschalterOben;
boolean  endschalterUnten;

const int endschalterObenPin = A4;
const int endschalterUntenPin = A5;


// Defition Keypad
const byte rows = 4; //four rows
const byte cols = 1; //three columns
char keys[rows][cols] = {
  {'1'},    //hoch
  {'2'},    //step hoch
  {'3'},    //step runter
  {'4'}       //runter
};
byte rowPins[rows] = {2, 10, 6, 5}; //connect to the row pinouts of the keypad   2:pink   10:gelb   6:braun   5:rot
byte colPins[cols] = {7}; //connect to the column pinouts of the keypad //PIN 7 kann auf A3 falls noetig !!! 14=A0; 15=A1; 16=A2; 17=A3

// nicht verwendtbar: 4, 12, 9, 3,
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, rows, cols );

char key = 0;


// Timer funktionen
unsigned long      stepTime     =   2000; // ( 2 * 1000) = 4s;
unsigned long      maxTime     =   30000; // ( 2 * 1000) = 90s;
unsigned long      memoryTime;
unsigned long      actualTime;

int state = 0;
int myStatus = 0;


// Client variables
char linebuf[80];
int charcount = 0;


void setup() {

  // disable the SD card by switching pin 4 high
  // not using the SD card in this program, but if an SD card is left in the socket,
  // it may cause a problem with accessing the Ethernet chip, unless disabled
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);

  // Open serial communications and wait for port to open
  // start the Ethernet connection and the server:
  Serial.begin(9600);
  Ethernet.begin(mac, ip, gateway, subnet);
  //Ethernet.begin(mac, ip);

  //Ethernet.begin(mac);  //DHCP

  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());


  //Endschalter - Initialisierung
  pinMode(endschalterObenPin, INPUT_PULLUP); //Digital- In to Ground, Endschalter oben / LOW-Aktiv  // ALS Digital I/O
  pinMode(endschalterUntenPin, INPUT_PULLUP); //Digital- In to Ground, Endschalter unten


  //Keypad - Eventdefinition
  keypad.addEventListener(keypadEvent); // Add an event listener for this keypad


  // Motor Code - neu
  /*************************************************************
    Motor Shield 1-Channel DC Motor Demo
    by Randy Sarafan
    For more information see:
    http://www.instructables.com/id/Arduino-Motor-Shield-Tutorial/
  **************************************************************/

  //Setup Channel A
  pinMode(12, OUTPUT); //Initiates Motor Channel A pin
  pinMode(9, OUTPUT); //Initiates Brake Channel A pin

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

  digitalWrite(9, HIGH); //Engage the Brake for Channel A

  Serial.println("Setup initialisiert!");
  Serial.println("----------------------------------------------");

}//setup ////////////////////////////////////////


// Display dashboard page with on/off button for relay
// It also print Temperature in C and F
void dashboardPage(EthernetClient &client) {
  client.println("<!DOCTYPE HTML><html><head>");
  client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"></head><body>");
  client.println("<h3>Arduino Web Server TV Halterung - <a href=\"/\">Refresh</a></h3>");
  // Generates buttons to control the relay
  client.println("<h4>TV Halterung Control </h4>");
  // If relay is off, it shows the button to turn the output on
  client.println(" < a href = \"/?button1on\"\">TV hochfahren</a>");
  client.println("<a href=\"/?button1off\"\">TV runterfahren</a>
");
  client.println("
");
  client.println("
");
  client.println("<a href=\"/?button2on\"\">TV  Step hochfahren</a>");
  client.println("<a href=\"/?button2off\"\">TV Step runterfahren</a>
");
  client.println("</body></html>");
}


void loop() {
  char key = keypad.getKey();
  if (key) {
    Serial.println(key);
  }
  endschalterOben = digitalRead(endschalterObenPin);
  endschalterUnten = digitalRead(endschalterUntenPin);

  if ((endschalterOben == LOW) && (myStatus == 2)) {
    digitalWrite(9, HIGH); //Engage the Brake for Channel A
    myStatus = 0;
    state = 0;
    Serial.println("Endschalter oben erreicht!");
  }


  if ((endschalterUnten == LOW) && (myStatus == 3)) {
    digitalWrite(9, HIGH); //Engage the Brake for Channel A
    myStatus = 0;
    state = 0;
    Serial.println("Endschalter unten erreicht!");
  }


  // Timebase abfragen
  actualTime = millis() - memoryTime;
  if ((actualTime  > maxTime) && (state == 1))
  {
    digitalWrite(9, HIGH); //Engage the Brake for Channel A
    memoryTime = millis();
    state = 0;
    Serial.println("Zeitüberschreitung!");
  } 


  // listen for incoming clients
  EthernetClient client = server.available();
  
  if (client) {
    Serial.println("new client");
    memset(linebuf, 0, sizeof(linebuf));
    charcount = 0;
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        //read char by char HTTP request
        linebuf[charcount] = c;
        if (charcount < sizeof(linebuf) - 1) charcount++;
        // 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) {
          dashboardPage(client);
          break;
        }
        if (c == '\n') {
          if (strstr(linebuf, "GET ?button1on") > 0) {
            digitalWrite(12, HIGH); //Establishes forward direction of Channel A
            digitalWrite(9, LOW);   //Disengage the Brake for Channel A
            analogWrite(3, 255);   //Spins the motor on Channel A at ful =255 speed
            Serial.println("motorHoch()");
            memoryTime = millis();
            state = 1;
            myStatus = 2;
          }
          else if (strstr(linebuf, "GET ?button1off") > 0) {
            digitalWrite(12, LOW); //Establishes backward direction of Channel A
            digitalWrite(9, LOW);   //Disengage the Brake for Channel A
            analogWrite(3, 255);   //Spins the motor on Channel A at ful speed
            Serial.println("motorRunter()");
            memoryTime = millis();
            state = 1;
            myStatus = 3;
          }
          else if (strstr(linebuf, "GET ?button2on") > 0) {
            digitalWrite(12, HIGH); //Establishes forward direction of Channel A
            digitalWrite(9, LOW);   //Disengage the Brake for Channel A
            analogWrite(3, 255);   //Spins the motor on Channel A at ful =255 speed
            delay(stepTime);
            digitalWrite(9, HIGH); //Engage the Brake for Channel A
            myStatus = 2;
          }
          else if (strstr(linebuf, "GET ?button2off") > 0) {
            digitalWrite(12, LOW); //Establishes forward direction of Channel A
            digitalWrite(9, LOW);   //Disengage the Brake for Channel A
            analogWrite(3, 255);   //Spins the motor on Channel A at ful =255 speed
            delay(stepTime);
            digitalWrite(9, HIGH); //Engage the Brake for Channel A
            myStatus = 3;
          }

          // you're starting a new line
          currentLineIsBlank = true;
          memset(linebuf, 0, sizeof(linebuf));
          charcount = 0;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      } //if client avaiable
    } //while
  } // if client
  // give the web browser time to receive the data
  delay(1);
  // close the connection:
  client.stop();
  Serial.println("client disonnected");

} //loop

THX for the help
Neo

Schließe mal die Zeichenkette nach dem Einlesen ordentlich ab und lass sie Dir dan ausgeben. Es scheint, als würden Deine Bedingungen nicht erfüllt werden.

if (c == '\n') { // das ist in Deinem Code schon da.
  linebuf[charcount] = '\0';  // Zeichenkette abschließen
  Serial.println(linebuf);
  ... // Weiter in Deinem Code

Informiere Dich mal etwas über Zeichenketten in C.

Gruß Tommy