Μέτρηση θερμοκρασίας με τον αναλογικό αισθητήρα TMP36

Σε αυτή την εργασία θα μάθετε πώς να μετράτε την θερμοκρασία με τον αισθητήρα TMP36 χρησιμοποιώντας την πλατφόρμα Arduino. Ο αισθητήρας ΤΜΡ36 παρέχει μια αναλογική έξοδο τάσης η οποία είναι ανάλογη προς την ως μέτρηση θερμοκρασία. Ο ΤΜΡ36 είναι ένας αναλογικός αισθητήρας ο οποίος είναι φθηνός, αξιόπιστος και εύκολος στην χρήση και κατασκευάζεται από την εταιρεία Analog Devices.

Η έξοδος του ΤΜΡ36 είναι μια τάση η οποία είναι ανάλογη της θερμοκρασίας του σώματος του και με μια μικρή ψηφιακή επεξεργασία στη τάση εξόδου του, καταφέρνουμε να μετρήσουμε την θερμοκρασία. Έτσι, σύμφωνα με το εγχειρίδιο του κατασκευαστή, στους 25 βαθμούς Κελσίου η τάση εξόδου του αισθητήρα είναι 750mV και για κάθε μεταβολή της θερμοκρασίας κατά ένα βαθμό Κελσίου έχουμε μεταβολή 10mV. Το ΤΜΡ36 μπορεί να μετρήσει θερμοκρασίες μεταξύ -40οC έως +125οC και με ακρίβεια ±1οC στους 25οC, ενώ έχουμε ακρίβεια ±2οC στην υπόλοιπη περιοχή -40oC έως +125οC

Ο αισθητήρας ΤΜΡ36 μπορεί να τροφοδοτηθεί με τάση μεταξύ 2,7V και 5,5V και καταναλώνει ρεύμα 50μΑ κατά τη διάρκεια μέτρησης, με αυτοθέρμανση μικρότερη από 0,1οC. Επιπρόσθετα σε κατάσταση shutdown καταναλώνει ρεύμα μικρότερο από 0,5μΑ.

Η συσκευασία του ΤΜΡ36 μοιάζει όπως ενός κοινού τρανζίστορ και συγκεκριμένα την ΤΟ-92, με διάταξη ακροδεκτών όπως φαίνεται στο σχήμα.

Μετατροπή της τάξης εξόδου του TMP36 σε τιμή θερμοκρασίας

Για να μετατρέψουμε την τάση εξόδου του αισθητήρα ΤΜΡ36 σε θερμοκρασία βαθμών Κελσίου χρησιμοποιούμε τον ακόλουθο τύπο:

Temperature (oC) = (VOUT – 500 ) / 10

Όπου VOUT η αναλογική έξοδος του TMP36 σε millivolt. Έτσι εάν π.χ. η έξοδος του αισθητήρα είναι 750mV τότε η θερμοκρασία είναι:

(750 – 500) / 10 = 25οC

‘Ετσι όπως φαίνεται στον πίνακα συνδέσεων, η έξοδος του TMP36 συνδέεται στην αναλογική είσοδο Α0 του Arduino. Η τιμή αυτής της αναλογικής τάσης εισόδου στο Arduino μπορεί να διαβαστεί με τη χρήση της συνάρτησης analogRead() όπως θα δείξουμε στο παρακάτω παράδειγμα . Η συνάρτηση analogRead(pin) επιστρέφει μια τιμή που είναι ανάλογη της τάσης στην αναλογική είσοδο του Arduino.

Πάνω στη μονάδα του Arduino υπάρχουν μετατροπείς (ADC) analog-to-digital ανάλυσης 10-bit οι οποίοι αντιστοιχούν την περιοχή τάσεων 0 – 5V σε ακέραιες τιμές 0 – 1023. Έτσι εάν χρησιμοποιήσουμε την συνάρτηση analogRead( ) για να διαβάσουμε μια αναλογική είσοδο του Arduino θα πάρουμε μια τιμή μεταξύ 0 έως 1023.

Στον ακόλουθο κώδικα, χρησιμοποιώντας την τιμή reading που δίνει η συνάρτηση analogRead( ) καθώς διαβάζει το αναλογικό πιν του Arduino στο oποίo είναι συνδεμένος ο αισθητήρας, η μέτρηση της τάσης εξόδου VOUT του αισθητήρα TMP36, εκφρασμένης σε mV, βασίζεται στον τύπο:

VOUT = reading*(5000 / 1024)

Μέτρηση της θερμοκρασίας με το TMP36 κάνοντας χρήση το Arduino

Στη συνέχεια αφού θα σας αναφέρω πως θα συνδέσετε τον αισθητήρα μέτρησης θερμοκρασίας TMP36 με την αναπτυξιακή πλακέτα που έχω παρουσιάσει σε άλλο μέρος αυτού του ιστοτόπου, θα σας δώσω ένα παράδειγμα κώδικα. Τα pins του αισθητήρα συνδέονται σε εκείνα τα pins της αναπτυξιακής πλακέτας, όπως φαίνεται στον ακόλουθο πίνακα:

Παρέχουμε τροφοδοσία με +5V από την αναπτυξιακή πλακέτα στο ΤΜΡ36 καθώς επίσης και τα 0V (GND). Ο μεσαίος ακροδέκτης του TMP36 είναι ο ακροδέκτης της αναλογικής εξόδου του αισθητήρα και τον συνδέουμε με την αναλογική είσοδο Α0 της αναπτυξιακής πλακέτας.

