Πίνακας περιεχομένων:

Arduino 3 σε 1 Ένδειξη χρόνου και καιρού: 11 βήματα
Arduino 3 σε 1 Ένδειξη χρόνου και καιρού: 11 βήματα

Βίντεο: Arduino 3 σε 1 Ένδειξη χρόνου και καιρού: 11 βήματα

Βίντεο: Arduino 3 σε 1 Ένδειξη χρόνου και καιρού: 11 βήματα
Βίντεο: Home Automation: 12V Relay with LED Display Delay 0.1 seconds to 999 seconds Timer module P1 to P4 2024, Νοέμβριος
Anonim

Ακολουθήστε περισσότερα από τον συγγραφέα:

Χρησιμοποιώντας το ATtiny85
Χρησιμοποιώντας το ATtiny85
Χρησιμοποιώντας το ATtiny85
Χρησιμοποιώντας το ATtiny85
Pi Powered Pie Partitioning and Polygon Pruning Tool
Pi Powered Pie Partitioning and Polygon Pruning Tool
Pi Powered Pie Partitioning and Polygon Pruning Tool
Pi Powered Pie Partitioning and Polygon Pruning Tool
Digitalηφιακά χειριστήρια για χειροκίνητο ενισχυτή ήχου
Digitalηφιακά χειριστήρια για χειροκίνητο ενισχυτή ήχου
Digitalηφιακά χειριστήρια για χειροκίνητο ενισχυτή ήχου
Digitalηφιακά χειριστήρια για χειροκίνητο ενισχυτή ήχου

Μου αρέσουν οι μικροελεγκτές PIC και μου αρέσει ο προγραμματισμός στη γλώσσα συναρμολόγησης. Στην πραγματικότητα, τα τελευταία δύο χρόνια, έχω δημοσιεύσει περίπου 40 έργα στον ιστότοπό μου με βάση αυτόν τον συνδυασμό. Πρόσφατα παρήγγειλα κάποια ανταλλακτικά από έναν από τους αγαπημένους μου προμηθευτές στις ΗΠΑ και εντόπισα ένα Arduino Nano, με καλώδιο προγραμματισμού, για μόλις 1,20 $ περισσότερα από ένα γυμνό τσιπ επεξεργαστή ATMEGA328. Έτσι αγόρασα μερικά από αυτά. Στη συνέχεια, κατέβασα το Arduino IDE και ξεσκάλισα τη μνήμη του προγραμματισμού ‘C ++’.

Αυτό το έργο είναι ένας συνδυασμός ενός ρολογιού που χρησιμοποιεί GPS για χρονισμό και ενός δέκτη RF που αποκωδικοποιεί μηνύματα καιρού από έναν κοινό αισθητήρα AcuRite. Το αποτέλεσμα είναι μια μικρή κλίμακα ένδειξης χρόνου και θερμοκρασίας. Το ρολόι GPS και οι ρουτίνες καιρού έχουν ρυθμιστεί ως ξεχωριστά αρχεία, ώστε να είναι εύκολο να μπείτε στην κύρια ρουτίνα και να το ρυθμίσετε ώστε να κάνει μόνο τη λειτουργία ρολογιού ή απλώς τη λειτουργία του καιρού. Απλώς σχολιάστε το κατάλληλο "#define" στην κορυφή της κύριας ρουτίνας εάν θέλετε μόνο μία από τις λειτουργίες.

Εάν χρησιμοποιούνται και οι δύο λειτουργίες, τότε η επάνω γραμμή της οθόνης LCD εμφανίζει την τοπική ώρα και η κάτω γραμμή της οθόνης LCD εμφανίζει την υγρασία και τη θερμοκρασία τόσο στους Κελσίου όσο και στους Φαρενάιτ. Εάν χρησιμοποιείται μόνο η λειτουργία ρολογιού, τότε η επάνω γραμμή εμφανίζει την τοπική ώρα και η κάτω γραμμή εμφανίζει το UTC. Εάν χρησιμοποιείται μόνο η συνάρτηση καιρού, τότε στην επάνω γραμμή εμφανίζεται ο πρώτος αισθητήρας που λαμβάνεται και στην κάτω γραμμή εμφανίζεται οποιοσδήποτε άλλος αισθητήρας που λαμβάνεται. Πρόσθεσα αυτή τη δυνατότητα επειδή έχω δύο αισθητήρες καιρού.

