Κ110 μίνι μετεωρολογικός σταθμός

Σε αυτό το πρότζεκτ, κατασκευάζουμε μια ηλεκτρονική πλακέτα για την μέτρηση της θερμοκρασίας, της υγρασίας και της ατμοσφαιρικής πίεσης, με τη βοήθεια της πλατφόρμας Arduino Nano. Μετράμε τη θερμοκρασία και την ατμοσφαιρική πίεση με τον αισθητήρα τύπου BMP280 και την υγρασία με τον αισθητήρα τύπου DHT22. Οι ενδείξεις απεικονίζονται στο ντισπλέι επτά τμημάτων εννέα ψηφίων.

Περιγραφή πρότζεκτ

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

Η εταιρεία Bosh έχει προχωρήσει ένα βήμα πιο μπροστά παράγοντας τον αισθητήρα BMP280 για την μέτρηση περιβαλλοντολογικών μεταβλητών και συγκεκριμένα της θερμοκρασίας και της ατμοσφαιρικής πίεσης. Ο αισθητήρας αυτός είναι θαυμάσιος για όλες τις ατμοσφαιρικές συνθήκες και μπορεί να επικοινωνεί με ένα μικροελεγκτή με ένα από τα πρωτόκολλα I2C ή SPI.  Για απλή γρήγορη διασύνδεση μπορείς να χρησιμοποιήσεις το πρωτόκολλο I2C. Αν θέλεις να χρησιμοποιήσεις ένα αριθμό τέτοιων αισθητήρων χωρίς να ανησυχείς για κολλήματα διευθύνσεων χρησιμοποίησε το πρωτόκολλο SPI. Είναι ένας υψηλής ακρίβειας αισθητήρας, με αρίστη σχέση απόδοσης – κόστους, που μπορεί να μετρήσει την ατμοσφαιρική πίεση με απόλυτη ακρίβεια ±1hPa  και ακρίβεια στη μέτρηση της θερμοκρασίας ±1.00C.

Τα δεδομένα οδηγούνται στο ντισπλέι εννέα ψηφίων, δια μέσω του ντράιβερ MAX7221, που είναι ένα ολοκληρωμένο κύκλωμα, που επικοινωνεί με την πλατφόρμα Arduino Nano με το πρωτόκολλο SPI.  Τα δεδομένα στέλνονται στο MAX7212  σε πακέτα των 16-bits στον ακροδέκτη του DIN και ολισθαίνουν στον 16-bit καταχωρητή του σε κάθε ανυψούμενο μέτωπο των παλμών ρολογιού.  Η είσοδος CS του ντράιβερ ΜΑΧ7221 πρέπει να είναι στο λογικό μηδέν για να μπορούν να εισέρχονται ή να εξέρχονται τα δεδομένα. Τα δεδομένα μανταλώνονται στον digit  ή control καταχωρητή με την ανύψωση του σήματος στην είσοδο CS.

Ο μικροελεγκτής στέλνει τα 16-bit πακέτα σειριακά στον ντράιβερ ΜΑΧ7221. Αυτά τα bit δεδομένων ονομάζονται D0-D15.  Τα bit της περιοχής D8-D11 περιέχει την διεύθυνση του καταχωρητή στο ντράιβερ ΜΑΧ7221, ενώ η περιοχή D0-D7 περιέχει τα δεδομένα του καταχωρητή ενώ η περιοχή bits D12-D15 είναι “don’t care” bits. Το πρώτο bit που λαμβάνεται είναι το D15 το περισσότερο σημαντικό bit. To MAX7221 έχει δεκατέσσερις digit και control καταχωρητές. Κάθε καταχωρητής περιέχει 8-bit δεδομένα και έχει την δικιά του διεύθυνση. Οι digit καταχωρητές έχουν άμεση διευθυοδότηση με τέτοιο τρόπο που οι ενδείξεις στο ντισπλέι μπορούν ανεξάρτητα να ανανεώνονται. Οι control καταχωρητές  αποτελούνται από τους decode mode, display intensity, scan limit, shutdown και display test.

