Displays a gradient between two colors

Dependencies:   mbed WS2812 PixelArray

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }