У меня есть проблема, которая на первый взгляд (и, будучи новичком в Arduino), я, тем не менее, была идеальным приложением для Arduino. Однако, пытаясь и не в состоянии осуществить это, я сомневаюсь в себе!
Проще говоря, мне нужно независимо управлять многими светодиодами, многие из которых будут иметь свои собственные индивидуальные схемы - например, «5 секунд включено - 5 секунд выключено». «непрерывные вспышки» - или последовательности, такие как «2 вспышки, пауза, 1 вспышка». Очевидно, без роскоши нитей я становлюсь немного отклеенным. Приятно слышать, если а) Arduino лучший выбор и б) если это так - как я могу это сделать!
Заранее спасибо :)
Ответы:
Обработка нескольких паттернов одновременно возможна с такой платформой, как Arduino, и вы можете сделать это несколькими способами.
Одним из методов, который я бы рассмотрел, является написание функций, которые эффективно представляют каждый шаблон математически. Вы просто передали бы его общее время, которое прошло в вашей программе, и оно выполнит соответствующее действие для этого конкретного момента времени. Он вернется сразу после этого (без задержек или чего-либо).
Чтобы сделать это, вам сначала нужно узнать, как долго длится один цикл паттерна. Затем вы можете использовать оператор по модулю, чтобы выяснить, как далеко вы прошли текущий цикл. Оттуда все, что вам нужно сделать, это иметь некоторые
if
условия, чтобы определить, что делать в любой момент времени.Вот как это может выглядеть для вашей схемы «5 секунд включено, 5 секунд выключено»:
По общему признанию, постоянно звонить,
digitalWrite()
когда вам технически не нужно, не очень эффективно. Это не должно причинить никакого вреда, и его довольно легко оптимизировать при необходимости.Чтобы использовать приведенный выше пример в наброске, вам нужно просто позвонить
loop()
и передать номер, с которого вы получилиmillis()
; например:Другие шаблоны будут более сложными, но будут следовать тому же принципу. Вы бы просто использовали соответствующие
if
выражения, чтобы выразить свою логику.Важно помнить, что функция представляет определенный момент времени. Он никогда не должен приостанавливать или задерживать программу, иначе это предотвратит запуск других шаблонов.
Изменить: время в первом цикле
Как отметил jfpoilpret в комментариях, самый первый цикл начнется в случайной точке. Это происходит потому , что первый раз , когда вы звоните
millis()
вloop()
, он не запустится при 0 (устройство уже работает в течение короткого времени , прежде чемloop()
будет вызвана). Это легко решить, хотя, если это необходимо.Вы бы сделали это, сместив
totalTime
значение на то значение, которое вы получили в самый первый разloop()
. Например:источник
%
подходом заключается в том, что время не будет правильным с самого начала, поскольку сначала оно будет случайным.millis
один раз в цикле и передавать свое значение в качестве параметра каждой светодиодной функции, чтобы каждая функция была безпараметрической, и запускать миллис внутри каждой. Это позволило бы каждой функции получить более точное значение, которое может или не может быть важным в зависимости от того, сколько времени занимает выполнение каждой функции в цикле, а также от требований к правильности синхронизации приложения.Arduino - прекрасный выбор для этой задачи, с которой легко начать. Ключ заключается в написании неблокирующего кода. Вы можете взглянуть на пример BlinkWithoutDelay.
Я сделал предложение для вашей задачи:
источник
Я знаю, что пост старый, но я проверил пример с использованием массива и по моему мнению:
всегда будет давать выделенный размер (количество элементов) массива - в этом случае 10. Таким образом, синхронизация не будет перезапущена, пока вы не достигнете «конца» массива, используя неопределенные элементы. Для светодиода "0":
Привет Томми
источник