Читаем Изучаем Arduino: инструменты и методы технического волшебства полностью

После вызова функции debounce() и установки значения переменной currentButton происходит сравнение текущего и предыдущего значений состояния кнопки с помощью оператора && (логический оператор "И", означающий, что выражение в скобках выполнится, только если истинно каждое из равенств, разделенных оператором &&).

Если ранее состояние кнопки было LOW, а теперь HIGH, значит, кнопка была нажата и нужно инвертировать значение переменной lecton. Это действие выполняет опера-

- 58 -

тор перед переменной lecton. Цикл закончен, обновляем предыдущую перемеую состояния кнопки и изменяем состояние светодиода.

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

<p>2.9. Создание управляемого ночника на RGB-светодиоде</p>

Вы уже знаете, как управлять цифровыми выходами, как создать противодребезговую защиту для кнопки, как менять яркость светодиода с помощью ШИМ-сигнала.

Теперь подключим к плате Arduino трехцветный RGB-светодиод и создадим ночник, цвет которого будет меняться при нажатии на кнопку. В RGB-светодиоде можно смешивать цвета, изменяя широтно-импульсной модуляцией яркость каждого из них.

В устройстве используем RGB-светодиод с четырьмя выводами, один из которых является катодом, общим для всех трех диодов, а остальные - аноды для диодов каждого цвета. Подключите RGB-светодиод проводами к трем ШИМ-контактам платы Arduino через токоограничивающие резисторы, как показано на рис. 2. 7.

Вы можете настроить циклическое переключение цветов светодиода при каждом нажатии на кнопку. В данном случае удобно добавить функцию для установки цвета светодиода в следующее состояние. В программе, представленной в листинге 2.6, определено семь цветов и состояние, когда светодиод не горит. С помощью функции analogWrite() можно задать свои цветовые комбинации. Единственное отличие цикла loop() от предыдущего примера - увеличение числа состояний светодиода (по кругу от 0 до 7).

Загрузите программу в плату и поэкспериментируйте с разноцветным ночником.

Поменяйте цвет RGB-светодиода, изменив значения в функции analogWrite() на свои собственные.

Листинг 2.6. Управляемый ночник на светодиоде - rgb_nightlight.ino

const int BLED=9; // Контакт 9 для вывода BLUE RGB-светодиода

const int GLED=10; // Контакт 10 для вывода GREEN RGB-светодиода

const int RLED=11; // Контакт 11 для вывода RED RGB-светодиода

const int BUTTON=2; // Контакт 2 для входа кнопки

boolean lastButton = LOW; // Предыдущий статус кнопки

boolean currentButton = LOW; // Текущий статус кнопки

int ledMode = 0; // Значение статуса RGB-светодиода

void setup()

{

pinMode (BLED, OUTPUT); // Сконфигурировать BLUE контакт светодиода как выход

- 59 -

pinMode (GLED, OUTPUT); // Сконфигурировать GREEN контакт светодиода как выход

pinMode (RLED, OUTPUT); // Сконфигурировать RED контакт светодиода как выход

pinMode (BUTTON, INPUT); // Сконфигурировать контакт кнопки как вход

}

/*

* Функция сглаживания дребезга

* принимает в качестве аргумента предыдущее состояние кнопки

* и выдает фактическое.

*/

boolean debounce(boolean last)

{

boolean current = digitalRead(BUTTON); // Считать состояние кнопки

if (last != current) // Если изменилось...

{

delay(5); // Ждем 5 мс

current = digitalRead(BUTTON); // Считываем состояние кнопки

return current; // Возвращаем состояние кнопки

}

}

/*

* Выбор режима светодиода.

* Передача номера режима и установка заданного режима светодиода.

*/

void setMode(int mode)

{

// Красный

if (mode == 1)

{

digitalWrite(RLED, HIGH);

digitalWrite(GLED, LOW);

digitalWrite(BLED, LOW);

}

// Зеленый

else if (mode == 2)

{

digitalWrite(RLED, LOW);

digitalWrite(GLED, HIGH);

digitalWrite(BLED, LOW);

}

// Синий

else if (mode == 3)

{

digitalWrite(RLED, LOW);

- 60 -

digitalWrite(GLED, LOW);

digitalWrite(BLED, HIGH);

}

// Пурпурный (Красный+ Синий)

else if (mode == 4)

{

analogWrite(RLED, 127);

analogWrite(GLED, 0);

analogWrite(BLED, 127);

}

// Бирюзовый (Синий+ Зеленый)

else if (mode == 5)

{

analogWrite(RLED, 0);

analogWrite(GLED, 127);

analogWrite(BLED, 127);

}

// Оранжевый (Зеленый+ Красный)

else if (mode == 6)

{

analogWrite(RLED, 127);

analogWrite(GLED, 127);

analogWrite(BLED, 0);

}

// Белый (Зеленый+ Красный+ Синий)

else if (mode == 7)

{

analogWrite(RLED, 85);

analogWrite(GLED, 85);

analogWrite(BLED, 85);

}

// Выключен (mode = 0)

else

{

digitalWrite(RLED, LOW);

digitalWrite(GLED, LOW);

digitalWrite(BLED, LOW);

}

}

void loop()

{

currentButton = debounce(lastButton); // Чтение статуса кнопки

if (lastButton == LOW && currentButton == HIGH) // Если нажата кнопка

{

- 61 -

ledMode++; // Инкремент переменной статуса светодиода

lastButton = currentButton;

// Прошли по циклу все режимы

// свечения светодиода

// Сброс на начальный вариант =0

if (ledMode == 8)

ledMode = 0;

setMode(ledMode); // Изменить режим светодиода

}

}

Рис. 2.7. Монтажная схема ночника

Стягивающий резистор

- 62 -

Перейти на страницу:

Похожие книги