Arduino:Примеры/Применение аппаратного прерывания для управления миганием RGB-светодиода

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Проверка/Оформление/Редактирование: Мякишев Е.А.



Применение аппаратного прерывания для управления миганием RGB-светодиода

Данный пример демонстрирует применение аппаратного прерывания для управления миганием RGB-светодиода. Здесь реализована схема аппаратного антидребезга контакта кнопки.

Необходимые компоненты

Монтажная схема

Соберите схему согласно монтажной схеме.

Схема аппаратного антидребезга контакта кнопки и подключение к Arduino
Распиновка SN74LS14N
Цоколевка SN74LS14N

Код

#define BUTTON_INT 0                          // Прерывание 0 (2-ой цифровой контакт на Arduino Uno)
#define RED        11                         // Красный вывод RGB-светодиода подключен к 11-му цифровому контакту
#define GREEN      10                         // Зеленый вывод RGB-светодиода подключен к 10-му цифровому контакту
#define BLUE       9                          // Синий вывод RGB-светодиода подключен к 9-му цифровому контакту

volatile int selectedLED = RED;               // Переменную с модификатором volatile  можно изменять внутри функции-обработчика прерывания

void setup()
{
  pinMode (RED, OUTPUT);
  pinMode (GREEN, OUTPUT);
  pinMode (BLUE, OUTPUT);

  attachInterrupt(BUTTON_INT, swap, RISING); // Инициализация аппаратного прерывания
                                             // BUTTON_INT: прерывание 0 (2-ой цифровой контакт на Arduino Uno)
                                             // swap      : функция-обработчик прерывания 
                                             // RISING    : прерывание срабатывает, когда контакт переключается из LOW в HIGH
                                             // Примечание: заметьте, мы используем RISING(из LOW в HIGH) потому-что мы применяем
                                             // инвертирующий триггер Шмитта SN74LS14N
}

void swap()
{
  analogWrite(selectedLED, 0);               // Выключаем текущий цвет
  // Но теперь выбираем другой цвет...
  if (selectedLED == GREEN)
    selectedLED = RED;
  else if (selectedLED == RED)
    selectedLED = BLUE;
  else if (selectedLED == BLUE)
    selectedLED = GREEN;
}

void loop()
{
  for (int i = 0; i<256; i++)
  {
    analogWrite(selectedLED, i);
    delay(10);
  }
  for (int i = 255; i>= 0; i--)
  {
    analogWrite(selectedLED, i);
    delay(10);
  }
}

См.также

Внешние ссылки