errore di lettura del sensore ds18b20 (sonda)

Ciao ragazzi,
oggi sono andato a comprarmi una sonda ds18b20 da collegare all’ arduino. Io avevo già programmato in passato un arduino con il ds18b20 classico (no sonda) collegato con una resistenza da 10 kohm ed era andato tutto liscio, allora carico lo stesso sketch sul nuovo arduino con la sonda, ma dal monitor seriale mi restituisce la temperatura di -0.06 °C con la resistenza da 4.7kohm e se cambio resistenza (ho provato con una da 10kohm e 1kohm) cambia il valore restituito sul monitor e resta quello anche se provo a scaldarla con le mani o raffreddandola nel ghiaccio.

Questo è il primo codice

#include <OneWire.h>

int pin_DS18B20 = 5;

OneWire ds(pin_DS18B20);

void setup(){
  Serial.begin(9600);
}

void loop(){
  byte data[11];
  byte addr[8];
  if(!ds.search(addr)){
      ds.reset_search();
      return -1000;
  }
  if(OneWire::crc8(addr, 7) != addr[7]){
      Serial.println("CRC non valido!");
      //err_t = 1;
      return -1000;
  }
  if(addr[0] != 0x10 && addr[0] != 0x28){
      Serial.print("Dispositivo non individuato");
      //err_t = 1;
      return -1000;
  }
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1); 
  byte present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE); 
  for(int i = 0; i < 9; i++){ 
    data[i] = ds.read();
  }
  ds.reset_search();
  byte MSB = data[1];
  byte LSB = data[0];
  float temp_read = ((MSB << 8) | LSB); 
  float temperatura = temp_read / 16;

  Serial.print("temp = ");
  Serial.print(temperatura);
  Serial.println("°C");
  delay(1000);

Allora ho iniziato a googlare e scaricare vari sketch e librerie compresa quella della dallastemperature
dove all’ interno c’erano degli esempi, ma i risultati che mi restituiva erano tre: -127 °C, 85 °C oppure la temperatura della stanza ma non sempre, dava in maggioranza i primi due risultati
Questo è il codice dell’ esempio:

// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// 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 address
DeviceAddress insideThermometer;

/*
 * Setup function. Here we do the basics
 */
void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // locate devices on the bus
  Serial.print("Locating devices...");
  sensors.begin();
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" devices.");

  // report parasite power requirements
  Serial.print("Parasite power is: "); 
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");
  
  // 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)
  // Note that you will need to use your specific address here
  //insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };

  // Method 1:
  // Search for devices on the bus and assign based on an index. Ideally,
  // you would do this to initially discover addresses on the bus and then 
  // use those addresses and manually assign them (see above) once you know 
  // the devices on your bus (and assuming they don't change).
  if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0"); 
  
  // method 2: search()
  // search() looks for the next device. Returns 1 if a new address has been
  // returned. A zero might mean that the bus is shorted, there are no devices, 
  // or you have already retrieved all of them. It might be a good idea to 
  // check the CRC to make sure you didn't get garbage. The order is 
  // deterministic. You will always get the same devices in the same order
  //
  // Must be called before search()
  //oneWire.reset_search();
  // assigns the first address found to insideThermometer
  //if (!oneWire.search(insideThermometer)) Serial.println("Unable to find address for insideThermometer");

  // show the addresses we found on the bus
  Serial.print("Device 0 Address: ");
  printAddress(insideThermometer);
  Serial.println();

  // set the resolution to 9 bit (Each Dallas/Maxim device is capable of several different resolutions)
  sensors.setResolution(insideThermometer, 9);
 
  Serial.print("Device 0 Resolution: ");
  Serial.print(sensors.getResolution(insideThermometer), DEC); 
  Serial.println();
}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
  // method 1 - slower
  //Serial.print("Temp C: ");
  //Serial.print(sensors.getTempC(deviceAddress));
  //Serial.print(" Temp F: ");
  //Serial.print(sensors.getTempF(deviceAddress)); // Makes a second call to getTempC and then converts to Fahrenheit

  // method 2 - faster
  float tempC = sensors.getTempC(deviceAddress);
  Serial.print("Temp C: ");
  Serial.print(tempC);
  Serial.print(" Temp F: ");
  Serial.println(DallasTemperature::toFahrenheit(tempC)); // Converts tempC to Fahrenheit
}
/*
 * Main function. It will request the tempC from the sensors and display on Serial.
 */
void loop(void)
{ 
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  
  // It responds almost immediately. Let's print out the data
  printTemperature(insideThermometer); // Use a simple function to print out the data
}

// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}

chi di voi ci capisce qualcosa??
Grazie mille

ciao :slight_smile:

puoi allegare anche un piccolo schema di come hai collegato la sonda e relativa resistenza? :slight_smile:

MD

MatteoDerrico:
ciao :slight_smile:

puoi allegare anche un piccolo schema di come hai collegato la sonda e relativa resistenza? :slight_smile:

MD

Oggi pomeriggio ti invio lo schema e delle foto se riesco a caricarle

eccomi qua ti ho allegato la foto dei collegamenti che ho fatto. La resistenza è di 4.7kohm

Hai provato a usare le librerie e il programma demo utilizzato dalla guida ufficiale d arduino ? :slight_smile:

Fammi sapere... perchè potrebbe essere anche un qualcosa riguardante le librerie :slight_smile:

MD

MatteoDerrico:
Hai provato a usare le librerie e il programma demo utilizzato dalla guida ufficiale d arduino ? :slight_smile:

Fammi sapere... perchè potrebbe essere anche un qualcosa riguardante le librerie :slight_smile:

MD

Ok con la guida l' errore della lettura è diminuito (le librerie sono le stesse che avevo installato anche io), però ho notato che l' errore viene fatto quando muovo la sonda o tocco il cavo, se la lascio ferma mi da la temperatura corretta. Può essere che ci sia una perdita di segnale a causa delle interferenze del mio corpo??

Con l' errore di lettura intendo che mi da due valori: o -127 °C o 85 °C

ciao...-127 vuol dire sonda sconnessa...secondo me o la sonda ha un filo interrotto o le connessioni che hai fatto non sono buone...tanto che il problema si presenta se muovi la sonda

ti posso dare un piccolo consiglio ? :slight_smile:

quando monti circuiti su breadboard e devi collegare tipi di cavi come quello della sonda, stagna i cavi oppure usa delle strip in modo tale che i contatti con le piste della breadboard avvengano in modo corretto e non si creino falsi contatti :):slight_smile:

MD

ORSO2001:
ciao...-127 vuol dire sonda sconnessa...secondo me o la sonda ha un filo interrotto o le connessioni che hai fatto non sono buone...tanto che il problema si presenta se muovi la sonda

ok domani provo gli do un occhiata

MatteoDerrico:
ti posso dare un piccolo consiglio ? :slight_smile:

quando monti circuiti su breadboard e devi collegare tipi di cavi come quello della sonda, stagna i cavi oppure usa delle strip in modo tale che i contatti con le piste della breadboard avvengano in modo corretto e non si creino falsi contatti :):slight_smile:

MD

i cavi erano già stagnati, ma forse essendo un po' corti fanno un falso contatto

Allora ti consiglio di usare delle strip :slight_smile:

MD

MatteoDerrico:
Allora ti consiglio di usare delle strip :slight_smile:

MD

ok grazie mille a tutti adesso funziona egregiamente