Βήμα 1: Αισθητήρας καιρού

Αισθητήρας καιρού
Αισθητήρας καιρού
Αισθητήρας καιρού
Αισθητήρας καιρού
Αισθητήρας καιρού
Αισθητήρας καιρού

Ο αισθητήρας καιρού AcuRite που χρησιμοποιείται εδώ στέλνει πληροφορίες θερμοκρασίας και υγρασίας κάθε 16 δευτερόλεπτα. Στο πίσω μέρος εμφανίζει αριθμό μοντέλου 000592TXR αλλά συνήθως διαφημίζεται ως μοντέλο 06002M. Αυτός ο αισθητήρας χρησιμοποιείται από πολλά διαφορετικά μοντέλα μετεωρολογικών σταθμών, οπότε είναι εύκολο να βρεθεί και μπόρεσα να τα αποκτήσω στο eBay για κάτω από $ 20. Το AcuRite πωλεί παρόμοιους αισθητήρες για μερικούς από τους μετεωρολογικούς σταθμούς τους, αλλά αυτοί μπορεί ή όχι να τηρούν το ίδιο πρωτόκολλο επικοινωνίας. Υπάρχει κάποια ένδειξη στον ιστό ότι ο αισθητήρας 00606 μόνο για τη θερμοκρασία χρησιμοποιεί την ίδια μορφή μηνύματος αλλά με μη έγκυρο byte υγρασίας.

Όπως φαίνεται στην πρώτη κυματομορφή που φαίνεται παραπάνω, τα μηνύματα καιρού αποστέλλονται σε ριπές με κενό 2 ms μεταξύ των διαδοχικών μηνυμάτων. Η δεύτερη κυματομορφή που φαίνεται παραπάνω επεκτείνει μέρος ενός μηνύματος για να δει τις διάρκειες και τα μοτίβα των δυαδικών ψηφίων. Υπάρχουν τέσσερα bits συγχρονισμού που είναι περίπου 600us υψηλά και ακολουθούν 600us χαμηλά. Τα δυαδικά ψηφία δεδομένων αντιπροσωπεύονται από 400us υψηλό ακολουθούμενο από 200us χαμηλό (1) ή 200us υψηλό ακολουθούμενο από 400us χαμηλό (0).

Η μορφή του μηνύματος αποτελείται από 7 byte δεδομένων. Τα δύο πρώτα byte είναι το αναγνωριστικό αισθητήρα και αυτά δεν αλλάζουν (δηλαδή: δεν χρησιμοποιεί κυλιόμενο κώδικα). Το τελευταίο byte είναι ένα απλό πρόσθετο άθροισμα ελέγχου των πρώτων έξι byte. Το τρίτο byte είναι ένας δείκτης στάθμης μπαταρίας και πρέπει να είναι πάντα 44 hex εάν η μπαταρία είναι καλή. Το τέταρτο byte είναι η υγρασία και είναι μια μη κλιμακωτή τιμή μεταξύ 0 και 99. Είναι σημαντικό να έχετε κατά νου ότι το πιο σημαντικό bit των byte 4, 5 και 6 είναι ένα bit ισοτιμίας και δεν αποτελεί μέρος της μέτρησης αξίες. Τα Bytes 5 και 6 είναι η κλιμακούμενη θερμοκρασία (Κελσίου) με τα κάτω 4 bits του byte 5 να συνδέονται με τα κάτω 7 bit του byte 6 για να σχηματίσουν μια τιμή 11-bit. Η θερμοκρασία αντιπροσωπεύεται πάντα ως θετικός αριθμός και γίνεται αρνητική μόνο όταν εφαρμόζεται η κλιμάκωση. Η κλίμακα είναι (C / 10) - 100. Η διαίρεση με το 10 απαιτείται επειδή η ανάλυση της θερμοκρασίας είναι στα δέκατα του βαθμού. Η αφαίρεση απαιτείται επειδή ο αισθητήρας προσθέτει 100 για να διατηρήσει τη μεταδιδόμενη τιμή θετική.

Βήμα 2: Δέκτης RF

Δέκτης RF
Δέκτης RF
Δέκτης RF
Δέκτης RF

