Как мигать светодиодом без delay в setup()?

Мигание светодиодом без использования функции delay() в функции setup() можно реализовать с использованием прерываний и таймеров на платформе Arduino. При использовании прерываний и таймеров, код будет выполняться асинхронно, что позволяет избежать использования блокирующей функции delay().

Ниже приведен пример программы, которая мигает светодиодом раз в секунду с использованием прерываний и таймеров на платформе Arduino:

// Подключение библиотеки для работы с платформой Arduino
#include <Arduino.h>

// Параметры мигания светодиода
const int ledPin = LED_BUILTIN;
const unsigned long blinkInterval = 1000;

// Переменная для хранения состояния светодиода
volatile bool ledState = LOW;

// Прототип функции обработчика прерывания
void toggleLed();

void setup() {
  // Настройка пина светодиода как выхода
  pinMode(ledPin, OUTPUT);

  // Настройка таймера для вызова функции обработчика прерывания каждые 500 микросекунд
  // Таймер 1 используется для Arduino Uno и Mega
  // Создание прерывания по периоду времени:
  // F_CPU / 64 (64 предделитель) / 15624 (значение счетчика) = 1 Гц (1 раз в секунду)
  cli(); // Отключение прерываний
  TCCR1A = 0; // Установка битов регистра настроек таймера в 0
  TCCR1B = 0; // Установка битов регистра настроек таймера в 0
  TCNT1 = 0; // Установка начального значения счетчика
  OCR1A = 15624; // Установка значения для сравнения
  TCCR1B |= (1 << CS10) | (1 << CS11); // Включение предделителя 64
  TCCR1B |= (1 << WGM12); // Включение режима CTC (счет до значения в OCR1A)
  TIMSK1 |= (1 << OCIE1A); // Разрешение прерывания при совпадении с OCR1A
  sei(); // Включение прерываний
}

void loop() {
  // Код в основном цикле программы (без использования задержек)
}

// Реализация функции обработчика прерывания, которая будет вызываться каждую секунду
void toggleLed() {
  // Инвертирование состояния светодиода
  ledState = !ledState;

  // Установка нового значения состояния светодиода
  digitalWrite(ledPin, ledState);
}

// Обработчик прерывания при совпадении с OCR1A
ISR(TIMER1_COMPA_vect) {
  // Вызов функции обработчика прерывания
  toggleLed();
}

В данном примере происходит настройка пина светодиода как выхода и настройка таймера 1 для вызова функции toggleLed() каждую секунду. Функция toggleLed() инвертирует состояние светодиода и устанавливает новое значение состояния.

Таким образом, светодиод будет мигать каждую секунду, без использования функции delay() и блокирования выполнения другого кода в функции setup().

Помните, что использование прерываний и таймеров требует своей собственной логики программирования и может быть сложным для новичков в программировании на платформе Arduino.