Browse By

Αυτονομο ασυρματο αισθητηριο θερμοκρασιας σε Arduino

Ενας φιλος απο τη δουλεια, εχει ενα μικρο θερμοκηπιο στο πισω μερος του σπιτιου και με ρωτησε εαν υπαρχει καποιος ευκολος και οικονομικος τροπος να παιρνει την θερμοκρασια. Στην αρχη ακουστηκε κατι απλο οταν ομως ακουσα ολες τις απαιτησεις του καταλαβα οτι με ενα απλο θερμομετρο δεν γινεται αυτο που ειχει στο μυαλο του. Μου ειπε λοιπον οτι, πρωτον θα πρεπει οι μετρησεις να ειναι σε πραγματικο χρονο, δευτερον θα πρεπει τα αποτελεσματα των μετρησεων να πηγαινουν ‘καπου’ στο σπιτι ασυρματα και τριτον το κυκλωμα στο θερμοκηπιο θα πρεπει να ειναι ενεργειακα αυτονομο. Δηλαδη στην ουσια ηθελε να μετραει καπως την θερμοκρασια στο θερμοκηπιο και την στελνει ασυρματα στο σπιτι οπου εκει θα αποφασισει αυτος τι θα κανει με τα δεδομενα των μετρησεων. Απο οτι μου ειπε σκεφτονταν να αποθηκευει τις μετρησεις σε καποια βαση δεδομενων.

Υστερα απο μια μικρη ερευνα στο διαδικτυο βρηκα αρκετες ετοιμες λυσεις ομως το προβλημα που υπηρχε ηταν το κοστος. Το πιο οικονομικο που μπορεσα λοιπον να σκεφτω ηταν, δυο arduino boards οπου στο ενα θα υπαρχει ενα αισθητηριο θερμοκρασιας το οποιο θα παιρνει τις μετρησεις και θα εχει ενα πομπο RF 433Mhz μεσω του οποιου θα τις στελνει στο δευτερο arduino το οποιο θα εχει εναν RF δεκτη για την ληψη. Εκει εγω προσθεσα και μια lcd για να βλεπουμε τις μετρησεις αμεσα αλλα μεσω ενος ethernet shield ανετα τις μετρησεις μπορουμε να τις στειλουμε σε μια υπηρεσια τυπου xively ωστε να ικανοποιηθει και η απαιτηση του φιλου για αποθηκευση. Τελος για να ειναι και ενεργειακα αυτονομο το πρωτο arduino(αυτο που εχει το αισθητηριο) βρηκα ενα πολυ ωραιο και φθηνο power bank με ενα ηλιακο πανελ στην μια πλευρα μεσω του οποιου φορτιζει την εσωτερικη μπαταρια. Το καλο ειναι οτι αυτα τα power banks εχουν σχεδιαστει για κινητα τα οποια καταναλωνουν αρκετη ενεργεια σε σχεση με το arduino οποτε θεωρητικα τουλαχιστον εχουμε καλυφθει. Ετσι μετα την αναμονη καποιων ημερων για την παραλαβη των εξαρτηματων απο το ebay εγινε το παρακατω:

Πληρες κυκλωμα

circuit

Κυκλωμα μετρησης και αποστολης της θερμοκρασιας 

circuit1

Κυκλωμα ληψης της θερμοκρασιας 

circuit2

 

circuit3

Συγκεντρωτικα τα υλικα που χρησιμοποιηθηκαν ειναι τα παρακατω:

-2 x Arduino Uno (εγω ειχα ενα mega οποτε χρησιμοποιησα αυτο)

-1 x RF 433Mhz Kit

-1 x Adafruit Max 31855 break out

-1 x K-type sensor

-1 x LCD 16×2

-1 x 10k pot

-Breadborad + jumper cables

