WiFi-Server hängt sich auf

Hallo zusammen,

ich habe ein recht komplexes Problem. Ich habe eine App entwickelt und auf mein Handy gespielt. Mit der App kann ich per WiFi Zahlen an mein Arduino schicken. Anschließend wird ein DC-Motor dann auf diese Zahlen eingeregelt (sprich er fährt einen bestimmten Drehwinkel an und bleibt dann stehen). Die Regelung wird mit

if (currentLine.endsWith("GET /P")) { ...

gestartet, d.h. sobald der Server die Info 192.168.0.170/P bekommt, beginnt die Regelung. Das funktioniert auch alles einwandfrei, aber sobald der Prozess der Regelung abgeschlossen ist, scheint sich das System irgendwie aufzuhängen. Ich kann also keinen neuen Befehl mehr ausführen, um z.B. eine LED über den Befehl

if (currentLine.endsWith("GET /H")) { ...

anzuschalten.

Das einzige, was ich machen kann ist, das Arduino neuzustarten. Dann kann ich den Prozess der Regelung des DC-Motors wieder genau 1x durchführen, bevor wieder alles abstürzt.

Hat jemand eine Ahnung, was ich in etwa meine und was das Problem sein könnte? Ich könnte gerne ein Minimalbeispiel erstellen, falls das notwendig ist. Das ganze Problem scheint mir aber sehr komplex. Gerne könnte man auch ein Online-Meeting machen, dann zeige ich einfach mal, worum es eigentlich geht. Das Problem ist recht komplex, allein schon wegen der App-Steuerung.

Viele Grüße

Mit dem kleinem Schnipsel kann dir keiner halfen, leider.
Ohne Sketsch wird wohl nix

...also ich konnte das Problem jetzt eindampfen. Es liegt wohl an den Servo's.

Das heißt: Der Betrieb des Servos führt irgendwie dazu, dass sich mein Server aufhängt. Kann man den Servo denn irgendwie "killen", bzw. im laufenden Programm auf "Anfangszustand" setzen?

Viele Grüße

Da kommen die nächste Fragen, wie werden die Angesteuert, was für Spannung, was für Treiber wird benutzt, ist die Versorgungspannung separat? (Schaltplan zeigen)
Wen er hängt ist in 75% EMV Problem

Die Servos werden direkt über das Arduino betrieben. Sprich ich nutze auch die Spannungsversorgung für alle Servos vom Arduino. Der DC-Motor wird über eine externe Spannungsquelle betrieben.

Das ist Dein Problem. Das kann er nicht stemmen. Die brauchen eine eigene Versorgung.

Gruß Tommy

Hm bist du dir sicher? Viel hängt da ja in meinem Minimodell gerade nicht dran. Eingentlich nur eine LED und ein Servomotor. Trotzdem loopt er sich irgendwie raus der Webserver.

Bau doch einfach mal eine besondere Ausgabe ins setup ein. Dann siehst Du, ob er neu bootet. Bei einem ESP (dafür spricht der Webserver) ist das fast garantiert oder die Störimpulse bringen ihn außer Takt.

Gruß Tommy

Ok, wie meinst du das mit der besonderen Ausgabe im Setup. Meinst du das void setup() { .. } oder einen anderen Befehl an anderer Stelle? Grüße

innerhalb von setup() eine Ausgabe auf den seriellen Monitor. Beispiele findest Du in den Beispielen der IDE.

Gruß Tommy

Also ich poste hier mal mein "Minimalbeispiel". Es sollte lauffähig sein, wenn man einfach im Browser die IP+/H oder /L oder /P eingibt. Aber die paar Zeilen

if (currentLine.endsWith("GET /P")) {                                          
myServo2.write(90);
delay(1000);
myServo2.write(0);
delay(1000);
myServo2.write(90);
}

führe einfach zum Absturz.

Hier das Minimalbeispiel:

#include <SPI.h>
#include <WiFiNINA.h>
//
#include <Servo.h>                                                            // Inkludieren Bibliothek fuer Servo
Servo myServo2;
int counter=0;                                                                // Counter fuer das Auslesen der Zufallskartenwerte
int z=-1;                                                                     // Zaehler zum Speichern der Zufallskartenwerte im integer karte
char scp[128];
int karte[52];                                                                // Speicher-Integer fuer die Zufallskartenwerte zur Weiterverarbeitung
//
char incomingByte;                                                            // Eingehende Bytes fuer Trigger Serial Monitor
//
char ssid[] = "CleanCastleAbbey";
char pass[] = "jpxmxcKzus2z";
int keyIndex = 0;
int status = WL_IDLE_STATUS;
//
WiFiServer server(80);
//
//
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//        VOID SETUP
//
//
void setup() {
//    
Serial.begin(9600);                                                           // Starten des Serial Monitors mit Baudrate 9600 
Serial.println("bla");
//
  while (!Serial) {                                                           //Warten, bis die serielle Schnittstelle verbunden ist
  ;                             
  Serial.println("bla2");
  }
//

if (WiFi.status() == WL_NO_MODULE) {                                          // Wenn die Kommunikation mit dem WiFi-Modul fehltschlägt, dann Meldung
  Serial.println("Communication with WiFi module failed!");
  Serial.println("bla3");
  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 WiFi 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();
Serial.println("bla4");
//
myServo2.attach(8);                                                           // Servo2 wird auf PIN 8 gelegt (Servo zum Kalibrieren)
myServo2.write(0);                                                            // Servo2 wird auf Null gefahren
pinMode(7, OUTPUT);                                                           // PIN 7 ist ein OUTPUT fuer Kontrolllampe (LED an/aus)
}
//
//
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//        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("<br>");
              client.println();
              break;
              }
           else {
  if (counter ==1) {                                                          // Programm zum Speichern der als String uebermittelten Zufallszahlen in einem Array karte
  z=-1; 
  Serial.println(F("\nProgrammstart"));
  Serial.println(currentLine.indexOf('['));
  Serial.println(currentLine.lastIndexOf(']'));
  Serial.println(currentLine);
  currentLine = currentLine.substring(1 + currentLine.indexOf("["), currentLine.lastIndexOf(']'));
  removestr(currentLine, "%22");
  Serial.println(currentLine);
  removestr(currentLine, "%20");
  Serial.println(currentLine);
  removestr(currentLine, ",[]");
  Serial.println(currentLine);
  const char * stri = currentLine.c_str();
  Serial.println(stri);
  strcpy(scp, stri);
  Serial.println(scp);
  char * pch;
  pch = strtok (scp, ",");
  while (pch != NULL)
  {
    z=z+1;
    Serial.print(pch);
    Serial.print('\t');
    Serial.println(atoi(pch));
    karte[z]=atoi(pch);                                                        // Achtung !!! karte enthält nicht nur alle Karten, sondern als letzten zahlenbehafteten Eintrag auch die Anzahl der Spieler
    pch = strtok (NULL, " ,.-");
    } 
  for(int i = 0; i < 22; i++){
  Serial.println(karte[i]);
  } 
 }
counter=counter+1;       
//
//                      
             currentLine = "";
             }
           } else if (c != '\r') {                                             // wenn ein Character in der current line ist, dann
              currentLine += c;                                                // currentLine = currentLine +c
              }
//
//
//  2.1)
if (currentLine.endsWith("GET /H")) {                                          // wenn die aktuelle Line mit /H endet, dann Test-LED an
          digitalWrite(7, HIGH);
          Serial.println("check_an");
}                                                                              
//
//
//  2.2)        
if (currentLine.endsWith("GET /L")) {                                          // wenn die aktuelle Line mit /L endet, dann Test-LED aus
          digitalWrite(7, LOW);
          Serial.println("check_aus");          
   }
//
//
//  2.4)       
if (currentLine.endsWith("GET /P")) {                                          // wenn die aktuelle Line mit /P endet, dann folgt der POKER-CODE
myServo2.write(90);
delay(1000);
myServo2.write(0);
delay(1000);
myServo2.write(90);
}
//
//
//      
   }
   // Ende if client available
  }                                                                            // Ende if client connected                               
