Алгоритм управления последовательностью светодиодов с WS2812 очень прост: первый светодиод принимает и записывает в свою внутреннюю память первые 24 бита с информацией о яркости каждого из трех встроенных в него диодов, а все остальные биты последовательности передает второму светодиоду. Соответственно второй светодиод получит и обработает свои 24 бита, а оставшуюся часть исходного сигнала передаст третьему и т.д. После передачи данных для всех светодиодов необходимо сделать паузу длиной 50 мкс, чтобы состояние светодиодов обновилось.
Для генерации управляющего сигнала может пригодиться микроконтроллер или плата Arduino.
Пример
GND > GND
5V > 5V
D6 > DIN (между ними резистор 200 – 500 Ом)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
// Adafruit_NeoMatrix example for single NeoPixel Shield. // Scrolls 'Howdy' across the matrix in a portrait (vertical) orientation. #include <Adafruit_GFX.h> #include <Adafruit_NeoMatrix.h> #include <Adafruit_NeoPixel.h> #ifndef PSTR #define PSTR // Make Arduino Due happy #endif #define PIN 2 // MATRIX DECLARATION: // Parameter 1 = width of NeoPixel matrix // Parameter 2 = height of matrix // Parameter 3 = pin number (most are valid) // Parameter 4 = matrix layout flags, add together as needed: // NEO_MATRIX_TOP, NEO_MATRIX_BOTTOM, NEO_MATRIX_LEFT, NEO_MATRIX_RIGHT: // Position of the FIRST LED in the matrix; pick two, e.g. // NEO_MATRIX_TOP + NEO_MATRIX_LEFT for the top-left corner. // NEO_MATRIX_ROWS, NEO_MATRIX_COLUMNS: LEDs are arranged in horizontal // rows or in vertical columns, respectively; pick one or the other. // NEO_MATRIX_PROGRESSIVE, NEO_MATRIX_ZIGZAG: all rows/columns proceed // in the same order, or alternate lines reverse direction; pick one. // See example below for these values in action. // Parameter 5 = pixel type flags, add together as needed: // NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs) // NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) // NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products) // NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2) // Example for NeoPixel Shield. In this application we'd like to use it // as a 5x8 tall matrix, with the USB port positioned at the top of the // Arduino. When held that way, the first pixel is at the top right, and // lines are arranged in columns, progressive order. The shield uses // 800 KHz (v2) pixels that expect GRB color data. Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(32, 8, PIN, NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG, NEO_GRB + NEO_KHZ800); const uint16_t colors[] = { matrix.Color(255, 0, 0), matrix.Color(0, 255, 0)}; static const unsigned long REFRESH_INTERVAL = 600; // ms static unsigned long lastRefreshTime = 0; static unsigned long CircleRefresh = 0; static const unsigned long Circle_Step = 100; // ms void setup() { matrix.begin(); matrix.setTextWrap(false); matrix.setBrightness(40); matrix.setTextColor(colors[0]); } int x = matrix.width(); int pass = 0; int y = 3; int toggle=1; int diameter = 0; int radius = 0; void loop() { if(millis() - CircleRefresh >= Circle_Step) { CircleRefresh += Circle_Step; if (diameter < 6 ) { diameter++ ; } else { diameter = 0; } } if (diameter < 1 ) { radius = 0; } else if (diameter < 2) { radius = 1; } else if (diameter < 3) { radius = 2; } else if (diameter < 4) { radius = 3; } else if (diameter < 5) { radius = 2; } else if (diameter < 6) { radius = 1; } else { radius =0; if (toggle > 0 ) { toggle = 0; y=28; } else { y=3; toggle =1; } } matrix.fillScreen(0); matrix.fillCircle(y, 3, radius, matrix.Color(0, 0, 255)); matrix.setCursor(x, 0); matrix.print(F("AMPERMARKET.KZ AMPERMARKET.KZ")); if(--x < -140) { x = matrix.width(); if(++pass >= 2) pass = 0; matrix.setTextColor(colors[pass]); } matrix.show(); delay(100); } |
Библиотека Adafruit GFX
Библиотека Adafruit NeoMatrix
Библиотека Adafruit NeoPixel
Документация WS2812B