K155 αναλογική μέτρηση θερμοκρασίας με τον 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 μοιάζει όπως ενός κοινού τρανζίστορ και συγκεκριμένα την ΤΟ-92, με διάταξη ακροδεκτών όπως φαίνεται στο σχήμα.

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

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

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

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

(750 – 500) / 10 = 25οC

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

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

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

VOUT = readingfromADC*(5000 / 1024)

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

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

Παρέχουμε με τροφοδοσία με +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(16, 2);
  // Δημιουργία προσαρμοσμένου χαρακτήρα
  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(0, 0);
  lcd.print("Temperature:");
  lcd.setCursor(0, 1);
  lcd.print(temperature);
  lcd.write(byte(0)); // εμφάνιση του προσαρμοσμένου χαρακτήρα.
  lcd.print("C");
  delay(1000); // καθυστέρηση ενός δευπτερολέπτου μεταξύ των διαβασμάτων
}

Για να βελτιώσουμε την σταθερότητα του αισθητήρα, το εγχειρίδιο συνιστά την σύνδεση ενός κεραμικού πυκνωτή μεταξύ της τάσης τροφοδοσίας 5V και το GND. Επίσης αν χρησιμοποιείς μακρά καλώδια διασύνδεσης, τοποθέτησε μια μικρή αντίσταση (π.χ. 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 συνδέεται το ΤΜΠ36:
#define sensorPin A0

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

void setup() {
  // Αρχικοποίηση του αντικειμένου lcd με τον αριθμό των στηλών και γραμμών.
  lcd.begin(16, 2);
  // Δημιουργία προσαρμοσμένου χαρακτήρα
  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(0, 0);
  lcd.print("Temperature:");
  lcd.setCursor(0, 1);
  lcd.print(temperature);
  lcd.write(byte(0)); // εμφάνιση του προσαρμοσμένου χαρακτήρα.
  lcd.print("C");