12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- #include <EEPROM.h>
- #include <SPI.h>
- #include <GD2.h>
- void setup()
- {
- GD.begin(~GD_STORAGE);
- bitmap();
- }
- // Make a 32x32 "soft glow" bitmap
- void bitmap()
- {
- GD.cmd_setbitmap(0, L8, 32, 32);
- for (int i = 0; i < 32; i++)
- for (int j = 0; j < 32; j++) {
- int x = i - 16, y = j - 16;
- float d = sqrt((x * x) + (y * y));
- float t = constrain(1.0 - d / 16, 0, 1);
- GD.wr(32 * i + j, 255 * t * t);
- }
- }
- // Catmull-Rom spline
- float spline(float t, float p_1, float p0, float p1, float p2)
- {
- return (
- t*((2-t)*t - 1) * p_1
- + (t*t*(3*t - 5) + 2) * p0
- + t*((4 - 3*t)*t + 1) * p1
- + (t-1)*t*t * p2 ) / 2;
- }
- // Return a point on path p
- xy &path(float t, xy p[])
- {
- static xy pos;
- pos.set(spline(t, p[0].x, p[1].x, p[2].x, p[3].x),
- spline(t, p[0].y, p[1].y, p[2].y, p[3].y));
- return pos;
- }
- void loop()
- {
- GD.Clear();
- GD.Begin(BITMAPS);
- GD.ColorRGB(0x335020); // Greenish
- GD.BlendFunc(SRC_ALPHA, ONE); // Additive blending
- xy p[4]; // random control points
- int allon; // true if the whole path is onscreen
- do {
- p[1].set(GD.random(PIXELS(GD.w - 32)), GD.random(PIXELS(GD.h - 32)));
- p[2].set(GD.random(PIXELS(GD.w - 32)), GD.random(PIXELS(GD.h - 32)));
- p[0] = p[1];
- p[0].rmove(PIXELS(300), GD.random());
- p[3] = p[2];
- p[3].rmove(PIXELS(300), GD.random());
- allon = 1;
- for (int i = 0; i < 100; i++)
- allon &= path(i * .01, p).onscreen();
- } while (!allon);
- for (int i = 0; i < 100; i++)
- path(i * .01, p).draw();
- GD.swap();
- delay(100);
- GD.wr(REG_PWM_DUTY, 128);
- delay(GD.random(20, 50)); // range of times to light up, in ms
- GD.wr(REG_PWM_DUTY, 0);
- delay(GD.random(300, 500)); // range of times to remain dark, in ms
- }
|