libreria DallasTemperature

Ciao a tutti.

sto facendo uno sketch con i sensori di temperatura ds18b20 e la libreria DallasTemperature e OneWire, ho visto un pò di esempi on line ma non riesco a trovare un sito dove spiega le varie keyword che ci sono nella liberia DallasTemperature e che cosa fanno. Qualcuno può aiutarmi? Grazie mille :slight_smile:

... purtroppo, come per quasi tutte le librerie di Arduino che vengono fornite in formato sorgente, l'unico modo di capire quali classi e quali metodi implementano è ... studiarsele e guardare tutti gli esempi.

E' veramente molto raro che qualcuno dedichi, oltre al tempo già dedicato a mettere a punto la libreria, anche del tempo per scrivere la documentazione. :confused:

Guglielmo

Grazie mille per la risposta,

Infatti facendo una googlata, mi sono reso conto che ci si deve arrangiare a farsi qualche esempio da soli e testarlo di volta in volta.
Ho trovato un esempio su google da questo sito:

ho fatto qualche modifica e sono arrivato a questo sketch:

//Programma by Bettonte Luca

#include <OneWire.h>
#include <DallasTemperature.h>
 
// L'ingresso ONE WIRE dei DS18B20 è sul piedino 10
#define ONE_WIRE_BUS 10
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress tmp_address; 
int nTs;
float Ts;
float Tamb;

void setup(void)
{
  Serial.begin(9600);
  Serial.println("Sto cercando i sensori...");
  sensors.begin();
  delay(6000);
  nTs = sensors.getDeviceCount();
  float Ts2[nTs];
  Serial.print("Trovati ");
Serial.print(nTs);
Serial.println(" sensori!");
Serial.println("Inizio la misurazione...");
Serial.println();
}
 
void loop(void)
{
  sensors.requestTemperatures(); // Comando per misurare la temp.
for(int i=0;i<nTs; i++)
  {
    Ts=sensors.getTempCByIndex(i);
    Serial.print("Sensore ");
    Serial.print(i);
    Serial.print(": ");
    Serial.print(Ts);
    Serial.print(" gradi C");
    delay(100);   
   Serial.println();
  }
  Serial.println();
  delay(1000); 
}

Ho dichiarato su void setup un array dove vorrei mettere la misura dei vari sensori di temperatura. Per poi farne la media ed inserirla nella variabile Tamb.

Attualmente ho messo due sensori per fare dei test, in seguito ne metterò un altro e quindi questo array si deve caricare automaticamente per poi poter effettuare la media sotto la variabile Tamb.

qualcuno può darmi una mano in merito?

grazi mille

saluti

non credo che il programma così vada, vedo due problemi: uno è che se dichiari l'assray nella setup, sarà locale li, lo devi dichiarare all'inizio, secondo è che se ricordo bene non puoi dichiarare array con dimensione non nota a compile time, che tradotto in un linguaggio umano, devi usare una costante già conosciuta quando trasferisci il programma all'arduino. quindi come se ne esce? dichiarando un array all'inizio, ed usando una dimensione ragionevole a certamente sufficente per contenere tutti i sensori che puoi avere, poi, nella setup cnti i sensori e metti un limite alla SCANSIONE dell'array, non alla sua dimensione
io meglio non saprei fare

PS non è vero, si potrebbe allocare diamicamnte un'area di memoria, cast(r)ando a puntatore di tipo adatto il puntatore a void che la malloc restituisce, ma tradurre in linguaggio umano questo è un po' più incasinato, prova prima la prima prova

Grazie mille per gli aiuti,

ho finalmente fatto funzionare il programma in base ai consigli che mi avete dato. Allego il codice:

#include <OneWire.h>
#include <DallasTemperature.h>
 
// L'ingresso ONE WIRE dei DS18B20 è sul piedino 10
#define ONE_WIRE_BUS 10
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress tmp_address; 
int nTs;
float Tamb;
float Ts[2];

void setup(void)
{
  Serial.begin(9600);
  Serial.println("Sto cercando i sensori...");
  sensors.begin();
  delay(6000);
  nTs = sensors.getDeviceCount();
  Serial.print("Trovati ");
Serial.print(nTs);
Serial.println(" sensori!");
Serial.println("Inizio la misurazione...");
Serial.println();
}

