Address strip WS2812B: различия между версиями
Строка 21: | Строка 21: | ||
==Сборка физической схемы== | ==Сборка физической схемы== | ||
Для сборки нам нужно две bread board платы, собираем по схеме: | Для сборки нам нужно две bread board платы, собираем по схеме: | ||
[[Файл:Ws2812b_BB_Schema.png|600px]] | |||
* пин 5V подключаем к +5V ленты | |||
* пин GND | |||
* пинг GPIO27 подключаем через резистор 220ом к DIN ленты | |||
Обращаю внимание на то, что не рекомендуется тестировать конфигурацию более чем на 5 светодиодах, такого количества будет достаточно, чтобы понять как выглядит световая картинка в том или ином алгоритме. Подключение большего количества светодиодов может привести к выгоранию USB-порта на компе, т.к. там обычно предельно допустимый ток 350мА, а один светодиод на такой ленте потребляет около 50мА. | |||
==Заливаем первую прошивку== | |||
Подразумевается что на PC уже установлена среда разработки VSCode и расширение PlatformIO. Создадим новый проект. | |||
[[Файл:Pio-create-prj.jpg]] | |||
Далее нам нужно подключить к проекту библиотеку для работы с лентой, они есть разные, я использовал FastLED | |||
[[Файл:Снимок экрана 2023-12-06 201634.jpg]] | |||
добавляем в проект | |||
[[Файл:Снимок экрана 2023-12-06 203931.jpg]] | |||
Открываем src/main.cpp и приводим его к следующему виду: | |||
<syntaxhighlight lang="c++"> | |||
#include <Arduino.h> | |||
#include <FastLED.h> | |||
#define LED_PIN 27 | |||
#define NUM_LEDS 5 | |||
#define BRIGHTNESS 50 | |||
#define LED_TYPE WS2811_400 | |||
#define COLOR_ORDER GRB | |||
CRGB leds[NUM_LEDS]; | |||
#define UPDATES_PER_SECOND 50 | |||
// This example shows several ways to set up and use 'palettes' of colors | |||
// with FastLED. | |||
// | |||
// These compact palettes provide an easy way to re-colorize your | |||
// animation on the fly, quickly, easily, and with low overhead. | |||
// | |||
// USING palettes is MUCH simpler in practice than in theory, so first just | |||
// run this sketch, and watch the pretty lights as you then read through | |||
// the code. Although this sketch has eight (or more) different color schemes, | |||
// the entire sketch compiles down to about 6.5K on AVR. | |||
// | |||
// FastLED provides a few pre-configured color palettes, and makes it | |||
// extremely easy to make up your own color schemes with palettes. | |||
// | |||
// Some notes on the more abstract 'theory and practice' of | |||
// FastLED compact palettes are at the bottom of this file. | |||
CRGBPalette16 currentPalette; | |||
TBlendType currentBlending; | |||
extern CRGBPalette16 myRedWhiteBluePalette; | |||
extern const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM; | |||
void setup() { | |||
delay( 3000 ); // power-up safety delay | |||
FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); | |||
FastLED.setBrightness( BRIGHTNESS ); | |||
currentPalette = RainbowColors_p; | |||
currentBlending = LINEARBLEND; | |||
} | |||
void ChangePalettePeriodically(); | |||
void FillLEDsFromPaletteColors( uint8_t colorIndex); | |||
void loop() | |||
{ | |||
ChangePalettePeriodically(); | |||
static uint8_t startIndex = 0; | |||
startIndex = startIndex + 1; /* motion speed */ | |||
FillLEDsFromPaletteColors( startIndex); | |||
FastLED.show(); | |||
FastLED.delay(1000 / UPDATES_PER_SECOND); | |||
} | |||
void FillLEDsFromPaletteColors( uint8_t colorIndex) | |||
{ | |||
uint8_t brightness = 255; | |||
for( int i = 0; i < NUM_LEDS; ++i) { | |||
leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending); | |||
colorIndex += 3; | |||
} | |||
} | |||
// There are several different palettes of colors demonstrated here. | |||
// | |||
// FastLED provides several 'preset' palettes: RainbowColors_p, RainbowStripeColors_p, | |||
// OceanColors_p, CloudColors_p, LavaColors_p, ForestColors_p, and PartyColors_p. | |||
// | |||
// Additionally, you can manually define your own color palettes, or you can write | |||
// code that creates color palettes on the fly. All are shown here. | |||
void SetupTotallyRandomPalette(); | |||
void SetupPurpleAndGreenPalette(); | |||
void SetupPurpleAndGreenPalette(); | |||
void SetupBlackAndWhiteStripedPalette(); | |||
void ChangePalettePeriodically() | |||
{ | |||
uint8_t secondHand = (millis() / 1000) % 60; | |||
static uint8_t lastSecond = 99; | |||
if( lastSecond != secondHand) { | |||
lastSecond = secondHand; | |||
if( secondHand == 0) { currentPalette = RainbowColors_p; currentBlending = LINEARBLEND; } | |||
if( secondHand == 10) { currentPalette = RainbowStripeColors_p; currentBlending = NOBLEND; } | |||
if( secondHand == 15) { currentPalette = RainbowStripeColors_p; currentBlending = LINEARBLEND; } | |||
if( secondHand == 20) { SetupPurpleAndGreenPalette(); currentBlending = LINEARBLEND; } | |||
if( secondHand == 25) { SetupTotallyRandomPalette(); currentBlending = LINEARBLEND; } | |||
if( secondHand == 30) { SetupBlackAndWhiteStripedPalette(); currentBlending = NOBLEND; } | |||
if( secondHand == 35) { SetupBlackAndWhiteStripedPalette(); currentBlending = LINEARBLEND; } | |||
if( secondHand == 40) { currentPalette = CloudColors_p; currentBlending = LINEARBLEND; } | |||
if( secondHand == 45) { currentPalette = PartyColors_p; currentBlending = LINEARBLEND; } | |||
if( secondHand == 50) { currentPalette = myRedWhiteBluePalette_p; currentBlending = NOBLEND; } | |||
if( secondHand == 55) { currentPalette = myRedWhiteBluePalette_p; currentBlending = LINEARBLEND; } | |||
} | |||
} | |||
// This function fills the palette with totally random colors. | |||
void SetupTotallyRandomPalette() | |||
{ | |||
for( int i = 0; i < 16; ++i) { | |||
currentPalette[i] = CHSV( random8(), 255, random8()); | |||
} | |||
} | |||
// This function sets up a palette of black and white stripes, | |||
// using code. Since the palette is effectively an array of | |||
// sixteen CRGB colors, the various fill_* functions can be used | |||
// to set them up. | |||
void SetupBlackAndWhiteStripedPalette() | |||
{ | |||
// 'black out' all 16 palette entries... | |||
fill_solid( currentPalette, 16, CRGB::Black); | |||
// and set every fourth one to white. | |||
currentPalette[0] = CRGB::White; | |||
currentPalette[4] = CRGB::White; | |||
currentPalette[8] = CRGB::White; | |||
currentPalette[12] = CRGB::White; | |||
} | |||
// This function sets up a palette of purple and green stripes. | |||
void SetupPurpleAndGreenPalette() | |||
{ | |||
CRGB purple = CHSV( HUE_PURPLE, 255, 255); | |||
CRGB green = CHSV( HUE_GREEN, 255, 255); | |||
CRGB black = CRGB::Black; | |||
currentPalette = CRGBPalette16( | |||
green, green, black, black, | |||
purple, purple, black, black, | |||
green, green, black, black, | |||
purple, purple, black, black ); | |||
} | |||
// This example shows how to set up a static color palette | |||
// which is stored in PROGMEM (flash), which is almost always more | |||
// plentiful than RAM. A static PROGMEM palette like this | |||
// takes up 64 bytes of flash. | |||
const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM = | |||
{ | |||
CRGB::Red, | |||
CRGB::Gray, // 'white' is too bright compared to red and blue | |||
CRGB::Blue, | |||
CRGB::Black, | |||
CRGB::Red, | |||
CRGB::Gray, | |||
CRGB::Blue, | |||
CRGB::Black, | |||
CRGB::Red, | |||
CRGB::Red, | |||
CRGB::Gray, | |||
CRGB::Gray, | |||
CRGB::Blue, | |||
CRGB::Blue, | |||
CRGB::Black, | |||
CRGB::Black | |||
}; | |||
// Additional notes on FastLED compact palettes: | |||
// | |||
// Normally, in computer graphics, the palette (or "color lookup table") | |||
// has 256 entries, each containing a specific 24-bit RGB color. You can then | |||
// index into the color palette using a simple 8-bit (one byte) value. | |||
// A 256-entry color palette takes up 768 bytes of RAM, which on Arduino | |||
// is quite possibly "too many" bytes. | |||
// | |||
// FastLED does offer traditional 256-element palettes, for setups that | |||
// can afford the 768-byte cost in RAM. | |||
// | |||
// However, FastLED also offers a compact alternative. FastLED offers | |||
// palettes that store 16 distinct entries, but can be accessed AS IF | |||
// they actually have 256 entries; this is accomplished by interpolating | |||
// between the 16 explicit entries to create fifteen intermediate palette | |||
// entries between each pair. | |||
// | |||
// So for example, if you set the first two explicit entries of a compact | |||
// palette to Green (0,255,0) and Blue (0,0,255), and then retrieved | |||
// the first sixteen entries from the virtual palette (of 256), you'd get | |||
// Green, followed by a smooth gradient from green-to-blue, and then Blue. | |||
</syntaxhighlight> | |||
сейчас можно залить попробовать скомпилировать прошивку, для этого в нижней панели жмём кнопку [[Файл:Снимок экрана 2023-12-06 205145.jpg]] | |||
если всё собралось, только можно шить это дело в esp32: | |||
* подключаем esp32 к компу при помощи microUSB data кабеля | |||
* инициируем заливку прошивки при помощи кнопки [[Файл:Снимок экрана 2023-12-06 205336.jpg]], когда система напишет "Connecting..." - зажимаем кнопку Boot на dev-плате esp32 | |||
* если прошивка залилась успешно, перезагружаем esp32 соответствующей кнопкой, после этого у вас должна заработать лента, алгоритм будет менять каждые 5 секунд, всего 12 алгоритмов |