Arduino:Примеры/Управление RGB-светодиодом при помощи Arduino: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
Нет описания правки
 
Строка 149: Строка 149:


<references />
<references />
{{Навигационная таблица/Портал/Arduino}}
[[Категория:Пример]]
[[Категория:Пример]]
[[Категория:Примеры]]
[[Категория:Примеры]]
[[Категория:Пример программирования Arduino]]
[[Категория:Пример программирования Arduino]]
[[Категория:Примеры программирования Arduino]]
[[Категория:Примеры программирования Arduino]]

Текущая версия от 12:41, 8 июля 2023

Проверка/Оформление/Редактирование: Мякишев Е.А.



Управление 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);
  }
}

См.также

Внешние ссылки