Système de Surveillance Domestique Avancé avec Arduino Mega et Capteurs IoT
Composants et fournitures
| Arduino Mega 2560 | 1 |
| Carte Ethernet Arduino | 1 |
| Écran LCD 4x20 avec interface I2C | 1 |
| Capteur température/humidité DHT22 | 1 |
| RTC DS3231 (horloge temps réel haute précision) | 1 |
| Capteur ultrasonique HC-SR04 (niveau puisard) | 1 |
| PCB personnalisé OSH Park (interface et annoncateur) | 1 |
À propos de ce projet
Tout a commencé par l'installation d'un thermostat intelligent Ecobee chez ma fille. Ecobee ayant cessé ce produit, je cherchais une alternative permettant de surveiller : niveau de puisard, alarme inondation, coupure de courant, et d'autres paramètres. Le code Arduino et le site web s'inspirent de nombreux projets open-source. L'utilisation de PushingBox pour les notifications a été l'élément clé permettant l'alerte à distance. Merci à la communauté open-source pour le partage de connaissances.

Le système repose sur un Arduino Mega 2560 avec carte Ethernet. Grâce à Eagle CAD, j'ai conçu des circuits imprimés pour les entrées et l'annoncateur visuel, fabriqués par OSH Park. La carte d'interface relie : 7 contacts secs, capteur température/humidité, RTC, et capteur ultrasonique de niveau de puisard à l'Arduino.

Pour l'affichage local : un LCD 4x20. Huit LEDs indiquent l'état de chaque entrée d'alarme : ambre = alarme active, vert = alarme passée (réarmée), éteint = réinitialisé. Le bouton « Reset » éteint les LEDs vertes ; le bouton « Message Enable » active/désactive les notifications PushingBox.
L'interface web n'est accessible que sur le réseau local (LAN) – pas d'ouverture de port sur le routeur pour des raisons de sécurité. Plusieurs exemples Arduino et la bibliothèque jqPlot ont été utilisés pour les graphiques autonomes.


