WiFi: myServo.write(180); verhindert neuladen von webserver

Hallo zusammen,

den Code

if (currentLine.endsWith("GET /L")) {                                          // wenn die aktuelle Line mit /L endet, dann Test-LED aus
          digitalWrite(13, LOW);
          Serial.println("check_aus");          
   }

benutze ich, um eine LED-Auszuschalten, wenn die Seite 192.168.0.12/L aufgerufen wird.
Füge ich nun allerdings einen Servo-Befehl hinzu, stürzt meine App ab, weil der Servo quasi in einer endlosschleife die 180 Grad hält und ich keinen neuen Befehl an den webserver schicken kann:

if (currentLine.endsWith("GET /L")) {                                          // wenn die aktuelle Line mit /L endet, dann Test-LED aus
          digitalWrite(13, LOW);
          Serial.println("check_aus"); 
          myServo.write(180);
   }

Wie kann ich dieses Problem umgehen?

Grüße

Hallo,

das glaube ich ehr nicht, warum soll der in der Zeile Servo.write(180) hängen bleiben. Dann könnte man ja nie zwei Positionen nacheinander anfahren.

loop{
  delay(500);
  Servo.write(120);
  delay(500);
  Servo.write(0);
}

düfte dann ja auch nicht funktionieren

Du muss hat dafür sorgen das die Zeile nur einmal aufgerufen wir und nicht immer wieder. Setze einen Statusmerker nach dem ersten Durchlauf.

nicht getestet

bool status;

if (currentLine.endsWith("GET /L")) { // wenn die aktuelle Line mit /L endet, dannTest-LED aus
  if (! status){         
       status=true; 
        digitalWrite(13, LOW);
         Serial.println("check_aus");
         myServo.write(180);
   }
}

else status=false;

sowas in der Art

Heinz

Was für eine App stürzt ab?
Was ist eine “App”, was bedeutet “abstürzen”?
Aber eigentlich will ich das gar nicht wissen. Es geht eher darum, dass deine Frage völlig unverständlich ist.

Das Problem, wenn man eine Glaskugel fragt, liegt eher darin, dass du die Serielle andauernd mit “check_aus\n” vollmüllst, wenn das überhaupt ein Problem in der von dir vermuteten Richtung ist. Aber zu diesem “überhaupt” hat meine Glaskugel arge Bedenken.

Hallo Heinz,

Danke für den Tipp. Vereinfacht gesagt ist das Problem einfach nur, dass ich den Servo abschalten will. Kann man das überhaupt machen? Weil vom Ding her ist das ja ein Positionierer, der immer Input braucht.

Grüße

oppaernst:
vom Ding her ist das ja ein Positionierer,

Den dauernden Input kriegt es im Prinzip von der Library, die per Hardware die letzte PPM-Einstellung permanent wiederholt, bis ein neues write, oder ein servo.detach oder was anderes, was die Hardware an dem Pin stört, kommt.

Hallo,

ja mein Problem scheint zu sein, dass sobald der Servo einen Befehl ausgeführt hat, z.B. myServo.write(90), der webserver nicht mehr ansprechbar ist. Wenn ich den Befehl myServo.write(90) auskommentiere, klappt die Kommunikation mit dem webserver einwandfrei.

Was kann ich da machen?

Hallo,

ja das sieht derzeit so aus:
Das Problem ist, dass ich nicht mehr mit dem Webserver kommunizieren kann, sobald der Servo einen Befehl ausgeführt hat. Grüße

