Llamadas a funciones asincrónicas en boceto Arduino

14

En un boceto de Arduino, ¿hay alguna forma de realizar llamadas a funciones asíncronas dentro del bucle? Como escuchar las solicitudes a través del servidor http y procesarlas de forma no bloqueante .

Jacer Omri
fuente
1
Si no eres un principiante en C ++, entonces puedes echar un vistazo a la biblioteca de Cosa ( github.com/mikaelpatel/Cosa ). Es una reescritura completa de la biblioteca Arduino para mejorarla: OOP y, en general, impulsada por interrupciones. Creo que son compatibles con HTTP, pero aún no he comprobado esa parte.
jfpoilpret

Respuestas:

11

Si y no. Eres un poco vago en lo que quieres hacer. He hecho esto en unas pocas secciones diferentes (enfocadas principalmente en leer los datos del sensor ... se aplica a todo pero ese es el contexto que estoy usando):

Hilos

AFAIK todos los Arduinos solo tienen un núcleo (pueden hacer una cosa a la vez). Para la mayoría de las placas Arduino, el subprocesamiento múltiple de hardware no es compatible. Sin embargo, hay formas de implementar software multihilo . El enfoque de AsheeshR no funcionaría bien para funciones que tardan mucho tiempo en completarse (es decir, algo en una biblioteca que lleva un tiempo o un retraso) porque se atascaría con esas instrucciones, pero funcionaría bien por poco tiempo Las funciones como pinMode(). La biblioteca Protothreads listada allí podría ser mejor en esto, pero realmente no lo sé.

Sería difícil organizar esto con HTTP, especialmente porque tienes que hacer

Retrasos

Una forma común de detener un boceto es el uso de un retraso. Esto se puede resolver utilizando, en el bucle principal, una instrucción if y la millis()función que devuelve una hora (no una hora de reloj, sino la hora desde que comenzó el Arduino). También podría hacer un ciclo dentro del ciclo para sondear los datos del sensor.

El millis()enfoque no funcionaría bien con cosas que hacen que todo el programa se detenga (es decir, más demoras o bucles que duran una cantidad de tiempo notable). Tenga en cuenta que 100ms IIRC es el tiempo máximo general para hacer que una IU no parezca lenta.

Interrupciones

Las interrupciones son una excelente manera de mantener las cosas casi asincrónicas. Ejecutan un código corto (que usted especifica) cada vez que cambia el estado de un pin. Se separa del loop(), y vuelve a donde lo dejó una vez que se ha ejecutado el " ISR ". No tengo mucho tiempo para explicar cómo hacer esto, pero una búsqueda rápida en Google arrojará muchos resultados.


Según su ejemplo, la sección de subprocesos sería la más aplicable. Este tema es bastante vago, por lo que tendrá que experimentar con algunas cosas y encontrar algo que funcione.

Pingüino anónimo
fuente
3

Acabo de publicar un código para un programador de tareas en el patio de recreo el otro día, es posible que desee echar un vistazo, tal vez pueda adaptarlo a sus necesidades.

El procesador de Arduino es inherentemente de un solo subproceso y no puede realizar varias tareas. Sin embargo, como se mencionó, existen formas de crear la ilusión de la multitarea. Annonomus Penguin los golpeó bastante bien.

También echa un vistazo a TimerOne (probablemente sea mejor;)

Aurast
fuente
TimerOne es una mala idea porque funciona solo con arduinos basados ​​en avr. Por ejemplo, mi Wemos D1 R1 no funciona
Vyachaslav Gerchicov