Ένας από τους ευκολότερους και οικονομικότερους τρόπους για να μετράτε θερμοκρασία στα projects σας με το Arduino είναι να χρησιμοποιήσετε τον αισθητήρα θερμοκρασίας TMP36. Αυτός ο αισθητήρας είναι αρκετά ακριβείς και δεν χρειάζονται εξωτερικά εξαρτήματα για να λειτουργήσει. Έτσι, με λίγες μόνο συνδέσεις και λίγο κώδικα Arduino, θα μπορείτε να μετράτε τη θερμοκρασία σε ελάχιστο χρόνο!
Αισθητήρας θερμοκρασίας TMP36
Ο TMP36 είναι ένας αισθητήρας θερμοκρασίας χαμηλής τάσης και υψηλής ακρίβειας, βαθμονομημένος σε βαθμούς Κελσίου, ο οποίος κατασκευάζεται από την Analog Devices. Πρόκειται για ένα ολοκληρωμένο κύκλωμα που παρέχει τάση εξόδου γραμμικά ανάλογη με τη θερμοκρασία σε °C και, επομένως, είναι πολύ εύκολος στη χρήση με ένα Arduino.
Ο αισθητήρας θερμοκρασίας TMP36 είναι αρκετά ακριβής, δεν φθείρεται με τη χρήση, λειτουργεί υπό πολλές περιβαλλοντικές συνθήκες και δεν απαιτεί εξωτερικά εξαρτήματα για τη λειτουργία του. Επιπλέον, ο αισθητήρας TMP36 δεν χρειάζεται βαθμονόμηση και παρέχει τυπική ακρίβεια ±1°C στους +25°C και ±2°C στο εύρος θερμοκρασίας από −40°C έως +125°C.
Ο αισθητήρας μπορεί να τροφοδοτηθεί με τάση από 2,7 V έως 5,5 V και καταναλώνει μόλις 50 μA κατά την ενεργή μετατροπή θερμοκρασίας, προσφέροντας πολύ χαμηλή αυτοθέρμανση, μικρότερη από 0,1°C σε ακίνητο αέρα. Επιπλέον, διαθέτει λειτουργία τερματισμού, η οποία μειώνει το ρεύμα τροφοδοσίας σε λιγότερο από 0,5 μA.
Πλήρεις προδιαγραφές
| Χαρακτηριστικό | Τιμή |
| Τάση τροφοδοσίας | 2,7V έως 5,5V |
| Κατανάλωση ρεύματος | 50μΑ |
| Εύρος θερμοκρασίας | −40°C έως +125°C |
| Ακρίβεια | ±2°C |
| Συντελεστής κλίμακας εξόδου | 10 mV/°C |
| Εύρος τάσης εξόδου | 0,1 V στους −40°C έως 1,75 V στους 125°C |
| Τάση εξόδου στους 25°C | 750mV |
Για περισσότερες πληροφορίες, ανατρέξτε στο φύλλο δεδομένων (datasheet), που μπορείτε να βρείτε στην ιστοσελίδα της κατασκευάστριας εταιρείας.
Αρχή λειτουργίας
Ο TMP36 χρησιμοποιεί τεχνολογία στερεάς κατάστασης για τη μέτρηση της θερμοκρασίας. Βασίζεται στο γεγονός ότι η πτώση τάσης μεταξύ της βάσης και του εκπομπού (τάση ορθής πόλωσης – VBE) του τρανζίστορ που είναι συνδεδεμένο ως δίοδος μειώνεται με γνωστό ρυθμό όσο αυξάνεται η θερμοκρασία. Ενισχύοντας με ακρίβεια αυτή τη μεταβολή τάσης, είναι εύκολο να παραχθεί ένα αναλογικό σήμα που είναι ευθέως ανάλογο με τη θερμοκρασία.
Αυτή η γραμμική σχέση μεταξύ της τάσης ορθής πόλωσης και της θερμοκρασίας είναι ο λόγος για τον οποίο χρησιμοποιούνται τρανζίστορ συνδεδεμένα ως δίοδοι σε συσκευές μέτρησης θερμοκρασίας. Ουσιαστικά, έτσι μετράται η θερμοκρασία, αν και με την πάροδο των ετών έχουν γίνει ορισμένες βελτιώσεις σε αυτή την τεχνική.
Τα καλά νέα είναι ότι όλοι αυτοί οι σύνθετοι υπολογισμοί πραγματοποιούνται στο εσωτερικό του TMP36. Ο αισθητήρας απλώς παρέχει μια τάση που είναι γραμμικά ανάλογη με τη θερμοκρασία.
Πως να μετράτε τη θερμοκρασία
Ο TMP36 είναι εύκολος στη χρήση. Απλώς συνδέστε το αριστερό pin στην τροφοδοσία (2,7–5,5 V) και το δεξί pin στη γείωση, με την προϋπόθεση ότι η επίπεδη πλευρά του αισθητήρα είναι στραμμένη προς το μέρος σας. Στη συνέχεια, στο μεσαίο pin θα εμφανίζεται μια αναλογική τάση που είναι ευθέως ανάλογη —δηλαδή γραμμική— με τη θερμοκρασία σε °C. Αυτό φαίνεται εύκολα στο διάγραμμα χαρακτηριστικής τάσης εξόδου σε σχέση με τη θερμοκρασία. Σημειώστε ότι η αναλογική τάση εξόδου είναι ανεξάρτητη από την τάση τροφοδοσίας.
Πριν υπολογίσουμε την ένδειξη της θερμοκρασίας, αφαιρούμε 0,5 V από την τάση εξόδου, επειδή ο TMP36 διαθέτει μετατόπιση τάσης 500 mV. Αυτή η μετατόπιση επιτρέπει στον αισθητήρα να μετρά και αρνητικές θερμοκρασίες. Στη συνέχεια, για να μετατρέψουμε αυτή την τάση σε θερμοκρασία, την πολλαπλασιάζουμε απλώς επί 100, επειδή ο TMP36 έχει συντελεστή κλίμακας 10 mV/°C. Τόσο εύκολο!
Με άλλα λόγια, για να μετατρέψετε την τάση σε θερμοκρασία, χρησιμοποιήστε τον ακόλουθο βασικό τύπο:
Θερμοκρασία(°C)=(Vout−0,5)×100
Για παράδειγμα, αν η τάση εξόδου είναι 1 V, τότε η θερμοκρασία είναι:
(1 – 0,5) x 100 = 50°C
Έλεγχος του αισθητήρα TMP36
Ο έλεγχος του TMP36 είναι αρκετά εύκολος. Συνδέστε το αριστερό pin σε τροφοδοσία 2,7–5,5 V —δύο μπαταρίες AA λειτουργούν πολύ καλά— και το δεξί pin στη γείωση, με την προϋπόθεση ότι η επίπεδη πλευρά του αισθητήρα είναι στραμμένη προς το μέρος σας. Στη συνέχεια, ρυθμίστε το πολύμετρο στη λειτουργία μέτρησης τάσης συνεχούς ρεύματος (DC) και συνδέστε το στη γείωση και στο μεσαίο pin. Σε θερμοκρασία δωματίου (25°C), η τάση θα πρέπει να είναι περίπου 0,75 V.
Δοκιμάστε να πιέσετε απαλά το πλαστικό περίβλημα του αισθητήρα για να δείτε τη θερμοκρασία να αυξάνεται. Εναλλακτικά, δοκιμάστε να αγγίξετε τον αισθητήρα με ένα παγάκι —τοποθετημένο μέσα σε πλαστική σακούλα, ώστε το κύκλωμά σας να μην έρθει σε επαφή με νερό— και παρακολουθήστε τη θερμοκρασία να μειώνεται.
Ακροδέκτες αισθητήρα TMP36
Ο TMP36 διατίθεται σε τρεις διαφορετικούς τύπους συσκευασίας, αλλά ο πιο συνηθισμένος είναι η συσκευασία TO-92 με 3 ακροδέκτες, η οποία μοιάζει ακριβώς με ένα τρανζίστορ. Ας δούμε τη διάταξη των ακροδεκτών του.

