Ligth animation fore hall
Dependencies: FastPWM HCSR04 NeoStrip mbed
Diff: main.cpp
- Revision:
- 0:dcef095e5883
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Sep 08 15:23:32 2015 +0000 @@ -0,0 +1,445 @@ +#include "mbed.h" +#include "HCSR04.h" +#include "NeoStrip.h" + +#define MinDist 150 +#define PeriodeTime 100 +#define Nsensor 6 + +HCSR04 *sensor1; +HCSR04 *sensor2; +HCSR04 *sensor3; +HCSR04 *sensor4; +HCSR04 *sensor5; +HCSR04 *sensor6; + +Timeout Delay; + +Serial pc(USBTX, USBRX); +//int SectionSize[8]={16,16,16,16,16,16,16,16}; +int SectionSize[8]= {500,343,285,270,395,443,16,16}; +int N=2268; + +int TimeToNet=0; +int CallAgain=0; +bool ThereAreSomeThing=0; +int ThereAreNothing=0; + +//int N=128; + +NeoStrip strip(p22, N); + +double LED[8]; //power status +int LedOnOff[8]; //Hvis 1 sættes skal den lave et loop +bool InAktive; +int color[3]= {255,255,255}; + +long DistArr[6]; +int SensorTOCall=0; + +int hueToRGB(float h); +void CallNewSensor(); +void pattern1(); +extern "C" void mbed_reset(); +// display a shifting rainbow, all colors have maximum +// saturation and value, with evenly spaced hue +void pattern1() +{ + static float dh = 360.0 / N; + static float x = 0; + + for (int i = 0; i < N; i++) + strip.setPixel(i, hueToRGB((dh * i) - x)); + + x += 1; + if (x > 360) + x = 0; +} + +// Converts HSV to RGB with the given hue, assuming +// maximum saturation and value +int hueToRGB(float h) +{ + // lots of floating point magic from the internet and scratching my head + float r, g, b; + if (h > 360) + h -= 360; + if (h < 0) + h += 360; + int i = (int)(h / 60.0); + float f = (h / 60.0) - i; + float q = 1 - f; + + switch (i % 6) { + case 0: + r = 1; + g = f; + b = 0; + break; + case 1: + r = q; + g = 1; + b = 0; + break; + case 2: + r = 0; + g = 1; + b = f; + break; + case 3: + r = 0; + g = q; + b = 1; + break; + case 4: + r = f; + g = 0; + b = 1; + break; + case 5: + r = 1; + g = 0; + b = q; + break; + default: + r = 0; + g = 0; + b = 0; + break; + } + + // scale to integers and return the packed value + uint8_t R = (uint8_t)(r * 255); + uint8_t G = (uint8_t)(g * 255); + uint8_t B = (uint8_t)(b * 255); + + return (R << 16) | (G << 8) | B; +} + +void update() +{ + int LEDNr=0; + for (int j=0; j<Nsensor; j++) { + for (int i=0; i<SectionSize[j]; i++) { + strip.setPixel(LEDNr,LED[j]*color[0],LED[j]*color[1],LED[j]*color[2]); + LEDNr++; + } + } + strip.write(); +} + +void ReadColorFactor() +{ + LocalFileSystem local("local"); // Create the local filesystem under the name "local" + char str[10]; + + FILE *fp = fopen("/local/color.txt", "r"); // Open "out.txt" on the local file system for writing + if (fp) { + //fscanf(fp,"%[^\n]",str); + printf("Reading color.txt \r\n"); + fgets(str, 10, fp); + printf("%s\r\n",str); + color[0]=atoi(str); + fgets(str, 10, fp); + printf("%s\r\n",str); + color[1]=atoi(str); + fgets(str, 10, fp); + printf("%s\r\n",str); + color[2]=atoi(str); + fclose(fp); + } else + printf("Cant open file\r\n"); +} + +void CalcNew() +{ + for (int i=0; i<Nsensor; i++) { + if ((LedOnOff[i]==2) && (LED[i]>=0)) LED[i]-=0.1; //falder + if (LedOnOff[i]==1) { + LED[i]+=0.1; + //InAktive=0; //stiger + } + if (LED[i]>1) { //Skift til at gå ned igen + LedOnOff[i]=2; + LED[i]=1; + } + if ((LedOnOff[i]==2) && (LED[i]<=0.02)) { //SLuk + LED[i]=0; + LedOnOff[i]=0; + } + } + update(); +} + + +void SetAll(float p) +{ + for (int i=0; i<N; i++) { + strip.setPixel(i,p*255,p*255,p*255); + } + strip.write(); +} + +void SetAllOn() +{ + for (int i=0; i<N; i++) { + strip.setPixel(i,color[0],color[1],color[2]); + } + strip.write(); +} + + +void distance6(long Duration) +{ + //printf("Distance2: %d %.2f \n\r",Duration, LED[1]); + DistArr[5]=Duration; + if (Duration<MinDist) { + if (CallAgain) { + LedOnOff[5]=1; + CallAgain=0; + ThereAreSomeThing=1; + } else { + CallAgain++; + SensorTOCall=6; //kalder sig selv igen + } + } else { + LedOnOff[5]=2; + CallAgain=0; + } +} + + +void distance5(long Duration) +{ + //printf("Distance1: %d %.2f \n\r",Duration, LED[0]); + DistArr[4]=Duration; + if (Duration<MinDist) { + if (CallAgain) { + LedOnOff[4]=1; + CallAgain=0; + ThereAreSomeThing=1; + } else { + CallAgain++; + SensorTOCall=5; //kalder sig selv igen + } + } else { + LedOnOff[4]=2; + CallAgain=0; + SensorTOCall=6; + } + Delay.attach(&CallNewSensor,0.005); //5ms mellem sensor + +// sensor6->Trigger(); +} + +void distance4(long Duration) +{ + //printf("Distance4: %d %.2f \n\r",Duration, LED[3]); + DistArr[3]=Duration; + if (Duration<MinDist) { + if (CallAgain) { + LedOnOff[3]=1; + CallAgain=0; + ThereAreSomeThing=1; + } else { + CallAgain++; + SensorTOCall=4; //kalder sig selv igen + } + } else { + LedOnOff[3]=2; + CallAgain=0; + SensorTOCall=5; + } + Delay.attach(&CallNewSensor,0.005); //5ms mellem sensor + +// sensor5->Trigger(); +} + +void distance3(long Duration) +{ + //printf("Distance3: %d %.2f \n\r",Duration, LED[2]); + DistArr[2]=Duration; + if (Duration<MinDist) { + if (CallAgain) { + LedOnOff[2]=1; + CallAgain=0; + ThereAreSomeThing=1; + } else { + CallAgain++; + SensorTOCall=3; //kalder sig selv igen + } + } else { + LedOnOff[2]=2; + CallAgain=0; + SensorTOCall=4; + } + Delay.attach(&CallNewSensor,0.005); //5ms mellem sensor + + //sensor4->Trigger(); +} + +void distance2(long Duration) +{ + //printf("Distance2: %d %.2f \n\r",Duration, LED[1]); + DistArr[1]=Duration; + if (Duration<MinDist) { + if (CallAgain) { + LedOnOff[1]=1; + CallAgain=0; + ThereAreSomeThing=1; + } else { + CallAgain++; + SensorTOCall=2; //kalder sig selv igen + } + } else { + LedOnOff[1]=2; + CallAgain=0; + SensorTOCall=3; + } + Delay.attach(&CallNewSensor,0.005); //5ms mellem sensor +} + + +void distance1(long Duration) +{ + + DistArr[0]=Duration; + if (Duration<MinDist) { + if (CallAgain) { + LedOnOff[0]=1; + CallAgain=0; + ThereAreSomeThing=1; + } else { + CallAgain++; + SensorTOCall=1; //kalder sig selv igen + } + } else { + LedOnOff[0]=2; + CallAgain=0; + SensorTOCall=2; + } + Delay.attach(&CallNewSensor,0.005); //5ms mellem sensor +} + +void CallNewSensor() +{ + switch (SensorTOCall) { + case 1: + sensor1->Trigger(); + break; + case 2: + sensor2->Trigger(); + break; + case 3: + sensor3->Trigger(); + break; + case 4: + sensor4->Trigger(); + break; + case 5: + sensor5->Trigger(); + break; + case 6: + sensor6->Trigger(); + break; + } +} + +int main() +{ + pc.baud(115200); + printf("Test af sensor\r\n"); + sensor1= new HCSR04(p5,p6,distance1); + sensor2= new HCSR04(p7,p8,distance2); + sensor3= new HCSR04(p9,p10,distance3); + sensor4= new HCSR04(p11,p12,distance4); + sensor5= new HCSR04(p13,p14,distance5); + sensor6= new HCSR04(p15,p16,distance6); + ReadColorFactor(); + N=0; + for (int a=0; a<8; a++) N+=SectionSize[a]; + printf("Numbers of LED %d\r\n",N); + + float bright = 0.2; // 20% is plenty for indoor use + strip.setBrightness(bright); // set default brightness + + SetAll(0); + + while(1) { + ThereAreSomeThing=0; + sensor1->Trigger(); + wait(0.05); + if (ThereAreSomeThing) ThereAreNothing=0; else ThereAreNothing++; + if (ThereAreNothing>6000) { //5 minutter ingenting + InAktive=2; //Inaktiv på den måde at denskal lave noget + } + if ((ThereAreSomeThing==0) && (InAktive==2)) InAktive=0; //gå tilbage til almindeligt mode + if (InAktive) { + if (TimeToNet) TimeToNet--; + if ((InAktive==2) && (TimeToNet==0)) { //gør noget + LED[rand() % 6]=1; //Tænder for en tilfældig + //Der skal gå et stykke tid + TimeToNet=60; //3 sek + CalcNew(); + } + } + if (InAktive==0) { + CalcNew(); + LedOnOff[0]=2; + LedOnOff[1]=2; + LedOnOff[2]=2; + LedOnOff[3]=2; + LedOnOff[4]=2; + LedOnOff[5]=2; + LedOnOff[6]=2; + LedOnOff[7]=2; + printf("Sensor %d %d %d %d %d %d \r",DistArr[0],DistArr[1],DistArr[2],DistArr[3],DistArr[4],DistArr[5]); + } + if (pc.readable()) { + switch(pc.getc()) { + case '1': + LedOnOff[0]=1; + break; + case '2': + LedOnOff[1]=1; + break; + case '3': + LedOnOff[2]=1; + break; + case '4': + LedOnOff[3]=1; + break; + case '5': + LedOnOff[4]=1; + break; + case '6': + LedOnOff[5]=1; + break; + //case 'a': InAktive=1; break; + case 'k': { + InAktive=1; + SetAllOn(); + printf("All On !!!!\r\n"); + } + break; + case 'K': + InAktive=0; + break; + + case 'c': + printf("Color R %d G %d B %d\r\n",color[0],color[1],color[2]); + break; + case 'r': + mbed_reset(); + break; + case 'b': { + bright+=0.1; + if (bright>1.01) bright=0; + strip.setBrightness(bright); // set default brightness + printf("brigth %.2f\r\n",bright); + } + break; + } + } + } +} \ No newline at end of file