L'alarme de niveau de puisard se déclenche sous 10 pouces (LED ambre allumée). La LED verte indique une alarme passée. Le bouton Reset éteint la verte, mais l'ambre reste allumée tant que le niveau < 10 pouces.
Code
Code Arduino (C/C++)
// Home Monitor code
/* AFFECTATIONS
arduino led verte led rouge interface annoncateur annoncateur capteur# variable entrée broche sortie broche sortie broche variable carte broche carte rouge broche carte verte broche
niveau puisard 1 6,8 18 19 pouces x15-2 à 6, x15-3 à 8 20-1 20-2
alarme inondation 2 28 23 25 x15-4 20-3 20-4
coupure courant 3 30 27 29 x15-5 20-5 20-6
température 4 ftemp 5 (ftemp,1) x15-1
humidité 5 fhumi 5 (fhumi,1) x15-1
aux 1 6 aux1 32 31 33 x15-6 20-7 20-8
aux 2 7 aux2 34 35 37 x15-11 21-1 21-2
aux 3 8 aux3 36 39 41 x15-7 21-3 21-4
aux 4 9 aux4 38 43 45 x15-8 21-5 21-6
aux 5 10 aux5 40 47 49 x15-9 21-7 21-8
reset reset 42 x15-10
inhibit msg msginhbt 44 x15-12
message led 17 * changer pour shield WiFi
CÂBLAGE
VCC vers 5V
LCD: SDA vers broche 21, SCL vers broche 20
DHT22: broche 1 vers VCC, broche 2 vers broche 5 + 10K vers VCC, broche 4 vers GND
HC-SR04: trig vers broche 8, echo vers broche 6
RTC: SDA vers 21, SCL vers 20
COUPURE COURANT broche 30
INONDATION broche 28
MESSAGE LED broche 17
PAS UTILISER broches 4, 7, 10, 11, 12, 13, 50, 51, 52, 53
*/
// BIBLIOTHÈQUES
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <dht.h>
#include <NewPing.h>
#include <RTClib.h>
#include <RTC_DS3231.h>
#define REQ_BUF_SZ 50
byte mac[] = { 0xzz, 0xzz, 0xzz, 0xzz, 0xzz, 0xzz };
IPAddress ip(192, 168, 1, 100);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
EthernetServer server(1000);
File webFile;
char HTTP_req[REQ_BUF_SZ] = {0};
char req_index = 0;
char DEVID1[] = "xxxxxxxxxxxxxxxxx"; // Votre DevID PushingBox
// CONFIGURATION MATÉRIEL
LiquidCrystal_I2C lcd(0x27, 20, 4);
dht DHT;
#define DHT22_PIN 5
#define TRIGGER_PIN 8
#define ECHO_PIN 6
#define MAX_DISTANCE 200
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
RTC_DS3231 RTC;
// Variables globales
unsigned long mathtime1 = 0, mathtime2 = 0, mathtime3 = 0, mathtime3a = 0, mathtime4 = 0;
String timestring, datestring;
unsigned int inches;
float ftemp, fhumi;
int aux1, aux2, aux3, aux4, aux5, reset;
int msginhbt = LOW;
// ... capteurs, messages, flags debug ...
void setup() {
// Carte SD, Ethernet, Serial, LCD, RTC, broches entrées/sorties
// Initialisation complète dans le code source original
}
void loop() {
// LED message pushbutton
if (digitalRead(44) == HIGH) digitalWrite(17, HIGH); else digitalWrite(17, LOW);
// Sous-routines principales
timeanddate();
ultrasonicsensor();
dht22();
annunciator();
// Préparation chaînes JSONP pour le site web
sensor1 = inches;
sensor1msg = (inches < 10) ? "_Sump_Alarm_" : "";
sensor2 = digitalRead(28) ? "'FLOOD ALARM'" : "'OK'";
sensor2msg = digitalRead(28) ? "_Flood_Alarm_" : "";
sensor3 = digitalRead(30) ? "'LOSS OF POWER'" : "'OK'";
sensor3msg = digitalRead(30) ? "_Loss_of_Power_" : "";
sensor4 = ftemp;
sensor5 = fhumi;
// ... aux 1-5 ...
msginhbtmsg = digitalRead(44) == HIGH ? "'ON'" : "'OFF'";
messagesend = sensor1msg + sensor2msg + sensor3msg + sensor6msg + sensor7msg + sensor8msg + sensor9msg + sensor10msg;
// Serveur web AJAX
EthernetClient client = server.available();
if (client) {
// Traitement requêtes HTTP, envoi données JSONP
// Voir code complet pour détails
}
// Envoi notifications PushingBox (désactivé si site web consulté)
// sendmessage();
}
// Fonctions : timeanddate(), ultrasonicsensor(), dht22(), annunciator(), sendmessage()
// Voir code source complet pour implémentation détaillée
Site Web (JavaScript + HTML)
Le tableau de bord web utilise : jQuery, jqPlot (graphiques), Gauge.js (jauges), canvas. Il interroge l'Arduino toutes les 3 secondes via JSONP et met à jour graphiques, jauges et valeurs textuelles en temps réel.
Fonctionnalités :
- Graphiques historiques : niveau puisard (0-50 pouces) et température (0-100 °F)
- Jauges circulaires avec zones colorées (vert/jaune/rouge)
- Affichage texte de tous les capteurs : niveau, alarme inondation, coupure courant, température, humidité, 5 entrées auxiliaires, timer messages
- Horloge JavaScript côté client
Note : les fichiers JS/CSS (jquery, jqplot, gauge.js, excanvas) doivent être hébergés localement sur l'ordinateur servant la page.
Schémas
Fichiers Eagle CAD : LED BAR 2.sch (interface et annoncateur)
Processus de fabrication
- Tensiomètre : conception, fabrication et tendances futures
- Construire un réseau de capteurs sans fil abordable pour votre maison
- Surveiller la température de votre maison avec un tableau de bord Raspberry Pi
- Construire un système domotique piloté par Raspberry Pi pour contrôle à distance
- Construire sa propre machine à écrire les devoirs à la maison (Traceur à stylo)
- Créer un système Ambilight spectaculaire pour moniteur avec Arduino
- Moniteur de Fréquence Cardiaque IoT en Temps Réel avec Arduino et MAX30100
- Sécurisez votre chauffe-eau : Moniteur de tension thermocouple pour veilleuse pilote
- Robot Assistant Domestique Autonome : Liste Complète et Guide de Configuration