Arduino:Примеры/Применение аппаратного прерывания для управления миганием RGB-светодиода
Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Проверка/Оформление/Редактирование: Мякишев Е.А.
Применение аппаратного прерывания для управления миганием RGB-светодиода
Данный пример демонстрирует применение аппаратного прерывания для управления миганием RGB-светодиода. Здесь реализована схема аппаратного антидребезга контакта кнопки.
Необходимые компоненты
- Плата Arduino Uno, 1 шт.;
- Инвертирующий триггер Шмитта SN74LS14N, 1 шт.;
- RGB-светодиод, 1 шт.;
- Кнопка, 1 шт.
- Резистор на 220 Ом, 3 шт.;
- Резистор на 10 кОм, 1 шт.;
- Резистор на 100 Ом, 1 шт.;
- Конденсатор, 10 мкФ, 1 шт.;
- Макетная плата;
- Провода перемычки;
Монтажная схема
Соберите схему согласно монтажной схеме.




Код
#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);
}
}