Η μονάδα RF που χρησιμοποιώ για αυτό το έργο είναι η RXB6. Είναι ένας υπερ -ετεροδενικός δέκτης σε αντίθεση με τους λιγότερο επιθυμητούς υπερ -αναγεννητικούς δέκτες. Αν κοιτάξετε τις φθηνές μονάδες RF εκεί έξω, θα διαπιστώσετε ότι οι πλακέτες πομπού και δέκτη είναι συχνά συνδυασμένες. Οι περισσότεροι από αυτούς τους δέκτες είναι εξαιρετικά αναγεννητικοί τύποι, οπότε τείνουν να έχουν πολύ χαμηλότερα χαρακτηριστικά απόδοσης (συμπεριλαμβανομένης της εμβέλειας) από τους υπερ -ετεροδυνικούς δέκτες. Χρειαζόμαστε μόνο τη μονάδα δέκτη για αυτό το έργο επειδή θα λαμβάνουμε σήματα από έναν πομπό αισθητήρα καιρού.

Βήμα 3: Κεραίες RF

Κεραίες RF
Κεραίες RF

Το RXB6 δεν έρχεται με κεραία. Μπορείτε να αγοράσετε μερικά ελικοειδή αρκετά φθηνά, αλλά είναι επίσης εύκολο να φτιάξετε τη δική σας κεραία. Στην πραγματικότητα, ένα καλώδιο βραχυκυκλωτήρα θα μπορούσε να γλιστρήσει στον πείρο κεραίας της μονάδας εάν δεν θέλετε να γίνετε πολύ φανταχτερός. Ιδανικά, μια κεραία ευθείας σύρματος θα έχει μήκος κύματος 1/4 το οποίο θα φτάνει τις 6,8 ίντσες. Αρχικά έκανα το καλώδιο του jumper και δεν είχα κανένα πρόβλημα να παραλάβω τον εξωτερικό μου αισθητήρα, παρόλο που το εργαστήριο ηλεκτρονικών μου βρίσκεται στο υπόγειό μου.

Μια άλλη πιθανότητα είναι να φτιάξετε τη δική σας ελικοειδή κεραία. Υπάρχει μια ποικιλία σχεδίων για αυτό στον ιστό, αλλά αυτό που φαίνεται στην παραπάνω εικόνα είναι αυτό που έφτιαξα. Χρησιμοποίησα ένα συμπαγές καλώδιο πυρήνα από ένα θραύσμα καλωδίου Ethernet και το έστρεψα γύρω από το λείο άκρο ενός τρυπανιού 5/32 ιντσών. Αφήστε τη μόνωση εκτός από την άκρη που συγκολλάται στην πλακέτα RF. Θα χρειαστείτε 20 στροφές. Μπορείτε επίσης να χρησιμοποιήσετε ένα τρυπάνι 7/32 ιντσών και να τυλίξετε αντ 'αυτού 17 στροφές. Οποιοδήποτε από αυτά πιθανότατα θα λειτουργήσει καλά για τις περιοχές που πιθανόν να έχετε για τους αισθητήρες σας. Το πραγματικό κλειδί είναι να έχεις έναν καλό δέκτη RF για αρχή. Οι αισθητήρες AcuRite έχουν επίσης αρκετά ισχυρούς πομπούς.

Βήμα 4: Πρωτόκολλο επικοινωνίας RF

Υπάρχουν μερικές διαφορετικές τεχνικές διαμόρφωσης για τη μετάδοση δεδομένων, αλλά αυτοί οι αισθητήρες χρησιμοποιούν την απλούστερη που είναι η OOK (ενεργοποίηση-απενεργοποίηση-κλειδί) ή ASK (εύρος-αλλαγή-κλειδί). Δεδομένου ότι έχουμε να κάνουμε με bit δεδομένων 0/1 σε αυτό το παράδειγμα, το πλάτος είναι πλήρες ενεργοποιημένο ή σβηστό. Έτσι, για τους σκοπούς μας, το OOK και το ASK είναι τα ίδια επειδή το OOK σημαίνει ότι ο φορέας RF είναι είτε ενεργοποιημένος είτε απενεργοποιημένος. Η μορφή μηνύματος καθορίζεται γενικά από τον κατασκευαστή της συσκευής εκπομπής και μπορεί να χρησιμοποιήσει σχεδόν οποιοδήποτε ρυθμό μετάδοσης, οποιοδήποτε στυλ μορφοποίησης bit και οποιοδήποτε μήκος μηνύματος. Η ζώνη 433-MHz είναι γεμάτη με εκπομπές για πράγματα όπως έξυπνοι μετρητές κ.λπ., οπότε το λογισμικό πρέπει να ρυθμιστεί ώστε να φιλτράρει μόνο τη μορφή μηνύματος που θέλουμε να χρησιμοποιήσουμε.

