Shield για την μέτρηση της θερμοκρασίας

Σε αυτή την εργασία θα μιλήσουμε για τον αναλογικό αισθητήρα μέτρησης θερμοκρασίας, αυτόν με τύπο ΤΜΡ36. Άλλοι αισθητήρες της ίδιας κατηγορίας, με παρόμοια χαρακτηριστικά, είναι οι ΤΜΡ35 και ΤΜΡ37, για τους οποίους δεν θα αναφερθούμε σε αυτό το εδάφιο, αλλά ο αναγνώστης μπορεί να βρει τα εγχειρίδια λειτουργίας τους στο διαδίκτυο.

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

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

Ο αισθητήρας ΤΜΡ36 παρέχει στην έξοδο του τάση 750mV σε θερμοκρασία 25οC η οποία αυξάνεται κατά 10mV για κάθε άνοδο της θερμοκρασίας κατά 1οC. Με αυτό τον τρόπο μπορούμε εύκολα να μετράμε και χαμηλές θερμοκρασίες σε βαθμούς Κελσίου.

Σε αυτή την εργασία φτιάχνουμε ένα shield για το Arduino Uno όπου πάνω του έχουμε τοποθετήσει δυο ψηφία LED επτά τμημάτων, που διαμέσου αντιστάσεων οδηγούνται από τις 14 εξόδους του Arduino, καθώς επίσης και τον αισθητήρα ΤΜΡ36, όπου την αναλογική του έξοδο την οδηγούμε στην αναλογική είσοδο Α0 του Arduino.

Το κύκλωμα της κατασκευής μας, φαίνεται στην ακόλουθη εικόνα:

Το pcb με τα εξαρτήματα πάνω του, το σχεδιάσαμε με το CAD ηλεκτρονικής σχεδίασης, το οποίο φαίνεται στην ακόλουθη εικόνα:

pcb με την τοποθέτηση των εξαρτημάτων

Στην ακόλουθη εικόνα φαίνονται φωτογραφίες και των δύο όψεων του pcb όπως το παρέδωσε η εταιρεία παραγωγής τυπωμένων κυκλωμάτων και συγκεκριμένα η jlcpcb.com:

το pcb με τις δυο όψεις του

Για να μπορέσουμε να μετρήσουμε την θερμοκρασία με τον αισθητήρα ΤΜΡ36 αναπτύξαμε ένα πρόγραμμα για το Arduino και το παρουσιάζουμε ακολούθως:

// Arduino uno shield 2-digit thermometer
#define MINUS_SYMBOL 10
#define ERROR_SYMBOL 10
byte digitarray_0[] = {0b1011111, 0b0001001, 0b0111110, 0b0111011, 0b1101001, 0b1110011, 0b1110111, 0b0011001, 0b1111111, 0b1111011, 0b1110110};
byte digitarray_1[] = {0b1110111, 0b1000001, 0b0111011, 0b1101011, 0b1001101, 0b1101110, 0b1111110, 0b1000011, 0b1111111, 0b1101111, 0b0001000};

void writedigit_0(byte num_0){
  byte digit_0 = digitarray_0[num_0];
  for(byte n = 0; n <=6; n++){
    digitalWrite(n, digit_0 & 0x01);
    digit_0 >>= 0x01;
  }
  return;
}
void writedigit_1(byte num_1){
  byte digit_1 = digitarray_1[num_1];
  for(byte m = 7; m<=13; m++){
    digitalWrite(m, digit_1 & 0x01);
    digit_1 >>= 0x01;
  }
  return;
}
int findtemp(){
  float voltage;
  int sensor;
  int celsius; 
  sensor = analogRead(0);
  voltage = (sensor * 5000.0) / 1024.0;
  voltage = voltage - 750.0;
  celsius = 25 + floor(voltage / 10.0);
  return celsius;
}
void displaytemp(int temp){
 if(temp<-9){
    writedigit_0(ERROR_SYMBOL); writedigit_1(MINUS_SYMBOL);
    }
 else if(temp>=-9 && temp<0) {
    writedigit_0(abs(temp)); writedigit_1(MINUS_SYMBOL);
    }
 else if(temp>=0 && temp<=99) {
    writedigit_0(temp%10); temp/=10; writedigit_1(temp%10);
    }
 else { 
    writedigit_0(ERROR_SYMBOL);writedigit_1(0);
    }
 return;
}
void setup() {
  for(byte i=0; i<=13; i++) pinMode(i, OUTPUT);
}

void loop() {
      displaytemp(findtemp());
      delay(1000);
}

Πως δουλεύει ο κώδικας

Με την συνάρτηση int findtemp() μετράμε την θερμοκρασία, όπου η επιστρεφόμενη τιμή είναι τύπου int που είναι η τιμή της θερμοκρασίας σε βαθμούς Κελσίου. Η διαδικασία μέτρησης είναι η εξής: Η εντολή analogRead(0) μετρά την τάση εξόδου του ΤΜΡ36. Αυτή επιστρέφει μια τιμή στο διάστημα 0 έως 1023 που για να πάρουμε την τιμή της τάσης στην έξοδο του αισθητήρα, που κυμαίνεται στο διάστημα από 0 έως 5000mV πολλαπλασιάζουμε την τιμή που επιστρέφει η συνάρτηση analogRead() με 5000/1024.

Στη συνέχεια από την τάση εξόδου του αισθητήρα αφαιρούμε την τιμή 750,0 (μια τιμή offset που χρησιμοποιείται από τον ΤΜΡ36 για να μπορεί να μετρά θερμοκρασίες κάτω από το 0). Διαιρούμε αυτό το αποτέλεσμα δια του 10 διότι κάθε μεταβολή της τάσης εξόδου του αισθητήρα κατά 10mV έχουμε μεταβολή της θερμοκρασίας κατά 1οC. Επειδή στους 25οC η έξοδος του ΤΜΡ36 είναι 750mV για να βρούμε την πραγματική τιμή της θερμοκρασίας προσθέτουμε την τιμή 25 στο αποτέλεσμα της προηγούμενης διαίρεσης.

Το αποτέλεσμα της συνάρτησης findtemp() το παίρνει η συνάρτηση displaytemp(int) και το απεικονίζει σε δυο ψηφία επτά τμημάτων LED. Εξετάζει την περίπτωση που η θερμοκρασία είναι κάτω των -9οC που τότε εμφανίζει το σύμβολο λάθους, την περίπτωση στην οποία η θερμοκρασία είναι μεταξύ -9οC έως 99οC που εδώ την απεικονίζει στα δυο ψηφία LED και την περίπτωση που η θερμοκρασία είναι μεγαλύτερη από 99οC που εμφανίζει σύμβολο λάθους.

Η απεικόνιση των μονάδων στο δεξιό ψηφίο LED επτά τμημάτων γίνεται με την συνάρτηση writedigit_0(byte) ενώ η απεικόνιση των δεκάδων στο αριστερό ψηφίο LED γίνεται με τη συνάρτηση writedigit_1(byte). Σε κάθε μια από αυτές τις συναρτήσεις έχει συσχετιστεί και από ένα πίνακα με τιμές τύπου byte (digitarray_0[] και digitarray_1[]) που συνδέει τις εξόδους του Arduino με τα τμήματα των ψηφίων, έτσι ώστε κάθε μονοψήφιος αριθμός να μπορεί να απεικονιστεί σωστά από τα ψηφία επτά τμημάτων.