Sensore di Temperatura DS18B20

Ragazzi sto cercando di utilizzare il famoso sensore di temperatura della Dallas Semiconductor, ho visto in rete, tante cose ...librerie Dallas e One wire ma il sensore non riesco a farlo funzionare, allora ho provato senza nessuna libreria, uploadando questo sketch su Arduino:

#define temp 8

void setup(){
  Serial.begin(9600);
  pinMode(temp,INPUT);
}

void loop(){
  delay(1000);
  Serial.print("Temperature is: ");
  Serial.println(digitalRead(temp));
}

Dovrebbe funzionare se ho collegato una resistenza di 4.6K al pin di segnale e poi questo pin al pin digitale 8, e il GND del sensore al GND di arduino!!!

Invece mi esce sempre :

Temperature is : 0 :frowning:

Potete aiutarmi? Dove sbaglio?

GRAZIE

Ciao,

non puoi utilizzare direttamente il sensore di temperatura Dallas senza utilizzare le librerie che permettano la comunicazione col sensore stesso (protocollo di comunicazione 1-Wire).

Utilizza la libreria DallasTemperature (che a sua volta utilizza la libreria OneWire o OneWire 2).

Trovi le librerie qui:
http://milesburton.com/wiki/index.php?title=Dallas_Temperature_Control_Library#Introduction

Qui come collegarlo:
http://blog.lampugnani.org/arduino/ds18b20-sensore-di-temperatura-digitale/

Ciao,
Marco.

Ah okey, credevo potesse funzionare come un normale sensore digitale...!!! Già avevo visto queste librerie, ora le studio meglio e vi faccio sapere!!!

Sono riuscito a fare funzionare il sensore con il codice seguente:

#include <OneWire.h>

int backLight = 13;    // pin 13 will control the backlight

OneWire  ds(8);        // ds18b20 pin #2 (middle pin) to Arduino pin 8

byte i;
byte present = 0;
byte data[12];
byte addr[8];
  
int HighByte, LowByte, SignBit, Whole, Fract, TReading, Tc_100, FWhole;

void setup(void) {
  Serial.begin(9600);
  pinMode(backLight, OUTPUT);
  digitalWrite(backLight, HIGH); // turn backlight on. Replace 'HIGH' with 'LOW' to turn it off.

    if ( !ds.search(addr)) {
    
      Serial.println("No more addrs");
      delay(1000);
      ds.reset_search();
      return;
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) {

      Serial.println("CRC not valid!");
      delay(1000);
      return;
  }
}

void getTemp() {
  int foo, bar;
  
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);

  for ( i = 0; i < 9; i++) {
    data[i] = ds.read();
  }
  
  LowByte = data[0];
  HighByte = data[1];
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;  // test most sig bit
  
  if (SignBit) {
    TReading = -TReading;
  }
  Tc_100 = (6 * TReading) + TReading / 4;    // multiply by (100 * 0.0625) or 6.25
  Whole = Tc_100 / 100;          // separate off the whole and fractional portions
  Fract = Tc_100 % 100;
  if (Fract > 49) {
    if (SignBit) {
      --Whole;
    } else {
      ++Whole;
    }
  }

  if (SignBit) {
    bar = -1;
  } else {
    bar = 1;
  }
  foo = ((Whole * bar) * 18);      // celsius to fahrenheit conversion section
  FWhole = (((Whole * bar) * 18) / 10) + 32;
  if ((foo % 10) > 4) {            // round up if needed
       ++FWhole;
  }
}
void printTemp(void) {
  Serial.print("Temp is: ");
    if (SignBit) {  
     Serial.println("-");
  }
  Serial.print(Whole);
  Serial.print(" C / ");
  Serial.print(FWhole);
  Serial.println(" F");
}

void loop(void) {
  getTemp();
  printTemp();
  delay(1000);
}

Però non capisco come fare per farlo funzionare in modalità parassita??

Ho provato a collegare così i pin del sensore:

PIN1------------------GND

PIN2-------4.6K----------PINDIGITAL8

Ma non funziona!!! :frowning:

Ciao,
il pin3 deve essere a massa

Saluti

Grazie marchino!!! ora provo ad interfacciare tutto con Xbee.... chissà!!! :grin:

CHE VOI sappiate è possibile che ho bruciato il sensore avendolo connesso nella maniera opposta?

Ma devo seguire la figura in cui si vede il sensore di faccia o la bottom view, perchè se seguo una ho una cosa, se seguo l'altra l'opposto!!

Fatemi sapere!!!