воскресенье, 5 июня 2022 г.

Асинхронное мигание светодиодами на ардуино

Задача асинхронного мигания светодиодами, по непонятным причинам, вызывает у некоторых ардуиньщиков и микроконтроллерщиков затруднения а также используется для объяснения преимущества использования операционной системы FreeRTOS. На этом примере как бы объясняется реализация многозадачности которая часто бывает необходима в крупных проектах когда микроконтроллер должен выполнять много разных действий например выводить показания на экран, считывать данные с датчиков и заниматься какими нибудь вычислениями если каждое действие занимает много времени а пользователь не хочет долго ждать результата на экране то нельзя их просто выполнять последовательно друг за другом. Для каждого действия нужно выделить отдельную задачу и некоторое количество времени на выполнение. Допустим светодиодов будет три.

Рисунок 1 - Схема

Скетч для асинхронного мигания светодиодами может быть например таким:

Константами LEDx где x-порядковый номер пина к которому подключается светодиод, заданы номера пинов к которым подключаются светодиоды. Константами LEDx_DELAY_MS где x-порядковый номер пина к которому подключается светодиод, задаются длительности полупериодов мигания светодиодов. Переменные unsigned long pre_time и unsigned long time нужны для отсчетов времени. Функция togglePin(int pin) нужна для инвертирования состояния пина. Функции taskx() где x-номер задачи, являются квазиасинхонно вызываемыми задачами. Внутри этих задач помещены инвертирования состояний светодиодов. В функции setup() инициализация пинов и переменных для отсчетов времени. В функции loop() раз в миллисекунду инкрементируются переменные счетчики для для мигания светодиодами. При досчитывани счетчика вызывается соответствующая задача и происходит мигание светодиодом.