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

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

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

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

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

Ο αισθητήρας BMP280 είναι θαυμάσιος για όλες τις ατμοσφαιρικές συνθήκες και μπορεί να επικοινωνεί με ένα μικροελεγκτή με ένα από τα πρωτόκολλα I2C ή SPI.  Για απλή γρήγορη διασύνδεση μπορείς να χρησιμοποιήσεις το πρωτόκολλο I2C. Αν θέλεις να χρησιμοποιήσεις ένα αριθμό τέτοιων αισθητήρων χωρίς να ανησυχείς για κολλήματα διευθύνσεων χρησιμοποίησε το πρωτόκολλο SPI.

Τα δεδομένα οδηγούνται στη μονάδα απεικόνισης εννέα ψηφίων, δια μέσω του driver MAX7221. Αυτό το ολοκληρωμένο κύκλωμα επικοινωνεί με την πλατφόρμα Arduino Nano με το πρωτόκολλο SPI.  Τα δεδομένα στέλνονται στο MAX7221  σε πακέτα των 16-bits στον ακροδέκτη του DIN και ολισθαίνουν στον 16-bit καταχωρητή του σε κάθε ανοδικό μέτωπο των παλμών ρολογιού. 

Η ψηφιακή είσοδος CS του driver ΜΑΧ7221 πρέπει να είναι στο λογικό μηδέν για να μπορούν να εισέρχονται ή να εξέρχονται τα δεδομένα. Τα δεδομένα μανταλώνονται στον καταχωρητή ψηφίων ή ελέγχου με την ανύψωση του σήματος στην είσοδο CS.

Ο μικροελεγκτής στέλνει τα 16-bit πακέτα σειριακά στον driver ΜΑΧ7221. Αυτά τα bit δεδομένων ονομάζονται D0-D15.  Τα bit της περιοχής D8-D11 περιέχουν την διεύθυνση του καταχωρητή πάνω στον ΜΑΧ7221, στον οποίο θα γραφούν τα δεδομένα, ενώ η περιοχή D0-D7 περιέχει τα δεδομένα που θα αποθηκευτούν στον καταχωρητή. Η περιοχή των bits D12-D15 είναι “don’t care” bits. Το πρώτο bit που λαμβάνεται από τον ΜΑΧ7221 είναι το D15 το περισσότερο σημαντικό bit.

To MAX7221 έχει δεκατέσσερις καταχωρητές ψηφίων και ελέγχου. Κάθε καταχωρητής περιέχει 8-bit δεδομένα και έχει την δικιά του διεύθυνση. Οι καταχωρητές ψηφίων προσπελαύνονται με άμεση διευθυνσιοδότηση με τέτοιο τρόπο που οι ενδείξεις στο display να μπορούν να απεικονίζονται ανεξάρτητα από ψηφίο σε ψηφίο. Οι καταχωρητές ελέγχου  αποτελούνται από τους decode mode, display intensity, scan limit, shutdown και display test.

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

Επίσης μπορούμε να ρυθμίσουμε τη φωτεινότητα του display με την κατάλληλη τιμή της αντιστάσεις που συνδέεται στον ακροδέκτη ISET και στην τάση τροφοδοσίας. (βλέπε το datasheet για περισσότερες λεπτομέρειες).

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

Αποτελείται από πέντε μέρη. Το τροφοδοτικό συνεχής τάσης, τον μικροελεγκτή της πλατφόρμας Arduino Nano, τους αισθητήρες και τον driver και το display. Το τροφοδοτικό είναι τύπου switching που στην έξοδο του παίρνουμε 5V και επιπρόσθετα έχει ένα σταθεροποιητή που δίνει τάση 9V στην έξοδο του.

Για την μέτρηση της υγρασίας, χρησιμοποιούμε τον αισθητήρα DHT22 και για τη μέτρηση της θερμοκρασίας και της ατμοσφαιρικής πίεσης, χρησιμοποιείται ο αισθητήρας BMP280. Και οι δυο αυτοί αισθητήρες τροφοδοτούνται με τάση 3.3V από το αντίστοιχο πιν τάσης εξόδου του Arduino. Το display αποτελείται από εννέα ψηφία επτά τμημάτων χρώματος κόκκινου, που οδηγούνται από το ολοκληρωμένο κύκλωμα ΜΑΧ7221. Η πλατφόρμα Arduino Nano επικοινωνεί με τον driver ΜΑΧ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. Ακολούθησε τα παρακάτω βήματα για να τις εγκαταστήσεις:

Δημιουργούμε ένα φάκελο στο σκληρό μας δίσκο π.χ. arduino_libraries και στην συνέχεια κατεβάζουμε τα zip αρχεία των βιβλιοθηκών, από τους ακόλουθους συνδέσμους και τα αποθηκεύουμε σ’ αυτόν τον φάκελο.

DHT library
Πάτησε εδώ DHT-sensor.zip για να κατεβάσεις και να αποθηκεύσεις την βιβλιοθήκη του αισθητήρα DHT σε μορφή zip αρχείου.

Adafruit_Sensor library
Πάτησε εδώ Adafruit_Sensor.zip για να κατεβάσεις και να αποθηκεύσεις την βιβλιοθήκη  Adafruit Sensor  σε μορφή .zip αρχείου.

Adafruit_BMP280_Library
Πάτησε εδώ Adafruit_BMP280_Library-1.0.2.zip για να κατεβάσεις και να αποθηκεύσεις την βιβλιοθήκη Adafruit_BMP280_Library  σε μορφή .zip αρχείου.

Προτού ανεβάσεις και τρέξεις τον κώδικά στο Arduino IDE, θα πρέπει να έχεις εγκαταστήσει τις αντίστοιχες βιβλιοθήκες. Για να εγκαταστήσεις τις βιβλιοθήκες ακολούθησε τα εξής απλά βήματα:

Από το μενού επιλέγουμε διαδοχικά: Sketch > Include Library > Add .ZIP library… Από το εμφανιζόμενο παράθυρο διαλόγου πλοηγούμαστε και επιλέγουμε το επιθυμητό .ZIP αρχείο βιβλιοθήκης και κάνουμε κλικ στο κουμπί Άνοιγμα. Αν πάνε όλα καλά θα πρέπει να έχουν εγκατασταθεί οι βιβλιοθήκες.

Αντέγραψε τον παρακάτω κώδικα στο 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 αντικειμένου
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() {
  float hu = dht.readHumidity(); //Εξαγωγή υγρασίας
  float te = bmp.readTemperature(); //Εξαγωγή θερμοκρασίας
  float pr = bmp.readPressure();  //Εξαγωγή ατμ. πίεσης
  printHumidity(hu); //Απεικόνιση υγρασίας
  printTemperature(te); //Απεικόνιση θερμοκρασίας
  printPressure(pr); //Απεικόνιση ατμοσφαιρικής πίεσης
  delay(20000); 
}

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

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