Displays a gradient between two colors
Dependencies: mbed WS2812 PixelArray
main.cpp
- Committer:
- radmir102
- Date:
- 2021-04-22
- Revision:
- 3:5fd199581f15
- Parent:
- 2:c4a43cc93ca8
File content as of revision 3:5fd199581f15:
#include "mbed.h" #include "WS2812.h" #include <stdio.h> #include "PixelArray.h" #define WS2812_BUF 16 //количество светодиодов в матрице #define NUM_COLORS 15 //количество цветов #define PIN_NUM A2 // номер пина using namespace std; PixelArray px(WS2812_BUF); // обращение к объекту класса матрицы //WS2812 ws(PIN_NUM, WS2812_BUF,6,17,9,14); //обращение к объекту класса светодиодного модуля WS2812 ws(PIN_NUM, WS2812_BUF,3,12,9,12); int color_set(uint8_t red,uint8_t green, uint8_t blue) // функция установки цвета { return ((red<<16) + (green<<8) + blue); } // функция получения градиента int interpolate(int startValue, int endValue, int stepNumber, int lastStepNumber) { return (endValue - startValue) * stepNumber / lastStepNumber + startValue; } int main() { uint8_t ir = 0; uint8_t ig = 0; uint8_t ib = 0; ws.useII(WS2812::PER_PIXEL); //дает возможность установить яркость // установка цветов, которыми мы хотим воспользоваться int colorbuf[NUM_COLORS] = {0xff0000,0x00FFFF,0x0000FF,0xFF00FF,0x808080,0x00FF00, 0xFF0000,0xFFFFFF,0xFFFF00,0x008080,0xFF0099,0xFFF0F5, 0x991199,0x808000,0xFFFFF0}; //получить начальные компоненты RGB для градиента size_t c1 = colorbuf[0]; size_t r1 = (c1 & 0xff0000) >> 16; size_t g1 = (c1 & 0x00FFFF) >> 8; size_t b1 = (c1 & 0x0000FF); //получить конечные компоненты RGB для градиента size_t c2 = colorbuf[1]; size_t r2 = (c2 & 0xFF00FF) >> 16; size_t g2 = (c2 & 0x808080) >> 8; size_t b2 = (c2 & 0x00FF00); //получение градиента for (int i = 0; i <= WS2812_BUF; i++) { ir = interpolate(r1, r2, i, WS2812_BUF); ig = interpolate(g1, g2, i, WS2812_BUF); ib = interpolate(b1, b2, i, WS2812_BUF); px.Set(i, color_set(ir,ig,ib)); // установка для каждого светодиода (i), градиентного цвета(color_set(ir,ig,ib)) } // Цикл плавного крестика while(true){ // цикл включения главной диагонали for (int x = 0; x<=15; x+=5 ){ for(int i = 0; i<255; i++){ px.SetI(x,i); // обращение к светодиоду (x) и установка яркости (i) ws.write(px.getBuf()); // вывод на матрицу (запуск) } } //цикл включения побочной диагонали for (int x = 3; x<=12; x+=3 ){ for(int i = 0; i<255; i++){ px.SetI(x,i); ws.write(px.getBuf()); } } // цикл выключения побочной диагонали for (int x = 12; x>=3; x-=3 ){ for(int i = 255; i>=0; i--){ px.SetI(x,i); ws.write(px.getBuf()); } } // цикл выключения главной диагонали for (int x = 15; x>=0; x-=5 ){ for(int i = 255; i>=0; i--){ px.SetI(x,i); ws.write(px.getBuf()); } } } }