Опубликовано

Управляемый ночник на трехцветном светодиоде

По материалам 2 главы книги Дж. Блума «Изучаем Arduino: инструменты и методы технического волшебства»

https://bhv.ru/product/izuchaem-arduino-instrumenty-i-metody-tehnicheskogo-volshebstva-2-e-izd-per-s-angl/

На данном этапе мы знаем, как подавать сигналы на цифровые контакты платы 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, слева) , которые имеют разную схему подключения общего вывода: к минусу (–) или к плюсу (+).

04-01-1-rgb

Рис. L1.1. RGB-светодиод с общим катодом (слева) и с общим анодом (справа)

Добавить комментарий