Αξιολόγηση Χρήστη: 5 / 5

Αστέρια ΕνεργάΑστέρια ΕνεργάΑστέρια ΕνεργάΑστέρια ΕνεργάΑστέρια Ενεργά
 

 

Σε αυτή την παρουσίαση θα συνδέσουμε έναν πιο σύνθετο αισθητήρα και θα προσπαθήσουμε να πάρουμε πληροφορίες θερμοκρασίας. Ο αισθητήρας αυτός ανήκει την κατηγορία του  1-Wire Digital Thermometer και θα προγραμματίσουμε το Raspberry Pi για να διαβάσει και να εμφανίσει στην οθόνη μας την θερμοκρασία που αισθάνθηκε το αισθητήριο.

Οι αισθητήρες 1-Wire sensors, όλα τα δεδομένα τα στέλνει πάνω σε ένα καλώδιο, αυτό διευκολύνει τους μικροεπεξεργαστές εδώ και το Raspberry Pi, διότι απαιτείται μόνο ένα GPIO pin για μέτρηση. Πρόσθετα οι τέτοιου τύπου αισθητήρες χρησιμοποιούν ένα μοναδικό σειριακό αριθμό και αυτό σημαίνει ότι μπορούμε να συνδέσουμε περισσότερους από έναν αισθητήρα πάνω στο ιδιο πιν του επεξεργαστή.

O αισθητήρας που θα χρησιμοποιηθεί σε αυτή την παρουσίαση είναι της Maxim το DS18B20+ Προγραμματιζόμενη Ανάλυση 1-Wire ψηφιακό θερμόμετρο. Το DS18B20 + διαθέτει μια διάταξη παρόμοια με τρανζίστορ που ονομάζεται η συσκευασία TO-92, με τρεις ακίδες: GND, Δεδομένα (DQ), και η γραμμή τροφοδοσίας 3.3V (VDD). Θα πρέπει, επίσης, μερικά καλώδια βραχυκύκλωσης, μια breadboard και μια 4.7kΩ αντίσταση 0.25watt.

 

Η αντίσταση σε αυτό το σκηνικό χρησιμοποιείται ως ένα «pull-up» για τα δεδομένα της γραμμής, και θα πρέπει να συνδεθούν μεταξύ της DQ και VDD γραμμής. Αυτό διασφαλίζει ότι η γραμμή δεδομένων 1-Wire θα είναι σε ένα προκαθορισμένο επίπεδο λογικής, και εκτός ορίων παρεμβολών από ηλεκτρικό θόρυβο. Επίσης, πρόκειται να χρησιμοποιεί η GPIO 4 [Pin 7] ως την ακίδα του οδηγού για την ανίχνευση της θερμοκρασίας εξόδου. Αυτό είναι το ειδικό pin για 1-Wire GPIO ανίχνευση.

Προετοιμασία

DS GPIO image

1. Συνδέστε το GPIO GND [Pin 6] πάνω στο κονέκτορα του Raspberry  στην αρνητική μπλε γραμμή του breadboard και συνδέστε το GPIO 3.3V [Pin 1] του Raspberry στη θετική κόκκινη γραμμή του breadboard.

2. Συνδέστε το DS18B20+ στο breadboard σας, εξασφαλίζοντας ότι και τρεις ακίδες του είναι σε διαφορετικές σειρές. Εξοικειωθείτε με τις ακίδες του εξαρτήματος διότι είναι πολύ εύκολο να μπει και ανάποδα.

ds18b20 pinout

3. Συνδέστε το  DS18B20+ GND [Pin 1] στην αρνητική μπλε γραμμή του breadboard.

4. Συνδέστε το  DS18B20+ VDD [Pin 3] στη θετική κόκκινη γραμμή του breadboard.

5. Τοποθετήστε μια 4.7kΩ αντίσταση μεταξύ του DS18B20+ DQ [Pin 2] και μιας ελεύθερης γραμμής στο breadboard.

6. Συνδέστε το ελεύθερο άκρο της 4.7kΩ αντίστασης στη θετική κόκκινη γραμμή του breadboard.

 

7.       Τέλος, συνδέστε το DS18B20+ DQ [Pin 2] στο GPIO 4 [Pin 7] με ένα καλώδιο βραχυκύκλωσης.