Βήμα 5: Δεδομένα χρόνου

Δεδομένα χρόνου
Δεδομένα χρόνου

Χρησιμοποιώ μια φτηνή μονάδα GPS για να λάβω ακριβή δεδομένα χρόνου που θα επανεκκινηθούν αυτόματα μετά από διακοπή ρεύματος. Έχω αρκετές μονάδες GPS (χωρίς οθόνες) που βγάζουν τις τυπικές προτάσεις NMEA αλλά η μικρότερη και φθηνότερη από τις μονάδες που έχω είναι η NEO-6M. Η μονάδα NEO-6M είναι εύκολη στη διασύνδεση με το Arduino επειδή χρησιμοποιεί σειριακή θύρα επιπέδου TTL. Η μόνη πραγματική διαφορά είναι ότι το πρότυπο NMEA καθορίζει σειριακό ρυθμό baud 4800, αλλά το NEO-6M προεπιλογή είναι 9600 baud. Μπορείτε να εκτελέσετε το δωρεάν πρόγραμμα "u-center" για να αλλάξετε το ρυθμό baud, αλλά το άφησα στην προεπιλεγμένη εργοστασιακή ρύθμιση. Υπάρχει επίσης ένα δωρεάν βοηθητικό πρόγραμμα που ονομάζεται GPSInfo (εκδόθηκε από την Globalsat) και είναι πολύ βολικό για την προβολή πληροφοριών GPS στον υπολογιστή. Μπορείτε να συνδέσετε τη μονάδα GPS σε ένα τυπικό καλώδιο USB σε TTL για να το ελέγξετε ή για να το ρυθμίσετε χρησιμοποιώντας υπολογιστή. Λάβετε υπόψη ότι το τσιπ GPS στην μονάδα λειτουργεί στην πραγματικότητα στα 3,3 βολτ (μέσω ενσωματωμένου ρυθμιστή τάσης), οπότε αν θέλετε να συνδεθείτε στη θύρα RXD θα πρέπει να μετατοπίσετε το επίπεδο από τα 5 βολτ. Η θύρα TXD μπορεί να συνδεθεί απευθείας με το Arduino ή τον υπολογιστή.

Βήμα 6: Ζώνες ώρας

Η εμφάνιση του χρόνου GPS είναι εύκολη υπόθεση, αρκεί να θέλετε να εμφανίσετε το UTC (Συντονισμός καθολικής ώρας). Οι προτάσεις NMEA αποτελούνται από χαρακτήρες ASCII που μπορούν να εξάγονται απευθείας στην οθόνη LCD. Το χρονικό τμήμα είναι σε μορφή HHMMSS. FF (ώρες, λεπτά, δευτερόλεπτα και κλασματικά δευτερόλεπτα). Για το ρολόι μας, το κλασματικό μέρος δεν είναι χρήσιμο, οπότε το μόνο που χρειάζεται να αντιμετωπίσουμε είναι έξι χαρακτήρες. Το πρόβλημα είναι ότι πρέπει στη συνέχεια να μετατραπεί στην τοπική ώρα σας και σε 12ωρη μορφή AM/PM εάν το θέλετε. Αλλά μερικές φορές τα προβλήματα είναι αυτά που κάνουν τη ζωή ενδιαφέρουσα, έτσι είναι αυτό που πραγματικά αφορά αυτό το τμήμα του λογισμικού.

Όσον αφορά τις ζώνες ώρας, ίσως σκεφτείτε ότι θα υπήρχαν απλώς 24 από αυτές με 12 από αυτές ανατολικά της θέσης UTC (+ ζώνες) και 12 από αυτές δυτικά της θέσης UTC (- ζώνες). Στην πραγματικότητα, υπάρχουν μερικές περίεργες ώρες που είναι κλασματικές ώρες και ένα ζευγάρι που υπερβαίνει το «όριο» των 12 ωρών. Εάν τυχαίνει να ζείτε σε μία από αυτές τις περιοχές ζητώ συγγνώμη γιατί το λογισμικό μου αντιπροσωπεύει μόνο τις 24ωρες ζώνες ολόκληρης της ώρας. Υπάρχουν επίσης μερικοί από εμάς που χρησιμοποιούμε θερινή ώρα μέρος του έτους, αλλά αυτό δεν υπολογίζεται αυτόματα στο λογισμικό. Αυτό θα απαιτούσε έναν πίνακα αναζήτησης μελλοντικών ημερομηνιών, επιπλέον πολυπλοκότητα στο λογισμικό και την ανάγκη ενημέρωσης του λογισμικού εάν άλλαζαν οι εβδομάδες του έτους για τη μετάβαση. Αντ 'αυτού, το υλικό χρησιμοποιεί έναν στιγμιαίο διακόπτη επαφής για εύκολη ρύθμιση της ζώνης ώρας (μετατόπιση UTC).

