#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_SIN 0 // Broche GPIO 0 pour le bouton sin
#define BUTTON_COS 5 // Broche GPIO 5 pour le bouton cos
#define BUTTON_SPEED_INC 12 // Broche GPIO 12 pour augmenter la vitesse de dessin
#define BUTTON_SPEED_DEC 14 // Broche GPIO 14 pour diminuer la vitesse de dessin
#define TFT_WIDTH 320
#define TFT_HEIGHT 240
volatile bool sinPressed = false;
volatile bool cosPressed = false;
volatile bool speedIncPressed = false;
volatile bool speedDecPressed = false;
int drawDelay = 500; // Délai initial entre les itérations de dessin
int savedDrawDelay = drawDelay; // Variable pour stocker la valeur de vitesse conservée
int newDrawDelay = drawDelay; // Nouvelle valeur de vitesse
bool changeSpeed = false; // Indique si la vitesse a changé
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
Button buttonSin(BUTTON_SIN);
Button buttonCos(BUTTON_COS);
Button buttonSpeedInc(BUTTON_SPEED_INC);
Button buttonSpeedDec(BUTTON_SPEED_DEC);
int currentDrawDelay = drawDelay; // Variable pour stocker la valeur de vitesse actuelle
void setup() {
Serial.begin(9600);
tft.begin();
tft.setRotation(1);
tft.fillScreen(ILI9341_BLACK);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(3);
buttonSin.begin();
buttonCos.begin();
buttonSpeedInc.begin();
buttonSpeedDec.begin();
attachInterrupt(BUTTON_SIN, sinInterrupt, FALLING);
attachInterrupt(BUTTON_COS, cosInterrupt, FALLING);
attachInterrupt(BUTTON_SPEED_INC, speedIncInterrupt, FALLING);
attachInterrupt(BUTTON_SPEED_DEC, speedDecInterrupt, FALLING);
}
void loop() {
static unsigned long previousMillis = 0;
unsigned long currentMillis = millis();
if (sinPressed) {
Serial.println("Bouton sin enfoncé");
sinPressed = false;
cosPressed = false;
savedDrawDelay = drawDelay; // Sauvegarder la valeur de vitesse
currentDrawDelay = drawDelay; // Mettre à jour la valeur de vitesse actuelle
previousMillis = currentMillis;
drawSinus();
displaySpeed();
}
if (cosPressed) {
Serial.println("Bouton cos enfoncé");
sinPressed = false;
cosPressed = false;
savedDrawDelay = drawDelay; // Sauvegarder la valeur de vitesse
currentDrawDelay = drawDelay; // Mettre à jour la valeur de vitesse actuelle
previousMillis = currentMillis;
drawCosinus();
displaySpeed();
}
if (speedIncPressed) {
Serial.println("Bouton vitesse inc enfoncé");
speedIncPressed = false;
newDrawDelay += 100; // Augmente la vitesse de 100
changeSpeed = true; // Indique que la vitesse a changé
}
if (speedDecPressed) {
Serial.println("Bouton vitesse dec enfoncé");
speedDecPressed = false;
newDrawDelay -= 100; // Diminue la vitesse de 100
changeSpeed = true; // Indique que la vitesse a changé
}
if (changeSpeed) {
currentDrawDelay = newDrawDelay; // Met à jour la vitesse actuelle avec la nouvelle vitesse
displaySpeed(); // Affiche la nouvelle vitesse
changeSpeed = false; // Réinitialise le changement de vitesse
}
// Vérifie si le temps écoulé dépasse le délai entre les itérations
if (currentMillis - previousMillis >= savedDrawDelay) {
previousMillis = currentMillis;
// Affiche le signal en fonction du dernier bouton pressé
if (sinPressed) {
drawSinus();
}
if (cosPressed) {
drawCosinus();
}
}
}
void sinInterrupt() {
sinPressed = true;
}
void cosInterrupt() {
cosPressed = true;
}
void speedIncInterrupt() {
speedIncPressed = true;
}
void speedDecInterrupt() {
speedDecPressed = true;
}
void drawAxes() {
tft.drawLine(0, TFT_HEIGHT / 2, TFT_WIDTH - 1, TFT_HEIGHT / 2, ILI9341_WHITE);
tft.drawLine(TFT_WIDTH / 2, 0, TFT_WIDTH / 2, TFT_HEIGHT - 1, ILI9341_WHITE);
}
void drawSinus() {
tft.fillScreen(ILI9341_BLACK);
drawAxes();
float yPrev, yCurr;
yPrev = sin(0) * (TFT_HEIGHT / 4) + TFT_HEIGHT / 2;
for (float x = 0; x < TFT_WIDTH; x += 0.1) { // Utilisation de x += 1 pour tracer des lignes plutôt que des points individuels
yCurr = sin(4 * PI * x / TFT_WIDTH) * (TFT_HEIGHT / 4) + TFT_HEIGHT / 2;
tft.drawLine(x - 1, yPrev, x, yCurr, ILI9341_GREEN); // Tracer une ligne entre les points précédent et courant
yPrev = yCurr;
if (cosPressed) {
break;
}
}
}
void drawCosinus() {
tft.fillScreen(ILI9341_BLACK);
drawAxes();
float yPrev, yCurr;
yPrev = cos(0) * (TFT_HEIGHT / 4) + TFT_HEIGHT / 2;
for (float x = 0; x < TFT_WIDTH; x += 0.1) { // Utilisation de x += 1 pour tracer des lignes plutôt que des points individuels
yCurr = cos(4 * PI * x / TFT_WIDTH) * (TFT_HEIGHT / 4) + TFT_HEIGHT / 2;
tft.drawLine(x - 1, yPrev, x, yCurr, ILI9341_RED); // Tracer une ligne entre les points précédent et courant
yPrev = yCurr;
if (sinPressed) {
break;
}
}
}
void displaySpeed() {
tft.setTextColor(ILI9341_BLACK); // Efface l'ancienne valeur en la colorant en noir
tft.setTextSize(2);
tft.setCursor(0, 0); // Positionne le curseur en haut à gauche
tft.print("Vitesse: ");
tft.print(savedDrawDelay); // Affiche la vitesse actuelle
delay(200); // Attente
tft.setCursor(0, 0); // Positionne le curseur en haut à gauche
tft.print(" "); // Efface l'ancienne valeur
tft.setCursor(0, 0); // Positionne le curseur en haut à gauche
tft.setTextColor(ILI9341_WHITE); // Change la couleur du texte en blanc pour afficher la nouvelle valeur
tft.print("Vitesse: ");
tft.print(currentDrawDelay); // Affiche la nouvelle vitesse
delay(200); // Attente
}