Displays a gradient between two colors
Dependencies: mbed WS2812 PixelArray
main.cpp
00001 #include "mbed.h" 00002 #include "WS2812.h" 00003 #include <stdio.h> 00004 #include "PixelArray.h" 00005 00006 00007 #define WS2812_BUF 16 //количество светодиодов в матрице 00008 #define NUM_COLORS 15 //количество цветов 00009 #define PIN_NUM A2 // номер пина 00010 00011 00012 00013 using namespace std; 00014 00015 PixelArray px(WS2812_BUF); // обращение к объекту класса матрицы 00016 //WS2812 ws(PIN_NUM, WS2812_BUF,6,17,9,14); //обращение к объекту класса светодиодного модуля 00017 WS2812 ws(PIN_NUM, WS2812_BUF,3,12,9,12); 00018 00019 00020 int color_set(uint8_t red,uint8_t green, uint8_t blue) // функция установки цвета 00021 { 00022 return ((red<<16) + (green<<8) + blue); 00023 } 00024 00025 // функция получения градиента 00026 int interpolate(int startValue, int endValue, int stepNumber, int lastStepNumber) 00027 { 00028 return (endValue - startValue) * stepNumber / lastStepNumber + startValue; 00029 } 00030 00031 int main() 00032 { 00033 uint8_t ir = 0; 00034 uint8_t ig = 0; 00035 uint8_t ib = 0; 00036 00037 00038 ws.useII(WS2812::PER_PIXEL); //дает возможность установить яркость 00039 00040 // установка цветов, которыми мы хотим воспользоваться 00041 int colorbuf[NUM_COLORS] = {0xff0000,0x00FFFF,0x0000FF,0xFF00FF,0x808080,0x00FF00, 00042 0xFF0000,0xFFFFFF,0xFFFF00,0x008080,0xFF0099,0xFFF0F5, 00043 0x991199,0x808000,0xFFFFF0}; 00044 00045 //получить начальные компоненты RGB для градиента 00046 size_t c1 = colorbuf[0]; 00047 size_t r1 = (c1 & 0xff0000) >> 16; 00048 size_t g1 = (c1 & 0x00FFFF) >> 8; 00049 size_t b1 = (c1 & 0x0000FF); 00050 00051 //получить конечные компоненты RGB для градиента 00052 size_t c2 = colorbuf[1]; 00053 size_t r2 = (c2 & 0xFF00FF) >> 16; 00054 size_t g2 = (c2 & 0x808080) >> 8; 00055 size_t b2 = (c2 & 0x00FF00); 00056 00057 //получение градиента 00058 for (int i = 0; i <= WS2812_BUF; i++) 00059 { 00060 ir = interpolate(r1, r2, i, WS2812_BUF); 00061 ig = interpolate(g1, g2, i, WS2812_BUF); 00062 ib = interpolate(b1, b2, i, WS2812_BUF); 00063 px.Set(i, color_set(ir,ig,ib)); // установка для каждого светодиода (i), градиентного цвета(color_set(ir,ig,ib)) 00064 00065 } 00066 00067 00068 // Цикл плавного крестика 00069 while(true){ 00070 // цикл включения главной диагонали 00071 for (int x = 0; x<=15; x+=5 ){ 00072 for(int i = 0; i<255; i++){ 00073 px.SetI(x,i); // обращение к светодиоду (x) и установка яркости (i) 00074 ws.write(px.getBuf()); // вывод на матрицу (запуск) 00075 } 00076 } 00077 //цикл включения побочной диагонали 00078 for (int x = 3; x<=12; x+=3 ){ 00079 for(int i = 0; i<255; i++){ 00080 px.SetI(x,i); 00081 ws.write(px.getBuf()); 00082 } 00083 } 00084 // цикл выключения побочной диагонали 00085 for (int x = 12; x>=3; x-=3 ){ 00086 for(int i = 255; i>=0; i--){ 00087 px.SetI(x,i); 00088 ws.write(px.getBuf()); 00089 } 00090 } 00091 // цикл выключения главной диагонали 00092 for (int x = 15; x>=0; x-=5 ){ 00093 for(int i = 255; i>=0; i--){ 00094 px.SetI(x,i); 00095 ws.write(px.getBuf()); 00096 } 00097 } 00098 00099 00100 } 00101 }
Generated on Sun Jul 17 2022 20:49:57 by 1.7.2