7aa8cd2a1c
Spec, plan d'implémentation, design system, documentation de déploiement. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
186 lines
4.6 KiB
Markdown
186 lines
4.6 KiB
Markdown
# 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](https://code.visualstudio.com/) + extension [PlatformIO](https://platformio.org/)
|
||
- Python 3 (requis par PlatformIO)
|
||
|
||
---
|
||
|
||
## Installation et premier flash
|
||
|
||
### 1. Configurer le WiFi
|
||
|
||
Éditer `include/config.h` :
|
||
|
||
```cpp
|
||
#define WIFI_SSID "VotreSSID"
|
||
#define WIFI_PASS "VotreMotDePasse"
|
||
```
|
||
|
||
### 2. Configurer le broker MQTT (optionnel)
|
||
|
||
Dans `include/config.h` :
|
||
|
||
```cpp
|
||
#define MQTT_BROKER "192.168.1.x" // IP du broker Mosquitto
|
||
#define MQTT_PORT 1883
|
||
```
|
||
|
||
### 3. Compiler et flasher
|
||
|
||
```bash
|
||
# 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` :**
|
||
```json
|
||
{ "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` :**
|
||
```bash
|
||
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)
|
||
|
||
```bash
|
||
# 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` |
|