#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <SPI.h>
#include <Button.h>
#include <math.h>
#define TFT_DC 2
#define TFT_CS 15
#define BUTTON_SIGNAL1 0 // Broche GPIO pour le bouton du signal 1
#define BUTTON_SIGNAL2 5 // Broche GPIO pour le bouton du signal 2
#define BUTTON_SIGNAL3 14 // Broche GPIO pour le bouton du signal 3
#define BUTTON_SIGNAL4 12 // Broche GPIO pour le bouton du signal 4
#define TFT_WIDTH 320
#define TFT_HEIGHT 240
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
Button buttonSignal1(BUTTON_SIGNAL1);
Button buttonSignal2(BUTTON_SIGNAL2);
Button buttonSignal3(BUTTON_SIGNAL3);
Button buttonSignal4(BUTTON_SIGNAL4);
volatile bool signalRequested = false;
volatile int requestedSignalNumber = 0;
volatile bool signalInProgress = false;
int currentSignalNumber = 0; // Variable pour stocker la fonction de calcul de signal utilisée
void setup() {
Serial.begin(9600);
tft.begin();
tft.setRotation(1);
tft.fillScreen(ILI9341_BLACK);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(3);
buttonSignal1.begin();
buttonSignal2.begin();
buttonSignal3.begin();
buttonSignal4.begin();
attachInterrupt(digitalPinToInterrupt(BUTTON_SIGNAL1), signalInterrupt, FALLING);
attachInterrupt(digitalPinToInterrupt(BUTTON_SIGNAL2), signalInterrupt, FALLING);
attachInterrupt(digitalPinToInterrupt(BUTTON_SIGNAL3), signalInterrupt, FALLING);
attachInterrupt(digitalPinToInterrupt(BUTTON_SIGNAL4), signalInterrupt, FALLING);
}
float signalValues[TFT_WIDTH]; // Tableau pour stocker les valeurs du signal
void calculateSignalValues(float (*calculateSignal)(int)) {
for (int x = 0; x < TFT_WIDTH; x++) {
signalValues[x] = calculateSignal(x);
}
}
void loop() {
drawSignal(ILI9341_BLACK);
if (signalRequested && !signalInProgress) {
signalInProgress = true;
switch (requestedSignalNumber) {
case 1:
calculateSignalValues(calculateCombinedSignal1);
currentSignalNumber = 1; // Mettre à jour la variable de fonction de calcul de signal utilisée
break;
case 2:
calculateSignalValues(calculateCombinedSignal2);
currentSignalNumber = 2;
break;
case 3:
calculateSignalValues(calculateCombinedSignal3);
currentSignalNumber = 3;
break;
case 4:
calculateSignalValues(calculateCombinedSignal4);
currentSignalNumber = 4;
break;
default:
break;
}
drawSignal(ILI9341_GREEN); // Dessiner le nouveau signal en blanc
drawSignal(ILI9341_BLACK);
// Ne pas réinitialiser signalRequested ici
signalInProgress = false;
signalRequested = false; // Réinitialiser signalRequested une fois que le signal a été dessiné
}
}
void signalInterrupt() {
int button = digitalRead(BUTTON_SIGNAL1) == LOW ? 1 :
digitalRead(BUTTON_SIGNAL2) == LOW ? 2 :
digitalRead(BUTTON_SIGNAL3) == LOW ? 3 :
digitalRead(BUTTON_SIGNAL4) == LOW ? 4 : 0;
if (button != 0) {
signalRequested = true;
requestedSignalNumber = button;
}
}
void drawSignal(uint16_t color) {
float maxAmplitude = -INFINITY;
float minAmplitude = INFINITY;
for (int x = 0; x < TFT_WIDTH; x++) {
maxAmplitude = max(maxAmplitude, signalValues[x]);
minAmplitude = min(minAmplitude, signalValues[x]);
}
float averageAmplitude = (maxAmplitude - minAmplitude) / 2;
float verticalOffset = TFT_HEIGHT / 2 - averageAmplitude;
for (int x = 0; x < TFT_WIDTH - 1; x++) {
float y = signalValues[x] + verticalOffset;
float y_next = signalValues[x + 1] + verticalOffset;
tft.drawLine(x, y, x + 1, y_next, color);
if (signalRequested && requestedSignalNumber != currentSignalNumber) {
return;
}
}
}
float calculateCombinedSignal1(int x) {
float s = 0;
int offset = 1;
while (offset <= 1000) {
float onde_P = -(1.5) * exp(-pow((x - 20 - offset), 2) / pow(10, 2));
float onde_Q = (2.75) * exp(-pow((x - 42 - offset), 2) / 2);
float onde_R = -(8) * exp(-pow((x - 47.35 - offset), 2) / pow(4, 2));
float onde_S = (6) * exp(-pow((x - 50.9 - offset), 2) / pow(2, 2));
float onde_T = -(2) * exp(-pow((x - 85 - offset), 2) / 80);
s += (onde_P + onde_Q + onde_R + onde_S + onde_T);
offset += 120;
}
return s * 7 + 50;
}
float calculateCombinedSignal2(int x) {
float s = 0;
for (int offset = 1; offset <= 1000; offset += 35) {
float y1 = -9 * exp(-pow((x - 10 - offset), 2) / pow(7, 2));
float y3 = 14 * exp(-pow((x - 19 - offset), 2) / pow(5, 2));
s += (y1 + y3);
}
return s * 0.6 * 7 + 40;
}
float calculateCombinedSignal3(int x) {
float s = 0;
for (int offset = 1; offset <= 1000; offset += 100) {
float y1 = 2 * exp(-pow((x - 10 - offset), 2) / pow(35, 2));
s += (y1);
}
return s * 0.6 * 8;
}
float calculateCombinedSignal4(int x) {
float s = 0;
for (int n = 1; n <= 400; n += 18) {
float y3 = -(15) * exp(-pow((x - (5 + n)), 2) / pow(4, 2));
float y4 = 1.8 * exp(-pow((x - (8 + n)), 2) / pow(5, 2));
s += y3 + y4;
}
return s * 5 + 70;
}