Arduino EthernetServer con interrupción

Tengo una aplicación arduino haciendo dos cosas en loop:

  1. Un servidor web que espera una conexión y presenta algunos formularios html para cambiar los valores de configuración.
  2. Procese algunos datos externos y muéstrelos en una matriz de leds.

El problema es que el procesamiento de los datos lleva mucho tiempo (~20 segundos). Entonces, mientras esta vez, el servidor web no puede hacer nada. La estructura de mi programa se ve así:

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
    }
  }
}

Entonces, mi pregunta es, ¿hay alguna posibilidad de usar un controlador de interrupciones para manejar las cosas del servidor web? Entonces el servidor web podría reaccionar mientras se ejecuta la otra tarea.


ACTUALIZACIÓN: ahora también intenté adjuntar una interrupción a los pines de ethernet (usando un Mega, estos son 50, 51 y 52), pero esto tampoco funciona. Intenté algo. como esto:

attachInterrupt(50, demoFunction, CHANGE);

Pero no se llama al método, incluso cuando se cambian los pines a 51 o 52 en ambos, la entrada de un cliente como una solicitud HTTP y el envío de HTML a un navegador.

Respuestas (2)

En los bocetos de Arduino, la loop()función se llama repetidamente. Su función de bucle llama webServer()a la que luego bloquea en un whilebucle.

En su lugar, úselo if (serverClient.connected())en su bucle e implemente la lógica de su servidor web como una máquina de estado capaz de hacer un poco de trabajo y luego devolver el control al bucle principal.

De esta manera, su programa no bloqueará la ejecución.

Oh sry si la pregunta no fue clara. processAndShowData();bloques, no webServer();así mientras el procesamiento de los datos, el servidor web no puede reaccionar a las respuestas. (En realidad trato de hacer el procesamiento con interrupciones)
Entonces, divida processAndShowData() en una máquina de estado que hace un poco de trabajo cada vez que se llama
Intenté esto, esto funciona para la mayoría de los casos, pero no para el mío. Debido a que esta parte del código dibuja una matriz de LED en cada ciclo, el texto de la matriz se mueve 1 píxel (LED) a la izquierda. Pero cuando uso el servidor web ahora, la matriz LED comienza a retrasarse mientras el servidor envía su respuesta.
Controle la pantalla LED desde el contexto de interrupción de un temporizador ( arduino.cc/playground/code/timer1 ). Use una máquina de estado en su función loop() para actualizar una variable/matriz global con los datos que se escribirán.

Para todos los demás con un problema igual, esto es lo que hice:

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

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

void loop() {
  webServer();
}

void displayInterrupt() {
  processAndShowData();
}

processAndShowDataya no es un método de bloqueo, cada vez que se llama a la interrupción se procesa una pequeña porción de datos.

Para usar la interrupción del temporizador, agregué TimerOne Library .

Espero que esto ayude a alguien.