Heartbeat Simulator -
# P wave def p_wave(t_center, t): return 0.25 * np.exp(-((t - t_center)**2) / (0.04))
beat_interval = 60 / bpm for i in range(int(duration / beat_interval)): center = i * beat_interval + 0.2 # offset to place QRS ecg += qrs(center, t) ecg += p_wave(center - 0.15, t) ecg += t_wave(center + 0.3, t)
# QRS complex model (sum of Gaussians) def qrs(t_center, t): return 1.2 * np.exp(-((t - t_center)**2) / (0.01)) heartbeat simulator
# Add baseline drift and noise drift = 0.05 * np.sin(2 * np.pi * 0.2 * t) noise = 0.02 * np.random.randn(len(t)) return t, ecg + drift + noise t, signal = generate_ecg(bpm=85) plt.plot(t, signal) plt.title("Simulated ECG for Heartbeat Simulator") plt.xlabel("Time (s)") plt.ylabel("Amplitude (mV)") plt.grid(True) plt.show()
# T wave def t_wave(t_center, t): return 0.35 * np.exp(-((t - t_center)**2) / (0.1)) # P wave def p_wave(t_center, t): return 0
void setup() pinMode(9, OUTPUT);
void loop() // Output one heartbeat cycle for (int i = 0; i < sizeof(ecgWaveform); i++) analogWrite(9, ecgWaveform[i]); delay(10); // 10ms steps = 100Hz update # P wave def p_wave(t_center
// Predefined waveform: sequence of amplitudes (0-255) // Represents P-QRS-T complex byte ecgWaveform[] = 128, 128, 130, 135, 140, // P wave start 150, 155, 160, 165, 170, 175, 180, // P wave peak 170, 160, 145, 130, 120, 110, // P-R segment 100, 90, 80, 70, 60, 50, 40, // QRS onset 30, 20, 10, 5, 0, 0, 0, // R wave downslope 10, 30, 50, 80, 110, 140, // S wave and return 160, 170, 175, 170, 160, 150, // ST segment 145, 140, 138, 135, 133, 130, 128 // T wave and baseline ;