Να σημειωσω οτι δεν ειναι απαρατητη η χρηση k-type αισθητηριου, απλα εγω ετυχε να εχω ενα τετοιο και το Max31855. Εσεις μπορειτε να χρησιμοποιησετε ενα DS1820 ή ακομα και ενα TMP36 θα κανει μια χαρα αυτη τη δουλεια.

H συνδεση ολων των παραπανω δεν ειναι ιδαιτερα δυσκολη. Διαβαστε αυτο το link για τη συνδεση του αισθητηριου, αυτο για τη συνδεση της lcd οθονης και τελος για τη συνδεση των rf modules η παρακατω εικονα νομιζω ειναι πληρως διαφωτιστικη.

connection

O κωδικας για την αποστολη της θερμοκρασιας ειναι ο παρακατω:

#include 
#include "Adafruit_MAX31855.h"

int thermoDO = 3;
int thermoCS = 4;
int thermoCLK = 5;

Adafruit_MAX31855 thermocouple(thermoCLK, thermoCS, thermoDO);
RCSwitch mySwitch = RCSwitch();

void setup() {
  Serial.begin(9600);
  // Transmitter is connected to Arduino Pin #10  
  mySwitch.enableTransmit(10);
  Serial.println("MAX31855 test");
  // wait for MAX chip to stabilize
  delay(500);
}

void loop() {
  // basic readout test, just print the current temp
   Serial.print("Internal Temp = ");
   Serial.println(thermocouple.readInternal());

   double c = thermocouple.readCelsius();
   if (isnan(c)) {
     Serial.println("Something wrong with thermocouple!");
   } else {
     Serial.print("C = "); 
     Serial.println(c);
   }
   //Serial.print("F = ");
   //Serial.println(thermocouple.readFarenheit());

  /* Same switch as above, but using decimal code */
  mySwitch.send(c, 24);
  delay(1000);  
}

Και για την ληψη:

/*
  Simple example for receiving

  http://code.google.com/p/rc-switch/

  Need help? http://forum.ardumote.com
*/

#include 
// include the library code:
#include 

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
RCSwitch mySwitch = RCSwitch();

void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);
    lcd.print("MAX31855 test");
  // wait for MAX chip to stabilize
  delay(500);
  mySwitch.enableReceive(0);  // Receiver on inerrupt 0 => that is pin #2
}

void loop() {
  lcd.setCursor(0, 0);
  if (mySwitch.available()) {

    int value = mySwitch.getReceivedValue();

    if (value == 0) {

      lcd.print("Unknown encoding");
    } else {
      lcd.print("Temp is : ");
      lcd.print( mySwitch.getReceivedValue() );
      lcd.print("c");
    }
    mySwitch.resetAvailable();
  }
}

Οπως βλεπετε για την επικοινωνια των rf module χρησιμοποιησα την πολυ καλη βιβλιοθηκη RCSwitch την οποια μπορειτε να κατεβασετε δωρεαν απο εδω.

Αυτη τη στιγμη ειμαι στο σταδιο των δοκιμων και ο παραπανω κωδικας θελει αρκετη δουλεια. Το πλανο λοιπον ειναι εαν ολα πανε καλα να φτιαχθουν κανονικες πλακετες με τον μικροελεγκτη atmel (ιδιο με αυτο που χρησιμοποιουν τα arduino), να κολληθουν τα rf,lcd κλπ πανω στις πλακετες και τελος να μπουν μεσα σε abs κουτακια. Ετσι θα γινει ακομη πιο οικονομικο και πιο εργονομικο το ολο project. Απο οτι υπολογιζω το κοστος θα ειναι κατω απο 50 ευρω.

Ενα demo video μπορειτε να δειτε εδω:

Αν δοκιμασετε να το φτιαξετε και καπου κολλησετε μπορειτε να επικοινωνησετε μαζι μου και θα χαρω να βοηθησω.

Κατεβαστε τον κωδικα απο εδω:

SEND-RECEIVE_TEMPERATURE

Leave a Reply

Your email address will not be published. Required fields are marked *