DS18B20 ARDUINO UNO - ViaLeopardiCinque

Vai ai contenuti

Menu principale:

DS18B20 ARDUINO UNO

Progetti
DS18B20 ARDUINO UNO
Il DS18B20 è un termometro digitale a risoluzione programmabile dotato di allarme e può misurare temperature che vanno da -55 a +125°C  con una precisione di  ± 0,5°C nel range di misurazione da -10 a +85°C. La risoluzione può essere impostata a 9 bit  1= 0,5°C, a 10 bit 1=0,25°C, a 11 bit 1=0,125°C, e a 12 bit 1=0,0625°C.  Il DS18B20 può essere  aimentato  da 3 a 5,5 volt e comunica con il microprocessore attraverso un collegamento 1-Wire bus.

Nel seguente esempio il DS18B20 verrà collegato alla porta 2 di Arduino UNO , e verrà alimentato a 5 Volt; la porta 2 sarà inoltre dotata di una resistenza di pull-up da 4K7 collegata al positivo. La risoluzione usata sarà di 12 bit.
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);

 
Copyright 2021. All rights reserved.
Torna ai contenuti | Torna al menu