-
Notifications
You must be signed in to change notification settings - Fork 0
/
sketch_dec17c.ino
141 lines (115 loc) · 3.7 KB
/
sketch_dec17c.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <arduinoFFT.h>
#define sensorPin A1
#define REDPIN 3
#define BLUEPIN 6
#define GREENPIN 5
#define SAMPLES 64 //Must be a power of 2
#define SAMPLING_FREQUENCY 1000 //Hz, must be less than 10000 due to ADC
#define Rrange 12 // SAMPLES/3 (more or less)
#define Grange 6
#define Brange 13
arduinoFFT FFT = arduinoFFT();
unsigned int sampling_period_us;
unsigned long microseconds; // current time since the Arduino board started
double vReal[SAMPLES];
double vImag[SAMPLES];
double Rmodule = 0;
double Gmodule = 0;
double Bmodule = 0;
int Rvalue = 0;
int Gvalue = 0;
int Bvalue = 0;
void setup() {
Serial.begin(115200); // open the serial port at 115200 bps:
sampling_period_us = round(1000000*(1.0/SAMPLING_FREQUENCY));
pinMode(sensorPin, INPUT);
pinMode(REDPIN, OUTPUT);
pinMode(GREENPIN, OUTPUT);
pinMode(BLUEPIN, OUTPUT);
}
void loop() {/*SAMPLING*/
for(int i=0; i<SAMPLES; i++)
{
microseconds = micros(); //Overflows after around 70 minutes
vReal[i] = analogRead(sensorPin) - 508; // 508 is silence value by default (can be different on other hardware)
vImag[i] = 0;
// remove interferences
if(vReal[i] >= -2 && vReal[i] <= 2) {
vReal[i] = 0;
}
// We take sampling_period_us microseconds to read the next sample
while(micros() < (microseconds + sampling_period_us)) {
}
}
/*FFT*/
FFT.Windowing(vReal, SAMPLES, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
FFT.Compute(vReal, vImag, SAMPLES, FFT_FORWARD);
FFT.ComplexToMagnitude(vReal, vImag, SAMPLES);
Rvalue = 0;
Gvalue = 0;
Bvalue = 0;
Rmodule = 0;
Gmodule = 0;
Bmodule = 0;
/* MODULES of the frequency vectors computed */
for(int i=1; i < SAMPLES/2; i++)
{
double a = vReal[i] * 2;//pow(vReal[i], 2);
double b = vImag[i] * 2;//pow(vImag[i], 2); // Now we assign each frequency value to its corresponding light range:
if(i <= Rrange) Rmodule += sqrt(a + b);
else if(i >= (Rrange+1) && i <= (Rrange+Grange)) Gmodule += sqrt(a + b);
else Bmodule += sqrt(a + b);
}
// Mean values of the modules of each interval:
//Rmodule /= Rrange;
//Gmodule /= Grange;
//Bmodule /= Brange;/* Giving more INTENSITY to the most DOMINANT frequencies (and reducing the rest):*/
/*if((Rmodule > Gmodule) && (Gmodule > Bmodule)){
Rmodule *= 1.5;
Gmodule *= 0.5;
Bmodule *= 0.5;
}
else if((Bmodule > Rmodule)&& (Bmodule > Gmodule)){
Bmodule *= 1.5;
Gmodule *= 0.2;
Rmodule *= 0.2;
}
else if((Gmodule > Bmodule) && (Gmodule > Rmodule)){
Gmodule *= 1.5;
Rmodule *= 0.2;
Bmodule *= 0.2;
} */
Rvalue = 255 * convBrightness(Rmodule);
Gvalue = 255 * convBrightness(Gmodule);
Bvalue = 255 * convBrightness(Bmodule);
if(Rvalue > 140 && Gvalue > 140 && Bvalue > 140) {
Serial.print("HIGH ");
Serial.println(Bvalue);
analogWrite(BLUEPIN, Bvalue * 1.6);
analogWrite(REDPIN, Rvalue / 1.8);
analogWrite(GREENPIN, Gvalue / 1.8);
}
else if ((Rvalue < 90 && Gvalue < 90 && Bvalue < 90) && (Rvalue > 3 && Gvalue > 3 && Bvalue > 3)) {
Serial.print("LOW ");
Serial.println(Rvalue);
analogWrite(REDPIN, Rvalue / 1.5);
analogWrite(GREENPIN, Gvalue / 1.5);
analogWrite(BLUEPIN, Bvalue / 1.5);
}
else {
//Serial.print("Common ");
//Serial.println(Rvalue);
analogWrite(REDPIN, Rvalue); // try analog
analogWrite(GREENPIN, Gvalue);
analogWrite(BLUEPIN, Bvalue);
}
Rvalue = 0;
Gvalue = 0;
Bvalue = 0;
delay(25);
}
double convBrightness(double b) {
double c = b / 400; // The maximun intensity value in theory is 31713 (but we are never having the volume that high)
if( c < 0.2 ) c = 0;
else if(c > 1) c = 1.00; return c;
}