// Il piedino DQ del DS18B20 è connesso con la porta 2 di Arduino
#define   OWBUS     2


int ledPin = 13;          // Nella Arduino Uno Board il pin 13 ha un Led connesso..
float  temperatura;       // contiene il valore di temperatura misurato

void setup() {
  Serial.begin(9600);      // Inizializza la porta seriale a 9600 Baud
  Serial.println("Dallas DS18B20 test");

  pinMode(ledPin, OUTPUT);

}


void loop() {

  while (true) {

    digitalWrite(ledPin, HIGH);
    
    temperatura = ReadTemp();
    Serial.print("Temperatura: ");
    Serial.println( temperatura );

    digitalWrite(ledPin, LOW);
    
    delay(1000);
  }
}





/////////////////////////////////////////////////////////////////////////////////////////////////
/*
  Name    : DS18B20.c
  Author  : Giuseppe Rapporti
  Notice  : Copyright (c) 2014
          : All Rights Reserved
  Date    : 27/09/2014
  Version : 1.0
  Notes   :  Dallas DS18B20 driver library
          :  Dallas 1-wire interface.
          :  Note a 4.7K pullup to +5V is required.
          :  VCC connected to +5V
          :  The default resolution at power-up is 12-bit: 1 = 0.0625°C



*/
/////////////////////////////////////////////////////////////////////////////////////////////////


void onewire_high(void)
{
  pinMode(OWBUS, INPUT);
}



void onewire_low(void)
{
  pinMode(OWBUS, OUTPUT);  digitalWrite(OWBUS, LOW);
}




void onewire_init(void)
{
  onewire_low();
  delayMicroseconds(500);        // pull 1-wire low for reset pulse
  pinMode(OWBUS, INPUT);         // float 1-wire high
  delayMicroseconds(500);        // wait-out remaining initialisation window.
}




byte onewire_read(void)
{
  byte n;
  byte input_byte;

  for (n = 0; n < 8; n++)
  {
    // pull 1-wire low to initiate read time-slot.
    pinMode(OWBUS, OUTPUT);   digitalWrite(OWBUS, LOW);
    pinMode(OWBUS, INPUT);   // now let 1-wire float high,
    delayMicroseconds(5);    // let device state stabilise,

    // and load result.
    if (  digitalRead(OWBUS) )
    { // owbus = 1
      input_byte = ( input_byte >> 1 ) | 0x80;	// least sig bit first
    }
    else
    { // owbus = 0
      input_byte = input_byte >> 1;
    }
    delayMicroseconds(60);    // wait until end of read slot.
  }
  return (input_byte);
}



void onewire_write(byte data)
{
  byte   n;


  for (n = 0; n < 8; n++)
  {
    if (data & 0x01)
    { // bit output = 1
      pinMode(OWBUS, OUTPUT); digitalWrite(OWBUS, LOW);
      delayMicroseconds(2);

      pinMode(OWBUS, INPUT);
      delayMicroseconds(58);
    }
    else
    { // bit output = 0
      pinMode(OWBUS, OUTPUT); digitalWrite(OWBUS, LOW);

      delayMicroseconds(60);
      pinMode(OWBUS, INPUT);
    }
    data = data >> 1;
  }

}




float   ReadTemp()
{
  byte    Temp_LSB;
  byte    Temp_MSB;
  int     Temp;
  byte    busy = 0;
  float   result;

  onewire_init();
  onewire_write(0xCC);                // skip ROM
  onewire_write(0x44);                // perform temperature conversion

  while ( busy == 0 ) busy = onewire_read();

  onewire_init();
  onewire_write(0xCC);                // skip ROM
  onewire_write(0xBE);                // read the result
  Temp_LSB = onewire_read();
  Temp_MSB = onewire_read();

  Temp = ( Temp_MSB * 256 ) + Temp_LSB;
  result = (float) Temp / 16;

  delay(600);
  return (result);

}