В качестве корпуса для прибора была использована коробка от конфет. В неё, на латунных стоечках, встроен микроконтроллерный модуль 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(); // иначе включаем демонстрационный режим
}
Когда вся конструкция была опробована на рабочем столе, пришло время встраивать её в квартиру. Диод удачно вписывается в нишу, чтобы световой поток падал на стену, тогда комната будет освещена лишь отражённым светом. Яркости вполне хватает в ночное время, даже с избытком. Провода от коробки до диода удлинены, теперь можно разместить джойстик на прикроватной тумбочке.


Отзывы
Написал Иван
Опубликовано в: Генератор изображений FooocusНаписал Денис
Опубликовано в: Настройка модуля HC-06Написал deman696
Опубликовано в: Настройка модуля HC-06Написал Борис
Опубликовано в: Сравнение современных СУБДНаписал Den
Опубликовано в: Редактирование сейвов Mass Effect 1