Ένα ιστολόγιο για όσους αγαπούν τις ηλεκτρονικές κατασκευές...

Τετάρτη 3 Οκτωβρίου 2018

Arduino Παίζοντας με θερμοκρασίες [1].

Σαν συνέχεια του άρθρου ARDUINO σε απλά Ελληνικά, το παρόν άρθρο αποτελεί υλοποίηση του παραδείγματος.

Θα δούμε στην συνέχεια πως μπορούμε να μετράμε την θερμοκρασία με ένα κατάλληλο αισθητήριο και να βλέπουμε την τιμή της σε οθόνη LCD 2 γραμμών 16 χαρακτήρων ανά γραμμή.
Για αισθητήριο θερμοκρασίας επέλεξα το DS18B20. Έχει καλή ακρίβεια στη μέτρηση και δεν χρειάζεται καλιμπράρισμα.



Η οθόνη χρειάζεται 6 Ι/Ο του μικροελεγκτή για να λειτουργήσει. Μπορούμε να την συνδέσουμε με ένα μικρό module που την μετατρέπει σε I2C οπότε χρειάζεται μόνο δύο Ι/Ο. Το ίδιο module περιλαμβάνει και ρύθμιση του contrast και επιλογή για τον οπίσθιο φωτισμό της οθόνης. Έτσι οι συνδέσεις απλουστεύονται πολύ.

Παρακάτω είναι το σχέδιο των συνδέσεων για την οθόνη και το αισθητήριο.
Ακολουθεί ο κώδικας για το arduino.
//===============================

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,16,2);

#define ONE_WIRE_BUS 2   // ---------- Αισθητήριο στο ποδαράκι D2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float tempC = 0;   //------- Μεταβλητή που κρατάει την θερμοκρασία


void setup() {

  sensors.begin();
  lcd.init();    
  lcd.home(); 
  lcd.backlight();

// ----------------------
//   Προαιρετικός κώδικας για εισαγωγικό μήνυμα
//   Βάλτε το δικό σας μήνυμα μεταξύ των " " 

  lcd.setCursor(0,0);
  lcd.print("DIY electronics");  
  lcd.setCursor(0,1);
  lcd.print("   blogspot.com");  
  delay(2000);
  lcd.clear();
//-----------------------
}

void loop() {

  sensors.requestTemperatures();
  tempC = sensors.getTempCByIndex(0);

  lcd.setCursor(0,0);
  lcd.print("TEMP: ");
  lcd.print(tempC);
  lcd.print("\337C"); //---- εκτύπωση συμβόλου βαθμών Κελσίου

  delay(1000);

}
//======== ΤΕΛΟΣ ========

Ο κώδικας είναι πολύ απλός αλλά θα τον εξηγήσω λίγο για όσους ξεκινούν τώρα με το arduino.
Στην αρχή του κώδικα δηλώνονται οι βιβλιοθήκες που θα χρησιμοποιηθούν. Αν κάνετε copy-paste τον κώδικα στο interface του Arduino και προσπαθήσετε να ανεβάσετε τον κώδικα στην πλακέτα θα σας βγάλει σφάλμα. Ο λόγος είναι ότι δεν θα βρίσκει κάποιες από τις βιβλιοθήκες που χρειάζονται.
Θα πρέπει να εγκαταστήσετε την βιβλιοθήκη για το αισθητήριο αφού την καταβάσετε από εδώ

Στην επόμενη σειρά του προγράμματος  LiquidCrystal_I2C lcd(0x3F,16,2); Δηλώνεται η διεύθυνση της οθόνης και ο τύπος της. Αν η διεύθυνση της οθόνης (0x3F) δεν είναι σωστή τότε η οθόνη δεν θα εμφανίσει τίποτε. Αν δεν γνωρίζετε την διεύθυνση της οθόνης σας μπορείτε να την βρείτε ως εξής:
Κατεβάστε τον κώδικα I2C scanner από εδώ και ανεβάστε τον στο arduino σας, τρέχετε τον κώδικα με την οθόνη συνδεδεμένη στον δίαυλο I2C και από την παρακολούθηση σειριακής βλέπετε την διεύθυνση που ανίχνευσε το πρόγραμμα. Αυτή την διεύθυνση θα πρέπει να βάλετε στην παραπάνω σειρά του προγράμματος. Ο τύπος οθόνης είναι 16Χ2 δηλαδή 16 χαρακτήρων 2 γραμμών. Αν βάλετε διαφορετικό τύπο οθόνης θα πρέπει να διορθώσετε ανάλογα.