+Vs (ή Vin) είναι ο ακροδέκτης της τάσης τροφοδοσίας του αισθητήρα, η οποία μπορεί να είναι από 2,7 V έως 5,5 V.
Vout είναι ο ακροδέκτης όπου παρέχει μια αναλογική τάση που είναι ευθέως ανάλογη (γραμμικά) με τη θερμοκρασία. Θα πρέπει να συνδεθεί σε μια αναλογική είσοδο (ADC).
GND είναι ο ακροδέκτης της γείωσης.
Σύνδεση του αισθητήρα θερμοκρασίας TMP36 σε Arduino
Η σύνδεση του TMP36 σε ένα Arduino είναι πολύ απλή. Χρειάζεται να συνδέσετε μόνο τρεις ακροδέκτες: δύο για την τροφοδοσία και έναν για την ανάγνωση της τιμής του αισθητήρα.
Ο αισθητήρας μπορεί να τροφοδοτηθεί από έξοδο 3,3 V ή 5 V. Η θετική τάση συνδέεται στον ακροδέκτη «+Vs», ενώ η γείωση συνδέεται στον «GND». Ο μεσαίος ακροδέκτης «Vout» είναι η αναλογική έξοδος σήματος του αισθητήρα και συνδέεται στην αναλογική είσοδο A0 του Arduino.
Για να μετρήσετε τη θερμοκρασία του αέρα, αφήστε τον αισθητήρα εκτεθειμένο στον αέρα ή σε άλλη εφαρμογή τοποθετήστε τον πάνω σε ένα αντικείμενο του οποίου θέλετε να μετρήσετε τη θερμοκρασία, όπως μια ψύκτρα.
Στην συνδεσμολογία, η έξοδος του TMP36 συνδέεται σε μία από τις αναλογικές εισόδους του Arduino. Η τιμή αυτής της αναλογικής εισόδου μπορεί να διαβαστεί με τη συνάρτηση analogRead().
Ωστόσο, η συνάρτηση analogRead() δεν επιστρέφει απευθείας την τάση εξόδου του αισθητήρα. Αντίθετα, αντιστοιχίζει την τάση εισόδου μεταξύ 0 V και της τάσης αναφοράς του ADC (τεχνικά πρόκειται για την τάση λειτουργίας, δηλαδή 5 V ή 3,3 V, εκτός εάν αυτή έχει αλλάξει) σε ακέραιες τιμές 10 bit, από 0 έως 1023.
Για να μετατρέψετε αυτή την τιμή ξανά στην τάση εξόδου του αισθητήρα, χρησιμοποιήστε τον ακόλουθο τύπο:
Vout = (τιμή από τον ADC) × (5 / 1024)
Ο τύπος αυτός μετατρέπει την αριθμητική τιμή 0–1023 του ADC σε τάση 0–5 V.
Εάν χρησιμοποιείτε Arduino με τάση λειτουργίας 3,3 V, θα πρέπει να χρησιμοποιήσετε:
Vout = (τιμή από τον ADC) × (3,3 / 1024)
Ο τύπος αυτός μετατρέπει την αριθμητική τιμή 0–1023 του ADC σε τάση 0–3,3 V.
Στη συνέχεια, για να μετατρέψετε την τάση σε θερμοκρασία, χρησιμοποιήστε τον ακόλουθο τύπο:
Θερμοκρασία (°C) = (Vout – 0,5) × 100
Θερμόμετρο με τον αισθητήρα TMP36 χρησιμοποιώντας την αναπτυξιακή πλακέτα
Σε αυτή την εφαρμογή αναπτύσσουμε ένα θερμόμετο βασισμένο στον αναλογικό αισθητήρα TMP36 χρησιμοποιώντας την αναπτυξιακή πλακέτα που έχουμε παρουσιάσει σε άλλο άρθρο. Χρησιμοποιώντας σαν μικροελεγκτή Arduino το Nano R3 το θερμόμετρο λειτουργεί άψογα, ενώ με το Nano R4 παρουσιάζει ασταθείς ενδείξεις.
Διαασυνδέουμε τον αισθητήρα TMP36 ως εξής: τον ακροδέκτη Vs σε συνεχή τάση 3,3V ή 5V, τον ακροδέκτη Vout στην αναλογική είσοδο Α0 του Arduino Nano R3 και τον ακροδέκτη GND στα 0V.
Στο περιβάλλον ανάπτυξης Arduino IDE επιλέξτε τον κατάλληλο μικροελεγκτή Arduino και την θύρα στην οποία είναι συνδεμένος. Φορτώστε και τρέξτε το ακόλουθο πρόγραμμα στο Arduino. Αν παρουσιάσει πρόβλημμα η φόρτωση του κώδικα τότε κατά πάσα πιθανότητα χρησιμοποιείτε κινέζικη απομίμηση του Nano R3. Σε αυτή την περίπτωση δοκιμάστε να επιλέξτε στο IDE ως μικροελεκτή το Arduino Duemilanove or Diecimila
#include <LiquidCrystal.h>
#define sensorPin A0
// Tie ARef to 3.3V
#define aref_voltage 5.0
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
byte Degree[] = {
0b00111, 0b00101, 0b00111,
0b00000, 0b00000, 0b00000,
0b00000, 0b00000
};
void setup() {
lcd.begin(20, 4);
lcd.createChar(0, Degree);
}
void loop() {
// Get the voltage reading from the TMP36
int reading = analogRead(sensorPin);
// Convert that reading into voltage
float voltage = reading * (aref_voltage / 1024.0);
// Convert the voltage into the temperature in Celsius
float temperatureC = (voltage - 0.5) * 100;
lcd.clear();
lcd.setCursor(0, 0);
// Προβολή της θερμοκρασίας σε βαθμούς Κελσίου
lcd.print("Temp: ");
lcd.print(temperatureC, 1);
lcd.write(byte(0)); // print the custom degree character
lcd.print("C ");
// Προβολή της θερμοκρασίας σε βαθμούς Φαρενάιτ
float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;
lcd.print(temperatureF, 1);
lcd.write(byte(0)); // print the custom degree character
lcd.print("F");
delay(1000); // Παύση ενός δευτερολέπτου μεταξύ των μετρήσεων
}
Επεξήγηση του κώδικα
Στην αρχή του sketch συμπεριλαμβάνουμε την αναγκαία βιβλιοθήκη για την λειτουργία της οθόνης lcd και δημιουργούμε το αντίστοιχο αντικείμενο lcd.
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
Ορίζουμε δυο σταθερές, το pin της αναλογικής εισόδου του μικροελεγκτή και την τάση αναφοράς του ADC
#define sensorPin A0
#define aref_voltage 5.0
Στη συνάρτηση setup() αρχικοποιούμε την διασύνδεση της οθόνης και ορίζουμε το σύμβολο των βαθμών:
void setup() {
lcd.begin(20, 4);
lcd.createChar(0, Degree);
}
Στη συνάρτηση loop() πρώτα διαβάζουμε το αναλογικό σήμα από τον αισθητήρα TMP36 χρησιμοποιώντας την συνάρτηση analogRead()
int reading = analogRead(sensorPin);
Στη συνέχεια, χρησιμοποιώντας τις σχέσεις που αναφέραμε νωρίτερα, μετατρέψουμε την αναλογική ένδειξη σε τιμή τάσης και μετά βρίσκουμε την θερμοκρασία
float voltage = reading * (aref_voltage / 1024.0);
float temperatureC = (voltage - 0.5) * 100;
Έπειτα τα αποτελέσματα προβάλλονται στην οθόνη
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperatureC, 1);
lcd.write(byte(0)); // print the custom degree character
lcd.print("C ");
Η τιμή της θερμοκρασίας που προβάλλεται είναι σε βαθμούς Κελσίου. Για να την εκφράσουμε σε βαθμούς Φαρενάιτ χρησιμοποιούμε την σχέση Τ(F) = T(C) x 9/5 +32 και στην συνέχεια την προβάλουμε στην οθόνη:
float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;
lcd.print(temperatureF, 1);
lcd.write(byte(0)); // print the custom degree character
lcd.print("F");
Βελτίωση της ακρίβειας του αισθητήρα TMP36
Επειδή δεν έχουμε ρυθμίσει την τάση αναφοράς (ARef) που χρησιμοποιείται για την αναλογική είσοδο —η προεπιλεγμένη αναλογική τάση αναφοράς στις πλακέτες Arduino των 5V είναι 5 volt— η μέγιστη ανάλυση που μπορούμε να έχουμε από τον ADC είναι 5/1024 = 4,88 mV ή 0,49°C.
Για καλύτερα αποτελέσματα, η χρήση της τάσης αναφοράς των 3,3V ως ARef αντί για τα 5V θα μας δώσει μεγαλύτερη ακρίβεια και λιγότερο θόρυβο. Με τάση αναφοράς 3,3V, έχουμε ανάλυση 3,3/1024 = 3,22 mV ή 0,32°C.
Για να χρησιμοποιήσουμε ως τάση αναφοράς τα 3.3V συνδέουμε το pin της εισόδου αναφοράς AREF (Analog Reference), στο pin των 3,3V της αναπτυξιακής πλακέτας. Επειδή η τάση στο pin της αναλογικής εισόδου του μικροελεγκτη Nano δεν πρέπει να υπερβένει την τάση αναφοράς, τροφοδοτούμε τον αισθητήρα TMP36 με τάση 3,3V.
Με αυτές τις ρυθμίσεις ανεβάστε και τρέχτε τον ακόλουθο κώδικα:
#include <LiquidCrystal.h>
#define sensorPin A0
// Συνδέστε το ARef στα 3,3V
#define aref_voltage 3.3
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
byte Degree[] = {
0b00111, 0b00101,
0b00111, 0b00000,
0b00000, 0b00000,
0b00000, 0b00000
};
void setup() {
lcd.begin(20, 4);
lcd.createChar(0, Degree);
// Αν θέλετε να ρυθμίσετε το ARef σε διαφορετική τάση από τα 5V
analogReference(EXTERNAL);
}
void loop() {
// Λάβετε την ένδειξη τάσης από τον TMP36
int reading = analogRead(sensorPin);
// Μετατρέψτε αυτή την ένδειξη σε τάση
float voltage = reading * (aref_voltage / 1024.0);
// Μετατρέψτε την τάση σε θερμοκρασία σε βαθμούς Κελσίου
float temperatureC = (voltage - 0.5) * 100;
lcd.clear();
lcd.setCursor(0, 0);
// Προβολή της θερμοκρασίας σε βαθμούς Κελσίου
lcd.print("Temp: ");
lcd.print(temperatureC, 1);
lcd.write(byte(0)); // Εκτυπώστε τον ειδικό χαρακτήρα του βαθμού
lcd.print("C ");
// Προβολή της θερμοκρασίας σε βαθμούς Φαρενάιτ
float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;
lcd.print(temperatureF, 1);
lcd.write(byte(0)); // Εκτυπώστε τον ειδικό χαρακτήρα του βαθμού
lcd.print("F");
delay(1000); // Παύση ενός δευτερολέπτου μεταξύ των μετρήσεων
}