Βήμα 7: Σχηματικό

Σχηματικός
Σχηματικός

Το σχήμα φαίνεται παραπάνω και περιλαμβάνει τις συνδέσεις για 4-bit 1602 LCD interface. Τα σειριακά δεδομένα από τον δέκτη RF είναι σε ψηφιακά λογικά επίπεδα, ώστε να συνδέονται απευθείας με έναν από τους ακροδέκτες εισαγωγής δεδομένων Arduino. Η καρφίτσα έχει ρυθμιστεί στο λογισμικό για να εκτελεί μια λειτουργία διακοπής-αλλαγής, έτσι ώστε να μπορούμε να μετρήσουμε τα πλάτη των παλμών. Η έξοδος GPS TXD συνδέεται απευθείας με την είσοδο Arduino RX.

Χρησιμοποιούνται δύο διακόπτες. Όπως αναφέρθηκε προηγουμένως, ένας στιγμιαίος διακόπτης επαφής επιτρέπει τη ρύθμιση της μετατόπισης UTC. Ο διακόπτης μπορεί να πατηθεί ανά πάσα στιγμή για να μεταβείτε στη λειτουργία ρύθμισης. Αρχικά, η οθόνη θα εμφανίσει μη έγκυρη μετατόπιση UTC "+77". Ανατρέξτε στην ενότητα "Λογισμικό ρολογιού" για οδηγίες ρύθμισης μετατόπισης UTC.

Ο δεύτερος διακόπτης είναι ένας απλός διακόπτης on/off. Στη θέση "απενεργοποίηση" ο χρόνος θα εμφανίζεται σε μορφή 12 ωρών (ΠΜ/ΜΜ) και στη θέση "ενεργοποιημένος" ο χρόνος θα εμφανίζεται σε μορφή 24 ωρών. Αυτός ο διακόπτης μπορεί να αλλάξει ανά πάσα στιγμή για εναλλαγή μεταξύ μορφών.

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

Βήμα 8: Λογισμικό LCD

Τείνω να χρησιμοποιώ έναν από τους δύο τύπους διεπαφών LCD. Το ένα είναι η τυπική διασύνδεση 4-bit και το άλλο είναι μια διεπαφή 3-καλωδίων που χρησιμοποιεί έναν καταχωρητή αλλαγής. Σχεδίασα αυτήν τη διεπαφή όταν δούλευα με μικρούς μικροελεγκτές PIC που είχαν περιορισμένο αριθμό ακίδων εισόδου/εξόδου. Χρησιμοποίησα τη διεπαφή 4-bit για αυτό το έργο, αλλά έχω το δικό μου αρχείο LCD, αντί για τη γενική βιβλιοθήκη Arduino LCD. Αυτό μειώνει την κατανάλωση μνήμης και την πολυπλοκότητα του κώδικα και επίσης μου επιτρέπει να τροποποιήσω τον κώδικα για συγκεκριμένα έργα όπως αυτό.

Βήμα 9: Λογισμικό ρολογιού

Η μονάδα GPS εξάγει τυπικές προτάσεις NMEA-0183 που είναι συμβολοσειρές ASCII που περιέχουν μια ποικιλία πληροφοριών. Για αυτήν την εφαρμογή επέλεξα την πρόταση GGA για να λάβω τις πληροφορίες χρόνου, επειδή αυτή είναι η πρόταση που χρησιμοποίησα για ένα προηγούμενο έργο GPS. Τα πεδία πληροφοριών στις προτάσεις NMEA διαχωρίζονται με κόμματα, οπότε, αφού εντοπιστεί η κεφαλίδα της πρότασης GGA, το λογισμικό κανονικά υπολογίζει κόμματα και καλεί την κατάλληλη ρουτίνα για κάθε επιθυμητό πεδίο πληροφοριών GPS. Μόνο οι πληροφορίες χρόνου χρειάζονται εδώ και αυτό είναι στο πεδίο μετά το πρώτο κόμμα, οπότε δεν απαιτείται καταμέτρηση.

