Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
DS18B20 Précision du capteur
#1
Salut la team,

Je voudrais faire remonter les températures des sondes DS18B20 sur deux chiffres après la virgule via MQTT.
Dans les données brutes du routeur je vois bien 27.67°C mais je ne retrouve que 28.8°C dans les trames MQTT.
J'ai besoin de ca pour calculer précisément les vitesses de chauffe et de refroidissement de mon CE.

Cheers
Yves
Répondre

#2
Bonjour,
Ce n'est pas possible avec le code actuel.
Il faudrait changer la ligne 381 de EnvoiMQTT.ino :
sprintf(value, "%s,\"Temperature_%s\": %.1f", value, String(canal), temperature[canal]);

remplacer le %.1f par %.2f
Répondre

#3
C est complètement utopique de travailler à 2 chiffres après la virgule sur une températures. Au delà de la précision de la sonde en elle même, tu as le temps de transfert de la chaleur de l eau à la sonde ( à la limite si on les suppose constant ce qui n est pas le cas en relatif ça pourrait marcher) mais surtout ce sont les mouvements de convections de l eau dans le CE qui ne sont jamais répétitifs. De plus tu crées des turbulences à chaque fois que tu tires de l eau.
Et la finalité ça te servirait à quoi d avoir la vitesse de réchauffement avec 4 chiffres significatifs ?
C est comme si ton compteur de voiture affichait 79,43 km/h ..
Répondre

#4
(16-02-2026, 09:22 PM)Mike a écrit : Bonjour,
Ce n'est pas possible avec le code actuel.
Il faudrait changer la ligne 381 de EnvoiMQTT.ino :
sprintf(value, "%s,\"Temperature_%s\": %.1f", value, String(canal), temperature[canal]);

remplacer le %.1f par %.2f

Merci pour ta réponse
Il faudra que je teste pour voir si j'arrive a avoir quelque chose de convaincant coté Home Assistant (calcul du coefficient de refroidissement en °C/h avec une dérivée)
Répondre

#5
DS18B20 Précision du capteur c est + ou - 0.5c degres , je sais pas si allez chercher le centieme de degres ca sert a quelquechose
Répondre

#6
(Aujourd’hui, 10:49 AM)alexandeur a écrit : DS18B20 Précision du capteur c est + ou - 0.5c degres , je sais pas si allez chercher le centieme de degres ca sert a quelquechose

on peut passer à  par %.12f  Smile 

Il faut effectivement revenir sur les bases des calculs de précisions, qui ne sont pas si simples , mais en tout cas on améliore pas la précision en augmentant le nombre de chiffres ( non siginificatifs) , au delà de l 'electronique dans le cas présent on a aussi la physique, la sonde ne peut pas prendre la temperature de l'eau à l interieure du ballon de façon précise puisqu elle est aussi refroidie par son environnement. Coté Numériques  le DS18B20  possède un CAN de 1/16 = 0,0625 °C  mais pour des raisons de vitesse d'acquisition est –55 °C à +125 °C, par défaut la conversion est "bridée" sur 9 bits, comme on enleve 3 bits la resolution passe de 0.0625 *2^3 =0.5 degré C.
ceci dit on peut reprogrammer le DSB pour repasser en 12 bits à cette vitesse la frequence d'echantillonnage est de 2 secondes ce qui est largement suffisant


Pour passer les DS18B20 flasher l ESP avec le code suivant, toutes les sondes coonectées au bus passeront en 12 bits, soit sur un esp separé avec les sondes dessus , soit en flashant le routeur avec , puis reflasher avec le code du routeur

Code :
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 4  // GPIO utilisé, à adapter

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup() {
  Serial.begin(115200);
  sensors.begin();

  Serial.println("Configuration des capteurs en 12 bits...");

  int deviceCount = sensors.getDeviceCount();
  Serial.print("Nombre de capteurs detectes : ");
  Serial.println(deviceCount);

  DeviceAddress tempAddress;

  // --- Passer tous les capteurs en 12 bits ---
  for(int i=0; i<deviceCount; i++) {
    if(sensors.getAddress(tempAddress, i)) {
      sensors.setResolution(tempAddress, 12); // 12 bits
    }
  }

  Serial.println("Configuration termine. Lecture des temperatures et resolutions :");
}

void loop() {
  sensors.requestTemperatures(); // lance la conversion

  int deviceCount = sensors.getDeviceCount();
  DeviceAddress tempAddress;

  for(int i=0; i<deviceCount; i++) {
    if(sensors.getAddress(tempAddress, i)) {
      float tempC = sensors.getTempC(tempAddress);
      uint8_t res = sensors.getResolution(tempAddress);

      Serial.print("Capteur ");
      Serial.print(i);
      Serial.print(" : Temp = ");
      Serial.print(tempC);
      Serial.print(" °C, Resolution = ");
      Serial.print(res);
      Serial.println(" bits");
    }
  }

  Serial.println("------------------------");
  delay(1000); // 1 lecture par seconde
}
Répondre



Atteindre :


Utilisateur(s) parcourant ce sujet :
1 visiteur(s)

Moteur MyBB, © 2002-2026 Melroy van den Berg.