Как сделать какой-нибудь уголок нашей комнаты более привлекательным? Конечно же добавить в него цветомузыку. В этой статье мы рассмотрим проект простой цветомузыки на основе платы Arduino и трехцветного светодиода, который будет изменять цвет в зависимости от освещенности в комнате.
Как известно, любой цвет можно получить при помощи комбинации красного, синего и зеленого цветов – это мы и будем использовать в нашем проекте для формирования нужного нам цвета, изменяя интенсивности красного, зеленого и синего цвета в трехцветном светодиоде.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Макетная плата.
- Резистор 1 кОм (3 шт.) (купить на AliExpress).
- Резистор 220 Ом (3 шт.) (купить на AliExpress).
- Соединительные провода.
- Фоторезистор (3 шт.) (купить на AliExpress).
- Три цветных ленты (red, green, blue).
- Трехцветный светодиод (купить на AliExpress).
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Фоторезистор
В нашем проекте для измерения интенсивности мы будем использовать фоторезисторы (light-dependent resistor, LDR). Фоторезисторы изготавливаются из полупроводниковых материалов, что позволяет им приобрести зависимые от света свойства. При увеличении количества света, падающего на фоторезистор, его проводимость увеличивается, а сопротивление, следовательно, уменьшается.
В нашем проекте фоторезисторы используются для управления яркостью свечения красного, зеленого и синего светодиодов в трехцветном светодиоде. Более подробно о подключении фоторезистора к плате Arduino можно прочитать в этой статье.
Трехцветный светодиод (RGB LED)
Существуют два типа трехцветных светодиодов – с общим катодом и общим анодом. В трехцветном светодиоде с общим катодом (CC, Common Cathode или Common Negative) имеется три положительных вывода, каждый из которых отвечает за свой цвет, и один отрицательный вывод для всех трех цветов.
В нашем проекте мы будем использовать трехцветный светодиод с общим анодом (CA, Common Anode или Common Positive), в котором три отрицательных вывода (каждый отвечает за свой цвет) и один положительный. Если мы хотим в данном случае зажечь красный светодиод нам необходимо подать землю на контакт красного светодиода и питание на общий положительный вывод. Аналогично и для светодиодов других цветов. Более подробно о подключении трехцветного светодиода к плате Arduino можно прочитать в этой статье.
Работа схемы
Схема цветомузыки с использованием Arduino, трехцветного светодиода и фоторезисторов представлена на следующем рисунке.
Вся схема запитывается от контакта +5V Arduino. Саму плату Arduino можно запитать от компьютера через USB кабель, от адаптера на 12 В или с помощью батарейки на 9 В.
Для управления яркостью свечения светодиодов разного цвета мы будем использовать ШИМ (широтно-импульсную модуляцию, в англ. – PWM). Более подробно об использовании ШИМ в плате Arduino можно прочитать в этой статье.
Исходный код программы для Arduino
Полный код программы приведен в конце статьи, здесь же сначала рассмотрим его основные фрагменты.
Для начала мы должны инициализировать все используемые контакты.
1 2 3 4 5 6 |
const byte red_sensor_pin = A0; const byte green_sensor_pin = A1; const byte blue_sensor_pin = A2; const byte green_led_pin = 9; const byte blue_led_pin = 10; const byte red_led_pin = 11; |
Затем присвоим начальные значения (нулевые) используемым переменным и зададим режим работы контактов.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
unsigned int red_led_value = 0; unsigned int blue_led_value = 0; unsigned int green_led_value = 0; unsigned int red_sensor_value = 0; unsigned int blue_sensor_value = 0; unsigned int green_sensor_value = 0; void setup() { pinMode(red_led_pin,OUTPUT); pinMode(blue_led_pin,OUTPUT); pinMode(green_led_pin,OUTPUT); Serial.begin(9600); } |
Далее в функции loop мы будем считывать значения с выхода трех контактов с помощью функции analogRead() и сохранять их в трех разных переменных.
1 2 3 4 5 6 |
void loop() { red_sensor_value = analogRead(red_sensor_pin); delay(50); blue_sensor_value = analogRead(blue_sensor_pin); delay(50); green_sensor_value = analogRead(green_sensor_pin); |
Печатаем эти значения в окне монитора последовательной связи (serial monitor) для целей отладки.
1 2 3 4 5 6 7 |
Serial.println("Raw Sensor Values:"); Serial.print("\t Red: "); Serial.print(red_sensor_value); Serial.print("\t Blue: "); Serial.print(blue_sensor_value); Serial.print("\t Green: "); Serial.println(green_sensor_value); |
С выхода АЦП (аналого-цифровых преобразователей) данных контактов мы будем получать значения в диапазоне 0-1023, а на выходе ШИМ контактов нам нужны значения в диапазоне 0-255. Поэтому для преобразования значений из диапазона 0-1023 в диапазон 0-255 мы можем просто делить получаемые значения на 4 или использовать для преобразования значений функцию map Arduino.
1 2 3 |
red_led_value = red_sensor_value / 4; // значение для красного (Red) светодиода blue_led_value = blue_sensor_value / 4; // значение для синего (Blue) светодиода green_led_value = green_sensor_value / 4; // значение для зеленого (Green) светодиода |
Печатаем преобразованные значения в окне монитора последовательной связи.
1 2 3 4 5 6 7 |
Serial.println("Mapped Sensor Values:"); Serial.print("\t Red: "); Serial.print(red_led_value); Serial.print("\t Blue: "); Serial.print(blue_led_value); Serial.print("\t Green: "); Serial.println(green_led_value); |
Используем функцию analogWrite() для управления интенсивностью свечения светодиодов всех цветов.
1 2 3 |
analogWrite(red_led_pin,red_led_value); // красный светодиод analogWrite(blue_led_pin,blue_led_value); // синий светодиод analogWrite(green_led_pin,green_led_value); // зеленый светодиод |
Принцип работы проекта достаточно прост. Когда изменяется интенсивность света, падающего на фоторезисторы, изменяется их сопротивление, что приводит к изменению напряжения на используемых аналоговых входах Arduino. А полученные значения с АЦП аналоговых контактов с помощью ШИМ используются для управления яркостью свечения светодиодов каждого цвета в трехцветном светодиоде. Таким образом, в зависимости от освещения в комнате мы получаем разные цвета в трехцветном светодиоде.
Далее представлен полный код программы.
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 |
const byte red_sensor_pin = A0; const byte green_sensor_pin = A1; const byte blue_sensor_pin = A2; const byte green_led_pin = 9; const byte blue_led_pin = 10; const byte red_led_pin = 11; unsigned int red_led_value = 0; unsigned int blue_led_value = 0; unsigned int green_led_value = 0; unsigned int red_sensor_value = 0; unsigned int blue_sensor_value = 0; unsigned int green_sensor_value = 0; void setup() { pinMode(red_led_pin,OUTPUT); pinMode(blue_led_pin,OUTPUT); pinMode(green_led_pin,OUTPUT); Serial.begin(9600); } void loop() { red_sensor_value = analogRead(red_sensor_pin); delay(50); blue_sensor_value = analogRead(blue_sensor_pin); delay(50); green_sensor_value = analogRead(green_sensor_pin); // print those values onto the serial monitor Serial.println("Raw Sensor Values:"); Serial.print("\t Red: "); Serial.print(red_sensor_value); Serial.print("\t Blue: "); Serial.print(blue_sensor_value); Serial.print("\t Green: "); Serial.println(green_sensor_value); // преобразуем значения из диапазона 0-1023 в диапазон 0-255 red_led_value = red_sensor_value / 4; // значение для красного (Red) светодиода blue_led_value = blue_sensor_value / 4; // значение для синего (Blue) светодиода green_led_value = green_sensor_value / 4; // значение для зеленого (Green) светодиода // print mapped values to serial monitor Serial.println("Mapped Sensor Values:"); Serial.print("\t Red: "); Serial.print(red_led_value); Serial.print("\t Blue: "); Serial.print(blue_led_value); Serial.print("\t Green: "); Serial.println(green_led_value); // use analogWrite() to set output for RGB LED analogWrite(red_led_pin,red_led_value); // красный светодиод analogWrite(blue_led_pin,blue_led_value); // синий светодиод analogWrite(green_led_pin,green_led_value); // зеленый светодиод } |