На данном этапе мы знаем, как подавать сигналы на цифровые контакты платы Arduino, как считывать с цифровых контактов платы сигналы, подаваемые на них внешними устройствами, а также как использовать ШИМ для изменения яркости свечения светодиода. Этих знаний будет достаточно, чтобы создать на основе платы Arduino своеобразный ночник. Для этого к ней нужно подключить трехцветный светодиод (красный, зеленый, синий) и кнопку для управления светодиодом. Цветом трехцветного светодиода можно управлять, меняя яркость составляющих его светодиодов.
Для этого проекта мы возьмем трехцветный светодиод с общим анодом. Это означает, что наш светодиод имеет в целом четыре вывода. Три вывода подключены к катодам светодиодов разных цветов, а четвертый подключен к анодам всех трех светодиодов. Подключите выводы катодов трехцветного светодиода к трем контактам ШИМ платы Arduino через последовательные токоограничивающие резисторы, как показано в монтажной схеме на рис. 2.8. Как и в случае с одноцветным красным светодиодом, используйте резисторы номиналом 220 Ом.
Рис. 2.8. Монтажная схема ночника на трехцветном светодиоде (Рисунок создан в программе Fritzing)
Поскольку все три составляющих светодиода имеют общий анод, для индивидуального управления ими к плате Arduino нужно подключать их катоды, а не анод, как было в случае с одноцветным красным светодиодом в предыдущих проектах. Контакт платы Arduino, работающий в режиме вывода, поставляет ток двумя способами:
- Когда на контакте установлен высокий уровень, этот контакт поставляет ток в режиме истока. Иными словами, ток из источника питания Arduino истекает из этого контакта, протекает через подключенную к контакту нагрузку (которой в данном случае является светодиод) и втекает в шину земли.
- Когда на контакте установлен низкий уровень, этот контакт поставляет ток в режиме стока. Иными словами ток из источника питания входит в контакт и далее на внутреннюю землю платы.
Поэтому, когда анод светодиода подключен к положительному напряжению 5 В, а его катод — к контакту платы Arduino, работающему в режиме вывода, логика управления этим светодиодом инвертируется. Чтобы обеспечить протекание тока из шины питания напряжением 5 В через резистор и светодиод и далее через контакт платы Arduino на внутреннюю землю платы, на этот контакт нужно подавать низкий управляющий уровень. Когда же на этот контакт подается высокий уровень, на нем будет такой же потенциал (5 В), как и на аноде светодиода. В результате ток не будет протекать, и светодиод выключится.
Можно разработать такую программу, чтобы при каждом нажатии кнопки с противодребезговой защитой циклически переключать цвета трехцветного светодиода. Для этого будет полезной дополнительная функция для задания следующего состояния цветового цикла трехцветного светодиода. В программе, код которой приведен в листинге 2.6, определено в общем семь цветовых состояний трехцветного светодиода, плюс одно выключенное состояние. Посредством функции analogWrite() можно создавать любые комбинации основных цветов, чтобы получить соответствующий общий цвет. Основной цикл loop() этой программы отличается от цикла в предыдущем примере только тем, что вместо переключения между двумя состояниями светодиода, в нем при каждом нажатии кнопки инкрементируется счетчик состояния светодиода, значение которого сбрасывается на ноль после прохождения через все доступные опции. Загрузите этот код в плату Arduino с подключенной к ней схемой ночника и любуйтесь его работой. Состояния цветов можно модифицировать, изменив значения аргумента цвета функции analogWrite().
Листинг 2.6. Программа rgb_nightlight.ino для управления трехцветным светодиодом
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 | const int BLED=9; // Подключаем катод синего светодиода к контакту 9 const int GLED=10; // Подключаем катод зеленого светодиода к контакту 10 const int RLED=11; // Подключаем катод красного светодиода к контакту 11 const int BUTTON=2; // Кнопку подключаем к контакту 2 boolean lastButton = LOW; // Предыдущее состояние кнопки. boolean currentButton = LOW; // Текущее состояние кнопки int ledMode = 0; // Переключаемся в цикле между состояниями // светодиода void setup() { pinMode (BLED, OUTPUT); // Задаем режим вывода для контакта // синего светодиода pinMode (gLED, OUTPUT); // Задаем режим вывода для контакта // зеленого светодиода pinMode (RLED, OUTPUT); // Задаем режим вывода для контакта // красного светодиода pinMode (BUTTON, INPUT); // Задаем режим ввода для контакта кнопки // (не обязательно) } /* * Функция устранения дребезга контактов * Передаем ей значение предыдущего состояния кнопки, * и получаем от нее текущее значение состояния кнопки * с устраненным дребезгом. */ boolean debounce(boolean last) { boolean current = digitalRead(BUTTON); // Считываем текущее // состояние кнопки. if (last != current) // если оно иное, чем предыдущее... { delay(5); // Ждем 5 мс current = digitalRead(BUTTON); // Считываем состояние снова } return current; // Возвращаем текущее // состояние кнопки } /* * Выбор состояния светодиода * Передаем функции номер состояния светодиода и устанавливаем * его соответственно * Обратите внимание на то, что поскольку наш трехцветный светодиод * имеет общий анод, чтобы включать составляющие его светодиоды, * на их катоды нужно подавать низкий (LOW) уровень. */ void setMode(int mode) { // КРАСНЫЙ if (mode == 1) { digitalWrite(RLED, LOW); digitalWrite(GLED, HIGH); digitalWrite(BLED, HIGH); } // ЗЕЛЕНЫЙ else if (mode == 2) { digitalWrite(RLED, HIGH); digitalWrite(GLED, LOW); digitalWrite(BLED, HIGH); } // СИНИЙ else if (mode == 3) { digitalWrite(RLED, HIGH); digitalWrite(GLED, HIGH); digitalWrite(BLED, LOW); } // ФИЛОЛЕТОВЫЙ (КРАСНЫЙ+СИНИЙ) else if (mode == 4) { analogWrite(RLED, 127); analogWrite(GLED, 255); analogWrite(BLED, 127); } // ЗЕЛЕНОВАТО-ГОЛУБОЙ (СИНИЙ+ЗЕЛЕНЫЙ) else if (mode == 5) { analogWrite(RLED, 255); analogWrite(GLED, 127); analogWrite(BLED, 127); } // ОРАНЖЕВЫЙ (ЗЕЛЕНЫЙ+КРАСНЫЙ) else if (mode == 6) { analogWrite(RLED, 127); analogWrite(GLED, 127); analogWrite(BLED, 255); } // БЕЛЫЙ (ЗЕЛЕНЫЙ+КРАСНЫЙ+СИНИЙ) else if (mode == 7) { analogWrite(RLED, 170); analogWrite(GLED, 170); analogWrite(BLED, 170); } // ОТКЛЮЧЕН (mode = 0) else { digitalWrite(RLED, LOW); digitalWrite(GLED, LOW); digitalWrite(BLED, LOW); } } void loop() { currentButton = debounce(lastButton); // Считываем состояние // кнопки с устраненным дребезгом if (lastButton == LOW && currentButton == HIGH) // если кнопка // была нажата... { ledMode++; // Инкрементируем значение LED } lastButton = currentButton; // Сбрасываем значение кнопки // Если прошли по всему циклу цветовых состояний, // обнуляем счетчик if (ledMode == 8) ledMode = 0; setMode(ledMode); // Изменяем значение состояния светодиода } |
На первый взгляд может показаться, что это значительный объем кода, но это не больше, чем просто набор фрагментов, которые мы уже рассмотрели ранее в этой главе.
Каким образом можно еще модифицировать этот код? Можно, например, добавить считывание состояния дополнительных кнопок, чтобы управлять каждым из цветовых светодиодов отдельно. Можно также добавить режим мигания, используя код из программы для мигания светодиодом из главы 1. В действительности, возможности здесь неограниченны.
Примечание
Светодиод RGB
Конструктивно трехцветный светодиод представляет собой три цветных светодиода: красный (R), зеленый (G) и синий (B), смонтированных в общем корпусе. Различные оттенки цвета получаются путем смешения 3-х базовых цветов (модель RGB). Поскольку светодиоды расположены очень близко друг к другу, наши глаза видят результат сочетания цветов, а не три цвета по отдельности. Для регулировки интенсивности каждого светодиода можно использовать сигнал ШИМ.
Внешний вид, назначение контактов
Имейте в виду, что существуют два вида светодиодов RGB: с общим анодом (рис. L1.1, справа) и с общим катодом (рис. L1.1, слева) , которые имеют разную схему подключения общего вывода: к минусу (–) или к плюсу (+).
Рис. L1.1. RGB-светодиод с общим катодом (слева) и с общим анодом (справа)