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());
}
}
}
}