Arduino:Примеры/Управление RGB-светодиодом при помощи Arduino
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Черновик |
Управление RGB-светодиодом при помощи Arduino
Данный пример демонстрирует управление RGB-светодиодом при помощи Arduino.
При каждом нажатии кнопки значение переменной, отвечающей за режим свечения RGB-светодиода будет увеличиваться на 1(инкрементироваться). При достижении значения 8, переменная обнуляется. При этом RGB-светодиод будет светиться разными цветами в зависимости от текущего режима свечения.
Необходимые компоненты
- Плата Arduino;
- RGB-светодиод с общим катодом;
- Три резистора на 220 Ом;
- Резистор на 10 кОм;
- Кнопка;
- Макетная плата;
- Провода-перемычки;
Схема
Соберите схему согласно рисунку. Соедините 1, 3 и 4 контакты RGB-светодиода с 11, 10 и 9 цифровыми контактами Arduino через резисторы на 220 Ом, а 2 контакт RGB-светодиода соедините с землей(GND). Соедините 2 цифровой контакт Arduino с одной из ног стягивающего резистора на 10 кОм и одним из контактов кнопки, вторую ногу резистора соедините с землей(GND). Второй контакт кнопки соедините с контактом 5V.
Теперь, допустим, что на кнопку никто не нажимает – в этом случае связи между ногами кнопки не будет, поэтому 2-ой цифровой контакт будет по-прежнему подсоединен к «земле», и Arduino сочтет эту ситуацию как LOW. Теперь, допустим, на кнопку все же кто-то нажимает – это создает связь между обоими ногами, тем самым соединяя 2-ой цифровой и 5-вольтовый контакты, и Arduino сочтет эту ситуацию как HIGH.
Если отсоединить цифровой контакт ото всего, то светодиод примется хаотично мигать. Это значит, что выходное значение будет «плавающим», т.е. беспорядочно переключающимся из LOW в HIGH и наоборот. Именно поэтому в цепи и нужны стягивающие/подтягивающие резисторы.
Код
#define BLED 9 //9 контакт для синего вывода RGB-светодиода
#define GLED 10 //10 контакт для зеленого вывода RGB-светодиода
#define RLED 11 //11 контакт для красного вывода RGB-светодиода
#define BUTTON 2 //2 контакт для кнопки
boolean lastButton = LOW; //предыдущее состояние кнопки
boolean currentButton = LOW; //текущее состояние кнопки
int ledMode = 0; //статус RGB-светодиода
void setup()
{
pinMode (BLED, OUTPUT); //Устанавливаем контакт BLED(Blue LED, т.е 9 контакт) как выход
pinMode (GLED, OUTPUT); //Устанавливаем контакт GLED(Green LED, т.е 9 контакт) как выход
pinMode (RLED, OUTPUT); //Устанавливаем контакт RLED(Red LED, т.е 9 контакт) как выход
pinMode (BUTTON, INPUT); //Устанавливаем контакт BUTTON(т.е. 2 контакт) как вход(опционально)
}
void loop()
{
currentButton = debounce(lastButton); //считываем состояние кнопки с применением "антидребезга"
if (lastButton == LOW && currentButton == HIGH) //если кнопка была нажата
{
ledMode++; //инкрементируем значение переменной
}
lastButton = currentButton; //сохраняем текущее состояние кнопки в предыдущее
if (ledMode == 8) ledMode = 0; //если прошли по циклу все режимы свечения светодиода, делаем сброс до 0
setMode(ledMode); //изменить режим светодиода
}
/*
* Функция антидребезга
* принимает предыдущее значение кнопки и возвращает текущее состояние кнопки с подавлением дребезга контактов
*/
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);
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);
}
//Выключен
else
{
digitalWrite(RLED, LOW);
digitalWrite(GLED, LOW);
digitalWrite(BLED, LOW);
}
}