Τα έξι ψηφία χρόνου (HHMMSS) αποθηκεύονται σε buffer και στη συνέχεια υποβάλλονται σε επεξεργασία αφού ληφθούν όλα αυτά. Το GPS μπορεί να εξάγει ορισμένα ημιτελή μηνύματα από νωρίς, οπότε η ρουτίνα αποθήκευσης επαληθεύει ότι κάθε χαρακτήρας είναι μια αριθμητική τιμή ASCII. Εάν ληφθεί κακός χαρακτήρας, το μήνυμα απορρίπτεται. Αυτό μπορεί επίσης να συμβεί σε σπάνιες περιπτώσεις κατά τη διάρκεια της κανονικής λειτουργίας, ιδιαίτερα εάν η επικοινωνία σειριακής θύρας πέσει λίγο. Το έχω δει μόνο μία φορά και το μόνο που συνέβη είναι ότι ο χρόνος σταμάτησε για ένα δευτερόλεπτο και στη συνέχεια πήδηξε δύο δευτερόλεπτα αντί για ένα.

Εάν το λογισμικό έχει ρυθμιστεί να εμφανίζει μόνο την ώρα, τότε η πρώτη γραμμή της οθόνης LCD θα εμφανίζει την τοπική ώρα και η δεύτερη γραμμή θα εμφανίζει το UTC. Για το UTC το λογισμικό απλώς στέλνει τους χαρακτήρες ASCII απευθείας στη ρουτίνα εμφάνισης, με άνω και κάτω τελεία (:) να έχουν εισαχθεί κατάλληλα.

Για να μετατρέψετε το UTC σε τοπική ώρα, πρέπει να εφαρμοστεί η μετατόπιση UTC (ζώνη ώρας). Επειδή ο χρόνος UTC από το GPS είναι σε μορφή ASCII, το λογισμικό μετατρέπει τους χαρακτήρες ώρας ASCII σε δεκαδικό και στη συνέχεια προσθέτει τη μετατόπιση UTC. Η μετατόπιση UTC αποθηκεύεται ως θετική τιμή BCD με ένα bit πρόσημο, έτσι μετατρέπεται αρχικά σε ακέραιη τιμή και στη συνέχεια αρνείται εάν οριστεί το bit του σημείου. Μόλις υπολογιστεί η ώρα της τοπικής ώρας, χρησιμοποιείται ένας πίνακας αναζήτησης για τη μετατροπή του σε BCD και, στη συνέχεια, το BCD μετατρέπεται ξανά σε ASCII για εμφάνιση. Ο πίνακας αναζήτησης πρέπει να χειρίζεται τη μορφή UTC 24 ωρών καθώς και τις ζώνες ώρας +/- 12. Για να γίνει αυτό, οι χρόνοι UTC από 0000 έως 2300 καταλαμβάνουν τις μεσαίες 24 καταχωρήσεις στον πίνακα με 12 καταχωρίσεις πριν και 12 καταχωρήσεις μετά για να υπολογίσουν τις ζώνες ώρας. Ένας πίνακας είναι σε μορφή 12 ωρών, οπότε πρόσθεσα επίσης έναν πίνακα αναζήτησης για το τμήμα AM/PM της οθόνης. Ο άλλος πίνακας είναι σε 24ωρη μορφή. Όπως αναφέρθηκε προηγουμένως, ένας διακόπτης on/off επιτρέπει την επιλογή της μορφής 12 ωρών ή 24 ωρών.