Στο ολοκληρωμένο κύκλωμα οδηγό MAX7221 ο καταχωρητής decode mode ορίζει σε καθένα ψηφίο του ντισπλέι αν είναι ενεργοποιημένος ο αποκωδικοποιητής  BCD code B ή όχι. Η διεύθυνση αυτού του καταχωρητή είναι 0x09. Κάθε bit αυτού του καταχωρητή αντιστοιχεί και σε ένα ψηφίο. Ένα λογικό 1 σε ένα bit ενεργοποιεί το BCD decoding στο αντίστοιχο ψηφίο, ενώ  ένα λογικό 0 παρακάμπτει το BCD decoding για αυτό το ψηφίο. (βλέπε το datasheet για περισσότερες λεπτομέρειες). Επίσης μπορούμε να ρυθμίσουμε τη φωτεινότητα του ντισπλέι με την κατάλληλη τιμή της αντιστάσεις που συνδέεται στον ακροδέκτη ISET και στην τάση τροφοδοσίας. (βλέπε το datasheet για περισσότερες λεπτομέρειες).

Περιγραφή κυκλώματος

Το σχηματικό της κατασκευής μας φαίνεται παρακάτω και είναι εύκολο να το καταλάβουμε.

Αποτελείται από πέντε μέρη. Το τροφοδοτικό συνεχής τάσης, τον μικροελεγκτή της πλατφόρμας Arduino Nano, τους αισθητήρες και τον ντράιβερ και το ντισπλέι. Το τροφοδοτικό είναι τύπου switching που στην έξοδο του παίρνουμε 5V και επιπρόσθετα έχει ένα σταθεροποιητή που δίνει τάση 9V στην έξοδο του. Για την μέτρηση της υγρασίας, χρησιμοποιούμε τον αισθητήρα DHT22 και για τη μέτρηση της θερμοκρασίας και της ατμοσφαιρικής πίεσης, χρησιμοποιείται ο αισθητήρας BMP280. Και οι δυο αυτοί αισθητήρες τροφοδοτούνται με τάση 3.3V. Το ντισπλέι αποτελείται από εννέα ψηφία επτά τμημάτων χρώματος κόκκινου, που οδηγούνται από το ολοκληρωμένο κύκλωμα ΜΑΧ7221. Η πλατφόρμα Arduino Nano επικοινωνεί με τον ντράιβερ ΜΑΧ7221 με το πρωτόκολλο SPI.

Κατασκευή

Αυτό το πρότζεκτ βασίζεται σε μια πλακέτα διπλής όψης διαστάσεων 10 x 14,5 cm, στο οποίο τοποθετούμε όλα τα εξαρτήματα, τα ψηφία επτά τμημάτων, τους σταθεροποιητές 7809 και LT1076-5, τους αισθητήρες DHT22 και BMP280, την αυτεπαγωγή 100μH, την δίοδο Schotty, το τρανζίστορ, τις αντιστάσεις τους πυκνωτές και τον κονέκτορα. Συνιστάται το Arduino Nano και το ολοκληρωμένο κύκλωμα MAX7221 να τοποθετηθούν σε βάσεις. Η κατασκευή τροφοδοτείται από DC τροφοδοτικό πρίζας τάσης 12 – 15V.

Μετά που έχουμε συναρμολογήσει την πλακέτα την τροφοδοτούμε με τάση 12V ή 15V με ένα τροφοδοτικό πρίζας. Με ένα πολύμετρο ελέγχουμε τις τάσεις εξόδου στην πλακέτα. Όταν όλα είναι εντάξει τοποθετούμε το ολοκληρωμένο κύκλωμα MAX7221 και το Arduino Nano.  Μετά την τροφοδοσία της κατασκευής μας, συνδέουμε με το κατάλληλο καλώδιο USB το Arduino Nano με το PC μας. Από το περιβάλλον προγραμματισμού Arduino IDE επιλέγουμε την σωστή USB θύρα και το σωστό Arduino board (αν έχετε το Arduino Nano ως κινέζικη απομίμηση δοκιμάστε να επιλέξετε στο Arduino IDE, ως πλακέτα “Arduino Duemilanove or Diecimila) και μετά ανεβάζουμε το παρακάτω πρόγραμμα sketch και την εγκατάσταση των σωστών βιβλιοθηκών όπως περιγράφεται παρακάτω. Μετά τη φόρτωση του software, αποσυνδέουμε το USB καλώδιο. Η πλακέτα τώρα τροφοδοτείται από το τροφοδοτικό πρίζας και θα πρέπει να λειτουργεί δείχνοντας τη θερμοκρασία σε βαθμούς Κελσίου στα δυο πάνω αριστερά ψηφία, την υγρασία στα δυο πάνω δεξιά ψηφία και την ατμοσφαιρική πίεση στα κάτω πέντε ψηφία, σε μονάδες mbar ή hPa.

