Arduino EthernetServer mit Interrupt

Ich habe eine Arduino-Anwendung, die zwei Dinge in der tut loop:

  1. Ein Webserver, der auf eine Verbindung wartet und einige HTML-Formulare darstellt, um Konfigurationswerte zu ändern.
  2. Verarbeiten Sie einige externe Daten und zeigen Sie sie auf einer LED-Matrix an.

Das Problem ist, dass die Verarbeitung der Daten viel Zeit in Anspruch nimmt (~20 Sekunden). Während dieser Zeit kann der Webserver also nichts tun. Meine Programmstruktur sieht so aus:

EthernetServer server(80);

void loop() {
  webServer()

  processAndShowData();
}

void webServer() {
  EthernetClient serverClient = server.available();

  if (serverClient) {
    while (serverClient.connected() {
      // handle the web server stuff in here
    }
  }
}

Meine Frage ist also, ob es eine Möglichkeit gibt, einen Interrupt-Handler für die Handhabung des Webserver-Zeugs zu verwenden? Dann könnte der Webserver reagieren, während die andere Task läuft.


UPDATE: Ich habe jetzt auch versucht, einen Interrupt an die Ethernet-Pins (bei einem Mega sind das 50, 51 und 52) zu legen, aber das geht auch nicht. ich habe etw. ausprobiert so was:

attachInterrupt(50, demoFunction, CHANGE);

Aber die Methode wird nicht aufgerufen, selbst wenn die Pins auf 51 oder 52 auf beiden geändert werden, Eingabe von einem Client wie eine HTTP-Anforderung und Ausgabe, die HTML an einen Browser sendet.

Antworten (2)

In Arduino-Sketches loop()wird die Funktion wiederholt aufgerufen. Ihre Schleifenfunktion ruft auf, webServer()die dann in einer whileSchleife blockiert.

Verwenden Sie stattdessen if (serverClient.connected())in Ihrer Schleife und implementieren Sie Ihre Webserverlogik als Zustandsmaschine, die in der Lage ist, ein wenig Arbeit zu erledigen und dann die Kontrolle an die Hauptschleife zurückzugeben.

Auf diese Weise wird Ihr Programm die Ausführung nicht blockieren.

Oh sry falls die Frage nicht klar war. processAndShowData();blockiert, also nicht webServer();während der Verarbeitung der Daten, der Webserver kann nicht auf Antworten reagieren. (Eigentlich versuche ich, die Verarbeitung mit Interrupts durchzuführen)
Brechen Sie also processAndShowData() in eine Zustandsmaschine auf, die bei jedem Aufruf ein wenig Arbeit erledigt
Versucht, das funktioniert für die meisten Fälle, aber nicht für mich. Da dieser Teil des Codes bei jeder Schleife auf eine Matrix von LEDs zeichnet, wird der Text auf der Matrix um 1 Pixel (LED) nach links verschoben. Aber wenn ich jetzt den Webserver verwende, beginnt die LED-Matrix zu verzögern, während der Server seine Antwort sendet.
Fahren Sie die LED-Anzeige aus dem Interrupt-Kontext eines Timers ( arduino.cc/playground/code/timer1 ). Verwenden Sie eine Zustandsmaschine in Ihrer loop()-Funktion, um eine globale Variable/Array mit den zu schreibenden Daten zu aktualisieren.

Für alle anderen mit dem gleichen Problem habe ich folgendes gemacht:

#include <SPI.h>
#include "TimerOne.h"

void setup() {
  Timer1.initialize(200000);
  Timer1.attachInterrupt(displayInterrupt);
}

void loop() {
  webServer();
}

void displayInterrupt() {
  processAndShowData();
}

processAndShowDataist nun keine Sperrmethode mehr, bei jedem Aufruf des Interrupts wird eine kleine Datenmenge verarbeitet.

Um den Timer-Interrupt zu verwenden, habe ich die TimerOne-Bibliothek hinzugefügt .

Hoffe, das wird jemandem helfen.