Δευτέρα 30 Μαΐου 2016

Μέτρηση θερμοκρασίας με τον Arduino και το ψηφιακό θερμόμετρο DS18B20

Το ψηφιακό θερμόμετρο DS18B20 της Dallas Semiconductors (τώρα Maxim) συνδυάζει ένα αισθητήρα θερμοκρασίας και ένα μετατροπέα αναλογικού σε ψηφιακό. Ο αισθητήρας του DS18B20 μετράει θερμοκρασίες από -55°C μέχρι +125°C με ακρίβεια ±2°C, ενώ στην περιοχή από -10°C μέχρι +85°C η ακρίβεια είναι ±0,5°C. Η ανάλυση του αναλογικοψηφιακού μετατροπέα του DS18B20 μπορεί  να επιλεγεί από το χρήστη στα 9, 10, 11 ή 12 bit, που οδηγεί σε βήμα μέτρησης 0,5°C, 0,25°C, 0,125°C ή 0,0625°C αντίστοιχα. Η ψηφιοποίηση της θερμοκρασίας διαρκεί 750 ms ή λιγότερο. Η τάση λειτουργίας του DS18B20 κυμαίνεται στην περιοχή 3V - 5,5V.
To DS18B20 επικοινωνεί με τον κεντρικό μικροεπεξεργαστή (με τον Arduino στην περίπτωσή μας) μέσω του διαύλου 1-Wire, ο οποίος απαιτεί μόνο μια γραμμή δεδομένων (και τη γραμμή γείωσης) για την επικοινωνία. Κάθε ψηφιακό θερμόμετρο DS18B20 ενσωματώνει μια 64-bit μνήμη ROM, στην οποία κατά τη φάση παραγωγής έχει αποθηκευθεί ένας μοναδικός για κάθε ολοκληρωμένο κωδικός μέσω του οποίου ο κεντρικός μικροεπεξεργαστής αναγνωρίζει και διευθυνσιοδοτεί το ψηφιακό θερμόμετρο στο δίαυλο. Κατ' αυτό τον τρόπο πολλαπλά DS18B20 (μέχρι και 127) μπορούν να λειτουργήσουν συνδεδεμένα στον ίδιο 1-Wire δίαυλο.
Η σύνδεση των DS18B20 στον κεντρικό μικροεπεξεργαστή υπολοιείται όπως φαίνεται στο ακόλουθο σχήμα:

Εικόνα 1: Σύνδεση DS18B20 στο δίαυλο 1-Wire (κανονικός τρόπος τροφοδοσίας)
Ένα ιδιαίτερο χαρακτηριστικό του DS18B20 είναι η δυνατόπτητα λειτουργίας χωρίς εξωτερική τροφοδοσία ("παρασιτικός" τρόπος λειτουργίας). Στην περίπτωση αυτή η τροφοδοσία του DS18B20 εξασφαλίζεται από τη γραμμή μεταφοράς δεδομένων (Data Line) του δίαυλου 1-Wire.

Εικόνα 2: Σύνδεση DS18B20 στο δίαυλο 1-Wire ("παραστιτικός" τρόπος τροφοδοσίας)
Στον Arduino πολλαπλά DS18B20 μπορούν να συνδεθούν, όπως φαίνεται στο σχήμα που ακολουθεί:

Εικόνα 3: Σύνδεση DS18B20 στον Arduino
Στο εμπόριο κυκλοφορούν υδατοστεγείς διατάξεις που καθε μια περικλείει ένα ψηφιακό θερμόμετρο DS18B20, απλοποιώντας τη χρήση τους σε διάφορες πρακτικές περιπτώσεις:

Εικόνα 4: Υδατοστεγή DS18B20 στον Arduino
Για τη λειτουργία του DS18B20 με τον Arduino απαιτούνται οι βιβλιοθήκες:
  • OneWire, που μπορεί να μεταφορωθεί από την ιστοσελίδα OneWire Project, μέσω της οποίας υλοποιείται το πρωτόκολλο επικοινωνίας του διαύλου 1-Wire.
  • DallasTemperature, που μπορεί να μεταφορτωθεί από την ιστοσελίδα του Miles Burton στο Github.
Είναι χρήσιμο (αν και όχι απαραίτητο) να γνωρίζουμε τον μοναδικό κωδικό (διεύθυνση) κάθε DS18Β20 που διαθέτουμε. Το πρόγραμμα (sketch) που ακολουθεί και προέρχεται (με κάποιες μικροαλλαγές) από την ιστοσελίδα Hackatronics, εκτελεί αυτήν ακριβώς τη λειτουργία:

//Sketch #1 - Address Finder

// This sketch looks for 1-wire devices and prints their addresses (serial number) to the UART,
// in a format that is useful in Arduino sketches

#include <OneWire.h>