void loop(void)
{
  sensors.requestTemperatures(); // Comando per misurare la temp.
  Tamb=0;
for(int i=0;i<nTs; i++)
  {
    Ts[i]=sensors.getTempCByIndex(i);
    Serial.print("Sensore ");
    Serial.print(i);
    Serial.print(": ");
    Serial.print(Ts[i]);
    Serial.println(" gradi C");
    delay(100);   
    }
   Serial.println();
   Tamb=Tamb+Ts[i];
  }
  
  Tamb=Tamb/nTs;
  Serial.println(Tamb);
  delay(1000); 
}

Ora vi è un altra necessità. Ovvero sapere quando il sensore è rotto. Quando questo viene staccato il valore della temperatura misurata è pari a -127 °C. Ma viene poi sommato al sensore funzionante per farne la media.
Io vorrei che quando la misura è pari a -127 °C questa venga esclusa dalla media. Il codice che ho scritto è un pò alla buona, infatti va bene non appena stacco il sensore per farne il test. Ma poi quando rimetto il sensore, lo rileva sempre come se è rotto.

#include <OneWire.h>
#include <DallasTemperature.h>
 
// L'ingresso ONE WIRE dei DS18B20 è sul piedino 10
#define ONE_WIRE_BUS 10
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress tmp_address; 
int nTs;
float Tamb;
float Ts[2];

void setup(void)
{
  Serial.begin(9600);
  Serial.println("Sto cercando i sensori...");
  sensors.begin();
  delay(6000);
  nTs = sensors.getDeviceCount();
  Serial.print("Trovati ");
Serial.print(nTs);
Serial.println(" sensori!");
Serial.println("Inizio la misurazione...");
Serial.println();
}

void loop(void)
{
  sensors.requestTemperatures(); // Comando per misurare la temp.
  Tamb=0;
for(int i=0;i<nTs; i++)
  {
    Ts[i]=sensors.getTempCByIndex(i);
    Serial.print("Sensore ");
    Serial.print(i);
    Serial.print(": ");
    Serial.print(Ts[i]);
    Serial.println(" gradi C");
    delay(100);   
    if (Ts[i]==-127) {
      Serial.println(" sensore rotto");
      nTs=nTs-1;
      Ts[i]==0;
      Tamb=Tamb+Ts[i];
    }
    else {
   Serial.println();
   Tamb=Tamb+Ts[i];
    }
  }
  
  Tamb=Tamb/nTs;
  Serial.println(Tamb);
  delay(1000); 
}

Come posso risolvere?

Bravo, ti muovi nella direzione giusta. Però devi sperare di non avere mai più di 2 sensori. Oppure allarghiamo preventivamente l'array.
Per il problema del sensore guasto, che può dare, se ben ricordo sia -127 che +80 a seconda del problema che ha. Tu ccontrolli se il sensore è guasto, poi dopo non lo interroghi più
Invece devi verificate se la temperatura è ok. Se non lo è non devi togliere uno al conteggio dei sensori. Ragiona rovescio, se la temperatura è ok la aggiungi alla media, ma non cambi il conto dei sensori.
Cosi al giro dopo il sensore guasto viene ancora controllato, è se ha ricominciato a lavorare lo usi di nuivo

puoi gentilmente modificare il codice secondo quanto mi hai detto? non riesco a capire come fare. Forse mi sto perdendo in un bicchiere d'acqua... :frowning:

Per l'array hai perfettamente ragione, l'ho incrementato. Nel mio caso ci saranno 3 sensori in effetti.

infatti quando tolgo il sensore mi misura -127. Come faccio a toglierlo dal conteggio?

Verifichi che la lettura sia != da -127 e sia != da +80 ... solo se tale IF è verificato utilizzi la misura, altrimenti è come se tu non l'avessi fatta.

Guglielmo

Dai uno sguardo ai commenti dovrebbe essere chiaro come modificare il programma

