Μέτρηση υγρασίας και θερμοκρασίας με τον αισθητήρα DHT22

Σε αυτό το εδάφιο θα εξετάσουμε τα χαρακτηριστικά των αισθητήρων DHT11 και DHT22 με τους οποίους μετράμε την σχετική υγρασία και την θερμοκρασία οι οποίοι κατασκευάζονται από την εταιρία AOSONG. Αυτοί οι αισθητήρες είναι καλιμπραρισμένοι από την γραμμή παραγωγής και δεν χρειάζονται εξωτερικά εξαρτήματα για να λειτουργήσουν.

Η απόλυτη υγρασία είναι η ποσότητα των υδρατμών στον αέρα εκφρασμένων σε gr/cm3, ενώ η σχετική υγρασία είναι το ποσοστό της πραγματικής ποσότητας υδρατμών στον αέρα προς την μέγιστη ποσότητα υδρατμών που μπορεί να υπάρξει στον αέρα.

Οι αισθητήρες DHT11 και DHT22 φαίνονται σχεδόν οι ίδιοι, αλλά με διαφορετικό χρώμα, όμως έχουν διαφορετικά χαρακτηριστικά. Ο DHT22 κοστίζει περισσότερο και επομένως έχει καλύτερα χαρακτηριστικά. Η θερμοκρασιακή περιοχή που μπορεί να μετρήσει ο DHT22 είναι από -40οC εως +125οC με ακρίβεια ±0,5οC, ενώ ο DHT11 έχει θερμοκρασιακή περιοχή 0οC έως 50οC με ακρίβεια ±2οC. Επίσης ο DHT22 έχει καλύτερη περιοχή μέτρησης υγρασίας από 0 έως 100% με ακρίβεια 2 – 5% ενώ ο DHT11 έχει περιοχή μέτρησης υγρασίας από 20 έως 80% με 5% ακρίβεια.

Αν και ο DHT22 έχει καλύτερα χαρακτηριστικά, ο αισθητήρας  DHT11 έχει τα πλεονεκτήματα του χαμηλού κόστους, μικρότερου μεγέθους και μεγαλύτερου ρυθμού δειγματοληψίας, π.χ. στον DHT11 ο ρυθμός δειγματοληψίας είναι μια ανά δευτερόλεπτο (1Ηz) , ενώ στον DHT22 ο ρυθμός δειγματοληψίας είναι μια ανά δυο δευτερόλεπτα (0,5Hz).

Τα κοινά τους χαρακτηριστικά είναι ότι έχουν την ίδια τάση τροφοδοσίας κυμαίνεται από 3 έως 5V και τραβούν το ίδιο ρεύμα στα 2,5mA. Επίσης είναι εναλλάξιμοι που σημαίνει ότι σε ένα πρότζεκτ μπορείς να αντικαταστήσεις τον ένα αισθητήρα στον άλλο με μικρή τροποποίηση του κώδικα.

Εσωτερική κατασκευή των αισθητήρων DHT11 και DHT22

Εάν ανοίξεις ένα DHT11 ή DHT22 θα δεις ότι περιέχει δυο αισθητήρες, το στοιχείο μέτρησης της υγρασίας και το θερμίστορ NTC για την μέτρηση της θερμοκρασίας.

Ο αισθητήρας της υγρασίας αποτελείται από δυο ηλεκτρόδια με ένα υπόστρωμα συγκράτησης της υγρασίας μεταξύ τους. Ο αισθητήρας μετρά την αντίσταση μεταξύ των δύο ηλεκτροδίων που η τιμή της εξαρτάται από την υγρασία του αέρα.

Το θερμίστορ είναι ένα εξάρτημα στο οποίο η αντίσταση του αλλάζει με τη μεταβολή της θερμοκρασίας και παρουσιάζει μεταβολή 100Ω περίπου ανά βαθμό Κελσίου. Ο όρος «NTC» σημαίνει “Negative Temperature Coefficient» δηλαδή η αντίσταση ελαττώνεται με την αύξηση της θερμοκρασίας.

Σε αυτό το πρότζεκτ θα σας δείξω πώς να συνδέσετε τον αισθητήρα υγρασίας και θερμοκρασίας και συγκεκριμένα τον DHT22 με την αναπτυξιακή πλακέτα Κ125 που παρουσιάζουμε σε άλλο μέρος αυτού του ισότοπου. Αυτή η αναπτυξιακή πλακέτα αποτελείται από το module Arduino Nano, δυο σταθεροποιητές τάσης 3,3V και 5V και μια 16Χ2 χαρακτήρων LCD οθόνη για απεικόνιση δεδομένων, που εδώ απεικονίζουμε τις μετρήσεις της υγρασίας και θερμοκρασίας του αέρα που δίνει ο αισθητήρας DHT22

