IP_HeartBand/main2.cpp

81 lines
2.3 KiB
C++

#include <iostream>
#include <vector>
#include <chrono>
#include <thread>
#include <cstdlib> // Pour rand()
#include <ctime> // Pour srand()
#include <unistd.h> // pour usleep()
// === Paramètres ===
const int BPM_MIN = 50;
const int BPM_MAX = 120;
const int SAMPLE_INTERVAL_MS = 10; // Prendre une mesure toutes les 10 ms
const int THRESHOLD = 550; // Seuil pour détecter un battement
const int NOISE_LEVEL = 100; // Niveau de bruit du signal
// === Initialiser le générateur de nombres aléatoires ===
void initialiserRandom() {
srand(static_cast<unsigned int>(time(0)));
}
// === Simule les données reçues du capteur cardiaque ===
int simulerSignalCardiaque() {
static int t = 0;
t++;
// Créer un pic toutes les 800 ms environ (~75 BPM)
if (t % 80 == 0) {
return 700 + rand() % 50; // Pic entre 700-750
}
else {
return 300 + rand() % NOISE_LEVEL; // Bruit entre 300 et 400
}
}
// === Fonction principale ===
int main() {
initialiserRandom();
bool battementDetecte = false;
auto dernierBattement = std::chrono::steady_clock::now();
std::cout << "Démarrage de la simulation du capteur cardiaque...\n";
while (true) {
int signal = simulerSignalCardiaque();
// Afficher la valeur brute du signal simulé (optionnel pour debug)
// std::cout << "Signal: " << signal << std::endl;
// Détection de battement
if (signal > THRESHOLD && !battementDetecte) {
auto maintenant = std::chrono::steady_clock::now();
auto intervalle = std::chrono::duration_cast<std::chrono::milliseconds>(maintenant - dernierBattement).count();
if (intervalle > 300) { // Filtrer les battements trop proches (<300 ms = >200 BPM)
int bpm = 60000 / intervalle;
std::cout << " BPM mesuré : " << bpm;
if (bpm < BPM_MIN || bpm > BPM_MAX) {
std::cout << " [Anomalie]";
}
std::cout << std::endl;
dernierBattement = maintenant;
}
battementDetecte = true;
}
// Prêt pour détecter un prochain battement
if (signal < THRESHOLD) {
battementDetecte = false;
}
// Pause entre deux lectures du capteur
usleep(SAMPLE_INTERVAL_MS);
}
return 0;
}