Tengo un problema, que a primera vista (y siendo nuevo en Arduino), pensé que era una aplicación perfecta para un Arduino. Sin embargo, después de intentarlo y no implementarlo, ¡estoy dudando de mí mismo!
Simplemente, necesito controlar muchos LED de forma independiente, muchos de los cuales tendrán sus propios patrones individuales, por ejemplo, "5 segundos encendido - 5 segundos apagado". "flashes continuos" - o secuencias como "2 flashes, pausa, 1 flash". Obviamente, sin el lujo de los hilos, me estoy despegando un poco. Sea genial saber si a) Arduino es la mejor opción yb) si es así, ¿cómo puedo hacer esto?
Gracias por adelantado :)
Respuestas:
Manejar múltiples patrones al mismo tiempo es ciertamente posible con una plataforma como Arduino, y hay varias maneras de hacerlo.
Un método que consideraría es escribir funciones que representen efectivamente cada patrón matemáticamente. Simplemente le pasará el tiempo total que ha transcurrido en su programa hasta el momento, y realizará la acción adecuada para ese momento específico en el tiempo. Volverá inmediatamente después (sin demoras ni nada).
Para hacer eso, primero necesitará saber cuánto dura un solo ciclo del patrón. Luego puede usar el operador de módulo para averiguar qué tan avanzado está el ciclo actual. A partir de ahí, todo lo que necesita hacer es tener algunas
if
condiciones para determinar qué hacer en un momento dado.Esto es lo que podría parecer para su patrón "5 segundos encendido, 5 segundos apagado":
Es cierto que llamar constantemente
digitalWrite()
cuando técnicamente no es necesario no es muy eficiente. Sin embargo, no debería causar ningún daño y es bastante fácil de optimizar si es necesario.Para usar el ejemplo anterior en un boceto, solo debe llamarlo
loop()
y pasar el número que obtienemillis()
; p.ej:Otros patrones serán más complejos, pero siguen el mismo principio. Simplemente usaría
if
declaraciones apropiadas para expresar su lógica.Lo vital para recordar es que la función representa un momento específico en el tiempo. Nunca debe pausar o retrasar el programa, de lo contrario evitará que se ejecuten los otros patrones.
Editar: Tiempo en el primer ciclo
Como jfpoilpret señaló en los comentarios, el primer ciclo comenzará en un punto aleatorio. Esto se debe a que la primera vez que se llama
millis()
enloop()
, no empezará a 0 (el dispositivo ya han estado funcionando durante un corto tiempo antes de queloop()
obtiene la llamada). Sin embargo, es fácil de resolver, si es necesario.Lo harías compensando el
totalTime
valor por el valor que obtuviste la primera vezloop()
. Por ejemplo:fuente
%
enfoque es que el tiempo no será correcto la primera vez, ya que será aleatorio al principio.millis
una vez en el ciclo y pasar su valor como parámetro a cada función led, tener cada función como una sin parámetros y ejecutar millis dentro de cada una. Eso permitiría que cada función obtenga un valor más preciso, que podría o no ser importante dependiendo de cuánto tiempo lleva ejecutar cada función en el bucle, y también los requisitos de corrección de tiempo de la aplicación.Arduino es una buena opción para la tarea, fácil de comenzar. La clave es escribir código sin bloqueo. Puedes echar un vistazo al ejemplo de BlinkWithoutDelay.
Hice una sugerencia para su tarea:
fuente
Sé que la publicación es antigua, pero revisé el ejemplo con el enfoque basado en matriz y, en mi opinión:
siempre producirá el tamaño asignado (número de elementos) de la matriz, en este caso 10. Por lo tanto, el tiempo no se reiniciará hasta que llegue al "final" de la matriz, utilizando elementos indefinidos. Para LED "0":
Saludos tommy
fuente