Settaggio sensore Temperatura DS18B20 a 9 bit

Carissimi,
non riesco a “settare” il sensore Temperatura DS18B20, che di default ha una precisione a 12 bit e quindi richiede 750ms per la risposta, a 9 bit.
Ho caricato 2 sketch differenti che utilizzano due approcci differenti (uno usa la Dallas, l’altro no) e funzionano benissimo, ma vorrei “ridurre la precisione per velocizzare la lettura”.
Ve li allego.
Potete spiegarmi in questi due esempi come impostare la precisione a 9bit ? Grazie tantissimo

#include <OneWire.h>

 
#define BUTTON A0
 
int DS18B20_Pin = 2;
 
OneWire ds(DS18B20_Pin);

 
void setup(void) {
  Serial.begin(9600);
 
  
  delay( 3000 );
}
 
void loop(void) {
  float temperature = getTemp();
  Serial.println(temperature);
 
 
  delay(1000); //just here to slow down the output so it is easier to read
 
}
 
float getTemp(){
  //returns the temperature from one DS18B20 in DEG Celsius
 
  byte data[12];
  byte addr[8];
 
  if ( !ds.search(addr)) {
      //no more sensors on chain, reset search
      ds.reset_search();
      return -1000;
  }
 
  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return -1000;
  }
 
  if ( addr[0] != 0x10 && addr[0] != 0x28) {
      Serial.print("Device is not recognized");
      return -1000;
  }
 
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1); // start conversion, with parasite power on at the end
 
  byte present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE); // Read Scratchpad
 
  for (int i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = ds.read();
  }
 
  ds.reset_search();
 
  byte MSB = data[1];
  byte LSB = data[0];
 
  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;
 
  return TemperatureSum;
 
}
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire ourWire(ONE_WIRE_BUS);
DallasTemperature sensors(&ourWire);

void setup() 
{
delay(1000);
Serial.begin(9600);
Serial.println("Misura la temperatura con sensore DS18B20");
Serial.println("continua la misurazione");
delay(1000);
sensors.begin();
}

void loop() 
{
Serial.println();
sensors.requestTemperatures();
Serial.print("Temperatura = ");
Serial.print(sensors.getTempCByIndex(0));
Serial.println(" gradi C");
}

Nel secondo sketch, con la dallas, dopo sensors.begin() metti sensors.setResolution(9);

Marinaio Grazie della risposta. Purtroppo mi sembra non funzioni.

E' possibile che la funzione da te chiamata debba essere scritta così: sensors.setResolution(tempDeviceAddress, TEMPERATURE_PRECISION); ?

In questo caso dovrei prima ottenere l'indirizzo della sonda, come ad esempio:

DeviceAddress Probe01 = { 0x28, 0x8A, 0xB1, 0x40, 0x04, 0x00, 0x00, 0xC7 };

e poi porre: sensors.setResolution(Probe01, 9);

Se così fosse come trovo l'indirizzo della sonda ?

Da quanto leggo nel datasheet (fare sempre riferimento ai datasheet, NO alle librerie) basta mettere nel "Configuration Register", che si trova all'indirizzo 0x04 dello Scratchpad (vd. pag 7/22) il valore 0x1F (vd. pag. 8/22).

Guglielmo

Guglielmo grazie della risposta. Purtroppo non ho le conoscenze per inserire R0=0 and R1=0 all'interno del Byte4. Ossia porre 0x1F all'indirizzo 0x04 come da te consigliato.

Potresti indicarmi in uno dei due sketchs che ho postato come inserire quel valore ?

Zamundo: Potresti indicarmi in uno dei due sketchs che ho postato come inserire quel valore ?

... ma possibile che fate sempre e solo dei copia/incolla senza STUDIARVI minimamente ciò che usate ? ? ? :fearful: Almeno leggere gli esempi no ? ? ? ::)

Libreria DallasTemperature, esempio "Single", righe 69 e 70 :

// set the resolution to 9 bit (Each Dallas/Maxim device is capable of several different resolutions)
  sensors.setResolution(insideThermometer, 9);

... non era così difficile da trovare vero ? ? ? :smiling_imp:

Ovviamente studiati tutto l'esempio per vedere se ci sono delle cose da fare prima per il corretto settaggio del sensore.

Guglielmo

P.S.: Per inciso, io NON uso quella libreria, me la sono scaricata ed ho cercato negli esempi ...

Gentilissimo Guglielmo,

non era difficile ed infatti è esattamente quello che avevo scritto nel post delle ore 05:16 del 1 Nov. Ah AH AH Questa volta la lavata di testa non era necessaria! Se rileggi quel post, dopo aver specificato che fosse necessario porre l'indirizzo della sonda per utilizzare il comando sensors.setResolution, vi chiedevo:

Se così fosse come trovo l'indirizzo della sonda ?

Grazie comunque... ho trovato l'indirizzo della sonda con un altro sketch trovato in rete ed inserito al posto di "Probe01" in sensors.setResolution(Probe01, 9); :)

Zamundo: Questa volta la lavata di testa non era necessaria!

... è sempre necessaria ... :smiling_imp:

Se ti studi l'esempio che ti ho indicato, scopri un sacco di informazioni utili ...

  1. come trovare quanti device ci sono sul bus (riga 26)
  2. come trovare il device address usando oneWire (riga 40)
  3. vari metodi di ricerca (riga 45 e riga 52)
  4. come utilizzarli ... ecc. ecc. ;)

Guglielmo