Displays a gradient between two colors

Dependencies:   mbed WS2812 PixelArray

Committer:
radmir102
Date:
Wed Apr 21 12:40:36 2021 +0000
Revision:
2:c4a43cc93ca8
Parent:
1:3fa4e131f518
Child:
3:5fd199581f15
message

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 1:3fa4e131f518 6 #define WS2812_BUF 16 //number of LEDs in the array
radmir102 2:c4a43cc93ca8 7 #define NUM_COLORS 14 //number of colors to store in the array
radmir102 1:3fa4e131f518 8 #define PIN_NUM A2
radmir102 1:3fa4e131f518 9 #define LIGHT_INTENSITY 30
theros 0:3bb97062a703 10
radmir102 1:3fa4e131f518 11 using namespace std;
radmir102 2:c4a43cc93ca8 12
theros 0:3bb97062a703 13 PixelArray px(WS2812_BUF);
radmir102 1:3fa4e131f518 14 DigitalIn usrBtn(USER_BUTTON);
radmir102 1:3fa4e131f518 15
theros 0:3bb97062a703 16
theros 0:3bb97062a703 17 // See the program page for information on the timing numbers
radmir102 1:3fa4e131f518 18 WS2812 ws(PIN_NUM, WS2812_BUF,6,17,9,14); //nucleo-f411re
theros 0:3bb97062a703 19
theros 0:3bb97062a703 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
theros 0:3bb97062a703 25 // 0 <= stepNumber <= lastStepNumber
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 1:3fa4e131f518 36 int btnState = 0;
theros 0:3bb97062a703 37
theros 0:3bb97062a703 38 ws.useII(WS2812::PER_PIXEL); // use per-pixel intensity scaling
theros 0:3bb97062a703 39
theros 0:3bb97062a703 40 // set up the colours we want to draw with
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 2:c4a43cc93ca8 43 0x991199,0x808000};
theros 0:3bb97062a703 44
theros 0:3bb97062a703 45 //get starting RGB components for interpolation
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
theros 0:3bb97062a703 51 //get ending RGB components for interpolation
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
theros 0:3bb97062a703 57 for (int i = 0; i <= WS2812_BUF; i++)
theros 0:3bb97062a703 58 {
theros 0:3bb97062a703 59 ir = interpolate(r1, r2, i, WS2812_BUF);
theros 0:3bb97062a703 60 ig = interpolate(g1, g2, i, WS2812_BUF);
theros 0:3bb97062a703 61 ib = interpolate(b1, b2, i, WS2812_BUF);
theros 0:3bb97062a703 62 //write the color value for each pixel
theros 0:3bb97062a703 63 px.Set(i, color_set(ir,ig,ib));
radmir102 2:c4a43cc93ca8 64 //write the II value for each pixel
radmir102 2:c4a43cc93ca8 65
radmir102 1:3fa4e131f518 66
radmir102 2:c4a43cc93ca8 67 }
radmir102 2:c4a43cc93ca8 68
radmir102 2:c4a43cc93ca8 69 // цикл плавного прохода по каждому светодиоду и обратное угасание
radmir102 2:c4a43cc93ca8 70 while(true){
radmir102 2:c4a43cc93ca8 71 for (int i = 0; i<WS2812_BUF; i++){
radmir102 2:c4a43cc93ca8 72 for (int j = 0; j<30 ; j++){
radmir102 2:c4a43cc93ca8 73 px.SetI(i, j);
radmir102 2:c4a43cc93ca8 74 wait(0.01);
radmir102 2:c4a43cc93ca8 75 ws.write(px.getBuf());
radmir102 2:c4a43cc93ca8 76 }
radmir102 2:c4a43cc93ca8 77 }
radmir102 2:c4a43cc93ca8 78
radmir102 2:c4a43cc93ca8 79
radmir102 2:c4a43cc93ca8 80 for (int x = WS2812_BUF; x>=0; x-- )
radmir102 2:c4a43cc93ca8 81 for (int j = 30; j>0 ; j--){
radmir102 2:c4a43cc93ca8 82 px.SetI(x, j);
radmir102 2:c4a43cc93ca8 83 wait(0.01);
radmir102 2:c4a43cc93ca8 84 ws.write(px.getBuf());
radmir102 2:c4a43cc93ca8 85 }
radmir102 2:c4a43cc93ca8 86 }
radmir102 2:c4a43cc93ca8 87
radmir102 2:c4a43cc93ca8 88 // цикл плавного прохода по диагонали
radmir102 2:c4a43cc93ca8 89 /*while(true){
radmir102 2:c4a43cc93ca8 90 for (int x = 0; x<=20; x+=5 ){
radmir102 2:c4a43cc93ca8 91 for(int i = 0; i<30; i++){
radmir102 2:c4a43cc93ca8 92 px.SetI(x,i);
radmir102 2:c4a43cc93ca8 93 wait(0.01);
radmir102 2:c4a43cc93ca8 94 ws.write(px.getBuf());
radmir102 2:c4a43cc93ca8 95 }
radmir102 2:c4a43cc93ca8 96 }
radmir102 2:c4a43cc93ca8 97
radmir102 2:c4a43cc93ca8 98 for (int x = 20; x>=0; x-=5 ){
radmir102 2:c4a43cc93ca8 99 for(int i = 30; i>=0; i--){
radmir102 2:c4a43cc93ca8 100 px.SetI(x,i);
radmir102 2:c4a43cc93ca8 101 wait(0.01);
radmir102 2:c4a43cc93ca8 102 ws.write(px.getBuf());
radmir102 2:c4a43cc93ca8 103 }
radmir102 2:c4a43cc93ca8 104 }}*/
radmir102 2:c4a43cc93ca8 105
radmir102 2:c4a43cc93ca8 106 // Цикл плавного крестика
radmir102 2:c4a43cc93ca8 107 /*
radmir102 2:c4a43cc93ca8 108 while(true){
radmir102 2:c4a43cc93ca8 109 for (int x = 0; x<=20; x+=5 ){
radmir102 2:c4a43cc93ca8 110 for(int i = 0; i<30; i++){
radmir102 2:c4a43cc93ca8 111 px.SetI(x,i);
radmir102 2:c4a43cc93ca8 112 wait(0.01);
radmir102 2:c4a43cc93ca8 113 ws.write(px.getBuf());
radmir102 2:c4a43cc93ca8 114 }
radmir102 2:c4a43cc93ca8 115 }
radmir102 2:c4a43cc93ca8 116 for (int x = 3; x<=12; x+=3 ){
radmir102 2:c4a43cc93ca8 117 for(int i = 0; i<30; i++){
radmir102 2:c4a43cc93ca8 118 px.SetI(x,i);
radmir102 2:c4a43cc93ca8 119 wait(0.01);
radmir102 2:c4a43cc93ca8 120 ws.write(px.getBuf());
radmir102 2:c4a43cc93ca8 121 }
radmir102 2:c4a43cc93ca8 122 }
radmir102 2:c4a43cc93ca8 123 for (int x = 12; x>=3; x-=3 ){
radmir102 2:c4a43cc93ca8 124 for(int i = 30; i>=0; i--){
radmir102 2:c4a43cc93ca8 125 px.SetI(x,i);
radmir102 2:c4a43cc93ca8 126 wait(0.01);
radmir102 2:c4a43cc93ca8 127 ws.write(px.getBuf());
radmir102 2:c4a43cc93ca8 128 }
radmir102 2:c4a43cc93ca8 129 }
radmir102 2:c4a43cc93ca8 130
radmir102 2:c4a43cc93ca8 131 for (int x = 0; x<=20; x-=5 ){
radmir102 2:c4a43cc93ca8 132 for(int i = 30; i>=0; i--){
radmir102 2:c4a43cc93ca8 133 px.SetI(x,i);
radmir102 2:c4a43cc93ca8 134 wait(0.01);
radmir102 2:c4a43cc93ca8 135 ws.write(px.getBuf());
radmir102 2:c4a43cc93ca8 136 }
radmir102 2:c4a43cc93ca8 137 }
radmir102 2:c4a43cc93ca8 138 }
radmir102 2:c4a43cc93ca8 139 */
radmir102 2:c4a43cc93ca8 140 /* int d = 20;
radmir102 2:c4a43cc93ca8 141 while(true){
radmir102 2:c4a43cc93ca8 142 for (int x = 0; x<=20; x+=5 ){
radmir102 2:c4a43cc93ca8 143 for(int i = 0; i<30; i++){
radmir102 2:c4a43cc93ca8 144 px.SetI(x,i);
radmir102 2:c4a43cc93ca8 145 wait(0.01);
radmir102 2:c4a43cc93ca8 146 px.SetI(d-=2,i);
radmir102 2:c4a43cc93ca8 147 wait(0.01);
radmir102 2:c4a43cc93ca8 148 ws.write(px.getBuf());
radmir102 2:c4a43cc93ca8 149 }
radmir102 2:c4a43cc93ca8 150 }
radmir102 1:3fa4e131f518 151
radmir102 2:c4a43cc93ca8 152 for (int x = 12; x>=3; x-=3 ){
radmir102 2:c4a43cc93ca8 153 for(int i = 30; i>=0; i--){
radmir102 2:c4a43cc93ca8 154 px.SetI(x,i);
radmir102 2:c4a43cc93ca8 155 wait(0.01);
radmir102 2:c4a43cc93ca8 156 ws.write(px.getBuf());
radmir102 2:c4a43cc93ca8 157 }
radmir102 2:c4a43cc93ca8 158 }
radmir102 2:c4a43cc93ca8 159
radmir102 2:c4a43cc93ca8 160 for (int x = 0; x<=20; x-=5 ){
radmir102 2:c4a43cc93ca8 161 for(int i = 30; i>=0; i--){
radmir102 2:c4a43cc93ca8 162 px.SetI(x,i);
radmir102 2:c4a43cc93ca8 163 wait(0.01);
radmir102 2:c4a43cc93ca8 164 ws.write(px.getBuf());
theros 0:3bb97062a703 165 }
radmir102 2:c4a43cc93ca8 166 }
radmir102 2:c4a43cc93ca8 167 }
radmir102 2:c4a43cc93ca8 168 */
radmir102 1:3fa4e131f518 169
radmir102 2:c4a43cc93ca8 170
radmir102 2:c4a43cc93ca8 171
radmir102 2:c4a43cc93ca8 172
radmir102 2:c4a43cc93ca8 173
radmir102 2:c4a43cc93ca8 174 /*
radmir102 2:c4a43cc93ca8 175 for (int i = WS2812_BUF; i >= 0; i--)
radmir102 2:c4a43cc93ca8 176 {
radmir102 2:c4a43cc93ca8 177 ws.write(px.getBuf());
radmir102 2:c4a43cc93ca8 178 }*/
radmir102 1:3fa4e131f518 179
radmir102 1:3fa4e131f518 180
radmir102 1:3fa4e131f518 181
theros 0:3bb97062a703 182 }