// Συμπερίληψη της απαρέτητης βιβλιοθήκης για το LCD
#include <LiquidCrystal.h>
// Δημιουργία ενός αντικειμένου της κλάσης LiquidCrystal
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // Δημιουργία αντικειμένου lcd
// Degree symbol:
byte Degree[] = { B00111, B00101, B00111, B00000,
  B00000, B00000, B00000, B00000 };
// Δήλωση σε ποιο πιν του Arduino συνδέεται το ΤΜΠ36:
#define sensorPin A0
void setup() {
  // Αρχικοποίηση του αντικειμένου lcd με τον αριθμό των στηλών και γραμμών.
  lcd.begin(20, 4);
  // Δημιουργία προσαρμοσμένου χαρακτήρα
  lcd.createChar(0, Degree);
}
void loop() {
  // Ανάγνωση από τον θερμοκρασιακό αισθητήρα TMP36:
  int reading = analogRead(sensorPin);
  // Μετατροπή της τιμής που διαβάστηκε σε τιμή voltage:
  float voltage = reading * (5000 / 1024.0);
  // Μετατροπή της τιμής voltage σε θερμοκρασία σε βαθμούς Κελσίου.
  float temperature = (voltage - 500) / 10;
  // Εμφάνησε την θερμοκρασία στο LCD;
  lcd.setCursor(4, 0);
  lcd.print("Temperature:");
  lcd.setCursor(6, 1);
  lcd.print(temperature);
  lcd.write(byte(0)); // εμφάνιση του προσαρμοσμένου χαρακτήρα.
  lcd.print("C");
  delay(1000); // καθυστέρηση ενός δευπτερολέπτου μεταξύ των διαβασμάτων
}

Για να βελτιώσουμε την σταθερότητα του αισθητήρα, το εγχειρίδιο συνιστά την σύνδεση ενός κεραμικού πυκνωτή μεταξύ της τάσης τροφοδοσίας 5V και το GND κοντά στον ΤΜΡ36. Επίσης αν χρησιμοποιήσετε μακρά καλώδια διασύνδεσης, τοποθέτησε μια μικρή αντίσταση (π.χ. 750Ω) σε σειρά με το αναλογικό σήμα VOUT η οποία θα μειώσει την επίδραση θορύβου.

Επεξήγηση του κώδικα

Στις πρώτες γραμμές του κώδικα εισάγουμε τη βιβλιοθήκη για το LCD module και δημιουργούμε το αντικείμενο lcd της κλάσης αυτής.

// Συμπερίληψη της απαρέτητης βιβλιοθήκης για το LCD
#include <LiquidCrystal.h>
// Δημιουργία ενός αντικειμένου της κλάσης LiquidCrystal
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // Δημιουργία αντικειμένου lcd

Στη συνέχεια δηλώνουμε σε πιο αναλογικό πιν του Arduino συνδέεται η αναλογική έξοδος του TMP36 για την μέτρηση της VOUT. Σε αυτή την περίπτωση χρησιμοποιούμε το αναλογικό πιν εισόδου  Α0 του Arduino.

Η έκφραση #define μπορεί να χρησιμοποιηθεί για να δώσει ένα όνομα σε μια σταθερή τιμή. Ο compiler αντικαθιστά όλες τις αναφορές με αυτό το όνομα με την τιμή της σταθεράς κατά τη διάρκεια της μεταγλώττισης. Στο παράδειγμα μας ο compiler  αντικαθιστά την σταθερά sensorPin  με την τιμή Α0.

// Δήλωση σε ποιό πιν του Arduino συνδέεται το ΤΜP36:
#define sensorPin A0

Στην συνάρτηση ‘setup’ αρχικοποιούμε το LCD module και μετά δημιουργούμε ένα προσαρμοσμένο σύμβολο για τους βαθμούς Κελσίου.

void setup() {
  // Αρχικοποίηση του αντικειμένου lcd με τον αριθμό των στηλών και γραμμών.
  lcd.begin(20, 4);
  // Δημιουργία προσαρμοσμένου χαρακτήρα
  lcd.createChar(0, Degree);
}

Στη συνάρτηση βρόγχου ‘loop’ αρχίζει κατ’ επανάληψη το διάβασμα από τον αισθητήρα ΤΜΡ36 χρησιμοποιώντας την συνάρτηση analogRead(pin)

// Ανάγνωση από τον θερμοκρασιακό αισθητήρα TMP36:
  int reading = analogRead(sensorPin);

Στη συνέχεια χρησιμοποιούμε τις σχέσεις που αναφέραμε νωρίτερα για να μετατρέψουμε τις τιμές που διαβάσαμε σε τιμές θερμοκρασίας.

 // Μετατροπή της τιμής που διαβάστηκε σε τιμή voltage:
  float voltage = reading * (5000 / 1024.0);
  // Μετατροπή της τιμής voltage σε θερμοκρασία σε βαθμούς Κελσίου.
  float temperature = (voltage - 500) / 10;

Στη συνέχεια εμφανίζεται η τιμή της θερμοκρασίας στο LCD με τον ακόλουθο κώδικα:

// Εμφάνηση της θερμοκρασίας στο LCD;
  lcd.setCursor(4, 0);
  lcd.print("Temperature:");
  lcd.setCursor(6, 1);
  lcd.print(temperature);
  lcd.write(byte(0)); // εμφάνιση του προσαρμοσμένου χαρακτήρα.
  lcd.print("C");