// Setup a oneWire instance to communicate with OneWire devices
// 1-wire Data Line is connected to Arduino pin 2
OneWire  ds( 2 );  

void setup( void )
{
   Serial.begin( 115200 );
   discoverOneWireDevices();
}

void discoverOneWireDevices( void )
{
   byte addr[8];

  Serial.println( "Looking for 1-Wire devices..." );
  while ( ds.search( addr ) )
  {
     Serial.println( "\n\rFound \'1-Wire\' device with address:" );
     for( int i = 0; i < 8; i++ )
     {
        Serial.print( "0x" );
        if ( addr[i] < 16 )
        {
          Serial.print( '0' );
        }
        Serial.print( addr[i], HEX );
        if ( i < 7 )
        {
           Serial.print( ", " );
        }
     }
     if ( OneWire::crc8( addr, 7 ) != addr[7])
     {
         Serial.println( "CRC is not valid!" );
         return;
     }
  }
  Serial.println( "\n\rThat's it." );
  ds.reset_search();
  return;
}

void loop( void )
{
   // nothing to do here
}

Το sketch εμφανίζει τα αποτελέσματα της αναζήτησης είτε στην ενσωματωμένη στο Arduino IDE σειριακή οθόνη είτε σε οποιοδήποτε άλλο εξωτερικό λογισμικό προσομοίωσης σειριακής οθόνης όπως π.χ. το Termite, το Τερματικό, κ.ά.

Έχοντας βρει τον μοναδικό για το ψηφιακό μας θερμόμετρο κωδικό μπορούμε πλέον να μεταφορτώσουμε στον Arduino το επόμενο sketch, ώστε να πάρουμε τις πρώτες μετρήσεις θερμοκρασίας:

//Sketch #2 - First example DS 18B20

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

// 1-Wire Data line is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire( ONE_WIRE_BUS );

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors( &oneWire );

// Array to hold device address
DeviceAddress Thermometer = { 0x28, 0x02, 0xAB, 0x34, 0x5, 0x0, 0x0, 0x40 };
// You have to chagne DeviceAddress data to match your specific sensor !!!

// Setup function. Here we do the basics
void setup( void )
{
    // Start serial port
    Serial.begin( 115200 );
    Serial.println( "Dallas DS18B20 Digital Thermometer" );

    // Set the resolution to 11 bit
    sensors.setResolution( Thermometer, 11 );
}

// Function to print the temperature for a device
void printTemperature( DeviceAddress deviceAddress )
{
    float tempC = sensors.getTempC( deviceAddress );
    Serial.print( "Temperature: " );
    Serial.print( tempC );
    Serial.write( 0xB0 );  // Print degrees symbol
    Serial.println( "C" );
}

// 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 1-Wire bus
    sensors.requestTemperatures();

    // Print out the data
    printTemperature( Thermometer );

    // Some delay
    delay( 625 );
}

Τα αποτελέσματα που παίρνουμε στη σειριακή οθόνη έχουν τη μορφή που φαίνεται στην επόμενη εικόνα:

Εικόνα 5: Μέτρηση θερμοκρασίας με το DS18B20

Εναλλακτικά αν δε γνωρίζουμε τη διεύθυνση (σειριακό κωδικό) του ψηφιακού μας θερμομέτρου DS18B20 μπορούμε να χρησιμοποιήσουμε το επόμενο sketch:

//Sketch #3 - Second example DS 18B20

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

// 1-Wire Data Line is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire( ONE_WIRE_BUS );

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors( &oneWire );

// The setup function. We only start the sensors here
void setup( void )
{
    // start serial port
    Serial.begin( 115200 );
    Serial.println( "Dallas DS18B20 Digital Thermometer" );

    // Start up the library
    sensors.begin();
}

// Main function, get and show the temperature

void loop( void )
{
    // Call sensors.requestTemperatures() to issue a global temperature
    // request to all devices on the bus
    sensors.requestTemperatures(); // Send the command to get temperatures

    // After we got the temperatures, we can print them here.
    // We use the function ByIndex, and as an example get the temperature from the first sensor only.
    Serial.print( "Temperature for the device 1 ( index 0 ) is: " );
    Serial.print( sensors.getTempCByIndex( 0 ) );
    Serial.write( 0xB0 );  // Print degrees symbol
    Serial.println( "C" );

    //Some delay
    delay( 250 );
}

Οι Εικόνες (1) και (2) προέρχονται από την ιστοσελίδα tweaking4all. Τα δύο sketch λήψης θερμοκρασίας με το DS18B20 που δίνω εδώ (Sketch #2 και Sketch #3), είναι τροποποιημένες εκδόσεις από αντίστοιχα παραδείγματα εφαρμογών της βιβλιοθήκης DallasTemperature.


Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου