Il FIRMWARE:
// 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 : 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);