#include <TFT_eSPI.h>
#include <SPI.h>
#include <IRremote.h>
#include <math.h>
#define DECODE_NEC
#define FEEDBACK_LED_IS_ACTIVE_LOW
#define IR_RECEIVE_PIN 22 // Définir le numéro de broche pour recevoir le signal infrarouge
TFT_eSPI tft = TFT_eSPI(); // Initialiser un objet TFT
IRrecv irReceiver(IR_RECEIVE_PIN); // Instance du récepteur infrarouge
#define xres 320 // Changer les dimensions de l'écran
#define yres 240 // Changer les dimensions de l'écran
#define xc 50
#define padding 28
#define span 50
float x = 0, speed = 3, y = 100 * 2, rnd_var;
int x0 = 30, offset = yres / 2, dt = 0, draw_period = 10, charge_period = 100, i = 0;
float xscale = 20 / speed / 3, yscale = 7.2 / speed / 3;
int reset = int(xres * xscale), drawInterval = 10;
unsigned long previousDrawTime = 0;
short Curve[xres], trace[xres], len_trace;
float rndFloat(float min, float max) {
return ((float)rand() / RAND_MAX) * (max - min) + min;
}
float sinrhythm(float t, float T){
float x = t - floor(t / T) * T;
return offset - 0.25 / yscale * (20 * exp(-pow(((x - xc) / 16), 2)) - 35 * exp(-pow(((x - xc - 40) / 5), 2)) + 230 * exp(-pow(((x - xc - 58) / 11.2), 2)) + 50 * exp(-pow(((x - xc - 130) / 20), 2)) + 10 * exp(-pow(((x - xc - 225) / 10), 2)) - 57 * exp(-pow(((x - xc - 76) / 5), 2)));
}
float vtachycard(float t, float T){
float x = t - floor(t / T) * T;
float y = int(floor(x)) % 97 + x - floor(x) + 5;
return 50 * (0.75 * exp(-pow(((y - 38) / 14), 2)) + 1 / 6 * exp(-pow(((y - 25) / 5), 2)) - 1.2 * exp(-pow(((y - 80) / 10), 2)) + 1 / 2 * exp(-pow(((y - 79) / 2.5), 2))) / yscale + offset;
}
float vfib(float t, float T){
float x = t - floor(t / T) * T;
return 50 * (0.5 * sin(x / 5) + 0.1 * sin(x / 10) + 0.01 * sin(x)) / yscale + offset;
}
float asys(float t, float T){
return offset;
}
float (*fnptr)(float, float) = sinrhythm;
void setup() {
Serial.begin(9600);
randomSeed(analogRead(36));
// Initialiser l'écran TFT
tft.init();
tft.setRotation(3);
// Initialiser l'objet IRrecv pour recevoir les signaux infrarouges
irReceiver.enableIRIn(); // Démarrer la réception IR
// Effacer l'écran et dessiner le cadre
tft.fillScreen(TFT_BLACK);
tft.fillRect(0, 0, 319, 13, TFT_RED);
tft.fillRect(0, 227, 319, 239, TFT_RED);
tft.setTextColor(TFT_WHITE, TFT_RED);
tft.drawString("Electrocardiogram simulator", xres / 2, 1);
tft.setTextColor(TFT_YELLOW, TFT_RED);
tft.drawString("Pura Solutions", xres / 2, 228);
rnd_var = rndFloat(-20, 20);
fillCurve();
}
void listen_IR() {
if (irReceiver.decode()) {
unsigned long irValue = irReceiver.decodedIRData.command;
irReceiver.resume();
Serial.print("IR command received: ");
Serial.println(irValue);
switch (irValue) {
case 48:
fnptr = sinrhythm;
break;
case 24:
fnptr = vtachycard;
break;
case 16:
fnptr = vfib;
break;
case 122:
fnptr = asys;
break;
default:
break;
}
irReceiver.resume(); // Activer la réception de la prochaine valeur
}
}
void erase_curve() {
tft.setTextColor(TFT_BLACK);
for (int j = 1; j < len_trace; j++) {
tft.drawLine((j * speed / xscale), trace[j], ((j * speed - speed) / xscale), trace[j - 1], TFT_BLACK);
}
x = 0;
}
void drawCurve() {
unsigned long currentTime = millis();
if (currentTime - previousDrawTime >= drawInterval) {
Serial.println("Drawing curve...");
if (i == 0)
trace[i] = (fnptr(x, y));
trace[i + 1] = (fnptr(x + speed, y));
x = x + speed;
Serial.print("x = ");
Serial.println(x);
tft.setTextColor(TFT_BLACK);
tft.fillRect((x + rnd_var) / xscale + 2, 40, (x + 60 + rnd_var) / xscale + 2, yres - 95, TFT_BLACK);
tft.fillCircle((x - speed + rnd_var) / xscale + 2, trace[i], 3, TFT_BLACK);
tft.setTextColor(TFT_GREEN);
if (i > 0)
tft.drawLine((x - speed + rnd_var) / xscale, trace[i], ((x - 2 * speed + rnd_var) / xscale), trace[i - 1], TFT_GREEN);
else
tft.drawLine((x - speed + rnd_var) / xscale, trace[i], ((x - 2 * speed + rnd_var) / xscale), offset, TFT_GREEN);
tft.drawLine((x + rnd_var) / xscale, trace[i + 1], ((x - speed + rnd_var) / xscale), trace[i], TFT_GREEN);
tft.fillCircle((x + rnd_var) / xscale + 2, trace[i + 1], 3, TFT_GREEN);
i++;
if (x > reset - 2) {
len_trace = i;
i = 0;
x = 0;
rnd_var = rndFloat(-10, 10);
}
previousDrawTime = currentTime;
}
}
void fillCurve() {
for (int j = 0; j < xres; j++) {
Curve[j] = fnptr(j, y);
}
}
void loop() {
drawCurve();
listen_IR();
}