Displays a gradient between two colors

Dependencies:   mbed WS2812 PixelArray

Committer:
radmir102
Date:
Thu Apr 22 10:16:59 2021 +0000
Revision:
3:5fd199581f15
Parent:
2:c4a43cc93ca8
realise prog

Who changed what in which revision?

UserRevisionLine numberNew contents of line
theros 0:3bb97062a703 1 #include "mbed.h"
theros 0:3bb97062a703 2 #include "WS2812.h"
radmir102 2:c4a43cc93ca8 3 #include <stdio.h>
theros 0:3bb97062a703 4 #include "PixelArray.h"
theros 0:3bb97062a703 5
radmir102 3:5fd199581f15 6
radmir102 3:5fd199581f15 7 #define WS2812_BUF 16 //количество светодиодов в матрице
radmir102 3:5fd199581f15 8 #define NUM_COLORS 15 //количество цветов
radmir102 3:5fd199581f15 9 #define PIN_NUM A2 // номер пина
radmir102 3:5fd199581f15 10
radmir102 3:5fd199581f15 11
theros 0:3bb97062a703 12
radmir102 1:3fa4e131f518 13 using namespace std;
radmir102 2:c4a43cc93ca8 14
radmir102 3:5fd199581f15 15 PixelArray px(WS2812_BUF); // обращение к объекту класса матрицы
radmir102 3:5fd199581f15 16 //WS2812 ws(PIN_NUM, WS2812_BUF,6,17,9,14); //обращение к объекту класса светодиодного модуля
radmir102 3:5fd199581f15 17 WS2812 ws(PIN_NUM, WS2812_BUF,3,12,9,12);
radmir102 1:3fa4e131f518 18
theros 0:3bb97062a703 19
radmir102 3:5fd199581f15 20 int color_set(uint8_t red,uint8_t green, uint8_t blue) // функция установки цвета
theros 0:3bb97062a703 21 {
theros 0:3bb97062a703 22 return ((red<<16) + (green<<8) + blue);
theros 0:3bb97062a703 23 }
theros 0:3bb97062a703 24
radmir102 3:5fd199581f15 25 // функция получения градиента
theros 0:3bb97062a703 26 int interpolate(int startValue, int endValue, int stepNumber, int lastStepNumber)
theros 0:3bb97062a703 27 {
theros 0:3bb97062a703 28 return (endValue - startValue) * stepNumber / lastStepNumber + startValue;
theros 0:3bb97062a703 29 }
theros 0:3bb97062a703 30
theros 0:3bb97062a703 31 int main()
theros 0:3bb97062a703 32 {
theros 0:3bb97062a703 33 uint8_t ir = 0;
theros 0:3bb97062a703 34 uint8_t ig = 0;
theros 0:3bb97062a703 35 uint8_t ib = 0;
radmir102 3:5fd199581f15 36
theros 0:3bb97062a703 37
radmir102 3:5fd199581f15 38 ws.useII(WS2812::PER_PIXEL); //дает возможность установить яркость
theros 0:3bb97062a703 39
radmir102 3:5fd199581f15 40 // установка цветов, которыми мы хотим воспользоваться
radmir102 2:c4a43cc93ca8 41 int colorbuf[NUM_COLORS] = {0xff0000,0x00FFFF,0x0000FF,0xFF00FF,0x808080,0x00FF00,
radmir102 2:c4a43cc93ca8 42 0xFF0000,0xFFFFFF,0xFFFF00,0x008080,0xFF0099,0xFFF0F5,
radmir102 3:5fd199581f15 43 0x991199,0x808000,0xFFFFF0};
theros 0:3bb97062a703 44
radmir102 3:5fd199581f15 45 //получить начальные компоненты RGB для градиента
radmir102 1:3fa4e131f518 46 size_t c1 = colorbuf[0];
radmir102 1:3fa4e131f518 47 size_t r1 = (c1 & 0xff0000) >> 16;
radmir102 2:c4a43cc93ca8 48 size_t g1 = (c1 & 0x00FFFF) >> 8;
radmir102 2:c4a43cc93ca8 49 size_t b1 = (c1 & 0x0000FF);
theros 0:3bb97062a703 50
radmir102 3:5fd199581f15 51 //получить конечные компоненты RGB для градиента
radmir102 1:3fa4e131f518 52 size_t c2 = colorbuf[1];
radmir102 2:c4a43cc93ca8 53 size_t r2 = (c2 & 0xFF00FF) >> 16;
radmir102 2:c4a43cc93ca8 54 size_t g2 = (c2 & 0x808080) >> 8;
radmir102 2:c4a43cc93ca8 55 size_t b2 = (c2 & 0x00FF00);
theros 0:3bb97062a703 56
radmir102 3:5fd199581f15 57 //получение градиента
theros 0:3bb97062a703 58 for (int i = 0; i <= WS2812_BUF; i++)
radmir102 3:5fd199581f15 59 {
theros 0:3bb97062a703 60 ir = interpolate(r1, r2, i, WS2812_BUF);
theros 0:3bb97062a703 61 ig = interpolate(g1, g2, i, WS2812_BUF);
theros 0:3bb97062a703 62 ib = interpolate(b1, b2, i, WS2812_BUF);
radmir102 3:5fd199581f15 63 px.Set(i, color_set(ir,ig,ib)); // установка для каждого светодиода (i), градиентного цвета(color_set(ir,ig,ib))
radmir102 3:5fd199581f15 64
radmir102 2:c4a43cc93ca8 65 }
radmir102 2:c4a43cc93ca8 66
radmir102 2:c4a43cc93ca8 67
radmir102 3:5fd199581f15 68 // Цикл плавного крестика
radmir102 3:5fd199581f15 69 while(true){
radmir102 3:5fd199581f15 70 // цикл включения главной диагонали
radmir102 3:5fd199581f15 71 for (int x = 0; x<=15; x+=5 ){
radmir102 3:5fd199581f15 72 for(int i = 0; i<255; i++){
radmir102 3:5fd199581f15 73 px.SetI(x,i); // обращение к светодиоду (x) и установка яркости (i)
radmir102 3:5fd199581f15 74 ws.write(px.getBuf()); // вывод на матрицу (запуск)
radmir102 3:5fd199581f15 75 }
radmir102 2:c4a43cc93ca8 76 }
radmir102 3:5fd199581f15 77 //цикл включения побочной диагонали
radmir102 2:c4a43cc93ca8 78 for (int x = 3; x<=12; x+=3 ){
radmir102 3:5fd199581f15 79 for(int i = 0; i<255; i++){
radmir102 2:c4a43cc93ca8 80 px.SetI(x,i);
radmir102 2:c4a43cc93ca8 81 ws.write(px.getBuf());
radmir102 3:5fd199581f15 82 }
radmir102 2:c4a43cc93ca8 83 }
radmir102 3:5fd199581f15 84 // цикл выключения побочной диагонали
radmir102 3:5fd199581f15 85 for (int x = 12; x>=3; x-=3 ){
radmir102 3:5fd199581f15 86 for(int i = 255; i>=0; i--){
radmir102 2:c4a43cc93ca8 87 px.SetI(x,i);
radmir102 2:c4a43cc93ca8 88 ws.write(px.getBuf());
radmir102 3:5fd199581f15 89 }
radmir102 2:c4a43cc93ca8 90 }
radmir102 3:5fd199581f15 91 // цикл выключения главной диагонали
radmir102 3:5fd199581f15 92 for (int x = 15; x>=0; x-=5 ){
radmir102 3:5fd199581f15 93 for(int i = 255; i>=0; i--){
radmir102 3:5fd199581f15 94 px.SetI(x,i);
radmir102 3:5fd199581f15 95 ws.write(px.getBuf());
radmir102 3:5fd199581f15 96 }
radmir102 3:5fd199581f15 97 }
radmir102 3:5fd199581f15 98
radmir102 3:5fd199581f15 99
radmir102 3:5fd199581f15 100 }
theros 0:3bb97062a703 101 }