Ο αισθητήρας DHT22 μπορεί να αντικαταστήσει με μικρές αλλαγές στον κώδικα το αδελφάκι του το DHT11, που αν το πρώτο κοστίζει περισσότερο έχει καλύτερα χαρακτηριστικά. Το DHT22 μπορεί να δώσει μετρήσεις στην περιοχή θερμοκρασιών μεταξύ -40οC έως +125οC με ακρίβεια ±0,5οC. Επίσης ο DHT22 έχει περιοχή μέτρησης υγρασίας από 0 έως 100% με ακρίβεια 2-5%. Ο ρυθμός δειγματοληψίας των μετρήσεων είναι μια μέτρηση κάθε δεύτερο δευτερόλεπτο, δηλαδή 0,5Ηz

Διάταξη ακροδεκτών του DHT11 και DHT22

Μιας που παρουσιάσαμε τα χαρακτηριστικά του DHT22 είναι ώρα να τον συνδέσουμε στην αναπτυξιακή πλακέτα. Ο αισθητήρας έχει 4 ακροδέκτες που επιτρέπει να τον τοποθετήσουμε σε ένα breadboard.

Vcc : τροφοδοτεί τον αισθητήρα με τάση. Αν και η τάση λειτουργίας κυμαίνεται μεταξύ 3,3V έως 5V, η τάση τροφοδοσίας 5V συνίσταται. Με τροφοδοσία τάσης 5V στον αισθητήρα επιτρέπει την απομακρυσμένη σύνδεση του αισθητήρα έως και 20 μέτρα από τον μικροελεγκτή, ενώ με τάση τροφοδοσίας 3,3V αυτή η απόσταση είναι μικρότερη από 1 μέτρο.
Data : χρησιμοποιείται για την μεταφορά δεδομένων μεταξύ του αισθητήρα και του μικροελεγκτή.
NC : Δεν συνδέεται πουθενά.
GND : συνδέεται στην τάση 0V (ground) του τροφοδοτικού.

Διασύνδεση του κυκλώματος του DHT22 με την αναπτυξιακή πλακέτα

Τροφοδοτούμε τον αισθητήρα με τάση 5V και συνδέουμε τα 0V στη γείωση. Τέλος συνδέουμε τον ακροδέκτη Data του DHT22 στο ψηφιακό πιν 8. Για να λειτουργήσει η διάταξη μας θα πρέπει να συνδέσουμε μια pull-up αντίσταση 10ΚΩ μεταξύ του ακροδέκτη VCC και Data. Αν έχεις προμηθευτεί τον αισθητήρα DHT22 κολλημένο πάνω σε ένα μικρό pcb με τρεις ακροδέκτες, δεν χρειάζεται να συνδέσεις εξωτερική αντίσταση. Αυτή περιλαμβάνεται στο pcb που είναι εγκαταστημένος ο DHT22.

Κώδικας Arduino – Απεικόνιση μετρήσεων στο LCD

Ο αισθητήρας DHT22 επικοινωνεί με τον μικροελεγκτή χρησιμοποιώντας το δικό του σειριακό πρωτόκολλο με αυστηρό συγχρονισμό μετάδοσης δεδομένων. Ευτυχώς η κοινότητα χρηστών του Arduino έχει αναπτύξει μια βιβλιοθήκη που φροντίζει για τη σωστή αυτή επικοινωνία του αισθητήρα με το Arduino. Για την εγκατάσταση αυτής της βιβλιοθήκης ακολούθησε τα ακόλουθα βήματα.

DHT Library
1] Πάτησε εδώ DHT-sensor.zip για να κατεβάσεις την βιβλιοθήκη του αισθητήρα DHT.  Θα πρέπει να έχεις ένα φάκελο .zip στο φάκελο downloads
2] Κάνε unzip τον .zip folder και θα πρέπει να πάρεις τον φάκελο: DHT
3] Μετακίνησε τη βιβλιοθήκη DHT στο φάκελο των βιβλιοθηκών του περιβάλλοντος Arduino IDE
4] Τέλος κάνε επανεκκίνηση την εφαρμογή Arduino IDE.

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

