Изучаем Arduino: инструметы и методы технического волшебства - [13]

Шрифт
Интервал

Теперь подключим к плате 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 -


На первый взгляд может показаться, что программа слишком велика. Но в основном это комбинация фрагментов кода, который вы уже встречали в данной главе.

Вы можете самостоятельно изменить этот проект. Например, добавить кнопки для управления каждым выводом RGB-светодиода. Или реализовать дополнительный режим мигания каждым цветом, взяв код из главы 1. Возможности для творчества безграничны.

Резюме

В этой главе вы узнали о следующем:

Как работать с макетной платой.

Как выбрать резистор для ограничения тока светодиода.

Как подключить внешний светодиод к плате Arduino.

Как использовать ШИМ, как замену аналогового вывода.

Как считывать состояние кнопки.

Как подавить дребезг кнопки.

Для чего нужны подтягивающий и стягивающий резисторы.

Глава 3 Опрос аналоговых датчиков


Список деталей

Для повторения примеров главы вам понадобятся следующие детали:

• плата Arduino Uno;

• макетная плата;

• перемычки;

• потенциометр 10 кОм;

• 2 резистора номиналом 10 кОм;

• 3 резистора номиналом 220 Ом;

• кабель USB;

• фоторезистор;

• датчик температуры ТМР36 (или тобой другой аналоговый датчик на 5 В);

• RGB-светодиод с общим катодом.

Электронные ресурсы к главе

На странице http://www.exploringarduino.com/content/ch3 можно загрузить программный код, видеоуроки и другие материалы для данной главы. Кроме того, листинги примеров можно скачать со страницы www.wiley.com/go/exploringarduino в разделе Downloads.