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
... 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.
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.
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
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);
}
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
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.
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);
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];
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