Κ140 μέτρηση υγρασίας και θερμοκρασίας με το DHT22

Σε αυτό το πρότζεκτ θα σας δείξω πώς να συνδέσετε τον αισθητήρα υγρασίας και θερμοκρασίας και συγκεκριμένα τον 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

Διάταξη ακροδεκτών του 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);