#include <SPI.h>
#include <WiFiNINA.h>
//
#include <Servo.h>                                                            // Inkludieren Bibliothek fuer Servo
Servo myServo;
//
#include "arduino_secrets.h" 
//
char incomingByte;                                                            // Eingehende Bytes fuer Trigger Serial Monitor
//
char ssid[] = " ";
char pass[] = " ";
int keyIndex = 0;
int status = WL_IDLE_STATUS;
//
WiFiServer server(80);
//
//
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//        VOID SETUP
//
//
//  0.)
void setup() {
//    
Serial.begin(9600);                                                           // Starten des Serial Monitors mit Baudrate 9600 
//
  while (!Serial) {                                                           //Warten, bis die serielle Schnittstelle verbunden ist
  ;                             
  }
//

if (WiFi.status() == WL_NO_MODULE) {                                          // Wenn die Kommunikation mit dem WiFi-Modul fehltschlägt, dann Meldung
  Serial.println("Communication with WiFi module failed!");
  while (true);
 } 
//
String fv = WiFi.firmwareVersion();
if (fv < WIFI_FIRMWARE_LATEST_VERSION) {                                      // Wenn die aktuelle Firmware-Version veraltet ist, dann Meldung, dies zu beheben
    Serial.println("Please upgrade the firmware");
  }
//
while (status != WL_CONNECTED) {                                              // Wenn Kommunikation mit dem WiFi-Modul erfolgreich etabliert, dann Meldungen zu WFi ausgeben
  Serial.print("Attempting to connect to SSID: ");
  Serial.println(ssid);
  status = WiFi.begin(ssid, pass);
  delay(10000); 
  }  
//
server.begin();                                                               // start listening for incoming connections (start listening for clients) 
printWifiStatus();
//
myServo.attach(6);                                                            // Servo wird auf PIN 6 gelegt
pinMode(7, OUTPUT);                                                           // PIN 7 ist ein OUTPUT (Interrupt-PIN 
pinMode(8, OUTPUT);
attachInterrupt(digitalPinToInterrupt(7), check_led, RISING);                  // Interrupt fuer check_led, um Servo zu interrupten
//
}
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//        VOID LOOP
//
void loop() {
//  
//
//  1.)
WiFiClient client = server.available();                                       // Abfrage, ob WiFi-Client verfuegbar ist
  if (client) {                                                               // Wenn der Client verfuegbar ist, dann
  String currentLine= "";                                                     // einen leeren String namens currentLine anlegen
//
    while (client.connected()) {                                              // waehrend der Client verfuegbar ist, tue
      if (client.available()) {                                               // wenn der Client verfuegbar ist, dann
        char c = client.read();                                               // in c wird die Info, die aus dem Client kommt, geschrieben
//
          if (c == '\n') {                                                    // wenn ein Newline-Character auftritt ... 
            if (currentLine.length() == 0) {                                  // ...und die Laenge des Newline-Characters Null ist
              client.println("HTTP/1.1 200 OK");
              client.println("Content-Type:text/html");
              client.println();  // the connection will be closed after completion of the response
              client.print("Value at A0 is ");  // refresh the page automatically every 5 sec
              client.print(analogRead(A0));
              client.print("
");
              client.println();
              break;
              }
           else {                   
             currentLine = "";
             }
           } else if (c != '\r') {                                             // wenn ein Character in der current line ist, dann
              currentLine += c;                                                // currentLine = currentLine +c
              }
//
//              
if (currentLine.endsWith("GET /O")) {                                          // wenn die aktuelle Line mit /M 
myServo.write(45);
delay(1000);
myServo.write(90);
delay(1000);
digitalWrite(7, HIGH);
delay(2000);
Serial.println("check_fertig"); 
}
//
//
//       
if (currentLine.endsWith("GET /P")) {                                          // wenn die aktuelle Line mit /P endet, 
//
digitalWrite(8, HIGH);
//
//      
   }                                                                           // Ende if client available
  }                                                                            // Ende if client connected                               
client.stop();                                                                 // Client stop 
}                                                                             // Ende if client
}                                                                              // Ende void loop
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//        VOIDS
//
//  Interrupt fuer Servo-Shutdown ???
//
void check_led() {
digitalWrite(7, LOW);
}
//
//
// WiFi-Status printen
//
void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your board's IP address:
  Serial.print(F("IP: "));Serial.println(WiFi.localIP());
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

Ja ich bin auf einem Uno.
Wie welches WiFi? Wie kann ich den Link setzen?
Schaltplan Nein. Echtbild Nein.

Das Projekt ist zu kompliziert. Aber an sich funktioniert ja alles. Ich habe nur das Problem, dass eben -sobald der Servo eine Position angefahren hat, keine Kommunikation mit dem webServer via z.B. "192.168.0.12/L" mehr möglich ist.

Hallo,

hast Du das mit dem statusmerker mal probiert ?

Heinz