Светодиодная вывеска своими руками

23 марта 2017

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


Материалы

  • Плата Arduino Nano;
  • 50 светодиодов;
  • Материалы для корпуса.

Определяем размер вывески и рассчитываем количество светодиодов

Ширину вывески было решено сделать 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. При перепечатке данного материала активная ссылка на первоисточник, не закрытая для индексации поисковыми системами, обязательна.


Поделиться: