sensore ds18b20 e libreria DallasTemperature

Ciao a tutti,
dovrei collegare una dozzina di sensori ds18b20 (di cui ho già tutti gli indirizzi)
per fare alcuni test ho usato l'esempio "multiple" che segue la libreria di milesburton, collegandone inizialmente solo alcuni.
purtroppo ogni volta che ne collego uno nuovo mi cambia l'ordinamento nel bus!
come faccio ad assegnare manualmente l'indirizzo?
nell'esempio che mi dice:
// assign address manually. the addresses below will beed to be changed
// to valid device addresses on your bus. device address can be retrieved
// by using either oneWire.search(deviceAddress) or individually via
// sensors.getAddress(deviceAddress, index)
//insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };

ho provato a "decommentare" l'assegnazione di insideThermometer (sostituendo l'indirizzo del mio sensore) ma la compilazione mi da errore
expected primary-expression before '{' token
expected `;' before '{' token

cosa sbaglio?
grazie 1000!

Ciao

l'indirizzo del sensore è gestito con un tipo dati definito nella libreria:

typedef uint8_t DeviceAddress[8];

quindi dovrai fare qualcosa tipo:

DeviceAddress device1 = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };
DeviceAddress device2 = {...};

e per ottenere la temperatura usare il metodo requestTemperaturesByAddress(deviceX);

Ciao,

io ho un sistema con 4 sensori dallas DS18B20 e recupero le temperature tramite il metodo di lettura by_index:

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

#define ONE_WIRE_BUS              7
#define TEMPERATURE_PRECISION     12

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// arrays to hold device addresses
DeviceAddress Addr_Temp_In_H2O, Addr_Temp_Out_H2O, Addr_Temp_Ambient, Addr_Temp_External;

void Setup_DS18x20(void)
{
  // Start up the library
  sensors.begin();

  // method 1: by index
  if (!sensors.getAddress(Addr_Temp_In_H2O, 0)); //Serial.println("Unable to find address for Device 0"); 
  if (!sensors.getAddress(Addr_Temp_Out_H2O, 1)); //Serial.println("Unable to find address for Device 1"); 
  if (!sensors.getAddress(Addr_Temp_Ambient, 2)); //Serial.println("Unable to find address for Device 2");
  if (!sensors.getAddress(Addr_Temp_External, 3)); //Serial.println("Unable to find address for Device 2");
  
  // set the resolution to N bit
  sensors.setResolution(Addr_Temp_In_H2O, TEMPERATURE_PRECISION);
  sensors.setResolution(Addr_Temp_Out_H2O, TEMPERATURE_PRECISION);
  sensors.setResolution(Addr_Temp_Ambient, TEMPERATURE_PRECISION);
  sensors.setResolution(Addr_Temp_External, TEMPERATURE_PRECISION);
}

float ReadDS18x20(byte* MyAddress){
  // send read request
  sensors.requestTemperatures();
  float sensordata = sensors.getTempC(MyAddress) - 2.0;
  return sensordata;
  }

// function read 1ware dallas temperature DS18B20
char* ReadDS18x20_ST(byte* MyAddress){
  // send read request
  sensors.requestTemperatures();
  float sensordata = sensors.getTempC(MyAddress) - 2.0;
  return floatToString(sensordata, 2, 0);
  }

più semplice, più rapido e più pulito, il sistema mette in ordine crescente (index) i sensori in base al loro indirizzo interno :slight_smile:

saluti
kattivik76

scusa ma da quello che vedo in realtà tu fai prima la getAddress() che dall'indice ti da l'indirizzo e poi leggi la temperatura passando l'indirizzo :wink:

ma la cosa più divertente è, che guardando la libreria, se usi la funzionalità di lettura by index in realtà lui richiama poi la lettura by address :wink:

bool DallasTemperature::requestTemperaturesByIndex(uint8_t deviceIndex)
{
  DeviceAddress deviceAddress;
  getAddress(deviceAddress, deviceIndex);
  return requestTemperaturesByAddress(deviceAddress);
}

lucadentella:
Ciao

l'indirizzo del sensore è gestito con un tipo dati definito nella libreria:

typedef uint8_t DeviceAddress[8];

quindi dovrai fare qualcosa tipo:

DeviceAddress device1 = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };
DeviceAddress device2 = {...};

e per ottenere la temperatura usare il metodo requestTemperaturesByAddress(deviceX);

quindi riprendendo l'esempio

DeviceAddress insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };

sensors.requestTemperaturesByAddress(insideThermometer);
(potrei invece usare sensors.requestTemperatures(); per fare la richiesta a tutti i sensori?)

float tempC = sensors.getTempC(insideThermometer);
(questa rimane invariata, giusto?)

grazie ancora!

esatto!

grazie!!!

chiedo aiuto a voi che mi sebra abbiate già affrontato il problema.
io ho collegato un sensore di temperatura direttamente ad arduino e non ho avuto problemi.
ora vorrei mettere più sensori ma gli ingressi analogici sono 6 e 2 li ho già usati per il display i2c.
come avete fatto a collegarne 12 ? ? ? ? ?
e poi come si fa ad avere l'indirizzo del sensore io nel mio ho 3 pin da collegare +,-, ingresso analogico.

Subia75:
chiedo aiuto a voi che mi sebra abbiate già affrontato il problema.
io ho collegato un sensore di temperatura direttamente ad arduino e non ho avuto problemi.
ora vorrei mettere più sensori ma gli ingressi analogici sono 6 e 2 li ho già usati per il display i2c.
come avete fatto a collegarne 12 ? ? ? ? ?
e poi come si fa ad avere l'indirizzo del sensore io nel mio ho 3 pin da collegare +,-, ingresso analogico.

Dipende dal sensore che utilizzi, che può essere con uscita analogica, ad esempio LM35, o digitale come quello qui discusso con DS18B20.
Nel primo caso devi collegare un sensore per ogni ingresso analogico ed il limite dipende da quanti ingressi hai a disposizione. Nel secondo caso il sensore comunica su un bus ad 1 filo (oneWire) e su quel bus puoi collegare più sensori; ogni sensore digitale ha un suo indirizzo univoco per la comunicazione che permette di distinguerlo dagli altri.

Ciao
QP

Effettivamente il sensore che ho è un LM35.
ma con un DS18B20 come si fa a trovare l'indirizzo di comunicazione?
avreste un sito dove trovarli perchè quelli che ho trovato sono sciolti o montati su schedina e collegabili con tre fili +,- e segnale
ma non ho trovato riferimenti riguardo all'indirizzo che penso sia come per un dispositivo i2c o sbaglio.

Subia75:
Effettivamente il sensore che ho è un LM35.
ma con un DS18B20 come si fa a trovare l'indirizzo di comunicazione?
avreste un sito dove trovarli perchè quelli che ho trovato sono sciolti o montati su schedina e collegabili con tre fili +,- e segnale
ma non ho trovato riferimenti riguardo all'indirizzo che penso sia come per un dispositivo i2c o sbaglio.

L'indirizzo è scritto nell'integrato e per conoscerlo devi "interrogare" il sensore.
Riferimenti li trovi nel Playground, nel sito di Maxim e nel sito Sottozero.

Ciao
QP

grazie per le info.
ho visto nel sito di sottozero l'esempio della stazione meteo.
a questo devo trovare i sensori adatti perchè vorrei metterne 2 sotto acqua
perchè devo riscaldare l'acqua dentro ad un contenitore.
spero ci siano anche quelli stagni che si possono comandare 1-wire.

Su robot-italy li trovi a tenuta stagna e con prolunga.

Ciao
QP

darò un'occhiata

grazie