×
Traktatov.net » Изучаем Arduino: инструметы и методы технического волшебства » Читать онлайн
Страница 20 из 138 Настройки

Вы можете настроить циклическое переключение цветов светодиода при каждом нажатии на кнопку. В данном случае удобно добавить функцию для установки цвета светодиода в следующее состояние. В программе, представленной в листинге 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++; // Инкремент переменной статуса светодиода