#include <LiquidCrystal.h> 
#include <DHT.h>
#define DHTTYPE DHT11
#define DHTPin 8

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
DHT dht(DHTPin, DHTTYPE); // Δημιουργία dht αντικειμένου βάσει των ορισμάτων στη συνάρτηση δημιουργίας.
bool show_c_f = false;

void setup() 
{
  lcd.begin(16,2); // Αρχικοποιεί την διασύνδεση του LCD και ορίζει τις διαστάσεις του.
  dht.begin();  //Αρχικοποίηση του dht αντικειμένου
}

void loop() 
{
  float h = dht.readHumidity(); //Εξαγωγή υγρασίας
  float t = dht.readTemperature();
  lcd.setCursor(0,0); // Μετακινεί τον κέρσορα στην πάνω αριστερή γωνία.
  lcd.print("Temp.: "); // Εμφανίζει το μήνυμα "Temp." στην LCD

  //Εμφανίζει την τιμή της θερμοκρασίας σε βαθμούς Κελσίου και Φαρενάιτ εναλλάξ
  if(show_c_f)
  {
    lcd.print(t); // Εμφανίζει την θερμοκρασία από τον αισθητήρα.
    lcd.print(" ");
    lcd.print((char)223);//δείχνει το χαρακτήρα του βαθμού.
    lcd.print("C");
    show_c_f = false;
  }
  else
  {
    lcd.print((t * 9.0) / 5.0 + 32.0); // εμφανίζει την θερμοκρασία σε βαθμούς Φαρενάιτ
    lcd.print(" ");
    lcd.print((char)223);// εμφανίζει τον χαρακτήρα του βαθμού.
    lcd.print("F");
    show_c_f = true;
  }
  
  lcd.setCursor(0,1);
  lcd.print("Humi.: ");
  lcd.print(h);
  lcd.print(" %");
  delay(5000);
}

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

Στις πρώτες γραμμές του κώδικα εισάγονται οι βιβλιοθήκες LiquidCrystal.h για την λειτουργία του LCD και την dht.h για την λειτουργία του αισθητήρα. Στη συνέχεια δηλώνουμε το ψηφιακό πιν του Arduino που θα συνδεθεί με το Data πιν του αισθητήρα καθώς και τον τύπο του αισθητήρα DHT11 ή DHT22

#include <LiquidCrystal.h> 
#include <DHT.h>
#define DHTTYPE DHT11
#define DHTPin 8

Προχωράμε δημιουργώντας ένα αντικείμενο lcd που η συνάρτηση δημιουργίας παίρνει τις παραμέτρους: rs, enable, d4, d5, d6, d7. Επίσης δημιουργείται και το αντικείμενο dht της κλάσης DHT που η συνάρτηση δημιουργίας παίρνει σαν παραμέτρους τον πιν που είναι συνδεμένος ο αισθητήρας και τον τύπο του. Η λογική μεταβλητή show_c_f ορίζει στην οθόνη LCD τη θερμοκρασία σε βαθμούς Κελσίου ή σε βαθμούς Φαρενάιτ.

LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // Δηλώστε τα πινς του δικούς σας πρότζεκτ.
DHT dht(DHTPin, DHTTYPE); // Δημιουργία dht αντικειμένου
bool show_c_f = false;

Στη συνάρτηση ‘setup’ αρχικοποιούμε την επικοινωνία του LCD και ορίζει τις διαστάσεις σε χαρακτήρες του LCD καθώς και την αρχικοποίηση του dht αντικειμένου.

void setup()
{
   lcd.begin(16, 2);
   dht.begin();
}

Στη συνάρτηση ‘loop’ χρησιμοποιούμε της σχετικές συναρτήσεις για να διαβάσουμε τις τιμές της υγρασίας και της θερμοκρασίας που δίνει ο αισθητήρας.

Άπαξ η υγρασία και η θερμοκρασία μετρηθούν, μπορείς να τις χρησιμοποιήσεις ως εξής:

 float h = dht.readHumidity(); //Εξαγωγή υγρασίας
 float t = dht.readTemperature();

Το αντικείμενο dht καθορίζει τη θερμοκρασία σε βαθμούς Κελσίου. Αυτή μπορεί να μετατραπεί σε βαθμούς Φαρενάιτ από τον τύπο:

// Απεικονίζει στο LCD τη θερμοκρασία σε βαθμούς Φαρενάιτ:
lcd.print( (t * 9.0) / 5.0 + 32.0);