Displays a gradient between two colors
Dependencies: mbed WS2812 PixelArray
main.cpp
- Committer:
- radmir102
- Date:
- 2021-04-21
- Revision:
- 2:c4a43cc93ca8
- Parent:
- 1:3fa4e131f518
- Child:
- 3:5fd199581f15
File content as of revision 2:c4a43cc93ca8:
#include "mbed.h" #include "WS2812.h" #include <stdio.h> #include "PixelArray.h" #define WS2812_BUF 16 //number of LEDs in the array #define NUM_COLORS 14 //number of colors to store in the array #define PIN_NUM A2 #define LIGHT_INTENSITY 30 using namespace std; PixelArray px(WS2812_BUF); DigitalIn usrBtn(USER_BUTTON); // See the program page for information on the timing numbers WS2812 ws(PIN_NUM, WS2812_BUF,6,17,9,14); //nucleo-f411re int color_set(uint8_t red,uint8_t green, uint8_t blue) { return ((red<<16) + (green<<8) + blue); } // 0 <= stepNumber <= lastStepNumber 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; int btnState = 0; ws.useII(WS2812::PER_PIXEL); // use per-pixel intensity scaling // set up the colours we want to draw with int colorbuf[NUM_COLORS] = {0xff0000,0x00FFFF,0x0000FF,0xFF00FF,0x808080,0x00FF00, 0xFF0000,0xFFFFFF,0xFFFF00,0x008080,0xFF0099,0xFFF0F5, 0x991199,0x808000}; //get starting RGB components for interpolation size_t c1 = colorbuf[0]; size_t r1 = (c1 & 0xff0000) >> 16; size_t g1 = (c1 & 0x00FFFF) >> 8; size_t b1 = (c1 & 0x0000FF); //get ending RGB components for interpolation 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); //write the color value for each pixel px.Set(i, color_set(ir,ig,ib)); //write the II value for each pixel } // цикл плавного прохода по каждому светодиоду и обратное угасание while(true){ for (int i = 0; i<WS2812_BUF; i++){ for (int j = 0; j<30 ; j++){ px.SetI(i, j); wait(0.01); ws.write(px.getBuf()); } } for (int x = WS2812_BUF; x>=0; x-- ) for (int j = 30; j>0 ; j--){ px.SetI(x, j); wait(0.01); ws.write(px.getBuf()); } } // цикл плавного прохода по диагонали /*while(true){ for (int x = 0; x<=20; x+=5 ){ for(int i = 0; i<30; i++){ px.SetI(x,i); wait(0.01); ws.write(px.getBuf()); } } for (int x = 20; x>=0; x-=5 ){ for(int i = 30; i>=0; i--){ px.SetI(x,i); wait(0.01); ws.write(px.getBuf()); } }}*/ // Цикл плавного крестика /* while(true){ for (int x = 0; x<=20; x+=5 ){ for(int i = 0; i<30; i++){ px.SetI(x,i); wait(0.01); ws.write(px.getBuf()); } } for (int x = 3; x<=12; x+=3 ){ for(int i = 0; i<30; i++){ px.SetI(x,i); wait(0.01); ws.write(px.getBuf()); } } for (int x = 12; x>=3; x-=3 ){ for(int i = 30; i>=0; i--){ px.SetI(x,i); wait(0.01); ws.write(px.getBuf()); } } for (int x = 0; x<=20; x-=5 ){ for(int i = 30; i>=0; i--){ px.SetI(x,i); wait(0.01); ws.write(px.getBuf()); } } } */ /* int d = 20; while(true){ for (int x = 0; x<=20; x+=5 ){ for(int i = 0; i<30; i++){ px.SetI(x,i); wait(0.01); px.SetI(d-=2,i); wait(0.01); ws.write(px.getBuf()); } } for (int x = 12; x>=3; x-=3 ){ for(int i = 30; i>=0; i--){ px.SetI(x,i); wait(0.01); ws.write(px.getBuf()); } } for (int x = 0; x<=20; x-=5 ){ for(int i = 30; i>=0; i--){ px.SetI(x,i); wait(0.01); ws.write(px.getBuf()); } } } */ /* for (int i = WS2812_BUF; i >= 0; i--) { ws.write(px.getBuf()); }*/ }