- network.h/.cpp : lecture credentials NVS (Preferences) au boot,
fallback config.h si vide ; network_get_ssid() et
network_save_credentials() exposés
- web_server.cpp : 3 nouvelles routes REST
GET /api/wifi/current → SSID/IP/RSSI/modeAP
GET /api/wifi/networks → scan async + polling état
POST /api/wifi/connect → sauvegarde NVS + ESP.restart()
- index.html : modal WiFi (réseau actuel, liste scannée avec
barres signal ▁▂▃▄▅ + cadenas, formulaire SSID/mdp,
bouton œil, message redémarrage avec lien esp_jardin.local)
design Gruvbox Seventies cohérent avec le reste
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ESP Jardin — Station de monitoring environnemental
Firmware ESP32 pour une station d'acquisition de températures avec interface web temps réel, API REST et publication MQTT.
Matériel requis
| Composant | Quantité | Notes |
|---|---|---|
| ESP32 DevKit V1 | 1 | ou équivalent 38 broches |
| Sonde DS18B20 | 3 | waterproof recommandé |
| Résistance 4.7 kΩ | 1 | pull-up obligatoire |
| Câbles Dupont | — |
Câblage
DS18B20 (×3 en parallèle)
VCC → 3.3V
GND → GND
DATA → GPIO 4
Résistance 4.7 kΩ entre 3.3V et GPIO 4 (pull-up)
Important : Sans la résistance pull-up, les sondes retournent systématiquement −127°C.
Prérequis logiciels
- VS Code + extension PlatformIO
- Python 3 (requis par PlatformIO)
Installation et premier flash
1. Configurer le WiFi
Éditer include/config.h :
#define WIFI_SSID "VotreSSID"
#define WIFI_PASS "VotreMotDePasse"
2. Configurer le broker MQTT (optionnel)
Dans include/config.h :
#define MQTT_BROKER "192.168.1.x" // IP du broker Mosquitto
#define MQTT_PORT 1883
3. Compiler et flasher
# Flash du firmware
pio run -t upload
# Flash de l'interface web (LittleFS)
pio run -t uploadfs
# Moniteur série (débogage)
pio device monitor
4. Vérifier le boot
[BOOT] esp_jardin v1.0 — démarrage...
[WIFI] Connexion STA → SSID: VotreSSID
[WIFI] Connecté — IP: 192.168.1.42
[mDNS] Accessible via http://esp_jardin.local
[OTA] Prêt
[FS] LittleFS monté
[HTTP] Serveur web démarré sur port 80
[SONDES] 3 capteur(s) DS18B20 détecté(s) sur GPIO 4
Accès à l'interface
Une fois connecté à votre réseau :
http://esp_jardin.local # Via mDNS
http://192.168.1.42 # Via IP directe
Mode Access Point de secours
Si le WiFi est indisponible au démarrage, l'ESP crée automatiquement un point d'accès :
| Paramètre | Valeur |
|---|---|
| SSID | ESP_CHEF_JARDIN |
| Mot de passe | Jardin2026 |
| IP de l'interface | 192.168.4.1 |
L'interface web reste accessible. Le broker MQTT est désactivé en mode AP. L'ESP tente de se reconnecter au WiFi STA toutes les 60 secondes.
API REST
| Méthode | Endpoint | Description |
|---|---|---|
| GET | /api/status |
État système (WiFi, MQTT, RAM, uptime) |
| GET | /api/temperatures |
Températures instantanées |
| GET | /api/history |
Historique 24h (288 points) |
| POST | /api/config |
Mise à jour configuration |
Exemple /api/temperatures :
{ "sonde_1": "19.3", "sonde_2": "28.7", "sonde_3": null, "unit": "C" }
null = sonde en erreur ou déconnectée.
Exemple POST /api/config :
curl -X POST http://esp_jardin.local/api/config \
-H "Content-Type: application/json" \
-d '{"intervalleMs": 5000, "mqttBroker": "10.0.0.3", "mqttPort": 1883}'
MQTT
Topics publiés (retain=true) :
| Sonde | Topic | Deadband |
|---|---|---|
| T°C Extérieur | maison/jardin/ext/temperature |
0.2°C |
| T°C Serre | maison/jardin/serre/temperature |
0.1°C |
| T°C Sol | maison/jardin/sol/temperature |
0.1°C |
Payload : valeur numérique en string, ex : "19.3". Les erreurs ne sont jamais publiées.
Mise à jour OTA (après déploiement)
# Remplacer 192.168.1.42 par l'IP réelle de la carte
pio run -t upload --upload-port 192.168.1.42
# Mot de passe OTA : Jardin2026
Le mot de passe OTA peut être changé dans include/config.h (OTA_PASS) et platformio.ini (upload_flags = --auth=...).
GPIO disponibles pour extensions futures
| GPIO | Usage futur | Interface |
|---|---|---|
| 21 / 22 | Capteur BH1750 (luminosité) ou SHT31 (T°/Humidité) | I2C |
| 32 / 33 | Capteur humidité sol | ADC1 (compatible WiFi) |
| 25 / 26 | Relais / électrovanne | Digital out |
| 14 | Pluviomètre à augets | Interruption |
| 27 | Bouton reset / forçage AP | Interruption |
Ne jamais utiliser ADC2 (GPIO 34–39) quand le WiFi est actif — conflit hardware ESP32.
Dépannage
| Symptôme | Cause probable | Solution |
|---|---|---|
| Sonde affiche −127°C | Résistance pull-up absente ou câble défectueux | Vérifier la résistance 4.7 kΩ sur GPIO 4 |
| Sonde affiche 85.0°C | Sonde en court-circuit ou alimentation insuffisante | Vérifier l'alimentation 3.3V |
| Interface web inaccessible | LittleFS non flashé | pio run -t uploadfs |
esp_jardin.local ne répond pas |
mDNS non supporté sur certains réseaux | Utiliser l'IP directe |
| OTA échoue | Mauvais mot de passe | Vérifier OTA_PASS dans config.h |