Στην επόμενη σειρά δηλώνουμε σε ποιο ποδαράκι συνδέσαμε το αισθητήριο. Συνήθως τα αισθητήρια θερμοκρασίας είναι αναλογικά εξαρτήματα. Το DS18B20 όμως είναι ένα ειδικό ψηφιακό ολοκληρωμένο. Δεν δίνει έξοδο κάποιο αναλογικό σήμα αλλά μεταφέρει την ένδειξη σαν μια σειρά από data. Για αυτό το λόγο συνδέουμε το αισθητήριο σε ψηφιακή είσοδο και όχι σε αναλογική. Για να γίνει η μεταφορά της ένδειξης από το DS18B20 στον μικροελεγκτή χρειαζόμαστε το προτώκολο onewire bas.
Με την σειρά του προγράμματος float tempC = 0; δηλώνουμε την μεταβλητή tempC η οποία θα κρατάει την τιμή της θερμοκρασίας. Δίνουμε αρχική τιμή 0 αλλά μόλις τρέξει το πρόγραμμα η τιμή της θα αλλάξει αμέσως στην τρέχουσα θερμοκρασία.

Ακολουθεί η function setup() η οποία τρέχει μια φορά μόνο όταν τροφοδοτούμε το arduino ή όποτε πατήσουμε το reset. Στην αρχή της setup τρέχουν κάποιες functions  από τις βιβλιοθήκες για να γίνει αρχικοποίηση του αισθητήρα και της οθόνης και να είναι έτοιμα για λειτουργία.
Αμέσως μετά έχω προσθέσει ένα εισαγωγικό ενημερωτικό μήνυμα, συνήθως εδώ ενημερώνουμε το χρήστη για διάφορα πράγματα που θέλουμε όπως π.χ. την version του κώδικα ή ότι άλλο θέλουμε. Μπορείτε αν θέλετε να διαγράψετε αυτές τις σειρές ή να βάλετε δικό σας μήνυμα.

Τέλος η function loop() κάνει ακριβώς αυτό που λέει. Είναι μια διαδικασία που επαναλαμβάνεται αενάως μέχρι να διακοπεί η τροφοδοσία του arduino.
Στις δύο πρώτες γραμμές διαβάζει και αναθέτει την θερμοκρασία στην στην μεταβλητή, στις επόμενες 4 γραμμές γίνεται η εκτύπωση της θερμοκρασίας στην οθόνη ενώ στην τελευταία γραμμή κάνουμε μία καθυστέρηση ενός δευτερολέπτου μέχρι την επόμενη μέτρηση κυρίως για να μην τρέμει η ένδειξη εφόσον υπάρχουν γρήγορες αλλαγές στα δεκαδικά. Επειδή η θερμοκρασία είναι ένα μέγεθος αργά μεταβαλλόμενο μία ένδειξη ανά ένα δευτερόλεπτο είναι υπέρ ικανοποιητική.

Εδώ τελείωσε η κατασκευή του θερμόμετρου με arduino και αισθητήριο θερμοκρασίας DS18B20.
Σε επόμενο άρθρο θα προσθέσουμε περισσότερο κώδικα ώστε να κάνει περισσότερες λειτουργίες.

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

Count down timer - χρονικό αντίστροφης μέτρησης

Μια απλή κατασκευή χρονομέτρου με αντίστροφη μέτρηση. Μπορεί να μετρήσει μέχρι 100 λεπτά με βήμα του ενός δευτερολέπτου. Είναι ιδανικό για ...