После вызова функции debounce() и установки значения переменной currentButton происходит сравнение текущего и предыдущего значений состояния кнопки с помощью оператора && (логический оператор "И", означающий, что выражение в скобках выполнится, только если истинно каждое из равенств, разделенных оператором &&).
Если ранее состояние кнопки было LOW, а теперь HIGH, значит, кнопка была нажата и нужно инвертировать значение переменной lecton. Это действие выполняет опера-
- 58 -
тор перед переменной lecton. Цикл закончен, обновляем предыдущую перемеую состояния кнопки и изменяем состояние светодиода.
Программа изменяет состояние светодиода после каждого нажатия кнопки. При отсутствии проверки дребезга кнопки результаты будут непредсказуемыми.
2.9. Создание управляемого ночника на RGB-светодиоде
Вы уже знаете, как управлять цифровыми выходами, как создать противодребезговую защиту для кнопки, как менять яркость светодиода с помощью ШИМ-сигнала.
Теперь подключим к плате 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
Читать дальше