Αυτό ήταν, Τώρα είμαστε έτοιμοι για προγραμματισμό!

Προγραμματισμός

Με λίγες εντολές, το DS18B20 + μπορεί να διαβαστεί απευθείας από την γραμμή εντολών, χωρίς την ανάγκη για τυχόν προγράμματα Python. Ωστόσο, αυτό απαιτεί από εμάς να εισάγουμε μια εντολή κάθε φορά που θέλουμε να γνωρίζουμε την ένδειξη της θερμοκρασίας. Προκειμένου να γίνουν κάποιες παρουσιάσεις για την 1-Wire διασύνδεση, θα το κάνουμε μέσω του τερματικού πρώτα, και στη συνέχεια θα γράψετε ένα πρόγραμμα σε Python που θα διαβάσει τη θερμοκρασία αυτόματα σε καθορισμένα χρονικά διαστήματα.

Το Raspberry Pi έρχεται εξοπλισμένο με μια σειρά από οδηγούς για τη διασύνδεση αυτή. Ωστόσο, δεν είναι εφικτό να φορτώνει κάθε οδηγό κατά την εκκίνηση του συστήματος, δεδομένου ότι θα αυξήσει το χρόνο εκκίνησης σημαντικά και θα χρησιμοποιήσετε πόρους του συστήματος για περιττές διαδικασίες. Ως εκ τούτου, οι εν λόγω οδηγοί αποθηκεύονται ως modules και η modprobe εντολή χρησιμοποιείται για να τους εκκινήσετε μέσα στον πυρήνα Linux όταν είναι απαραίτητο. Οι ακόλουθες δύο εντολές φορτώνουν τα 1-Wire και το θερμόμετρο οδηγούς για την ακίδα GPIO 4.

προσθέτουμε τις ακόλουθες γραμές στο αρχείο /boot/config.txt

sudo nano /boot/config.txt

και στο τέλος προσθέτουμε

dtoverlay=w1-gpio

sudo modprobe w1-gpio

sudo modprobe w1-therm

Αλλάζουμε φάκελο με την εντολή cd για να σιγουρευτούμε ότι ο φάκελος 1-Wire device με την εντολή ls -l και το θερμόμετρο μας έχουν φορτωθεί σωστά.

cd /sys/bus/w1/devices/

ls -l

Μέσα στο φάκελο με τους οδηγούς των συσκευών πρέπει να δούμε ένα αρχείο με ονομασία 28-χχχ όπου τα χχχ είναι μια σειρά από αριθμούς και γράμματα. Αυτό το αρχείο φάκελος αφορά τον αισθητήρα μας. Μπαίνουμε σε αυτόν τον φάκελο πληκτρολογώντας:

cd 28-000005e2fdc3

Το αισθητήριό μας γράφει περιοδικά το αρχείο w1_slave, έτσι με την εντολή cat βλέπουμε το περιεχόμενο του.

cat w1_slave

Σε αυτό το κείμενο των 2 γραμμών βλέπουμε την μεταβλητή t=που μας δείχνει την θερμοκρασία σε βαθμούς κελσίου αρκεί να βάλουμε μία τελεία μετά τα πρώτα 2 ψηφία πχ. 23.125 degrees Celsius.

72 01 4b 46 7f ff 0e 10 57 : crc=57 YES

72 01 4b 46 7f ff 0e 10 57 t=23125

Αυτά που διαβάσαμε από την γραμμή των εντολών μπορούμε τώρα να τα εμφανίσουμε μέσα από ένα πρόγραμμα της  python για να έχουμε μια περιοδική εμφάνιση της θερμοκρασίας αυτόματα.

πρόγραμμα σε Python

Στις πρώτες εντολές εισάγουμε τις πρώτες modules: os που μας επιτρέπει να ενεργοποιήσουμε το οδηγό 1-Wire  και την διασύνδεσή με τον αισθητήρα μας, και η time που επιτρέπει στο Raspberry Pi να ορίσει το χρόνο, και να ενεργοποιειθεί η χρήση των χρονικών περιόδων μέσα στον κώδικα.

import os

import time

