ESP8266 con DS18B20 letture irregolari

Buon giorno,

sto utilizzando gli ESP01 e ho messo il ds18b20 con relativa resistenza da 4.7K ma rilevo misure troppo alte.
Ho provato anche con resistenze da 2.2k ma uguale.

Addirittura un sensore ha 10 gradi in più...

Ho pensato, ok so che legge n gradi in più e quindi da codice abbasso la lettura ma ho calibrato i sensori a 21 gradi e quando gli ho piazzati ho sempre letture molto errate.
In camera da letto ho 17 gradi (letti con 2 cronotermostati provvisori) e me ne segna 19 il ds...
Ho provato a calibrarli sul posto, cioè nella relativa stanza ma poi sono sempre sbagliati.
In camera quando scaldo la temperatura aumenta ma è sempre più bassa di quella letta dai Crono esterni. Per esempio se arriva a 20 gradi il ds mi segna sempre qualcosa in meno...
In bagno mi dice che ho 19.11 gradi e anche se scaldo vedo la temperatura che va anche a 22/23 gradi con 2 termometri esterni digitali ma il ds mi da al massimo 19.38....

Cosa sto sbagliando?

Hai provato a realizzare lo sketch su un hardware chw ti permetta di vedere i dati su un monitor seriale? es: NODEMCU oppure omettendo la parte wifi ?
Io di solito mi comporto in questo modo e spesso scopro errori nel mio software?
Se l'intervento ti sembra banale , perdonami
ciao
Daniele

Ne ho provate di ogni ma non riesco a regolarli bene...

Grazie comunque

Ma il 18b20 è una sonda digitale

Come potrebbe cambiare una resistenza cambiare la lettura?
Ti va di mettere schema e sketch?

Non ho capito la frase

Lo sckatch eccolo:

/*************************************************************

  This is a simple demo of sending and receiving some data.
  Be sure to check out other examples!
 *************************************************************/

// Template ID, Device Name and Auth Token are provided by the Blynk.Cloud
// See the Device Info tab, or Template settings
#define BLYNK_TEMPLATE_ID "TMPLqE8jHF9G"
#define BLYNK_DEVICE_NAME "Bagno"
#define BLYNK_AUTH_TOKEN "o4kFYn_WqnEOfE_cwryjQil181j905E3";


// Comment this out to disable prints and save space
#define BLYNK_PRINT Serial


#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <OneWire.h> 
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS); 
DallasTemperature sensors(&oneWire);


char auth[] = BLYNK_AUTH_TOKEN;

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "";

char pass[] = "";

float tSomma = 0;
int countLetture =0;
BlynkTimer timer;

//WidgetTerminal terminal(V36); //Bagno
//WidgetTerminal terminal(V37); //Soggiorno
//WidgetTerminal terminal(V38); //Camera
//WidgetTerminal terminal(V40); //Laboratorio



// This function sends Arduino's up time every second to Virtual Pin (5).
// In the app, Widget's reading frequency should be set to PUSH. This means
// that you define how often to send data to Blynk App.
void sendSensor()
{
  if(countLetture<60){
    float tTemp =0;
    sensors.requestTemperatures();
    tTemp = sensors.getTempCByIndex(0);
    Serial.print("tTemp è: "); Serial.println(tTemp);
    //terminal.print(F("tTemp è: ")); terminal.println(tTemp);
    tSomma += tTemp;
    Serial.print("tSomma è: "); Serial.println(tSomma);
    //terminal.print(F("tSomma è: ")); terminal.println(tSomma);
    //terminal.flush();
    countLetture++;
    Serial.print("Il numero di letture è: "); Serial.println(countLetture);
    //terminal.print(F("Il numero di letture è: ")); terminal.println(countLetture);
    //terminal.flush();
  }
  if(countLetture==60){
    float t = tSomma /60;
    //t = t-0.4;//Soggiorno
    //t = t-5.3;//Bagno
    //t = t-4.6;//Camera
    t = t -10.3;//Reception
    //t = t -8.7;//Uffico
    //t = t -3;//Laboratorio
    
    Serial.print("La media di 60 letture è: "); Serial.println(t);
    //terminal.print(F("La media di 60 letture è:")); terminal.println(t);
    Blynk.notify("Tempweratura inviata");
    
    Serial.print("Temperatura inviata: "); Serial.println(t);
    //terminal.print("Temperatura inviata: "); terminal.println(t);
    //terminal.flush();
    Blynk.virtualWrite(V5, t);//laboratorio
    //Blynk.virtualWrite(V6, t);//ufficio
    //Blynk.virtualWrite(V7, t);//reception
    //Blynk.virtualWrite(V0, t);//Soggiorno
    //Blynk.virtualWrite(V1, t);//Bagno
    //Blynk.virtualWrite(V2, t);//camera
    //Blynk.virtualWrite(V3, t);//studio
    //Blynk.virtualWrite(V4, t);//gym
    //Blynk.virtualWrite(V35, t);//esterno
    tSomma=0;
    countLetture=0;
  }
  
}

void setup()
{
  // Debug console
  Serial.begin(115200);

  Blynk.begin(auth, ssid, pass);
  // You can also specify server:
  //Blynk.begin(auth, ssid, pass, "blynk.cloud", 80);
  //Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,100), 8080);

// Start up the library 
 sensors.begin(); 
 //terminal.println(F("Blynk v" BLYNK_VERSION ": Device started"));
 //terminal.flush();
  // Setup a function to be called every second
  timer.setInterval(1000L, sendSensor);
}

void loop()
{
  Blynk.run();
  timer.run();
}

