#include <Arduino.h>
#include <vector>
// Configuration des composants
#define PIR_PIN 15 // Capteur de mouvement
#define FSR_PIN 34 // Capteur de pression
#define LED_PIN 2 // LED intégrée
#define BUZZER_PIN 4 // Buzzer
#define RELAY_PIN 5 // Relais (porte)
#define BTN_PIN 13 // Bouton de test
// Variables du système
struct Scenario {
String name;
int pirValue;
int fsrValue;
int duration;
};
std::vector<Scenario> scenarios = {
{"Scénario Normal", 1, 500, 10},
{"Chute Temporaire", 0, 2500, 5},
{"Chute Réelle", 0, 2500, 35},
{"Déplacement Normal", 1, 0, 8}
};
unsigned long scenarioStartTime = 0;
int currentScenario = 0;
bool alertTriggered = false;
void setup() {
Serial.begin(115200);
// Configuration des pins
pinMode(PIR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(BTN_PIN, INPUT_PULLUP);
Serial.println("\n=== SafeCare Simulation ===");
printInstructions();
}
void loop() {
// Gestion du bouton pour changer de scénario
if (digitalRead(BTN_PIN) == LOW) {
delay(50); // Anti-rebond
if (digitalRead(BTN_PIN) == LOW) {
nextScenario();
}
while (digitalRead(BTN_PIN) == LOW); // Attente relâchement
}
// Exécution du scénario courant
runCurrentScenario();
}
void nextScenario() {
currentScenario = (currentScenario + 1) % scenarios.size();
scenarioStartTime = millis();
alertTriggered = false;
resetAlert();
Serial.println("\n=== " + scenarios[currentScenario].name + " ===");
Serial.println("PIR:" + String(scenarios[currentScenario].pirValue) +
" FSR:" + String(scenarios[currentScenario].fsrValue) +
" Durée:" + String(scenarios[currentScenario].duration) + "s");
}
void runCurrentScenario() {
Scenario s = scenarios[currentScenario];
// Simulation des capteurs
int pirValue = s.pirValue;
int fsrValue = s.fsrValue;
// Détection IA
if (pirValue == 0 && fsrValue > 2000) {
unsigned long elapsed = (millis() - scenarioStartTime) / 1000;
if (elapsed >= s.duration && !alertTriggered) {
triggerAlert();
alertTriggered = true;
}
}
// Affichage des données
static unsigned long lastPrint = 0;
if (millis() - lastPrint > 1000) {
lastPrint = millis();
Serial.println("T:" + String((millis() - scenarioStartTime) / 1000) +
"s PIR:" + String(pirValue) +
" FSR:" + String(fsrValue));
}
// Fin du scénario
if ((millis() - scenarioStartTime) / 1000 > s.duration + 5 && s.duration > 0) {
nextScenario();
}
}
void triggerAlert() {
digitalWrite(LED_PIN, HIGH);
digitalWrite(BUZZER_PIN, HIGH);
digitalWrite(RELAY_PIN, HIGH);
Serial.println("🚨 ALERTE: Situation anormale détectée!");
Serial.println("-> LED activée");
Serial.println("-> Buzzer activé");
Serial.println("-> Relais (porte) activé");
}
void resetAlert() {
digitalWrite(LED_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(RELAY_PIN, LOW);
}
void printInstructions() {
Serial.println("\nINSTRUCTIONS:");
Serial.println("1. Scénarios prédéfinis:");
Serial.println(" - Normal: Mouvement et pression normale");
Serial.println(" - Chute Temporaire: Fausse alerte");
Serial.println(" - Chute Réelle: Alerte après 30s");
Serial.println(" - Déplacement: Pas de pression");
Serial.println("2. Appuyez sur le bouton pour changer de scénario");
Serial.println("3. Les alertes se déclenchent automatiquement");
Serial.println("\n=== Démarrage ===\n");
}