/*
Note: The arduinoFFT.h library needs to be added to the Arduino IDE before compiling and uploading this script/sketch to an Arduino.
*/
#include "arduinoFFT.h"
#define SAMPLES 128 //SAMPLES-pt FFT. Must be a base 2 number. Max 128 for Arduino Uno.
#define SAMPLING_FREQUENCY 2048 //Ts = Based on Nyquist, must be 2 times the highest expected frequency.
arduinoFFT FFT = arduinoFFT();
unsigned int samplingPeriod;
unsigned long microSeconds;
double vReal[SAMPLES]; //create vector of size SAMPLES to hold real values
double vImag[SAMPLES]; //create vector of size SAMPLES to hold imaginary values
void setup()
{
Serial.begin(115200); //Baud rate for the Serial Monitor
samplingPeriod = round(1000000*(1.0/SAMPLING_FREQUENCY)); //Period in microseconds
unsigned long num = 0;
}
void loop()
{
/*Sample SAMPLES times*/
for(int i=0; i<SAMPLES; i++)
{
microSeconds = micros(); //Returns the number of microseconds since the Arduino board began running the current script.
vReal[i] = analogRead(0); //Reads the value from analog pin 0 (A0), quantize it and save it as a real term.
vImag[i] = 0; //Makes imaginary term 0 always
/*remaining wait time between samples if necessary*/
while(micros() < (microSeconds + samplingPeriod))
{
//do nothing
}
}
/*Perform FFT on samples*/
FFT.Windowing(vReal, SAMPLES, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
FFT.Compute(vReal, vImag, SAMPLES, FFT_FORWARD);
FFT.ComplexToMagnitude(vReal, vImag, SAMPLES);
/*Find peak frequency and print peak*/
double peak = FFT.MajorPeak(vReal, SAMPLES, SAMPLING_FREQUENCY);
Serial.println(peak); //Print out the most dominant frequency.
/*Calcul de chaques valeurs RGB pour la fréquence détecté*/
unsigned long num = peak * 838.86;
int B = num % 256 ;
if (B < 0) {
B += 256;
}
int G = ((num - B) / 256) % 256 ;
if (G < 0) {
G += 256;
}
unsigned long R = ((num - B) / 256 - G) / 256 ;
if (R < 0) {
R += 256;
}
pinMode(3, OUTPUT);
pinMode(6, OUTPUT);
pinMode(10, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
analogWrite(3, R);
analogWrite(6, G);
analogWrite(10, B);
Serial.println("R: " + String(R));
Serial.println("G: " + String(G));
Serial.println("B: " + String(B));
}