Light Show library for organic, calm, light display.

Dependencies:   BLE_API mbed nRF51822

Fork of mbed_blinky by Mbed

Committer:
nargetdev
Date:
Sun Oct 11 07:00:37 2015 +0000
Revision:
15:ee94af1f90a0
Parent:
14:e8a1fe69b048
Child:
16:810a1bbb320a
better ID sequence

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dan 0:7dec7e9ac085 1 #include "mbed.h"
nargetdev 8:5ed23e276c8a 2
nargetdev 10:fc61583e9e8f 3
nargetdev 11:2d3cc5459d5b 4
nargetdev 11:2d3cc5459d5b 5 #define calibrationTime 3
nargetdev 11:2d3cc5459d5b 6
nargetdev 11:2d3cc5459d5b 7 #define HPI 1.571
nargetdev 11:2d3cc5459d5b 8 #define PI 3.1416
nargetdev 14:e8a1fe69b048 9 #define HYSTERESIS_QUANTITY PI
nargetdev 11:2d3cc5459d5b 10
nargetdev 15:ee94af1f90a0 11 unsigned long seed = 515;
dan 0:7dec7e9ac085 12
nargetdev 9:1bd0f7a2ee71 13 typedef unsigned char byte;
nargetdev 9:1bd0f7a2ee71 14 typedef unsigned int uint;
nargetdev 9:1bd0f7a2ee71 15
nargetdev 9:1bd0f7a2ee71 16 PwmOut red(p18);
nargetdev 9:1bd0f7a2ee71 17 PwmOut green(p19);
nargetdev 9:1bd0f7a2ee71 18 PwmOut blue(p20);
nargetdev 9:1bd0f7a2ee71 19 DigitalIn motion(p1);
nargetdev 9:1bd0f7a2ee71 20
nargetdev 9:1bd0f7a2ee71 21 Serial pc(USBTX, USBRX); // tx, rx
nargetdev 9:1bd0f7a2ee71 22
nargetdev 9:1bd0f7a2ee71 23 unsigned int hash(unsigned int x) {
nargetdev 9:1bd0f7a2ee71 24 x = ((x >> 16) ^ x) * 0x45d9f3b;
nargetdev 9:1bd0f7a2ee71 25 x = ((x >> 16) ^ x) * 0x45d9f3b;
nargetdev 9:1bd0f7a2ee71 26 x = ((x >> 16) ^ x);
nargetdev 9:1bd0f7a2ee71 27 seed*=2;
nargetdev 9:1bd0f7a2ee71 28 seed+=17;
nargetdev 9:1bd0f7a2ee71 29 return x%100;
dan 0:7dec7e9ac085 30 }
nargetdev 8:5ed23e276c8a 31
nargetdev 9:1bd0f7a2ee71 32 void identify(unsigned int m){
nargetdev 9:1bd0f7a2ee71 33 unsigned int hashable;
nargetdev 9:1bd0f7a2ee71 34 float write_me;
nargetdev 9:1bd0f7a2ee71 35
nargetdev 9:1bd0f7a2ee71 36 hashable = hash(m + seed);
nargetdev 9:1bd0f7a2ee71 37 write_me = hashable/100.0;
nargetdev 15:ee94af1f90a0 38 red.write(hashable >= 50);
nargetdev 9:1bd0f7a2ee71 39 pc.printf("r, g, b: %f\t", write_me);
nargetdev 9:1bd0f7a2ee71 40
nargetdev 9:1bd0f7a2ee71 41 hashable = hash(m + seed);
nargetdev 9:1bd0f7a2ee71 42 write_me = hashable/100.0;
nargetdev 15:ee94af1f90a0 43 green.write(hashable >= 50);
nargetdev 9:1bd0f7a2ee71 44 pc.printf("%f\t", write_me);
nargetdev 9:1bd0f7a2ee71 45
nargetdev 9:1bd0f7a2ee71 46 hashable = hash(m + seed);
nargetdev 9:1bd0f7a2ee71 47 write_me = hashable/100.0;
nargetdev 15:ee94af1f90a0 48 blue.write(hashable >= 50);
nargetdev 9:1bd0f7a2ee71 49 pc.printf("%f\n", write_me);
nargetdev 8:5ed23e276c8a 50 }
nargetdev 8:5ed23e276c8a 51
nargetdev 9:1bd0f7a2ee71 52 void calibrate(){
nargetdev 9:1bd0f7a2ee71 53
nargetdev 9:1bd0f7a2ee71 54 //give the sensor some time to calibrate
nargetdev 9:1bd0f7a2ee71 55 pc.printf("calibrating sensor\n");
nargetdev 9:1bd0f7a2ee71 56 for(int i = 0; i < calibrationTime; i++){
nargetdev 9:1bd0f7a2ee71 57 pc.printf(".");
nargetdev 9:1bd0f7a2ee71 58 identify(calibrationTime);
nargetdev 15:ee94af1f90a0 59 wait(.5);
nargetdev 9:1bd0f7a2ee71 60 }
nargetdev 9:1bd0f7a2ee71 61 pc.printf(" done\n");
nargetdev 9:1bd0f7a2ee71 62 pc.printf("SENSOR ACTIVE\n");
nargetdev 9:1bd0f7a2ee71 63 wait(0.05);
nargetdev 9:1bd0f7a2ee71 64 }
nargetdev 9:1bd0f7a2ee71 65
nargetdev 9:1bd0f7a2ee71 66 void show(){
nargetdev 9:1bd0f7a2ee71 67 float in, rout, bout, gout;
nargetdev 9:1bd0f7a2ee71 68 bool tit = true;
nargetdev 10:fc61583e9e8f 69
nargetdev 10:fc61583e9e8f 70 unsigned int rgb = 0x0;
nargetdev 9:1bd0f7a2ee71 71 pc.printf("showing...\n");
nargetdev 8:5ed23e276c8a 72
nargetdev 9:1bd0f7a2ee71 73 float hysteresis = 0;
nargetdev 9:1bd0f7a2ee71 74
nargetdev 11:2d3cc5459d5b 75 for (in = -HPI; in < hysteresis || rgb != 0x7; in = in + 0.00628)
nargetdev 9:1bd0f7a2ee71 76 {
nargetdev 9:1bd0f7a2ee71 77 unsigned int i = motion;
nargetdev 9:1bd0f7a2ee71 78 if (motion){
nargetdev 10:fc61583e9e8f 79 hysteresis = in + HYSTERESIS_QUANTITY;
nargetdev 11:2d3cc5459d5b 80 pc.printf("hyst ||");
nargetdev 8:5ed23e276c8a 81 }
nargetdev 9:1bd0f7a2ee71 82 tit = !tit;
nargetdev 10:fc61583e9e8f 83 if (!(rgb & 0x1))
nargetdev 13:ed92d45dc9ab 84 rout = sin(in + 2.88*(in + HPI)) + 1.0;
nargetdev 10:fc61583e9e8f 85 else
nargetdev 10:fc61583e9e8f 86 rout = 0.0f;
nargetdev 10:fc61583e9e8f 87 if (!(rgb & 0x2))
nargetdev 13:ed92d45dc9ab 88 gout = sin(in + 2.61*(in+HPI) ) + 1.0;
nargetdev 13:ed92d45dc9ab 89 else
nargetdev 13:ed92d45dc9ab 90 gout = 0.0f;
nargetdev 13:ed92d45dc9ab 91 if (!(rgb & 0x4))
nargetdev 13:ed92d45dc9ab 92 bout = sin(in + 3.92*(in+HPI) ) + 1.0;
nargetdev 10:fc61583e9e8f 93 else
nargetdev 10:fc61583e9e8f 94 bout = 0.0f;
nargetdev 10:fc61583e9e8f 95
nargetdev 9:1bd0f7a2ee71 96 if (tit)
nargetdev 13:ed92d45dc9ab 97 pc.printf("%f\t%f\t%f\n",rout,gout, bout);
nargetdev 9:1bd0f7a2ee71 98
nargetdev 10:fc61583e9e8f 99 red.write(rout/2.0);
nargetdev 10:fc61583e9e8f 100 green.write(gout/2.0);
nargetdev 10:fc61583e9e8f 101 blue.write(bout/2.0);
nargetdev 10:fc61583e9e8f 102
nargetdev 10:fc61583e9e8f 103 if (in > hysteresis){
nargetdev 10:fc61583e9e8f 104 if (rout < 0.01)
nargetdev 10:fc61583e9e8f 105 rgb |= 0x1;
nargetdev 10:fc61583e9e8f 106 if (gout < 0.01)
nargetdev 10:fc61583e9e8f 107 rgb |= 0x2;
nargetdev 10:fc61583e9e8f 108 if (bout < 0.01)
nargetdev 10:fc61583e9e8f 109 rgb |= 0x4;
nargetdev 10:fc61583e9e8f 110 }
nargetdev 13:ed92d45dc9ab 111 wait(0.0001f);
nargetdev 9:1bd0f7a2ee71 112 }
nargetdev 11:2d3cc5459d5b 113 pc.printf("\n%X\n", rgb);
nargetdev 8:5ed23e276c8a 114 }
nargetdev 9:1bd0f7a2ee71 115
nargetdev 14:e8a1fe69b048 116 void channel_check(){
nargetdev 14:e8a1fe69b048 117
nargetdev 14:e8a1fe69b048 118 red.write(1.0f);
nargetdev 14:e8a1fe69b048 119 wait(.5);
nargetdev 14:e8a1fe69b048 120 red.write(0.0f);
nargetdev 14:e8a1fe69b048 121
nargetdev 14:e8a1fe69b048 122 green.write(1.0f);
nargetdev 14:e8a1fe69b048 123 wait(.5);
nargetdev 14:e8a1fe69b048 124 green.write(0.0f);
nargetdev 14:e8a1fe69b048 125
nargetdev 14:e8a1fe69b048 126 blue.write(1.0f);
nargetdev 14:e8a1fe69b048 127 wait(.5);
nargetdev 14:e8a1fe69b048 128 blue.write(0.0f);
nargetdev 14:e8a1fe69b048 129 }
nargetdev 14:e8a1fe69b048 130
nargetdev 9:1bd0f7a2ee71 131 int main() {
nargetdev 9:1bd0f7a2ee71 132 red.period(0.001f);
nargetdev 9:1bd0f7a2ee71 133 green.period(0.001f);
nargetdev 9:1bd0f7a2ee71 134 blue.period(0.001f);
nargetdev 14:e8a1fe69b048 135
nargetdev 14:e8a1fe69b048 136 channel_check();
nargetdev 9:1bd0f7a2ee71 137 pc.printf("Hello World!\n");
nargetdev 9:1bd0f7a2ee71 138 // Calibrate FIR and identify.
nargetdev 9:1bd0f7a2ee71 139 calibrate();
nargetdev 9:1bd0f7a2ee71 140
nargetdev 9:1bd0f7a2ee71 141 // Clear the lights. Wait for victim.
nargetdev 9:1bd0f7a2ee71 142 red.write(0.00f);
nargetdev 9:1bd0f7a2ee71 143 green.write(0.00f);
nargetdev 9:1bd0f7a2ee71 144 blue.write(0.00f);
nargetdev 9:1bd0f7a2ee71 145
nargetdev 9:1bd0f7a2ee71 146 while(1){
nargetdev 9:1bd0f7a2ee71 147 unsigned int i = motion;
nargetdev 9:1bd0f7a2ee71 148 if (i){
nargetdev 9:1bd0f7a2ee71 149 pc.printf("Motion detected.\n");
nargetdev 9:1bd0f7a2ee71 150 show();
nargetdev 9:1bd0f7a2ee71 151 pc.printf("End show.\n");
nargetdev 9:1bd0f7a2ee71 152 }
nargetdev 9:1bd0f7a2ee71 153 else
nargetdev 9:1bd0f7a2ee71 154 red.write(0.0f);
nargetdev 9:1bd0f7a2ee71 155 green.write(0.0f);
nargetdev 9:1bd0f7a2ee71 156 blue.write(0.0f);
nargetdev 9:1bd0f7a2ee71 157 }
nargetdev 8:5ed23e276c8a 158 }