Made some changes, totally changed the way I displayed the pixels. Now can I call matrix.show() only for the pixels I want ?
Code :
#include <gfxfont.h>
#define LOG_OUT 1 // Utilisation de la fonction LOG
#define FFT_N 32 // Etude sur 32 points
#include <FFT.h> // insert la bibliothèque FFT
#include <Adafruit_GFX.h> // insert la bibliothèque Adafruit GFX
#include <Adafruit_SPITFT.h>
#include <Adafruit_SPITFT_Macros.h>
#include <Adafruit_NeoMatrix.h> // insert la bibliothèque Adafruit NeoMatrix pr communiquer avec la matrice led
#include <Adafruit_NeoPixel.h> // insert la bibliothèque Adafruit Neopixel, complémentaire a NeoMatrix
#ifndef PSTR
#define PSTR // Make Arduino Due happy (je sais pas à quoi ça sert, mais c'est dans l'exemple de la bibliothèque NeoMatrix, donc je le met)
#endif
#define PIN 6 // définie la pin de la matrice
/* Définition de la matrice :
* Paramètre n°1 => Largeur de la matrice
* Paramètre n°2 => Longueur de la matrice
* Paramètre n°3 => Pin de la matrice
* Paramètre n°4 => Définition du type de la matrice. A ajouter :
* - Position du premier pixel : RIGHT / LEFT + TOP / BOTTOM
* - Agencement des pixels : ROWS / COLUMS
*/
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(16, 16, PIN,
NEO_MATRIX_BOTTOM + NEO_MATRIX_RIGHT +
NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
NEO_GRB + NEO_KHZ800);
int const eq[] = {190, 160, 90, 80, 50, 40, 30, 20, 20, 10, 5, 5, 5, 0, 0, 0};
int8_t level[16];
void setup() {
TIMSK0 = 0; // turn off timer0 for lower jitter
ADCSRA = 0xe5; // set the adc to free running mode
ADMUX = 0x40; // use adc0
DIDR0 = 0x01; // turn off the digital input for adc0
matrix.begin();
matrix.setBrightness(20);
}
void loop() {
while(1) { // reduces jitter
cli(); // UDRE interrupt slows this way down on arduino1.0
for (int i = 0 ; i < 64 ; i += 2) { // save 32 samples
while(!(ADCSRA & 0x10)); // wait for adc to be ready
ADCSRA = 0xf5; // restart adc
byte m = ADCL; // fetch adc data
byte j = ADCH;
int k = (j << 8) | m; // form into an int
k -= 0x0200; // form into a signed int
k <<= 6; // form into a 16b signed int
fft_input[i] = k; // put real data into even bins
fft_input[i+1] = 0; // set odd bins to 0
}
fft_window(); // window the data for better frequency response
fft_reorder(); // reorder the data before doing the fft
fft_run(); // process the data in the fft
fft_mag_log(); // take the output of the fft
sei();
initialisation();
byte i = 0;
while (i < FFT_N/2) {
if (fft_log_out[i] >= 0) {
level[i] = (((uint8_t)fft_log_out[i]) - eq[i]) / 16;
} else {
level[i] = 0;
}
displaySound(i, level[i]);
i++;
}
}
}
void initialisation() {
matrix.writeFillRect(0, 14, 16, 2, matrix.Color(0, 0, 255));
matrix.writeFillRect(0, 5, 16, 9, matrix.Color(0, 255, 0));
matrix.writeFillRect(0, 0, 16, 5, matrix.Color(255, 0, 0));
}
void displaySound(int x, int h) {
matrix.writeFastVLine(x, 0, 15-h, 0);
matrix.show();
}