Serial.println("bla5");
client.stop();                                                                 // Client stop 
 }                                                                             // Ende if client
}

//
// 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");
}
//
//
void removestr(String& aString, const char* str2Remove) {

  size_t len = aString.length();
  if (len == 0) return ;

  size_t len2Remove = strlen(str2Remove);
  if (len2Remove == 0) return;

  char str[len + 1];
  memcpy(str, aString.c_str(), len + 1);

  char *readFrom = str;
  char *foundAt;
  while ((foundAt = strstr(readFrom, str2Remove)) != NULL) {
    memmove(foundAt, foundAt + len2Remove, (readFrom + len) - (foundAt + len2Remove) + 1); // move the '\0' at the same time
    readFrom = foundAt;
    len -= len2Remove;
  }
  aString = str;
}

Grüße

Evtl. wäre es mal sinnvoll, wenn Du uns mitteilst, welchen Arduino Du benutzt.

Gruß Tommy

Ich nutze den Arduino Uno WiFi Rev2. Grüße

Danke für die guten Tipps. Ich hab jetzt BEIDE Servos an eine externe Stromquelle gehängt und jetzt klappt alles :smiley: Vielen Dank. Damit habe ich ein Projekt, was viel Geld gekostet hat (1000€) und auch viel Zeit gekostet hat endlich technisch gesehen fertig. Grüße

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.