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

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

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


Pixel Art Mini Meow Animated.gif Черновик


Управление 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 и наоборот. Именно поэтому в цепи и нужны стягивающие/подтягивающие резисторы.

Arduino uno rgb led.png

Код

  1 #define BLED 9                                         //9 контакт для синего вывода RGB-светодиода
  2 #define GLED 10                                        //10 контакт для зеленого вывода RGB-светодиода
  3 #define RLED 11                                        //11 контакт для красного вывода RGB-светодиода
  4 #define BUTTON 2                                       //2 контакт для кнопки
  5 
  6 boolean lastButton = LOW;                              //предыдущее состояние кнопки
  7 boolean currentButton = LOW;                           //текущее состояние кнопки
  8 int ledMode = 0;                                       //статус  RGB-светодиода
  9 
 10 void setup()
 11 {
 12   pinMode (BLED, OUTPUT);                              //Устанавливаем контакт BLED(Blue LED, т.е 9 контакт) как выход 
 13   pinMode (GLED, OUTPUT);                              //Устанавливаем контакт GLED(Green LED, т.е 9 контакт) как выход 
 14   pinMode (RLED, OUTPUT);                              //Устанавливаем контакт RLED(Red LED, т.е 9 контакт) как выход
 15   pinMode (BUTTON, INPUT);                             //Устанавливаем контакт BUTTON(т.е. 2 контакт) как вход(опционально)
 16 }
 17 
 18 void loop()
 19 {
 20   currentButton = debounce(lastButton);                //считываем состояние кнопки с применением "антидребезга"
 21   if (lastButton == LOW && currentButton == HIGH)      //если кнопка была нажата
 22   {
 23     ledMode++;                                         //инкрементируем значение переменной
 24   }
 25   lastButton = currentButton;                          //сохраняем текущее состояние кнопки в предыдущее
 26   
 27   if (ledMode == 8) ledMode = 0;                      //если прошли по циклу все режимы свечения светодиода, делаем сброс до 0
 28   setMode(ledMode);                                   //изменить режим светодиода
 29 }
 30 
 31 /*
 32 * Функция антидребезга
 33 * принимает предыдущее значение кнопки и возвращает текущее состояние кнопки с подавлением дребезга контактов
 34 */
 35 boolean debounce(boolean last)
 36 {
 37   boolean current = digitalRead(BUTTON);             //считываем состояние кнопки
 38   if (last != current)                               //если есть изменения
 39   {
 40     delay(5);                                        //ждем 5мс
 41     current = digitalRead(BUTTON);                   //считываем состояние кнопки
 42   }
 43   return current;                                    //возвращаем, считанное состояние кнопки
 44 }
 45 
 46 /*
 47 * Выбор режима работы светодиода
 48 * Передача номера режима и его установка
 49 * Функция ничего не возвращает
 50 */
 51 void setMode(int mode)
 52 {
 53   //Красный
 54   if (mode == 1)
 55   {
 56     digitalWrite(RLED, HIGH);
 57     digitalWrite(GLED, LOW);
 58     digitalWrite(BLED, LOW);
 59   }
 60   //Зеленый
 61   else if (mode == 2)
 62   {
 63     digitalWrite(RLED, LOW);
 64     digitalWrite(GLED, HIGH);
 65     digitalWrite(BLED, LOW);
 66   }
 67   //Синий
 68   else if (mode == 3)
 69   {
 70     digitalWrite(RLED, LOW);
 71     digitalWrite(GLED, LOW);
 72     digitalWrite(BLED, HIGH);
 73   }
 74   //Пурпурный(Красный + Синий)
 75   else if (mode == 4)
 76   {
 77     analogWrite(RLED, 127);
 78     analogWrite(GLED, 0);
 79     analogWrite(BLED, 127);
 80   }
 81   //Бирюзовый(Синий + Зеленый)
 82   else if (mode == 5)
 83   {
 84     analogWrite(RLED, 0);
 85     analogWrite(GLED, 127);
 86     analogWrite(BLED, 127);
 87   }
 88   //Оранжевый(Зеленый + Красный)
 89   else if (mode == 6)
 90   {
 91     analogWrite(RLED, 127);
 92     analogWrite(GLED, 127);
 93     analogWrite(BLED, 0);
 94   }
 95   //Белый(Красный + Зеленый + Синий)
 96   else if (mode == 7)
 97   {
 98     analogWrite(RLED, 85);
 99     analogWrite(GLED, 85);
100     analogWrite(BLED, 85);
101   }
102   //Выключен
103   else
104   {
105     digitalWrite(RLED, LOW);
106     digitalWrite(GLED, LOW);
107     digitalWrite(BLED, LOW);
108   }
109 }

См.также

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