Многим нравятся различные неоновые вывески. Яркие и привлекательные они невольно приковывают взгляд. Именно поэтому их так часто используют для рекламы. Ведь главная ее задача – это обращать на себя внимание как можно большего количества людей. И, думаю, многим хотелось бы иметь нечто подобное у себя дома или в уголке, где вы проводите много времени. Но где ее взять? Заказать в рекламном агентстве? Это будет стоить немалых денег. А вдруг она надоест или захочется что-то в ней изменить? Снова придется тратить кучу денег на ее изменение и реставрацию? Нет. Сегодня мы своими руками создадим такую вывеску. И каждый сможет подобрать изображение или надпись на ней на свой вкус.

Ширину вывески было решено сделать 19”. Дабы сохранить пропорции слова "ARDUINO", высота будет 5”. Вывеска такого размера отлично смотрится над дверью.
Слово "ARDUINO" состоит из шести сложных и одной простой буквы «I», на которую нам хватит 4 диодов. На остальные буквы потребуется 7-8 диодов.
Подойдут любые RGB светодиоды. Проще всего купить набор из 50 RGB светодиодов. Этого вполне должно хватить.

Нам подойдет любое оргстекло. В нашем случае – это отрезок полупрозрачного стекла. Из него необходимо выпилить кусок 19х5”. После этого нужно отшлифовать края наждачной бумагой.
Светодиоды к стеклу будут крепится при помощи горячего клея, поэтому обратную сторону также следует обработать более крупной наждачкой. В противном случае клей не будет достаточно крепко держаться на гладкой глянцевой поверхности.

Изображение нашего размера легко помещается на два листа А4. Разбить изображение можно в любом графическом редакторе. В нашем случае – это слово ARDUINO. Подсвечиваемые участки должны быть светлыми. Поэтому мы печатаем белые буквы на черном фоне. Также стоит отметить, что не следует использовать для печати плотную бумагу. Так как через нее не будет проходить свет в достаточной мере. Подойдет обычная копировальная бумага.

Следующий шаг – это разметка стекла для крепления светодиодов. Для этого подойдет мягкий простой карандаш. По 8 светодиодов будет использоваться для букв «A», «R», «D», «U», «N», 4 для «I» и шесть для «O».

Для крепления светодиодов к обратной стороне оргстекла мы используем горячий клей. Температуру пистолета лучше ставить не очень высокую, дабы клей быстрей застывал и светодиоды не «стекали». Также стоит помнить, что провода от светодиодов не очень длинные. Поэтому стоит обдумывать в каком месте делать переход от буквы к букве. В противном случае придется допаивать провода. Еще один момент – это форма вершины светодиода. Если вы приобрели круглые, то лучше сточить верх и сделать его плоским. Клеить будет намного легче.

Боковые стенки мы сделали деревянными. К ним при помощи шурупов мы крепим стекло с наклеенным на него изображением.

Мы использовали половину 400-коннекторной макетной платы и установили ее на деревянное основание. Также были установлены две кнопки для переключения режимов свечения светодиодов. Их стоит подключить к контактам 2 и 3 на плате. Одна кнопка будет увеличивать скорость мерцания, а другая уменьшать.