for(int i=0;i<nTs; i++)
  {
    Ts[i]=sensors.getTempCByIndex(i);
    Serial.print("Sensore ");
    Serial.print(i);
    Serial.print(": ");
    Serial.print(Ts[i]);
    Serial.println(" gradi C");
    delay(100);   
    if (Ts[i]==-127) {
      Serial.println(" sensore rotto");
      nTs=nTs-1;// no no, il numero di sensori non cambia, devi solo scaratre la sua misura
      Ts[i]==0;// questo va bene, la misura è scartata
      Tamb=Tamb+Ts[i];
    }
    else {
   Serial.println();
   Tamb=Tamb+Ts[i];
    }
  }
 
  Tamb=Tamb/nTs;// occhio qui che non devi dividere per il numero di sensori, ma per il numero di letture NON scartate
  Serial.println(Tamb);
  delay(1000);

Buona sera a tutti,

premetto che sto facendo varie prove, e sicuramente mi sto perdendo in qualcosa di banale ma non riesco a trovare la soluzione. Ho due dallas ds18b20 per questo test ma in realtà ne saranno di più, le ho collegate in bus sul pin 10 e con la libreria dallas e onewire riesco a ricavare la temperatura per poi calcolarne la media.

Quando il sensore è staccato o guasto misura -127 °C. Anzitutto quando calcolo la media vado ad azzerare Ts*=0 se questo risulta -127 e vado a decrementare nTs.*
Anche in modo rozzo, il codice funziona. Perchè quando poi vado a rimettere il sensore riparte a fare la media senza problemi.
Altra cosa, quando misuro -127 dovrei attivare l'uscita sul pin 11 segnalandomi con un led che uno dei sensori risulta guasto. Ma questo lampeggia, mentre vorrei che rimanesse attivato finchè non vado a ricollegare il sensore.
allego il codice usato:
```
*#include <OneWire.h>
#include <DallasTemperature.h>

// L'ingresso ONE WIRE dei DS18B20 è sul piedino 10
// imposto l'ingresso di sensore rotto sul piedino 11
#define ONE_WIRE_BUS 10
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress tmp_address;
int nTs;
float Tamb;
float Ts[2];

void setup(void)
{
  pinMode(11,OUTPUT);
  Serial.begin(9600);
  Serial.println("Sto cercando i sensori...");
  sensors.begin();
  delay(6000);
  nTs = sensors.getDeviceCount();
  Serial.print("Trovati ");
Serial.print(nTs);
Serial.println(" sensori!");
Serial.println("Inizio la misurazione...");
Serial.println();
}

void loop(void)
{
  nTs= sensors.getDeviceCount();
  sensors.requestTemperatures(); // Comando per misurare la temp.
  Tamb=0;
for(int i=0;i<nTs; i++)
  {
    Ts[i]=sensors.getTempCByIndex(i);
    Serial.print("Sensore ");
    Serial.print(i);
    Serial.print(": ");
    Serial.print(Ts[i]);
    Serial.println(" gradi C");
    delay(100);
    if (Ts[i]!=-127) {
        Tamb=Tamb+Ts[i];
        Serial.println();
        Serial.println("sensori ok");
        Serial.println();
        Serial.println("disattivo l'allarme sensore rotto...");
        digitalWrite(11,LOW);
    }
    else {
      Ts[i]=0;
      nTs=nTs-1;
      Serial.println();
      Serial.println("sensore rotto!!!!!");
      Serial.println();
      Serial.println("attivo l'allarme sensore rotto...");
      digitalWrite(11,HIGH);
      delay(2000);
    }
  }
 
Tamb=Tamb/nTs;
  delay(1000);
  Serial.println();
  Serial.println(Tamb);
}*
```
- anzitutto sto facendo bene le operazioni oppure ci saranno problemi quando i sensori ad esempio saranno 5?
- vi e una maniera più elegante per scrivere il codice?
- come faccio ad evitare che il led in uscita lampeggi?
scusate le numerose domande e grazie a quanti mi vorranno aiutare
saluti

>rlocus: ... ho unito io i tuoi due thread.

NON aprire più thread relativi allo stesso argomento perché ricadi nel cross-posting che è proibito da regolamento. Grazie.

Guglielmo

Grazie mille Guglielmo, non sapevo come fare. :frowning:

Riusciresti a darmi qualche dritta sottoforma di codice, oltre a quella che mi hai già dato per riuscire nel mio intento?

Grazie mille per il tuo aiuto e per l'aiuto di tutti!!!