Εγκατάσταση βιβλιοθηκών

Πριν φορτώσεις τον κώδικα στο Arduino Nano θα πρέπει να εγκαταστήσεις τρείς βιβλιοθήκες στο περιβάλλον Arduino IDE και συγκεκριμένα τις a) DHT sensor library b)Adafruit_Sensor και c)Adafruit_BMP280_Library. Ακολούθησε τα παρακάτω βήματα για να τις εγκαταστήσεις:

DHT library
1] Πάτησε εδώ https://learnelectronics.gr/downloadfiles/K110/DHT-sensor-library-master.zip για να κατεβάσεις την βιβλιοθήκη του αισθητήρα DHT.  Θα πρέπει να έχεις ένα φάκελο .zip στο φάκελο downloads
2] Κάνε unzip τον .zip folder και θα πρέπει να πάρεις τον φάκελο: DHT-sensor-library-master
3] Άλλαξε το όνομα αυτού του φακέλου από : DHT-sensor-library-master  σε  DHT
4] Μετακίνησε τη βιβλιοθήκη DHT στο φάκελο των βιβλιοθηκών του περιβάλλοντος Arduino IDE
5] Τέλος επανεκκίνηση την εφαρμογή Arduino IDE.

Adafruit_Sensor library
1] Πάτησε εδώ https://learnelectronics.gr/downloadfiles/K110/Adafruit_Sensor-master.zip για να κατεβάσεις την βιβλιοθήκη  Adafruit Sensor.  Θα πρέπει να έχεις ένα φάκελο .zip στο φάκελο downloads
2] Κάνε unzip τον .zip folder και θα πρέπει να πάρεις τον φάκελο: Adafruit_Sensor-master
3] Άλλαξε το όνομα αυτού του φακέλου από : Adafruit_Sensor-master  σε  Adafruit_Sensor
4] Μετακίνησε τη βιβλιοθήκη Adafruit_Sensor στο φάκελο των βιβλιοθηκών του περιβάλλοντος Arduino IDE
5] Τέλος επανεκκίνηση την εφαρμογή Arduino IDE.

Adafruit_BMP280_Library
1]Πάτησε εδώ https://learnelectronics.gr/downloadfiles/K110/Adafruit_BMP280_Library.zip για να κατεβάσεις την βιβλιοθήκη Adafruit_BMP280_Library.  Θα πρέπει να έχεις ένα φάκελο .zip στο φάκελο downloads
2] Κάνε unzip τον .zip folder και θα πρέπει να πάρεις τον φάκελο: Adafruit_BMP280_Library-1.0.2
3] Άλλαξε το όνομα αυτού του φακέλου από : Adafruit_BMP280_Library-1.0.2  σε  Adafruit_BMP280_Library
4] Μετακίνησε τη βιβλιοθήκη Adafruit_BMP280_Library στο φάκελο των βιβλιοθηκών του περιβάλλοντος Arduino IDE
5] Τέλος επανεκκίνηση την εφαρμογή Arduino IDE.

Ανέβασμα του κώδικα

Αντέγραψε τον παρακάτω κώδικα στο Arduino IDE και φόρτωσε το στο Arduino Nano.

