#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
int numPoints = 300; // Número de puntos en un ciclo completo del ECG
const int delay_ms = 10; // Retraso en milisegundos entre cada punto
int s1 = 9, s2 = 8;
int ecgWave[500]; // Declaración del array con el tamaño máximo inicial
uint8_t heart[8] = {
0b00000,
0b01010,
0b11111,
0b11111,
0b11111,
0b01110,
0b00100,
0b00000,
};
byte BAJO1[8] =
{
B00000,
B00000,
B00000,
B00000,
B00000,
B00010,
B00101,
B11101
};
byte BAJO2[8] =
{
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00101,
B11011
};
byte PICO1[8] =
{
B00100,
B00100,
B01010,
B01010,
B01010,
B10010,
B10001,
B10001
};
byte BAJO3[8] =
{
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B11001
};
byte BAJO4[8] =
{
B00101,
B00010,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000
};
byte BAJO5[8] =
{
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B01100,
B10011
};
byte PICO2[8] =
{
B00100,
B00100,
B00100,
B00100,
B00100,
B01100,
B01010,
B10011
};
byte BAJO6[8] =
{
B10100,
B11000,
B10000,
B00000,
B00000,
B00000,
B00000,
B00000
};
byte BAJO7[8] =
{
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00110,
B00101
};
byte MUERTO[8] =
{
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B11111
};
byte GDA[8] =
{
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000
};
void setup() {
pinMode(s1, INPUT);
pinMode(s2, INPUT);
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.setCursor(2,0);
lcd.print("Frec Cardiaca");
lcd.setCursor(5,1);
lcd.print("Prueba");
delay(1000);
lcd.clear();
// Genera la señal de ECG inicialmente con el tamaño definido
generateECG();
}
void loop() {
// Verificar el estado de los dip switches y ajustar numPoints si es necesario
bool s1State = digitalRead(s1);
bool s2State = digitalRead(s2);
if (s1State == HIGH) {
numPoints = 90;
generateECG();
} else {
numPoints = 300;
generateECG();
normal();
int rand = (int)random(89, 100);
lcd.setCursor(1,1);
lcd.print("BPM: ");
lcd.print(rand);
latidos();
}
// Verificar si s2 está activado y s1 está desactivado para simular muerte (ECG plano)
if (s2State == HIGH && s1State == LOW) {
for (int i = 0; i < numPoints; i++) {
ecgWave[i] = 0;
Serial.println(ecgWave[i]);
}
muerto();
lcd.setCursor(1,1);
lcd.print("BPM: 0 ");
latidos();
} else {
// Imprime los valores de la señal de ECG en un formato que el gráfico pueda interpretar
for (int i = 0; i < numPoints; i++) {
Serial.print("data: ");
Serial.println(ecgWave[i]);
}
normal();
int rand = (int)random(89, 100);
lcd.setCursor(1,1);
lcd.print("BPM: ");
lcd.print(rand);
latidos();
}
}
void generateECG() {
// Frecuencia de muestreo inicial para una frecuencia cardíaca promedio de 90 BPM
float samplingFreq = 2.5; // Frecuencia de muestreo inicial para 90 BPM
// Simula el ciclo completo de una señal de ECG con variabilidad
for (int i = 0; i < numPoints; i++) {
// Introduce aleatoriedad en la frecuencia de muestreo
float variability = random(-0.5, 0.5) / 100.0; // Variación aleatoria entre -0.5 y 0.5
samplingFreq += samplingFreq * variability;
// Polarización auricular (P)
if (i < 30 / samplingFreq) {
ecgWave[i] = 10 * sin(2 * PI * i * samplingFreq / 30.0); // Sinusoidal positiva
}
// Despolarización ventricular (QRS)
else if (i < 120 / samplingFreq) {
// Onda R (positiva)
if (i < 60 / samplingFreq) {
ecgWave[i] = 100 * sin(2 * PI * (i - 30 / samplingFreq) * samplingFreq / 60.0); // Sinusoidal positiva
}
// Onda S (negativa)
else {
ecgWave[i] = -3 * sin(3 * PI * (i - 60 / samplingFreq) * samplingFreq / 60.0); // Sinusoidal negativa, amplitud reducida a -3
}
}
// Repolarización ventricular (T)
else if (i < 180 / samplingFreq) {
// Onda T (positiva)
ecgWave[i] = 50 * sin(3 * PI * (i - 120 / samplingFreq) * samplingFreq / 60.0); // Sinusoidal positiva
}
// Periodo de reposo reducido
else {
ecgWave[i] = 0; // Valor cero (línea de base)
}
}
}
void frecuencia1(){
lcd.createChar(0, BAJO1);
lcd.createChar(1, BAJO2);
lcd.createChar(2, PICO1);
lcd.createChar(3, BAJO3);
lcd.createChar(5, BAJO5);
lcd.createChar(6, PICO2);
lcd.setCursor(0, 0);
lcd.write((uint8_t)0);
lcd.setCursor(1, 0);
lcd.write((uint8_t)1);
lcd.setCursor(2, 0);
lcd.write((uint8_t)2);
lcd.setCursor(3, 0);
lcd.write((uint8_t)3);
lcd.setCursor(4, 0);
lcd.write((uint8_t)5);
lcd.setCursor(5, 0);
lcd.write((uint8_t)6);
lcd.setCursor(6, 0);
lcd.write((uint8_t)8);
lcd.setCursor(7, 0);
lcd.write((uint8_t)5);
lcd.setCursor(8, 0);
lcd.write((uint8_t)1);
lcd.setCursor(9, 0);
lcd.write((uint8_t)2);
lcd.setCursor(10, 0);
lcd.write((uint8_t)3);
lcd.setCursor(11, 0);
lcd.write((uint8_t)0);
lcd.setCursor(12, 0);
lcd.write((uint8_t)1);
lcd.setCursor(13, 0);
lcd.write((uint8_t)6);
lcd.setCursor(14, 0);
lcd.write((uint8_t)1);
lcd.setCursor(15, 0);
lcd.write((uint8_t)0);
}
void frecuencia2(){
lcd.createChar(0, BAJO1);
lcd.createChar(1, BAJO2);
lcd.createChar(2, PICO1);
lcd.createChar(3, BAJO3);
lcd.createChar(5, BAJO5);
lcd.createChar(6, PICO2);
lcd.setCursor(0, 0);
lcd.write((uint8_t)0);
lcd.setCursor(1, 0);
lcd.write((uint8_t)1);
lcd.setCursor(2, 0);
lcd.write((uint8_t)5);
lcd.setCursor(3, 0);
lcd.write((uint8_t)6);
lcd.setCursor(4, 0);
lcd.write((uint8_t)0);
lcd.setCursor(5, 0);
lcd.write((uint8_t)1);
lcd.setCursor(6, 0);
lcd.write((uint8_t)2);
lcd.setCursor(7, 0);
lcd.write((uint8_t)5);
lcd.setCursor(8, 0);
lcd.write((uint8_t)1);
lcd.setCursor(9, 0);
lcd.write((uint8_t)6);
lcd.setCursor(10, 0);
lcd.write((uint8_t)3);
lcd.setCursor(11, 0);
lcd.write((uint8_t)0);
lcd.setCursor(12, 0);
lcd.write((uint8_t)2);
lcd.setCursor(13, 0);
lcd.write((uint8_t)1);
lcd.setCursor(14, 0);
lcd.write((uint8_t)1);
lcd.setCursor(15, 0);
lcd.write((uint8_t)0);
}
void frecuencia3(){
lcd.createChar(0, BAJO1);
lcd.createChar(1, BAJO2);
lcd.createChar(2, PICO1);
lcd.createChar(3, BAJO3);
lcd.createChar(5, BAJO5);
lcd.createChar(6, PICO2);
lcd.setCursor(0, 0);
lcd.write((uint8_t)6);
lcd.setCursor(1, 0);
lcd.write((uint8_t)1);
lcd.setCursor(2, 0);
lcd.write((uint8_t)0);
lcd.setCursor(3, 0);
lcd.write((uint8_t)2);
lcd.setCursor(4, 0);
lcd.write((uint8_t)1);
lcd.setCursor(5, 0);
lcd.write((uint8_t)0);
lcd.setCursor(6, 0);
lcd.write((uint8_t)2);
lcd.setCursor(7, 0);
lcd.write((uint8_t)0);
lcd.setCursor(8, 0);
lcd.write((uint8_t)0);
lcd.setCursor(9, 0);
lcd.write((uint8_t)1);
lcd.setCursor(10, 0);
lcd.write((uint8_t)2);
lcd.setCursor(11, 0);
lcd.write((uint8_t)0);
lcd.setCursor(12, 0);
lcd.write((uint8_t)1);
lcd.setCursor(13, 0);
lcd.write((uint8_t)3);
lcd.setCursor(14, 0);
lcd.write((uint8_t)1);
lcd.setCursor(15, 0);
lcd.write((uint8_t)2);
}
void frecuencia4(){
lcd.createChar(0, MUERTO);
lcd.createChar(1, GDA);
lcd.setCursor(0, 0);
lcd.write((uint8_t)0);
lcd.setCursor(1, 0);
lcd.write((uint8_t)1);
lcd.setCursor(2, 0);
lcd.write((uint8_t)1);
lcd.setCursor(3, 0);
lcd.write((uint8_t)0);
lcd.setCursor(4, 0);
lcd.write((uint8_t)0);
lcd.setCursor(5, 0);
lcd.write((uint8_t)0);
lcd.setCursor(6, 0);
lcd.write((uint8_t)0);
lcd.setCursor(7, 0);
lcd.write((uint8_t)0);
lcd.setCursor(8, 0);
lcd.write((uint8_t)0);
lcd.setCursor(9, 0);
lcd.write((uint8_t)0);
lcd.setCursor(10, 0);
lcd.write((uint8_t)0);
lcd.setCursor(11, 0);
lcd.write((uint8_t)0);
lcd.setCursor(12, 0);
lcd.write((uint8_t)0);
lcd.setCursor(13, 0);
lcd.write((uint8_t)0);
lcd.setCursor(14, 0);
lcd.write((uint8_t)0);
lcd.setCursor(15, 0);
lcd.write((uint8_t)0);
lcd.setCursor(16, 0);
lcd.write((uint8_t)0);
}
void frecuencia5(){
lcd.createChar(0, MUERTO);
lcd.createChar(1, GDA);
lcd.setCursor(0, 0);
lcd.write((uint8_t)0);
lcd.setCursor(1, 0);
lcd.write((uint8_t)0);
lcd.setCursor(2, 0);
lcd.write((uint8_t)0);
lcd.setCursor(3, 0);
lcd.write((uint8_t)0);
lcd.setCursor(4, 0);
lcd.write((uint8_t)0);
lcd.setCursor(5, 0);
lcd.write((uint8_t)1);
lcd.setCursor(6, 0);
lcd.write((uint8_t)1);
lcd.setCursor(7, 0);
lcd.write((uint8_t)0);
lcd.setCursor(8, 0);
lcd.write((uint8_t)0);
lcd.setCursor(9, 0);
lcd.write((uint8_t)0);
lcd.setCursor(10, 0);
lcd.write((uint8_t)0);
lcd.setCursor(11, 0);
lcd.write((uint8_t)0);
lcd.setCursor(12, 0);
lcd.write((uint8_t)0);
lcd.setCursor(13, 0);
lcd.write((uint8_t)0);
lcd.setCursor(14, 0);
lcd.write((uint8_t)0);
lcd.setCursor(15, 0);
lcd.write((uint8_t)0);
lcd.setCursor(16, 0);
lcd.write((uint8_t)0);
}
void frecuencia6(){
lcd.createChar(0, MUERTO);
lcd.createChar(1, GDA);
lcd.setCursor(0, 0);
lcd.write((uint8_t)0);
lcd.setCursor(1, 0);
lcd.write((uint8_t)0);
lcd.setCursor(2, 0);
lcd.write((uint8_t)0);
lcd.setCursor(3, 0);
lcd.write((uint8_t)0);
lcd.setCursor(4, 0);
lcd.write((uint8_t)0);
lcd.setCursor(5, 0);
lcd.write((uint8_t)0);
lcd.setCursor(6, 0);
lcd.write((uint8_t)0);
lcd.setCursor(7, 0);
lcd.write((uint8_t)0);
lcd.setCursor(8, 0);
lcd.write((uint8_t)1);
lcd.setCursor(9, 0);
lcd.write((uint8_t)1);
lcd.setCursor(10, 0);
lcd.write((uint8_t)0);
lcd.setCursor(11, 0);
lcd.write((uint8_t)0);
lcd.setCursor(12, 0);
lcd.write((uint8_t)0);
lcd.setCursor(13, 0);
lcd.write((uint8_t)0);
lcd.setCursor(14, 0);
lcd.write((uint8_t)0);
lcd.setCursor(15, 0);
lcd.write((uint8_t)0);
lcd.setCursor(16, 0);
lcd.write((uint8_t)0);
}
void frecuencia7(){
lcd.createChar(0, MUERTO);
lcd.createChar(1, GDA);
lcd.setCursor(0, 0);
lcd.write((uint8_t)0);
lcd.setCursor(1, 0);
lcd.write((uint8_t)0);
lcd.setCursor(2, 0);
lcd.write((uint8_t)0);
lcd.setCursor(3, 0);
lcd.write((uint8_t)0);
lcd.setCursor(4, 0);
lcd.write((uint8_t)0);
lcd.setCursor(5, 0);
lcd.write((uint8_t)0);
lcd.setCursor(6, 0);
lcd.write((uint8_t)0);
lcd.setCursor(7, 0);
lcd.write((uint8_t)0);
lcd.setCursor(8, 0);
lcd.write((uint8_t)0);
lcd.setCursor(9, 0);
lcd.write((uint8_t)0);
lcd.setCursor(10, 0);
lcd.write((uint8_t)0);
lcd.setCursor(11, 0);
lcd.write((uint8_t)0);
lcd.setCursor(12, 0);
lcd.write((uint8_t)0);
lcd.setCursor(13, 0);
lcd.write((uint8_t)0);
lcd.setCursor(14, 0);
lcd.write((uint8_t)1);
lcd.setCursor(15, 0);
lcd.write((uint8_t)1);
lcd.setCursor(16, 0);
lcd.write((uint8_t)0);
}
void normal(){
frecuencia1();
delay(200);
frecuencia2();
delay(200);
frecuencia3();
delay(150);
}
void muerto(){
frecuencia4();
delay(100);
frecuencia5();
delay(100);
frecuencia6();
delay(100);
frecuencia7();
delay(100);
}
void latidos(){
lcd.createChar(4, heart);
lcd.createChar(7, GDA);
lcd.setCursor(0, 1);
lcd.write((uint8_t)4);
delay(200);
lcd.setCursor(0, 1);
lcd.write((uint8_t)7);
}