#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <SPI.h>
#include <IRremote.h>
#include <math.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#define TFT_DC 2
#define TFT_CS 15
#define TFT_WIDTH 320
#define TFT_HEIGHT 240
#define SIGNAL_POINTS TFT_WIDTH // Nombre de points à calculer sur la courbe
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
IRrecv irReceiver(22); // Création de l'objet IRrecv
volatile int speed = 10; // Valeur initiale de la vitesse (500 est un exemple, vous pouvez l'ajuster selon vos besoins)
volatile bool signalRequested = false;
volatile int requestedSignalNumber = 0;
TaskHandle_t affichageTaskHandle = NULL;
void drawSignal(uint16_t color, float (*calculateSignal)(int));
float calculateCombinedSignal1(int x) {
float s = 0;
for (int offset = 1; offset <= 1000; offset += 120) {
float onde_P = -(1 / 0.4) * exp(-pow((x - 20 - offset), 2) / pow(8, 2));
float onde_Q = (1.4 / 0.4) * exp(-pow((x - 42 - offset), 2) / 1.5);
float onde_R = -(3 / 0.2) * exp(-pow((x - 47.35 - offset), 2) / pow(2.5, 2));
float onde_S = (1 / 0.2) * exp(-pow((x - 50.9 - offset), 2) / pow(1.5, 2));
float onde_T = -(1 / 0.3) * exp(-pow((x - 85 - offset), 2) / 80);
s += (onde_P + onde_Q + onde_R + onde_S + onde_T);
}
return s * 4 + 60;
}
float calculateCombinedSignal2(int x) {
float s = 0;
for (int offset = 1; offset <= 1000; offset += 100) {
float y1 = -(3.5 / 0.25) * exp(-pow((x - 15 - offset), 2) / pow(4, 2));
float y2 = 7 * exp(-pow((x - 20 - offset), 2) / pow(8, 2));
float y3 = -2 * exp(-pow((x - 20.2 - offset), 2) / pow(6, 2));
s += y1 + y2 + y3;
}
return s * 0.6 * 7 + 50;
}
float calculateCombinedSignal3(int x) {
float s = 0;
for (int offset = 1; offset <= 1000; offset += 90) {
float y1 = -(0.4 / 2.5) * exp(-pow((x - 12 - offset), 2) / pow(6, 2));
float y2 = -(0.5 / 5) * exp(-pow((x - 25.5 - offset), 2) / pow(3, 2));
float y3 = -(0.4 / 5) * exp(-pow((x - 35 - offset), 2) / pow(2, 2));
float y4 = (0.7 / 5) * exp(-pow((x - 40 - offset), 2) / pow(2, 2));
float y5 = -(0.6 / 9) * exp(-pow((x - 50 - offset), 2) / 15);
float y6 = -(0.7 / 3.0) * exp(-pow((x - 60 - offset), 2) / pow(12, 2));
s += y1 - y2 + y3 + y4 + y5 + y6;
}
return s * 15 + 10;
}
float calculateCombinedSignal4(int x) {
float s = 0;
for (int n = 1; n <= 400; n += 18) {
float y3 = -(3.0 / 0.2) * exp(-pow((x - (5 + n)), 2) / pow(2, 2));
float y4 = 0.8 * exp(-pow((x - (8 + n)), 2) / pow(9, 2));
s += y3 + y4;
}
return s * 5 + 70;
}
void drawSignal(uint16_t color, float (*calculateSignal)(int), int delayMultiplier) {
float maxAmplitude = 0;
float minAmplitude = 0;
for (int x = 0; x < TFT_WIDTH; x++) {
float signalValue = calculateSignal(x);
maxAmplitude = max(maxAmplitude, signalValue);
minAmplitude = min(minAmplitude, signalValue);
}
float averageAmplitude = (maxAmplitude - minAmplitude) / 2;
float verticalOffset = TFT_HEIGHT / 2 - averageAmplitude;
for (int x = 0; x < TFT_WIDTH - 1; x++) {
float y = calculateSignal(x) + verticalOffset;
float y_next = calculateSignal(x + 1) + verticalOffset;
tft.drawLine(x, y, x + 1, y_next, color);
delay(5 * delayMultiplier); // Delay between each line to adjust the display speed
}
}
void affichageTask(void *pvParameters) {
int signalNumber = *((int*)pvParameters);
tft.fillScreen(ILI9341_BLACK);
int delayMultiplier = 5; // Valeur par défaut pour la vitesse d'affichage
// Vérifiez si le signal correspond à une commande pour augmenter ou diminuer la vitesse
if (signalNumber == 2) { // Augmenter la vitesse
speed += 40; // Augmentez la vitesse de 40 (ajustez selon vos besoins)
} else if (signalNumber == 152) { // Diminuer la vitesse
speed -= 40; // Diminuez la vitesse de 40 (ajustez selon vos besoins)
}
// Assurez-vous que la vitesse reste dans la plage de 0 à 1000
speed = constrain(speed, 0, 1000);
// Ensuite, affichez la forme d'onde correspondante (signalNumber) avec la vitesse actuelle
switch (signalNumber) {
case 48:
Serial.println("Signal 1 detected");
drawSignal(ILI9341_YELLOW, calculateCombinedSignal1, delayMultiplier);
break;
case 24:
Serial.println("Signal 2 detected");
drawSignal(ILI9341_GREEN, calculateCombinedSignal2, delayMultiplier);
break;
case 122:
Serial.println("Signal 3 detected");
drawSignal(ILI9341_RED, calculateCombinedSignal3, delayMultiplier);
break;
case 16:
Serial.println("Signal 4 detected");
drawSignal(ILI9341_CYAN, calculateCombinedSignal4, delayMultiplier);
break;
default:
Serial.println("Unknown signal detected");
break;
}
vTaskDelete(NULL);
}
void setup() {
Serial.begin(9600);
tft.begin();
tft.setRotation(3);
tft.fillScreen(ILI9341_BLACK);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
irReceiver.enableIRIn(); // Activation du récepteur IR
}
void stopDisplayTask() {
if (affichageTaskHandle != NULL) {
vTaskDelete(affichageTaskHandle);
affichageTaskHandle = NULL;
}
}
void loop() {
if (irReceiver.decode()) {
unsigned long irValue = irReceiver.decodedIRData.command;
irReceiver.resume();
stopDisplayTask();
// Vérifiez quelle touche de la télécommande a été pressée pour ajuster la vitesse
if (irValue == 152) { // Exemple de code pour le bouton augmentant la vitesse
speed += 40; // Augmentez la vitesse de 100 (ajustez selon vos besoins)
} else if (irValue == 2) { // Exemple de code pour le bouton diminuant la vitesse
speed -= 40; // Diminuez la vitesse de 100 (ajustez selon vos besoins)
}
// Assurez-vous que la vitesse reste dans la plage de 0 à 1000
speed = constrain(speed, 0, 1000);
requestedSignalNumber = irValue;
signalRequested = true;
}
if (signalRequested) {
signalRequested = false;
xTaskCreate(affichageTask, "AffichageTask", 4096, (void*)&requestedSignalNumber, 1, &affichageTaskHandle);
}
}