Το ψηφιακό θερμόμετρο 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 στον κεντρικό μικροεπεξεργαστή υπολοιείται όπως φαίνεται στο ακόλουθο σχήμα:
Ένα ιδιαίτερο χαρακτηριστικό του DS18B20 είναι η δυνατόπτητα λειτουργίας χωρίς εξωτερική τροφοδοσία ("παρασιτικός" τρόπος λειτουργίας). Στην περίπτωση αυτή η τροφοδοσία του DS18B20 εξασφαλίζεται από τη γραμμή μεταφοράς δεδομένων (Data Line) του δίαυλου 1-Wire.
Στον Arduino πολλαπλά DS18B20 μπορούν να συνδεθούν, όπως φαίνεται στο σχήμα που ακολουθεί:
Στο εμπόριο κυκλοφορούν υδατοστεγείς διατάξεις που καθε μια περικλείει ένα ψηφιακό θερμόμετρο DS18B20, απλοποιώντας τη χρήση τους σε διάφορες πρακτικές περιπτώσεις:
Για τη λειτουργία του DS18B20 με τον Arduino απαιτούνται οι βιβλιοθήκες:
Το sketch εμφανίζει τα αποτελέσματα της αναζήτησης είτε στην ενσωματωμένη στο Arduino IDE σειριακή οθόνη είτε σε οποιοδήποτε άλλο εξωτερικό λογισμικό προσομοίωσης σειριακής οθόνης όπως π.χ. το Termite, το Τερματικό, κ.ά.
Έχοντας βρει τον μοναδικό για το ψηφιακό μας θερμόμετρο κωδικό μπορούμε πλέον να μεταφορτώσουμε στον Arduino το επόμενο sketch, ώστε να πάρουμε τις πρώτες μετρήσεις θερμοκρασίας:
Τα αποτελέσματα που παίρνουμε στη σειριακή οθόνη έχουν τη μορφή που φαίνεται στην επόμενη εικόνα:
Εναλλακτικά αν δε γνωρίζουμε τη διεύθυνση (σειριακό κωδικό) του ψηφιακού μας θερμομέτρου DS18B20 μπορούμε να χρησιμοποιήσουμε το επόμενο sketch:
Οι Εικόνες (1) και (2) προέρχονται από την ιστοσελίδα tweaking4all. Τα δύο sketch λήψης θερμοκρασίας με το DS18B20 που δίνω εδώ (Sketch #2 και Sketch #3), είναι τροποποιημένες εκδόσεις από αντίστοιχα παραδείγματα εφαρμογών της βιβλιοθήκης DallasTemperature.
To DS18B20 επικοινωνεί με τον κεντρικό μικροεπεξεργαστή (με τον Arduino στην περίπτωσή μας) μέσω του διαύλου 1-Wire, ο οποίος απαιτεί μόνο μια γραμμή δεδομένων (και τη γραμμή γείωσης) για την επικοινωνία. Κάθε ψηφιακό θερμόμετρο DS18B20 ενσωματώνει μια 64-bit μνήμη ROM, στην οποία κατά τη φάση παραγωγής έχει αποθηκευθεί ένας μοναδικός για κάθε ολοκληρωμένο κωδικός μέσω του οποίου ο κεντρικός μικροεπεξεργαστής αναγνωρίζει και διευθυνσιοδοτεί το ψηφιακό θερμόμετρο στο δίαυλο. Κατ' αυτό τον τρόπο πολλαπλά DS18B20 (μέχρι και 127) μπορούν να λειτουργήσουν συνδεδεμένα στον ίδιο 1-Wire δίαυλο.
Η σύνδεση των DS18B20 στον κεντρικό μικροεπεξεργαστή υπολοιείται όπως φαίνεται στο ακόλουθο σχήμα:
Εικόνα 1: Σύνδεση DS18B20 στο δίαυλο 1-Wire (κανονικός τρόπος τροφοδοσίας) |
Εικόνα 2: Σύνδεση DS18B20 στο δίαυλο 1-Wire ("παραστιτικός" τρόπος τροφοδοσίας) |
Εικόνα 3: Σύνδεση DS18B20 στον Arduino |
Εικόνα 4: Υδατοστεγή DS18B20 στον Arduino |
- OneWire, που μπορεί να μεταφορωθεί από την ιστοσελίδα OneWire Project, μέσω της οποίας υλοποιείται το πρωτόκολλο επικοινωνίας του διαύλου 1-Wire.
- DallasTemperature, που μπορεί να μεταφορτωθεί από την ιστοσελίδα του Miles Burton στο Github.
//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.
Δεν υπάρχουν σχόλια:
Δημοσίευση σχολίου