#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <SPI.h>
#include <math.h>
#define TFT_DC 2
#define TFT_CS 15
#define TFT_WIDTH 320
#define TFT_HEIGHT 240
#define NUM_SEGMENTS 12 // Nombre de segments dans lesquels diviser l'écran
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
float signalValues[TFT_WIDTH]; // Tableau pour stocker les valeurs du signal
// Fonction pour calculer les valeurs du signal
void calculateSignalValues(float (*calculateSignal)(int)) {
for (int x = 0; x < TFT_WIDTH; x++) {
signalValues[x] = calculateSignal(x);
}
}
// Efface et dessine une partie spécifique de la courbe sur l'écran
void drawSignalSegment(uint16_t drawColor, int segment) {
// Calcule les coordonnées x de début et de fin du segment
int segmentWidth = TFT_WIDTH / NUM_SEGMENTS;
int startX = segment * segmentWidth;
int endX = startX + segmentWidth;
// Efface le segment précédent
for (int x = startX; x < endX; x++) {
float y = signalValues[x] + TFT_HEIGHT / 2;
float y_next = signalValues[x + 1] + TFT_HEIGHT / 2;
tft.drawLine(x, y, x + 1, y_next, ILI9341_BLACK);
delay (20);
}
// Dessine la nouvelle partie de la courbe
for (int x = startX; x < endX - 1; x++) {
float y = signalValues[x] + TFT_HEIGHT / 2;
float y_next = signalValues[x + 1] + TFT_HEIGHT / 2;
tft.drawLine(x, y, x + 1, y_next, drawColor);
delay(3);
}
}
void setup() {
tft.begin();
tft.setRotation(1);
}
void loop() {
// Calculer les valeurs du signal
calculateSignalValues(calculateCombinedSignal);
// Dessiner chaque segment de la courbe en effaçant et en dessinant de manière séquentielle
for (int segment = 0; segment < NUM_SEGMENTS; segment++) {
drawSignalSegment(ILI9341_GREEN, segment);
//delay(50); // Attendre un court instant pour un effet de transition fluide
}
}
float calculateCombinedSignal(int x) {
float s = 0;
int offset = 1;
while (offset <= 1000) {
float onde_P = -(0.9) * exp(-pow((x - 17 - offset), 2) /144);
float onde_Q = (2.2) * exp(-pow((x - 41 - offset), 2) / 5);
float onde_R = -(8) * exp(-pow((x - 50 - offset), 2) / 47);
float onde_S = (4) * exp(-pow((x - 57 - offset), 2) / 9);
float onde_T = -(1.8) * exp(-pow((x - 90 - offset), 2) / 170);
s += (onde_P + onde_Q + onde_R + onde_S + onde_T);
offset += 140;
}
return s * 9 + 20;
}