@abinformatica : in conformità al REGOLAMENTO , punto 7, cortesemente edita il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone a forma di piccola matita :pencil2: che si trova in basso del tuo post), seleziona TUTTA la parte di codice e premi l'icona </> nella barra degli strumenti per contrassegnarla come codice.

Inoltre, così com'è, non è molto leggibile ... assicurati di averlo correttamente indentato nell'IDE prima di inserirlo (questo lo si fa premendo ctrlT su un PC o cmd T su un Mac all'intero del IDE). Per maggiori informazioni ... punto 17.2 del succitato regolamento. Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà sistemato il codice, nel rispetto del suddetto regolamento nessuno ti risponderà (eventuali risposte verrebbero cancellate), quindi ti consiglio di fare il tutto al più presto. :wink:

quindi tu hai una lettora ogni secondo, ogni sessanta letture fai lamedia e stampi la media
e le singole leture tra di loro cambiano molto?
il ds18.. e' dato per uan grande precisione, ci domandamo come sia possibile questo
alza comunque il valore della resistenza, crediamo che anche 4700 sia ancora basso, cosa dice il datasheet? come lo hai collegato? in parasite o alimentato a parte?

In effetti un po i dati cambiano di lettura in lettura, ma sto scrivendo anche sul forum americano (perchè qua nessuno mi diceva nulla), e mi dicono che ci sono molti DS18B20 farlocchi in giro e forse io ho preso proprio quelli perchè da Amazon 7.99€ 5 sensori mentre da RS ONLINE 6,14€ l'uno.....
Probabilmente qualcosa cambierà credo. Ora non so se acquistarli da RS e vedere se le letture vengo diverse l'una dall'altra o cosa fare.

Aggiornamenti:
ho ordinato i sensori da RS Online, una 40ina di euro 5 sensori.
Ora sto facendo test e ho più o meno gli stessi risultati, cioè appena collego il nodo mi da una temperatura e poi piano piano sale fino a stabilizzarsi dopo 5 minuti circa.
Per esmpio ora ho scritto un codice che mi manda ogni 30 sec i dati che sono:
22.06
23.06
23.94
24.75
25.31
25.69
26.13
26.44
26.81
26.94
27.19
27.50
27.50
27.63
27.94
28.00
28.06
28.00
28..06
28.19
28.13
27.75
27.81
28.06
28.19
28.13
28.31
28.25
28.13
28.13
28.00
28.19
28.31
28.19
27.75
27.88
28.06
28.19
28.25
28.31
28.38
28.44
28.38
28.56
28.56
28.63
28.56
28.69
28.81
28.75
28.88
28.88
28.81
28.88
28.88
28.88
28.81
28.75

Insomma a mio avviso sembra che ci sia un condensatore che si stia caricando ma possibile che ci metta anche 15/20 minuti?

In più la temperatura ambiente è 20.8C, è normale anche che mi segna 8 gradi in più?

Grazie

Hai abbassato la resistenza?

Come lo hai collegato?

In realtà io ho comperato un modulo come questo:
51Bcyv5Wb1L.AC_SY450
avente lo schema cosi:
Temperature-Sensor-on-the-web-with-ESP8266-and-DS18B20_Elec-Cafe

Aggiornamenti
Dopo che si è stabiizzato (circa 2 ore) il DS18B20 rilevava 30.69C mentre altri due termometri digiali erano a 24.00C.
Via codice ho fatto t = t-6.6;

E ora quando ci sono 24 gradi reali legge 24.12C. E ho pensato PERFETTO!

Poi ho fatto un altro test, ho messo tutto all'esterno e non va per niente bene.
Il DS18B20 legge 4.31C mentre invece c'è ne sono 14.5C

Io non so più cosa fare, sono disperato!

Lo sketch è ancora quello che hai postato più su?

Io fossi in te proverei a fare uno sketch semplicissimo senza fare medie o altro che può distogliere e/o nascondere altre problematiche: leggi la temperatura, stampi sulla seriale e confronti con un riferimento.

Ho usato diverse volte questo sensore con ESP8266 e non ho mai riscontrato problemi simili a questo. L'unica differenza che io uso sempre la modalità di connessione "2 wire" (cosa che però non dovrebbe influire in alcun modo).

ma sei sicuro che quel modulo abbia quello schema?
ptresti mettere il link?

Sulla seriale che valori leggi?

Serial.print("tTemp è: "); Serial.println(tTemp);

In casa avevo questi e ho sostituito quei sensori con i DS18B20 perché so che sono più precisi.

Questo te lo puoi togliere dalla testa perché non è un sensore analogico ma è un sensore digitale, cioè trasmette dei dati, e questo indipendentemente dalla resistenza che metti.
Io ho sempre usato dei DHT22 dove consigliano una resistenza che, regolarmente, non ho mai messo, ma ciò non cambiava la lettura.
La resistenza serve solo a stabilizzare i valori digitali 0 e 1 su dei fronti conosciuti.

Per quanto riguarda il ds18b20 ho visto in giro che diverse persone hanno problemi di precisione che, dal data sheet, dovrebbe essere di 0,5 gradi, in più o in meno. Non certo 10 gradi !!!

Per quanto riguarda la stabilizzazione della lettura dopo alcuni minuti è normale per tutti i sensori e non è dovuto ad un "condensatore che si sta caricando" ma semplicemente all'auto riscaldamento del componente elettronico (qualsiasi cosa che funziona elettricamente produce calore).

Non conosco il tuo ds18b20 ma questi errori sono normalmente imputabili alla libreria: hai provato a usarne un'altra? Questo problema mi era successo anche con i DHT22.