В качестве корпуса для прибора была использована коробка от конфет. В неё, на латунных стоечках, встроен микроконтроллерный модуль Arduino UNO, который и будет управлять трёхцветным (сверхъярким) светодиодом. Там же поместился футляр для элементов питания АА, причём отлично подошли уже прилично потрёпанные батарейки от радиоуправляемой машинки - вообще, они были приготовлены к утилизации.
Внезапно родилась идея, а нельзя ли как-то дополнительно управлять светильником? На глаза попался миниатюрный джойстик. Да, именно то, что нужно!
В результате светильник плавно меняет цвета красный-зелёный-голубой, но при нажатии на кнопку джойстика переходит в режим ручного управления (в котром уровень яркости каждого цвета определяется положением рукоятки джойсктика). Повторное нажатие на кнопку приводит к выходу из режима ручного управления.
Текст программы изначально был позаимствован из открытых источников, но затем сильно модифицирован. Получился более мягкий и нежный ночной светильник.
const int pinRed = 11; const int pinGreen = 9; const int pinBlue = 10; const int swPin = A5; const int pinX = A4; // X const int pinY = A3; // Y const int ledPin = 13; boolean ledOn = false; // текущее состояние кнопки boolean prevSw = false; // предыдущее состояние кнопки void setup() { pinMode(ledPin, OUTPUT); pinMode(pinRed, OUTPUT); pinMode(pinGreen, OUTPUT); pinMode(pinBlue, OUTPUT); pinMode(pinX, INPUT); pinMode(pinY, INPUT); pinMode(swPin, INPUT); digitalWrite(swPin, HIGH); // включаем встроенный подтягивающий резистор } boolean isLedOn() { // ОПРЕДЕЛЯЕМ НАЖАТИЕ КНОПКИ if (digitalRead(swPin) == HIGH && prevSw == LOW) { ledOn = !ledOn; prevSw = HIGH; } else prevSw = digitalRead(swPin); digitalWrite(ledPin, ledOn); // включаем светодиод на пине 13 return ledOn; } void CtlMode() { // РЕЖИМ "Ручное управление" int X = analogRead(pinX); // считываем положение джойстика int Y = analogRead(pinY); int BLUE = map(Y, 000, 1023, 0, 255); // маппинг значений int GREEN = map(X, 512, 1023, 0, 255); int RED = map(X, 511, 0, 0, 255); analogWrite(pinRed, RED); // включение каналов R,G,B analogWrite(pinGreen, GREEN); analogWrite(pinBlue, BLUE); } void DemoMode() { // РЕЖИМ "Демонстрация" for (int i=0; i <= 255; i++) { if (isLedOn()) { break; } // при нажатии кнопки выходим из цикла analogWrite(pinRed, i); // работает канал RED analogWrite(pinGreen, 0); analogWrite(pinBlue, 0); delay(7); } for (int i=255; i >= 0; i--) { if (isLedOn()) { break; } // при нажатии кнопки выходим из цикла analogWrite(pinRed, i); // работает канал RED analogWrite(pinGreen, 0); analogWrite(pinBlue, 0); delay(7); } for (int i=0; i <= 255; i++) { if (isLedOn()) { break; } // при нажатии кнопки выходим из цикла analogWrite(pinRed, 0); analogWrite(pinGreen, 0); analogWrite(pinBlue, i); // работает канал BLUE delay(7); } for (int i=255; i >= 0; i--) { if (isLedOn()) { break; } // при нажатии кнопки выходим из цикла analogWrite(pinRed, 0); analogWrite(pinGreen, 0); analogWrite(pinBlue, i); // работает канал BLUE delay(7); } for (int i=0; i <= 255; i++) { if (isLedOn()) { break; } // при нажатии кнопки выходим из цикла analogWrite(pinRed, 0); analogWrite(pinGreen, i); // работает канал GREEN analogWrite(pinBlue, 0); delay(7); } for (int i=255; i >= 0; i--) { if (isLedOn()) { break; } // при нажатии кнопки выходим из цикла analogWrite(pinRed, 0); analogWrite(pinGreen, i); // работает канал GREEN analogWrite(pinBlue, 0); delay(7); } } void loop() { // если нажата кнопка и горит светодиод на пине 13, включаем режим "Ручое управление" if (isLedOn()) CtlMode(); else DemoMode(); // иначе включаем демонстрационный режим }
Когда вся конструкция была опробована на рабочем столе, пришло время встраивать её в квартиру. Диод удачно вписывается в нишу, чтобы световой поток падал на стену, тогда комната будет освещена лишь отражённым светом. Яркости вполне хватает в ночное время, даже с избытком. Провода от коробки до диода удлинены, теперь можно разместить джойстик на прикроватной тумбочке.
Отзывы
Написал Денис
Опубликовано в: Настройка модуля HC-06Написал deman696
Опубликовано в: Настройка модуля HC-06Написал Борис
Опубликовано в: Сравнение современных СУБДНаписал Den
Опубликовано в: Редактирование сейвов Mass Effect 1Написал Артём
Опубликовано в: Запрет обновлений Google Chrome