#include <SPI.h>    // Εισαγωγή των απαραίτητων βιβλιοθηκών
#include "DHT.h"
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#define CS_PIN_MAX7221 10
#define DHTTYPE DHT22
#define DHTPin 8
#define LEFTdigit 7
DHT dht(DHTPin, DHTTYPE); // Δημιουργία dht αντικειμένου
Adafruit_BMP280 bmp;      // Δημιουργία bmp αντικειμένου
char c=2;
int i=0;
void max7221Transfer(unsigned char address, unsigned char value){
    //Συνάρτηση για την αποστολή του 16-bit πακέτου στον ντράϊβερ
    digitalWrite(CS_PIN_MAX7221, LOW); // CS ακροδέκτης σε LOW
    SPI.transfer(address); //Σειριακή εγγραφή της διεύθυνσης του καταχωρητή
    SPI.transfer(value);//Σειριακή εγγραφή των δεδομένων στον καταχωρητή
    digitalWrite(CS_PIN_MAX7221, HIGH);// CS ακροδέκτης σε HIGH
    delay(1);
}
void printTemperature(float temp){
  // Απεικόνιση της τιμής της θερμοκρασίας στο ντισπλέϊ
  char t = (char)temp;
  if(t>=0){
      max7221Transfer(0x07, t%10);
      t/=10;
      max7221Transfer(0x08, t%10);
  }else if(t>-10 && t<0){
      max7221Transfer(0x07, (-t)%10);
      max7221Transfer(0x08, 0x0A);
  }else{
      max7221Transfer(0x07, 0x0A);
      max7221Transfer(0x08, 0x0A);
  }
}
void printHumidity(float hum){
  // Απεικόνιση της τιμής της υγρασίας στο ντισπλέϊ
  unsigned char h = (unsigned char)hum;
  max7221Transfer(0x05, h%10);
  h/=10;
  max7221Transfer(0x06, h%10);
}
void printPressure(float pre){
  // Απεικόνιση της τιμής της πίεσης στο ντισπλέϊ
  pre/=10;
  int p = (int)pre;
  max7221Transfer(0x01, p%10);
  p/=10;
  max7221Transfer(0x02, (p%10)|0x80);
  p/=10;
  max7221Transfer(0x03, p%10);
  p/=10;
  max7221Transfer(0x04, p%10);
  p/=10;
  if(p>0) digitalWrite(LEFTdigit, LOW); else digitalWrite(LEFTdigit, HIGH);
}
void setup() {
  SPI.begin();  //Αρχικοποίηση της σειριακής επικοινωνίας με τον ντράιβερ
  dht.begin();  //Αρχικοποίηση του dht αντικειμένου
  bmp.begin(0x76);  //Αρχικοποίηση του bmp αντικειμένου
  pinMode(CS_PIN_MAX7221, OUTPUT);
  pinMode(LEFTdigit, OUTPUT);
  digitalWrite(LEFTdigit, LOW);
  digitalWrite(CS_PIN_MAX7221, HIGH);
  max7221Transfer(0x0C, 0x01); //Shutdown Register Format: Normal Operation
  max7221Transfer(0x0F, 0x01); //Display – Test Register Format: Display Test Mode
  delay(2000);
  max7221Transfer(0x0F, 0x00); //Display – Test Register Format: Normal Operation
  max7221Transfer(0x0B, 0x07); // Scan – Limit Register Format: Display digits 01234567
  max7221Transfer(0x09, 0xFF); //Decode – Mode Register Format: No decode for digits 7-0
  max7221Transfer(0x0A, 0x0F);
  for(byte n=0; n<10; n++){   //Δοκιμή λειτουργίας του ντισπλέϊ
    for(i=1; i<9; i++)
    max7221Transfer(i,n);
    delay(500);
  }
}
void loop() {
  SPI.transfer(c);  
  float hu = dht.readHumidity(); //Εξαγωγή υγρασίας
  float te = bmp.readTemperature(); //Εξαγωγή θερμοκρασίας
  float pr = bmp.readPressure();  //Εξαγωγή ατμ. πίεσης
  printHumidity(hu); //Απεικόνιση υγρασίας
  printTemperature(te); //Απεικόνιση θερμοκρασίας
  printPressure(pr); /Απεικόνιση ατμοσφαιρικής πίεσης
  delay(20000); 
}

Εξαρτήματα
R1……….10K   1/4W
R2………..330Ω   1/4W
R3………..330Ω   1/4W
R4………..4,7K    1/4W
R5………..4,7K    1/4W
R6………..1,5K  1/4W
C1…………2200μF/16V
C2…………100nF
C3…………100nF
C4………….33nF
C5………….1000μF/25V
C6…………..100nF
D1………….1N4001
D2…………..1N5818  schottky
L1……………100μΗ
Q1………….BC328
DIS0…..DIS8  common cathode red display 0.56in
IC1………..MAX7221
IC2……….7808
IC3……….LT1076-5
J1…………DC connector
S1……….BMP280 from ebay.com
S2……….DHT22
Arduino Nano

Χρήσιμα αρχεία για κατέβασμα

Μπορείτε να κατεβάσετε τα αρχεία eagle της κατασκευής  και να τα χρησιμοποιείται ελεύθερα από τον σύνδεσμο:
Αρχεία eagle για την κατασκευή Κ110 μίνι μετεωρολογικός σταθμός

Μπορείτε να κατεβάσετε τα αρχεία Arduino sketch code της κατασκευής και να τα χρησιμοποιείται ελεύθερα από τον σύνδεσμο: Πηγαίος κώδικας Arduino για την κατασκευή Κ110 μίνι μετεωρολογικός σταθμός