Η ζώνη ώρας ανακτάται από το EEPROM κατά την αρχικοποίηση και εμφανίζεται σύντομα. Εάν δεν έχει ρυθμιστεί τουλάχιστον μία φορά, τότε καλείται η ρουτίνα ρύθμισης. Η ρουτίνα ρύθμισης μπορεί επίσης να κληθεί ανά πάσα στιγμή πατώντας το διακόπτη στιγμιαίας επαφής. Η ρουτίνα ρύθμισης θα αρχικοποιήσει την οθόνη σε "UTC OFFSET +77". Ένα σύντομο πάτημα του διακόπτη θα αλλάξει την τιμή σε "-00". Εάν απαιτείται θετική ζώνη ώρας, τότε ένα άλλο σύντομο πάτημα θα αλλάξει την τιμή σε "+00". Με ένα μακρύ πάτημα (> 1 δευτερόλεπτο) θα μετακινήσετε τη λειτουργία ρύθμισης στο επόμενο βήμα. Σε αυτό το σημείο κάθε σύντομο πάτημα αυξάνει την τιμή χρόνου έως το μέγιστο 12. Αφού φτάσετε στην επιθυμητή ζώνη ώρας, πατήστε και κρατήστε πατημένο το διακόπτη για περισσότερο από 1 δευτερόλεπτο και, στη συνέχεια, αφήστε τον. Στη συνέχεια, το λογισμικό θα αποθηκεύσει την τιμή UTC στο EEPROM και θα εμφανίσει για λίγο "OFFSET SAVED". Εάν κάνετε λάθος κατά την είσοδο, απλώς βγείτε και στη συνέχεια πατήστε ξανά το διακόπτη για να το επαναφέρετε.

Το NEO-6M δεν απαιτεί καλή διόρθωση θέσης για να εξάγει την ώρα, οπότε θα πρέπει να εξάγει μηνύματα μόλις λάβει έναν δορυφόρο. Μέχρι τότε η οθόνη θα γράφει "ΟΧΙ ΣΤΟΙΧΕΙΑ".

Βήμα 10: Λογισμικό καιρού

Ο μικροελεγκτής PIC έχει τη δυνατότητα να ενεργοποιεί/απενεργοποιεί έναν χρονοδιακόπτη χρησιμοποιώντας έναν εξωτερικό παλμό. Ο ίδιος παλμός εισόδου μπορεί επίσης να χρησιμοποιηθεί ως εξωτερική διακοπή για να σηματοδοτήσει ανάγνωση της διάρκειας του παλμού. Το Arduino δεν έχει αυτήν ακριβώς την ικανότητα, οπότε χρησιμοποίησα τη λειτουργία διακοπής-αλλαγής. Στο ένα άκρο του παλμού μηνύματος RF ο τρέχων χρόνος μικροδευτερολέπτου εξοικονομείται από τον χειριστή διακοπών. Στην αντίθετη άκρη ο χρόνος που έχει παρέλθει υπολογίζεται για να καθορίσει το πλάτος του παλμού.

Το λογισμικό έχει έναν ορισμό "DEBUG" που επιτρέπει την εμφάνιση της ακατέργαστης μορφής δεδομένων των ληφθέντων μηνυμάτων. Υπάρχει επίσης ένας ορισμός για τον καθορισμό του πείρου εισόδου Arduino για τη σειριακή ροή από τον δέκτη RF. Το λογισμικό έχει ρυθμιστεί για να υπολογίζει τις κατάλληλες ρυθμίσεις καταχωρητή διακοπής-αλλαγής βάσει αυτού του ορισμού. Ο υπολογισμός λειτουργεί μόνο για τις ψηφιακές ακίδες Arduino. Αντ 'αυτού θα μπορούσε να χρησιμοποιηθεί ένα αναλογικό pin, αλλά αυτό θα απαιτούσε σκληρή κωδικοποίηση των τιμών καταχωρητή.

Ο χειριστής διακοπής καθορίζει εάν η καταγεγραμμένη καταμέτρηση είναι αρκετά μεγάλη ώστε να είναι παλμός εκκίνησης. Όπως αναφέρθηκε προηγουμένως, το χάσμα μεταξύ πολλαπλών μηνυμάτων είναι 2ms, έτσι ακριβώς αυτό που αναζητά το λογισμικό. Λόγω όλης της κίνησης 433-MHz, η αρχική προβολή στο λογισμικό διασφαλίζει ότι ο μετρημένος χρόνος είναι τουλάχιστον 1,8ms αλλά όχι μεγαλύτερος από 2,4ms. Αφού εντοπιστεί η εκκίνηση, το λογισμικό αναζητά τα δυαδικά ψηφία συγχρονισμού (600us) και μετρά για να βεβαιωθεί ότι λαμβάνονται τέσσερα από αυτά. Μόλις περάσουν αυτές οι δοκιμές, το λογισμικό αναζητά τους κατάλληλους χρόνους δυαδικών ψηφίων 200us και 400us.

