Изучаем 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.