Strani valori - sonde DS18B20

Ciao a tutti, sto integrando 3 sonde di temperatura nel mio progetto.

Uso la libreria Dallastemperature.h
Il monitor seriale mi mostra il valore di 85° per due delle tre sonde in maniera randomica; qualcuno mi potrebbe aiutare a capire come mai?

Grazie

Questo lo sketch

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

int intTempPlafo = 45;
int intTempCentr = 35;
int intTempVasca = 25;
int DeltaTempVasca = 1;
int DeltaTempCentr = 5;
int DeltaTempPlafo = 5;
const int Riscaldatore = 22;
const int PompaFiltro = 23;
const int PompaOsmo = 24;
const int Luce = 25;
const int Refrigeratore = 26;
const int LuceNotte = 27;
const int VentolaPlafo = 28;
const int VentolaCentr = 29;
const int Galleggiante = 30;

long delayTemp;
long lungDelayTemp = 5;  //  INDICARE IN SECONDI
long sviluppoDelayTemp;

#define ONE_WIRE_BUS 4  

OneWire oneWire(ONE_WIRE_BUS); devices

DallasTemperature sensors(&oneWire); 

DeviceAddress TempCentr = { 0x28, 0x36, 0xD2, 0x32, 0x04, 0x00, 0x00, 0x4D };
DeviceAddress TempPlafo = { 0x28, 0x5F, 0x04, 0x51, 0x05, 0x00, 0x00, 0x69 };
DeviceAddress TempVasca = { 0x28, 0xAE, 0x5D, 0x5C, 0x06, 0x00, 0x00, 0x33 };

void setup(void)
{
  pinMode(Riscaldatore, OUTPUT);
  pinMode(PompaFiltro, OUTPUT);
  pinMode(PompaOsmo, OUTPUT);
  pinMode(Luce, OUTPUT);
  pinMode(Refrigeratore, OUTPUT);
  pinMode(LuceNotte, OUTPUT);
  pinMode(VentolaPlafo, OUTPUT);
  pinMode(VentolaCentr, OUTPUT);
  pinMode(Galleggiante, INPUT);
  sviluppoDelayTemp = lungDelayTemp * 1000;
  delayTemp = sviluppoDelayTemp;
  
  Serial.begin(19200);
  
  sensors.begin();
  
  sensors.setResolution(TempCentr, 10);
  sensors.setResolution(TempPlafo, 10);
  sensors.setResolution(TempVasca, 10);
  
  digitalWrite(Riscaldatore,HIGH);  
  digitalWrite(PompaFiltro,HIGH);  
  digitalWrite(PompaOsmo,HIGH);  
  digitalWrite(Luce,HIGH);  
  digitalWrite(Refrigeratore,HIGH);  
  digitalWrite(LuceNotte,HIGH);  
  digitalWrite(VentolaPlafo,HIGH);  
  digitalWrite(VentolaCentr,HIGH);
}

void printTemperature(DeviceAddress deviceAddress)
{
  delay(700);
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print("Errore di lettura...");
  } else {
    Serial.print("C: ");
    Serial.print(tempC);
  }
}

void loop(void)
{ 
  if (millis() >= delayTemp){
    Serial.print("Lettura Temperature...\n\r");
    sensors.requestTemperatures();
    
    Serial.print("Temperatura centralina: ");
    printTemperature(TempCentr);
    Serial.print("\n\r");
    Serial.print("Temperatura plafo: ");
    printTemperature(TempPlafo);
    Serial.print("\n\r");
    Serial.print("Temperatura vasca: ");
    printTemperature(TempVasca);
    Serial.print("\n\r\n\r");
    delayTemp = millis() + sviluppoDelayTemp;
  }
  
  if(sensors.getTempC(TempCentr) >= (intTempCentr + DeltaTempCentr)){
    digitalWrite(VentolaCentr,LOW);
  }
  if(sensors.getTempC(TempCentr) < (intTempCentr - DeltaTempCentr)){
    digitalWrite(VentolaCentr,HIGH);
  }
  
  
  if(sensors.getTempC(TempPlafo) >= (intTempPlafo + DeltaTempPlafo)){
    digitalWrite(VentolaPlafo,LOW);
  }
  if(sensors.getTempC(TempPlafo) < (intTempPlafo - DeltaTempPlafo)){
    digitalWrite(VentolaPlafo,HIGH);
  }
  
  
  if(sensors.getTempC(TempVasca) >= (intTempVasca + DeltaTempVasca)){
    digitalWrite(Refrigeratore,LOW);
    digitalWrite(Riscaldatore,HIGH);
  }
  if(sensors.getTempC(TempVasca) < (intTempVasca - DeltaTempVasca)){
    digitalWrite(Refrigeratore,HIGH);
    digitalWrite(Riscaldatore,LOW);
  }
  if((sensors.getTempC(TempVasca) > (intTempVasca - DeltaTempVasca)) && (sensors.getTempC(TempVasca) < (intTempVasca + DeltaTempVasca))){
    digitalWrite(Refrigeratore,HIGH);
    digitalWrite(Riscaldatore,HIGH);
  }
}

come alimenti i sensori?
Ciao Uwe

:o

Porto alimentazione e segnale ad una bredboard.
parto con 3 fili e vado a una presa jack stereo (tipo cuffia)
poi con una spina jack strereo vado ai sensori.

La R di pull-up da quanto l'hai messa?

4,7K

Puoi provare ad abbassarla leggermente (esempio 3K3). Oppure puoi provare a fare un collegamento diretto dalla breaboard, togliendo gli spinotti per verificare che non ci sia un falso contatto.

Grazie marinaio, la prova ad abbassare la R l'avevo già fatta e per quel che riguarda il falso contatto, qualora non devesse essere rilevata la sonda ho fatto in modo che mi restituisca un errore ("Errore di lettura...")

85 gradi è il valore che ha il sensore al reset. A me sembra che leggi troppo velocemente, dovresti aspettare almeno 750 millisecondi dopo l'inizio della misura prima di leggere il registro. Forse la libreria commette errori?

Avevo pensato al delay, ma preferirei non usarlo perché faccio anche altri controlli e vorrei che fossero in tempo reale; per questo faccio la lettura delle memorie ogni 5 secondi.
Ora mi sorge una domanda:
i 750 millis li devo aspettare dal momento della chiamata o va bene come faccio tra una lettura e l'altra?

Il datasheet dice che dal momento al al DS18B20 si da il comando di inizio misura devono passare almeno 750 millisecondi prima che si inizi a leggere il valore dal registro.
Io non conosco bene la libreria ma potrebbe essere che sia la libreria stessa che si occupi della tempistica visto che tu hai un'unica istruzione che restituisce la temperatura.
Se hai usato questa libreria

ho visto che ci sono diversi esempi di cui alcuni aspettano la fine della conversione (usano millis e non delay) ma altri tipi il simple no.
Magari parti da quegli esempi giusto per essere sicuro di non avere un sensore difettoso.