Τα ληφθέντα bit διαμορφώνονται σε byte και κάθε byte αποθηκεύεται. Αφού ληφθούν επτά byte, το άθροισμα ελέγχου μηνύματος επαληθεύεται πριν επιτραπεί περαιτέρω επεξεργασία. Εάν πρόκειται να εξάγονται ακατέργαστα byte (λειτουργία εντοπισμού σφαλμάτων), τότε τα byte μετατρέπονται σε χαρακτήρες ASCII και αποστέλλονται στην οθόνη LCD. Εάν επιθυμείτε έξοδο υγρασίας και θερμοκρασίας, τότε πραγματοποιούνται οι κατάλληλες μετατροπές.

Τα δύο byte δεδομένων Centigrade στο μήνυμα RF συνδυάζονται για να σχηματίσουν μια τιμή 11-bit. Το κάτω τμήμα μετατοπίζεται αριστερά ένα bit για να εξαλειφθεί το bit ισοτιμίας και να ευθυγραμμιστεί με τα bits στο άνω τμήμα. Τα δύο byte διαμορφώνονται σε μεταβλητή λέξης 16-bit και στη συνέχεια το όλο πράγμα μετατοπίζεται σωστά ένα bit για να πάρει την τελική ευθυγράμμιση bit. Η μεταβλητή λέξης στη συνέχεια μετατρέπεται σε μεταβλητή κυμαινόμενου σημείου για τους μαθηματικούς υπολογισμούς.

Ένα μεγάλο πλεονέκτημα της χρήσης του C ++ στη γλώσσα Arduino έναντι της συναρμολόγησης στο PIC είναι ότι απλοποιεί τους μαθηματικούς υπολογισμούς. Όπως αναφέρθηκε νωρίτερα, η μετατροπή Centigrade είναι (C / 10) -100. Το αποτέλεσμα μετατρέπεται σε συμβολοσειρά και αποστέλλεται στην οθόνη LCD για εμφάνιση. Ο υπολογισμός Φαρενάιτ είναι (C * 1.8) + 32. Το αποτέλεσμα μετατρέπεται ξανά σε συμβολοσειρά και αποστέλλεται στην οθόνη LCD για εμφάνιση. Και στις δύο περιπτώσεις, η μετατροπή συμβολοσειράς περιλαμβάνει το αρνητικό πρόσημο (εάν ενδείκνυται) και το δεκαδικό. Γίνεται έλεγχος για το δεκαδικό σημείο για να διασφαλιστεί ότι μόνο ένας χαρακτήρας μετά το δεκαδικό αποστέλλεται στην οθόνη. Αυτός ο έλεγχος είναι απαραίτητος επειδή η συμβολοσειρά μπορεί να κυμαίνεται από 3 έως 5 χαρακτήρες σε μήκος.

Έχω δύο αισθητήρες AcuRite, οπότε πρόσθεσα μια επιταγή στο λογισμικό για να διασφαλίσω ότι τα δεδομένα του ενός δεν αντικαθιστούν τα δεδομένα για το άλλο, εάν το λογισμικό έχει ρυθμιστεί να κάνει μόνο τη λειτουργία καιρού. Ο πρώτος αισθητήρας που λαμβάνεται μετά την ενεργοποίηση εμφανίζεται στη γραμμή 1 και ο άλλος εμφανίζεται στη γραμμή 2. Χρησιμοποιώντας τη λειτουργία εντοπισμού σφαλμάτων, μπορώ να δω ποιο είναι το αναγνωριστικό για κάθε αισθητήρα, ώστε να μπορώ να κάνω έναν απλό έλεγχο στον κώδικα εάν ήθελε να επεξεργαστεί δεδομένα από ένα από αυτά.

Το λογισμικό παρακολουθεί την κατάσταση της μπαταρίας (byte3) και εμφανίζει ένα μήνυμα εάν υποδηλώνει χαμηλή μπαταρία. Αυτό το μήνυμα αντικαθιστά όλα τα άλλα δεδομένα για αυτόν τον αισθητήρα.

Βήμα 11: Εμφανίζει

Οθόνες
Οθόνες
Οθόνες
Οθόνες
Οθόνες
Οθόνες

Ακολουθούν ορισμένα παραδείγματα οθονών για τις διάφορες λειτουργίες. Έχω μερικά άλλα Instructables, αλλά τα περισσότερα έργα μικροελεγκτών PIC μπορούν να βρεθούν στον ιστότοπό μου στη διεύθυνση: www.boomerrules.wordpress.com

Συνιστάται: