Introduction

L’objectif de cette application est de mettre en place un système de surveillance et d’affichage en temps réel de la qualité de la baignade. Le système utilise un indicateur à trois couleurs, représenté par des LEDs, afin de signaler aux usagers l’état de sécurité de la mer :

  • Rouge : danger, baignade interdite

  • Orange : baignade risquée, réservée aux nageurs expérimentés

  • Vert : conditions sûres, baignade autorisée

Le dispositif intègre également deux boutons :

  • Le premier permet de déclencher un signal d’alerte (SOS) en cas d’incident. Dans ce cas, la LED rouge clignote jusqu’à ce que le second bouton soit pressé pour signaler la résolution du problème et rétablir l’état précédent.

  • Le second bouton est utilisé par le sauveteur pour confirmer qu’un incident est terminé et que la situation revient à la normale.

Enfin, le système est capable de recevoir des informations externes, telles que des alertes météorologiques ou des messages provenant de l’équipe en mer, via la communication série. Ces messages sont interprétés pour mettre à jour automatiquement l’indicateur lumineux selon les mots-clés suivants :

  • Rouge : meduse, tempete, requin → danger immédiat, baignade interdite

  • Orange : vague → baignade réservée aux nageurs expérimentés

  • Vert : surveillant, calme → conditions sûres

Ce projet permet ainsi de développer un système de supervision simple mais efficace, combinant capteurs, boutons de contrôle et retour d’information en temps réel pour garantir la sécurité des usagers.

Schéma du projet

Programme du projet

// Définition des états
#define VERT 0
#define ORANGE 1
#define ROUGE 2

int etat = 0;                  // état actuel (VERT, ORANGE, ROUGE)
char mot[20];                  // mot lu sur la voie série

// Broches utilisées
const int btn_SOS = 2;
const int btn_OK  = 3;
const int leds[3] = {11, 12, 13}; // LEDs : VERT, ORANGE, ROUGE

void setup() {
  Serial.begin(9600);

  // Configuration des boutons en entrée
  pinMode(btn_SOS, INPUT);
  pinMode(btn_OK, INPUT);

  // Configuration des LEDs en sortie et éteintes
  for (int i = 0; i < 3; i++) {
    pinMode(leds[i], OUTPUT);
    digitalWrite(leds[i], HIGH); // LED éteinte
  }
}

// Lecture d'un mot sur la voie série jusqu'au '\n'
void lireVoieSerie() {
  int i = 0;
  while (Serial.available() > 0 && i < sizeof(mot) - 1) {
    mot[i++] = Serial.read();
    delay(10);
  }
  mot[i] = '\0'; // fin de chaîne
}

// Allume une LED et éteint les autres
// numLed : VERT = 0, ORANGE = 1, ROUGE = 2, -1 = toutes éteintes
void allumerDrapeau(int numLed) {
  for (int i = 0; i < 3; i++) {
    digitalWrite(leds[i], HIGH); // éteint toutes les LEDs
  }
  if (numLed != -1) {
    digitalWrite(leds[numLed], LOW); // allume la LED souhaitée
  }
}

// Fonction d'alerte : clignotement de la LED ROUGE jusqu'à appui sur OK
void alerte() {
  long temps = millis();
  bool clignotant = false;
  allumerDrapeau(-1); // toutes les LEDs éteintes

  while (digitalRead(btn_OK) != LOW) {
    if (millis() - temps > 250) {
      clignotant = !clignotant;
      digitalWrite(leds[ROUGE], clignotant);
      temps = millis();
    }
  }
}

// Compare un mot lu avec les mots connus et renvoie l'état correspondant
int comparerMot(const char mot[]) {
  if (strcmp(mot, "surveillant") == 0 || strcmp(mot, "calme") == 0) return VERT;
  if (strcmp(mot, "vague") == 0) return ORANGE;
  if (strcmp(mot, "meduse") == 0 || strcmp(mot, "tempete") == 0 || strcmp(mot, "requin") == 0) return ROUGE;
  return ORANGE; // valeur par défaut
}

void loop() {
  // Bouton SOS : déclenche alerte
  if (digitalRead(btn_SOS) == LOW) {
    alerte();
  }

  // Lecture des données série
  if (Serial.available() > 0) {
    lireVoieSerie();
    etat = comparerMot(mot);
  }

  // Affichage de l'état actuel sur les LEDs
  allumerDrapeau(etat);
}