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.
// 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);
}