Φορτώνουμε τους οδηγούς:

os.system('modprobe w1-gpio')

os.system('modprobe w1-therm')

Επόμενο βήμα ορίζουμε που είναι το αρχείο εξόδου του αισθητηρίου μας εφόσον έχουμε σιγουρευθεί για την ονομασία του αρχείου με την χρήση των εντολών γραμμής.

temp_sensor = ‘sys/bus/w1/devices/28-000005e2fdc3/w1_slave’

Χρειαζόμαστε μια μεταβλητή για να αποθηκεύουμε την τιμή της θερμοκρασίας (temp_raw); μαζί με τις 2 γραμμές που εμφανίστηκαν από τον αισθητήρα. Ωστόσο ασ μπούμε στην διαδικασία να εμφανίσουμε κάτι πιο προσιτό. Έτσι ανοίγουμε, διαβάζουμε, καταγράφουμε, και κλείνουμε το αρχείο μας. Χρησιμοποιούμε και την εντολή return function για να επανακαλέσουμε αυτά τα δεδομένα σε επόμενη σκηνή μέσα στο κώδικα του προγράμματός μας.

def temp_raw():

    f = open(temp_sensor, 'r')

    lines = f.readlines()

    f.close()

    return lines

Πρώτα τσεκάρουμε αν η μεταβλητή μας από την προηγούμενη λειτουργία έχει κάποιο λάθος. Εάν θυμηθείτε το αποτέλεσμα που είχαμε από τις εντολές που δώσαμε στην γραμμή εντολών είχαμε πάρει 2 γραμμές κώδικα

(Line 0 = 72 01 4b 46 7f ff 0e 10 57 : crc=57 YES);

Κάνουμε strip αυτή την γραμμή εκτός από τα 3 τελευταία ψηφία και τσεκάρουμε για την λέξη “YES” που μας δείχνει ότι έχει γίνει μια επιτυχείς καταγραφή θερμοκρασία από τον αισθητήρα. Στην Python, not-equal ορίζεται ως “!=”, Έτσι με την εντολή while αν δεν έχουμε YES, sto τέλος της γραμμής επιβάλλουμε μικρή  καθυστέρηση για 0.2sec και επαναλαμβάνουμε.

def read_temp():

    lines = temp_raw()

    while lines[0].strip()[-3:] != 'YES':

        time.sleep(0.2)

        lines = temp_raw()

Όταν βρεθεί η λέξη YES το πρόγραμμμα προχωράει να ελέγξει την δεύτερη γραμμή

(Line 1 = 72 01 4b 46 7f ff 0e 10 57 t=23125).

Βρίσκουμε την θερμοκρασία μας μετά την μεταβλητή “t=”, την τσεκάρουμε για τυχόν λάθη, κάνουμε και εδώ strip την γραμμή μέχρι τα σύμβολα “t=” και κρατάμε τα νουμερα της θερμοκρασίας, κάνουμε 2 υπολογισμούς και δίνουμε τιμές θερμοκρασίας σε βαθμούς κελσίου και φαρενάιτ.

    temp_output = lines[1].find('t=')

    if temp_output != -1:

        temp_string = lines[1].strip()[temp_output+2:]

        temp_c = float(temp_string) / 1000.0

        temp_f = temp_c * 9.0 / 5.0 + 32.0

        return temp_c, temp_f

Τέλος κάνουμε επανάληψη της διαδικασίας και εμφανίζουμε την θερμοκρασία κάθε 1 δευτερόλεπτο.

while True:

        print(read_temp())

        time.sleep(1)

 

Αποθηκεύουμε το πρόγραμμα με το όνομα temp_2.py, και τρέχουμε τον κώδικα για να εμφανιστεί η θερμοκρασία μας :

sudo python temp_2.py

DS18B20+ αισθητήρες μπορούν να συνδεθούν παράλληλα, και να προσπελαθούν οι μοναδικά σειριακοί φακελοί τους. Το Python προγραμμά μας μπορεί να τροποποιηθεί και να εμφανίζει όλες τις θερμοκρασίες από όλους τους αισθητήρες.

 

Προσθήκη νέου σχολίου


Κωδικός ασφαλείας
Ανανέωση