feat: module capteurs DS18B20 — acquisition non-bloquante, buffer circulaire 24h
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,8 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
// Initialise le bus OneWire et les capteurs DallasTemperature
|
||||||
|
void sensors_init();
|
||||||
|
|
||||||
|
// À appeler à chaque loop() : acquisition non-bloquante toutes les MESURE_INTERVALLE ms
|
||||||
|
// Retourne true si une nouvelle mesure vient d'être enregistrée
|
||||||
|
bool sensors_update();
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "network.h"
|
#include "network.h"
|
||||||
|
#include "sensors.h"
|
||||||
|
|
||||||
SondeConfig sondesConfig[NB_SONDES] = {
|
SondeConfig sondesConfig[NB_SONDES] = {
|
||||||
{ "T°C Ext", "maison/jardin/ext/temperature", 60000, 0.2f },
|
{ "T°C Ext", "maison/jardin/ext/temperature", 60000, 0.2f },
|
||||||
@@ -16,8 +17,10 @@ void setup() {
|
|||||||
Serial.begin(115200);
|
Serial.begin(115200);
|
||||||
Serial.println("[BOOT] esp_jardin démarrage...");
|
Serial.println("[BOOT] esp_jardin démarrage...");
|
||||||
network_init();
|
network_init();
|
||||||
|
sensors_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
network_update();
|
network_update();
|
||||||
|
sensors_update();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,67 @@
|
|||||||
|
#include "sensors.h"
|
||||||
|
#include "config.h"
|
||||||
|
#include <OneWire.h>
|
||||||
|
#include <DallasTemperature.h>
|
||||||
|
|
||||||
|
static OneWire _oneWire(ONE_WIRE_BUS);
|
||||||
|
static DallasTemperature _sensors(&_oneWire);
|
||||||
|
|
||||||
|
// États de la machine non-bloquante
|
||||||
|
static uint32_t _derniereMesureMs = 0;
|
||||||
|
static uint32_t _demandeMs = 0;
|
||||||
|
static bool _demandeEnCours = false;
|
||||||
|
|
||||||
|
// Conversion 12 bits = 750 ms
|
||||||
|
static const uint32_t CONVERSION_MS = 750;
|
||||||
|
|
||||||
|
void sensors_init() {
|
||||||
|
_sensors.begin();
|
||||||
|
_sensors.setWaitForConversion(false); // mode non-bloquant
|
||||||
|
uint8_t nb = _sensors.getDeviceCount();
|
||||||
|
Serial.printf("[SONDES] %u capteur(s) DS18B20 détecté(s) sur GPIO %d\n", nb, ONE_WIRE_BUS);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sensors_update() {
|
||||||
|
uint32_t maintenant = millis();
|
||||||
|
|
||||||
|
// ── Lancement de la demande de conversion ────────────────────────
|
||||||
|
if (!_demandeEnCours && maintenant - _derniereMesureMs >= MESURE_INTERVALLE) {
|
||||||
|
_sensors.requestTemperatures();
|
||||||
|
_demandeMs = maintenant;
|
||||||
|
_demandeEnCours = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Attente de la fin de conversion (750 ms) ─────────────────────
|
||||||
|
if (_demandeEnCours && maintenant - _demandeMs >= CONVERSION_MS) {
|
||||||
|
_demandeEnCours = false;
|
||||||
|
_derniereMesureMs = maintenant;
|
||||||
|
|
||||||
|
// Lecture et validation de chaque sonde
|
||||||
|
for (uint8_t i = 0; i < NB_SONDES; i++) {
|
||||||
|
float t = _sensors.getTempCByIndex(i);
|
||||||
|
|
||||||
|
// Rejeter les valeurs d'erreur DS18B20
|
||||||
|
if (t == DEVICE_DISCONNECTED_C || t == 85.0f) {
|
||||||
|
sondesEtat[i].erreur = true;
|
||||||
|
sondesEtat[i].tempActuelle = NAN;
|
||||||
|
Serial.printf("[SONDE %u] ERREUR — valeur rejetée: %.1f\n", i, t);
|
||||||
|
} else {
|
||||||
|
sondesEtat[i].erreur = false;
|
||||||
|
sondesEtat[i].tempActuelle = t;
|
||||||
|
Serial.printf("[SONDE %u] %s = %.1f°C\n", i, sondesConfig[i].nom, t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enregistrement dans le buffer circulaire
|
||||||
|
historique[histIdx].timestamp = maintenant;
|
||||||
|
for (uint8_t i = 0; i < NB_SONDES; i++) {
|
||||||
|
historique[histIdx].temps[i] = sondesEtat[i].tempActuelle; // NAN si erreur
|
||||||
|
}
|
||||||
|
histIdx = (histIdx + 1) % HIST_TAILLE;
|
||||||
|
|
||||||
|
return true; // nouvelle mesure disponible
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user