Πίνακας περιεχομένων:
2025 Συγγραφέας: John Day | [email protected]. Τελευταία τροποποίηση: 2025-01-13 06:57
Αυτή τη φορά θα κατασκευάσουμε έναν θερμοστάτη βασισμένο στο Arduino, αισθητήρα θερμοκρασίας και ρελέ. Μπορείτε να βρείτε στο github
Βήμα 1: Διαμόρφωση
Ολόκληρη η διαμόρφωση αποθηκεύεται στο Config.h. Μπορείτε να αλλάξετε τα PIN που ελέγχουν τα ρελέ, τη θερμοκρασία ανάγνωσης, τα κατώφλια ή τους χρονισμούς.
Βήμα 2: Διαμόρφωση ρελέ
Ας υποθέσουμε ότι θα θέλαμε να έχουμε 3 ρελέ:
- ID: 0, PIN: 1, Σημείο ρύθμισης θερμοκρασίας: 20
- ID: 1, PIN: 10, Σημείο ρύθμισης θερμοκρασίας: 30
- ID: 2, PIN: 11, Σημείο ρύθμισης θερμοκρασίας: 40
Πρώτα πρέπει να βεβαιωθείτε ότι το PIN της επιλογής σας δεν έχει ήδη ληφθεί. Όλες οι ακίδες μπορούν να βρεθούν στο Config.h, ορίζονται από μεταβλητές που ξεκινούν με DIG_PIN.
Πρέπει να επεξεργαστείτε το Config.h και να διαμορφώσετε τους κωδικούς PIN, τα όρια και τον αριθμό των ρελέ. Προφανώς ορισμένες ιδιότητες υπάρχουν ήδη, οπότε πρέπει απλώς να τις επεξεργαστείτε.
const στατικό uint8_t DIG_PIN_RELAY_0 = 1; const στατικό uint8_t DIG_PIN_RELAY_1 = 10; const static uint8_t DIG_PIN_RELAY_2 = 11;
const static uint8_t RELAYS_AMOUNT = 3;
const static int16_t RELAY_TEMP_SET_POINT_0 = 20;
const static int16_t RELAY_TEMP_SET_POINT_1 = 30; const static int16_t RELAY_TEMP_SET_POINT_2 = 40;
Τώρα πρέπει να εγκαταστήσουμε ρελέ και ελεγκτή, αυτό συμβαίνει στο RelayDriver.cpp
initRelayHysteresisController (0, DIG_PIN_RELAY_0, RELAY_TEMP_SET_POINT_0); initRelayHysteresisController (1, DIG_PIN_RELAY_1, RELAY_TEMP_SET_POINT_1); initRelayHysteresisController (2, DIG_PIN_RELAY_2, RELAY_TEMP_SET_POINT_2);
xxx
Βήμα 3: Ελεγκτής υστέρησης
Είναι αυτό που επιλέχθηκε στο παραπάνω παράδειγμα, έχει λίγες πρόσθετες διαμορφώσεις:
const static uint32_t RELAY_DELAY_AFTER_SWITCH_MS = 300000; // 5 λεπτά σταθερή uint32_t RHC_RELAY_MIN_SWITCH_MS = 3600000.
Το RELAY_DELAY_AFTER_SWITCH_MS δίνει χρόνο αναμονής για την αλλαγή του επόμενου ρελέ. Φανταστείτε ότι η διαμόρφωση από το παράδειγμά μας θα ξεκινούσε να λειτουργεί σε περιβάλλον 40 μοιρών. Αυτό θα είχε ως αποτέλεσμα την ενεργοποίηση και των τριών ρελέ ταυτόχρονα. Αυτό θα μπορούσε τελικά να οδηγήσει σε υψηλή κατανάλωση ενέργειας - ανάλογα με το τι ελέγχετε, ο ηλεκτρικός κινητήρας, για παράδειγμα, καταναλώνει περισσότερη ισχύ κατά την εκκίνηση. Στην περίπτωσή μας, τα ρελέ μεταγωγής έχουν την ακόλουθη ροή: το πρώτο ρελέ πηγαίνει, περιμένετε 5 λεπτά, το δεύτερο συνεχίζεται, περιμένετε 5 λεπτά, το τρίτο συνεχίζεται.
Το RHC_RELAY_MIN_SWITCH_MS ορίζει την υστέρηση, είναι η ελάχιστη συχνότητα για συγκεκριμένο ρελέ να αλλάξει την κατάστασή του. Μόλις ενεργοποιηθεί, θα παραμείνει ενεργοποιημένο για τουλάχιστον αυτό το χρονικό διάστημα, αγνοώντας τις αλλαγές θερμοκρασίας. Αυτό είναι ήσυχο χρήσιμο όταν ελέγχετε ηλεκτρικούς κινητήρες, καθώς κάθε διακόπτης έχει αρνητικό αντίκτυπο στον χρόνο ζωής.
Βήμα 4: Ελεγκτής PID
Αυτό είναι προχωρημένο θέμα. Η εφαρμογή ενός τέτοιου ελεγκτή είναι απλή εργασία, η εύρεση των σωστών ρυθμίσεων πλάτους είναι διαφορετική ιστορία.
Για να χρησιμοποιήσετε τον ελεγκτή PID πρέπει να αλλάξετε το initRelayHysteresisController (…..) σε initRelayPiDController (….) Και πρέπει να βρείτε τις σωστές ρυθμίσεις για αυτό. Ως συνήθως, θα τα βρείτε στο Config.h
Έχω εφαρμόσει απλό προσομοιωτή στην Java, έτσι ώστε να είναι δυνατή η οπτικοποίηση των αποτελεσμάτων. Μπορεί να βρεθεί στο φάκελο: pidsimulator. Παρακάτω μπορείτε να δείτε προσομοιώσεις για δύο ελεγκτές Το PID a P. PID δεν είναι απόλυτα σταθερό επειδή δεν εφάρμοσα κανέναν εξελιγμένο αλγόριθμο για να βρω σωστές τιμές.
Και στα δύο οικόπεδα η απαιτούμενη θερμοκρασία έχει οριστεί σε 30 (μπλε). Η τρέχουσα θερμοκρασία υποδεικνύει τη γραμμή ανάγνωσης. Το ρελέ έχει δύο καταστάσεις ON και OFF. Όταν είναι ενεργοποιημένη η θερμοκρασία μειώνεται κατά 1,5, όταν είναι απενεργοποιημένη αυξάνεται κατά 0,5.
Βήμα 5: Λεωφορείο μηνυμάτων
Διαφορετικές ενότητες λογισμικού πρέπει να επικοινωνούν μεταξύ τους, ελπίζουμε όχι με τους δύο τρόπους.)
Για παράδειγμα:
- η ενότητα στατιστικών πρέπει να γνωρίζει πότε ο συγκεκριμένος ρελέ ενεργοποιείται και απενεργοποιείται,
- το πάτημα ενός κουμπιού πρέπει να αλλάξει το περιεχόμενο της οθόνης και επίσης να αναστείλει τις υπηρεσίες που θα κατανάλωναν πολλούς κύκλους CPU, για παράδειγμα ανάγνωση θερμοκρασίας από τον αισθητήρα,
- μετά από κάποιο χρονικό διάστημα η ένδειξη θερμοκρασίας πρέπει να ανανεωθεί,
- και ούτω καθεξής….
Κάθε ενότητα συνδέεται με το Bus Bus και μπορεί να εγγραφεί για συγκεκριμένα συμβάντα και μπορεί να παράγει οποιαδήποτε συμβάντα (πρώτο διάγραμμα).
Στο δεύτερο διάγραμμα μπορούμε να δούμε τη ροή συμβάντων πατώντας το κουμπί.
Ορισμένα στοιχεία έχουν κάποιες εργασίες από όσες πρέπει να εκτελούνται περιοδικά. Θα μπορούσαμε να καλέσουμε τις αντίστοιχες μεθόδους τους από τον κύριο βρόχο, αφού έχουμε το Bus Bus είναι απαραίτητο μόνο να διαδώσουμε το σωστό συμβάν (τρίτο διάγραμμα)
Βήμα 6: Libs
- https://github.com/maciejmiklas/Thermostat
- https://github.com/milesburton/Arduino-Temperature…
- https://github.com/maciejmiklas/ArdLog.git