Несмотря на то, что плату Arduino Nano можно запитать от любого порта USB, мы решили использовать преобразователь, дабы нашу вывеску можно было подключать где угодно.
Проект готов и полностью работоспособен, но к нему можно добавить какую-нибудь интересную функцию. Например, при помощи потенциометра можно контролировать яркость и скорость смены цветов.
Файл с кодом.
#include
<Adafruit_NeoPixel.h>
int mode =
0; // This is the "mode" of the device. It starts at 0 and gets incremented or
decremented
int
newModeInc = 0; // Set to 1 by the ISR when the Green Increment Mode button is
pressed.
int
newModeDec = 0; // Set to 1 by the ISR when the Red Decrment Mode button is
pressed.
long
lastDebounceTime = 0; // the last time
the output pin was toggled
long
debounceDelay = 150; // the debounce
time; increase if the output flickers
const int
LED_STRIP_PIN = 12; // Connect the Data pin of the LED strip here
const int
NUMBER_PIXELS = 30;
; // Number
of pixels in the LED strip
Adafruit_NeoPixel
strip = Adafruit_NeoPixel(NUMBER_PIXELS, LED_STRIP_PIN, NEO_GRB + NEO_KHZ800);
int
modeCount = 17; // The number of display modes, we mode the mode to get the
actual mode
int
mainLoopCount = 0; // The number of
times we go through the main loop
void
setup()
{
pinMode(13, OUTPUT); // Pin 13 is output to which an LED is
connected
digitalWrite(13, LOW); // Make pin 13 low, switch LED off
pinMode(2, INPUT_PULLUP); // Pin 2 is input to which a switch is
connected = INT0
pinMode(3, INPUT_PULLUP); // Pin 3 is input to which a switch is
connected = INT1
attachInterrupt(0, changeModeInc,
FALLING ); // pin 2
attachInterrupt(1, changeModeDec,
FALLING ); // pin 3
Serial.begin(9600);
strip.begin(); // sets up the memory for the
LED strip
Serial.println("Start");
Serial.print("Mode=");
Serial.println(mode, DEC);
rainbow7();
delay(100);
newModeInc=0; // must be reset to 0 at the
end of setup!
newModeDec=0;
}
void loop()
{
if (newModeInc == 1) {
if ((millis() - lastDebounceTime) >
debounceDelay) {
mode++;
mode = mode % modeCount;
Serial.print("Inc Mode=");
Serial.println(mode, DEC);
digitalWrite(13, LOW);
newModeInc = 0;
}
else {
}
};
if (newModeDec == 1) {
if ((millis() - lastDebounceTime) >
debounceDelay) {
if (mode == 0) {
mode = modeCount - 1;
} else {
mode--;
}
Serial.print("Dec Mode=");
Serial.println(mode, DEC);
digitalWrite(13, LOW);
newModeDec = 0;
}
};
// select the mode
switch (mode) {
case 0:rainbow7();break; // 7 pixel
rainbow
case 1: dot(255, 0, 0);break; // red
case 2: dot(0, 255, 0);break; // green
case 3: dot(0, 0, 255);break; // blue
case 4: colorWipe(255 ,0, 0);break;
case 5: colorWipe(0, 255, 0);break;
case 6: colorWipe(0, 0, 255);break;
case 7: swoosh(255 ,0, 0);break;
case 8: swoosh(0, 255, 0);break;
case 9: swoosh(0, 0, 255);break;
case 10: theaterChase(255, 0, 0);break;
case 11: theaterChase(0, 255, 0);break;
case 12: theaterChase(0, 0, 255);break;
case 13: rainbowSlide();break;
case 14: candle();break;
case 15: randomColor();break;
case 16: sparkle();break;
}
delay(100); // keep this pattern for 1/10th
of a second
mainLoopCount++;
}
//
Interrupt service routine - keep this fast
void
changeModeInc(){
digitalWrite(13, HIGH); // show we have a new
mode
newModeInc = 1; // indicate we have a new
increment mode
lastDebounceTime = millis(); // record when
we got the interrupt for debouncing
}
//
Interrupt service routine
void
changeModeDec(){
digitalWrite(13, HIGH); // show we have a new mode
newModeDec = 1; // indicate we have a new
increment mode
lastDebounceTime = millis(); // record when
we got the interrupt for debouncing
}
// move a
dot
void
dot(int red, int blue, int green) {
int index = mainLoopCount %
strip.numPixels();
clear();
strip.setPixelColor(index, red, blue, green);
strip.show();
}
void
colorWipe(int red, int blue, int green) {
int index = mainLoopCount %
strip.numPixels();
if (index == 0) {
clear();
}
else
for(uint16_t i=0; i<=index; i++) {
strip.setPixelColor(i, red, blue, green);
}
strip.show();
}
// make a
single color appear to move as a comet flying by
void
swoosh(int red, int blue, int green) {
int n = strip.numPixels();
int index = mainLoopCount % n;
clear();
strip.setPixelColor((index + 5) % n, red,
blue, green);
strip.setPixelColor((index + 4) % n, red /
1.5, blue / 1.5, green / 1.5);
strip.setPixelColor((index + 3) % n, red / 2,
blue/ 2, green/ 2);
strip.setPixelColor((index + 2) % n, red / 4,
blue/ 4, green/ 4);
strip.setPixelColor((index + 1) % n, red / 8,
blue/ 8, green/ 8);
strip.setPixelColor((index) % n, red / 16,
blue/ 16, green/ 16);
strip.show();
}
// draw a
seven segment rainbow on the LED strip with red on the highest pixel
// i is the
index of where to start
// strip is
the LED strip
void
rainbow7() {
int i = mainLoopCount;
int np = strip.numPixels(); // we use the modulo function with this
strip.setPixelColor(i % np, 0, 0, 0); // off
strip.setPixelColor((i+1) % np, 25, 0, 25);
// violet
strip.setPixelColor((i+2) % np, 255, 0,
255); // indigo
strip.setPixelColor((i+3) % np, 0, 0, 150);
// blue
strip.setPixelColor((i+4) % np, 0, 150, 0);
// green
strip.setPixelColor((i+5) % np, 255, 255,
0); // yellow
strip.setPixelColor((i+6) % np, 110, 70,
0); // orange
strip.setPixelColor((i+7) % np, 150, 0, 0);
// red
// erase the rest
strip.setPixelColor((i+8) %np , 0, 0, 0);
strip.setPixelColor((i+9) %np , 0, 0, 0);
strip.setPixelColor((i+10) %np , 0, 0, 0);
strip.setPixelColor((i+11) %np , 0, 0, 0);
strip.show();
}
void
rainbowSlide() {
for(int i=0; i< strip.numPixels(); i++)
{
strip.setPixelColor((i + mainLoopCount)
% strip.numPixels(), Wheel(((i * 256 / strip.numPixels()) + mainLoopCount)
& 255));
}
strip.show();
}
void
randomColor() {
int randomIndex = random(strip.numPixels());
// a number from 0 to 11
clear();
strip.setPixelColor(randomIndex,
Wheel(random(255)));
strip.show();
}
void
sparkle() {
int randomIndex = random(strip.numPixels());
// a number from 0 to 11
clear();
strip.setPixelColor(randomIndex, 10, 10,
10);
strip.show();
}
void
clear() {
for(uint16_t i=0; i<strip.numPixels();
i++) {
strip.setPixelColor(i, 0);
strip.show();
}
}
// Input a
value 0 to 255 to get a color value.
// The
colours are a transition r - g - b - back to r.
uint32_t
Wheel(byte WheelPos) {
if(WheelPos < 85) {
return strip.Color(WheelPos * 3, 255 -
WheelPos * 3, 0);
} else if(WheelPos < 170) {
WheelPos -= 85;
return strip.Color(255 - WheelPos * 3, 0,
WheelPos * 3);
} else {
WheelPos -= 170;
return strip.Color(0, WheelPos * 3, 255 -
WheelPos * 3);
}
}
void
candle() {
uint8_t green; // brightness of the green
uint8_t red;
// add a bit for red
for(uint8_t i=0; i<100; i++) {
green = 50 + random(155);
red = green + random(50);
strip.setPixelColor(random(strip.numPixels() - 1), red, green, 0);
strip.show();
delay(5);
}
}
void
theaterChase(int red, int blue, int green) {
int index =
mainLoopCount % strip.numPixels();
for(int
i=0; i < strip.numPixels(); i++) {
if ((i + index) % 3 == 0)
{
strip.setPixelColor(i, red, green,
blue);
}
else
{
strip.setPixelColor(i, 0, 0, 0);
}
}
strip.show();
}
На этом все. Проект полностью готов к работе и будет радовать вас и ваших гостей.
Статья является авторским переводом с сайта instructables.com.
Данная статья является собственностью Amperkot.ru. При перепечатке данного материала активная ссылка на первоисточник, не закрытая для индексации поисковыми системами, обязательна.
Комментарии