Αρχικά, ο θερμοστάτης κατασκευάστηκε απλά ως θερμόμετρο για τον έλεγχο της θερμοκρασίας έξω από το παράθυρο. Στη συνέχεια, κατά τους παγετούς, οι πατάτες άρχισαν να παγώνουν υπόγεια και προστέθηκε λειτουργικότητα για τον έλεγχο του μικροκλίματος. Δεδομένα διαβατηρίου του ρελέ μεταγωγής - 250V και 10A (2,5kW). Δεδομένου ότι η θερμότητα στο υπόγειο δεν είναι απαραίτητη, ένα δέκα ανά κιλοβάτ είναι αρκετό.
Απαραίτητα υλικά και εργαλεία:κουτί φροντίδας παπουτσιών
-USB-χρέωση για το τηλέφωνο (οποιαδήποτε, τουλάχιστον 0,7Α)
-
Arduino-Pro-Mini
-2 γραμμών οθόνη 8 χαρακτήρων (WH0802A-NGA-CT είναι πιο συμπαγής)
Κωδικοποιητής με ένα κουμπί (μπορεί να αγοραστεί σε οποιοδήποτε ραδιόφωνο mag, το κουμπί δεν μπορεί να είναι ενσωματωμένο)
-συλλογή με ρελέ 5V (αγόρασα μια δέσμη κινεζικών ρελέ χωρίς οπτική απομόνωση ταυτόχρονα, οπότε χρειαζόμουν ένα άλλο Optocoupler PC817 και μια αντίσταση 470 Ohm.Αν έχετε οπτική απομόνωση στην πινακίδα, μπορείτε να συνδέσετε την πινακίδα απευθείας στην θύρα arduino)
Υποδοχή USB
-2 Καλώδιο προέκτασης USB 3 μέτρων (το ένα για το καλώδιο τροφοδοσίας, ενώ στο δεύτερο θα συνδέσουμε το DS1820)
- DS1820 (με οποιοδήποτε γράμμα)
συγκολλητικό σίδερο
-πλάκα πυροβόλων
Πινακίδα ονόματος FTDI232
Βήμα 1: Πρώτα απ 'όλα, πρέπει να αναβοσβήνει το arduino, επειδή έχω ένα Pro Mini (πηγαίνει χωρίς μετατροπέα USB-RS232), πρέπει να κολλήσω ένα χάρακα με καρφίτσες στο arduino. Από την πλευρά όπου προέρχονται τα DTR, TXD, RXD, VCC, GND, GND. Τώρα συνδέστε τα FTDI232 DTR σε DTR, VCC σε VCC, GND σε GND, TXD σε RXD, RXD σε TXD. Εκτελέστε το arduino IDE, κατεβάστε το σκίτσο και αναβοσβήξτε το (σκίτσο στο τέλος).
Βήμα 2: Τώρα ας φροντίσουμε για το κύτος. Βγάζουμε το σφουγγάρι από το "FUKS", απολιπαίνουμε τα πάντα καλά, το βαθύ μέρος του κιβωτίου μπορεί να περάσει με ένα σφουγγαράκι (κάτι θα κολλήσει καλύτερα). Σημειώστε την οπή για τον κωδικοποιητή, το βύσμα USB (μητέρα) και την ίδια την οθόνη. Συνδέστε το ρελέ στο κάλυμμα του κιβωτίου. Πρέπει να προσπαθήσουμε να τοποθετήσουμε το ρελέ μακριά από τον επεξεργαστή και να οργανώσουμε τα εξαρτήματα έτσι ώστε το καπάκι να κλείσει αργότερα (υπάρχει αρκετός χώρος).
Βήμα 3: Τώρα βγάζουμε το καλώδιο προέκτασης USB, κόβουμε την υποδοχή σύνδεσης (μητέρα). Κόψτε το άκρο κοπής, τρυπήστε μια τρύπα για το καλώδιο στο σώμα, τοποθετήστε το και κόψτε το κλειδί με ένα όπλο. Επιπλέον, το καλώδιο έχει κόκκινο, μείον μαύρο (το ελέγχω απλώς), συν το συν του συνδέσμου, μείον το μείον (δεν δίνω το pinout του συνδετήρα - είναι στο Διαδίκτυο). Μεταξύ του πλεονεκτήματος του συνδέσμου και του 2 μέσου (έχω συνδεθεί), μια αντίσταση 4.7kOhm πρέπει να συγκολληθεί.
Βήμα 4: Λαμβάνουμε 2 καλώδια επέκτασης USB, κόψουμε το βύσμα (μητέρα), κόψουμε το καλώδιο. Σε κάθε περίπτωση, θα ελέγξουμε αν όλοι κολλήσαμε σωστά. Συνδέουμε το καλώδιο τροφοδοσίας με τη φόρτιση USB και στο δίκτυο, κολλάμε το κομμένο καλώδιο στη θύρα USB, κοιτάμε τον ελεγκτή + στο κόκκινο - σε μαύρο χρώμα. Τραβήξτε το καλώδιο και συνδέστε το DS1820: - στο 1, έως τα 3 υπόλοιπα 2 καλώδια στο 2. Στη συνέχεια επικαλύψτε την εποξειδική ένωση (για να επισκευάσετε τις δεξαμενές, τα θερμαντικά σώματα), αφήνοντας λίγο το περίβλημα του αισθητήρα προς τα έξω, έτσι ώστε να υπάρξει ταχύτερη αντίδραση στις αλλαγές θερμοκρασίας.Λοιπόν, κάνουμε την εγκατάσταση σύμφωνα με το διάγραμμα κυκλώματος (συνδέουμε την ισχύ και τη γείωση της πλάκας ρελέ με τα κοινά + και - κυκλώματα, αντίστοιχα).
Βήμα 5: Όλα τα εξαρτήματα του κυκλώματος είναι συνδεδεμένα. Συνδέουμε τον αισθητήρα μας (χωρίς αυτό, η οθόνη θα παραμείνει μαύρη), ισχύς. Στην πρώτη γραμμή - η τιμή θερμοκρασίας, σε 2 εάν είναι ενεργοποιημένο το "*" - το ρελέ είναι αναμμένο, όχι. Τώρα ας προσπαθήσουμε να ρυθμίσουμε τα όρια μεταγωγής του ρελέ. Πατώντας τον άξονα του κωδικοποιητή (ή το κουμπί) εμφανίζεται η οριακή τιμή στην οποία θα ενεργοποιηθεί το ρελέ περιστρέφοντας τον άξονα - η τιμή αυξάνεται ή μειώνεται. Κάνοντας κλικ στον άξονα ξανά - παίρνουμε το ανώτατο όριο (το ρελέ θα σβήσει), ρυθμίστε την τιμή και πιέστε ξανά. Η συσκευή θα παρακολουθεί τη θερμοκρασία, η τιμή των ορίων διατηρείται όταν η συσκευή είναι απενεργοποιημένη. Αυτό είναι όλο.
#include
#include
#include
#define BUTTON_1_PIN 10 // ο αριθμός εξόδου του κουμπιού 1 είναι 12
OneWire ds (12). // στην ακίδα 10 (είναι απαραίτητη μια αντίσταση 4.7K)
// Αρχικοποιήστε τη βιβλιοθήκη με τους αριθμούς των ακίδων διεπαφής
Υγρό κρύσταλλο lcd (3, 2, 4, 5, 6, 7).
μη υπογεγραμμένο μεγάλο χρονικό όριο;
const int pin_A = 8; // pin 12
const int pin_B = 9; // pin 11
μη καταχωρημένο char enc_A;
μη καταχωρημένο char enc_B;
χαρακτήρας nesigned enc_A_prev = 0;
float n_pr = 24,1;
float b_pr = 26,2.
boolean priz = false;
class Button {
δημόσια:
Κουμπί (byte pin, byte timeButton); // περιγραφή κατασκευαστή
boolean flagPress? // πατημένο το κουμπί σημαίας
boolean flagClick? // το κουμπί σημαίας πατήθηκε (κάντε κλικ)
void scanState (); // μέθοδος για τον έλεγχο της κατάστασης του σήματος
άκυρη setPinTime (byte pin, byte timeButton); // μέθοδος για τον καθορισμό του αριθμού εξόδου και του χρόνου επιβεβαίωσης (αριθμός)
ιδιωτικό:
byte _buttonCount; // μετρητής σταθερής επιβεβαίωσης κατάστασης
byte _timeButton; // ώρα επιβεβαίωσης κατάστασης κουμπιών
byte _pin. // pin number
},
Πλήκτρο κουμπιού1 (BUTTON_1_PIN, 30);
void knopka () {
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (n_pr);
// button1.scanState ();
ενώ (button1.flagClick == false) {
enc_A = digitalRead (pin_A);
enc_B = digitalRead (pin_B);
αν ((! enc_A) && (enc_A_prev)) {
εάν (enc_B) {
n_pr = n_pr-0,1;
} else {
n_pr = n_pr + 0,1;
}}
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (n_pr);
}}
enc_A_prev = enc_A;
button1.scanState ();
}}
button1.flagClick = false;
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (b_pr);
ενώ (button1.flagClick == false) {
enc_A = digitalRead (pin_A);
enc_B = digitalRead (pin_B);
αν ((! enc_A) && (enc_A_prev)) {
εάν (enc_B) {
b_pr = b_pr-0,1;
} else {
b_pr = b_pr + 0,1.
}}
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (b_pr);
}}
enc_A_prev = enc_A;
button1.scanState ();
}}
button1.flagClick = false;
εάν (n_pr> b_pr) {
float wr = n_pr;
n_pr = b_pr;
b_pr = wr;
}}
int addr = 0;
EEPROM.write (addr, 'y');
addr = 1;
EEPROM.put (addr, n_pr);
addr + = μέγεθοςof (float);
EEPROM.put (addr, b_pr);
καθυστέρηση (300);
}}
άκυρη ρύθμιση (άκυρη) {
pinMode (11, OUTPUT);
pinMode (pin_A, INPUT_PULLUP);
pinMode (pin_B, INPUT_PULLUP);
lcd.begin (8.2).
int addr = 0;
char c = EEPROM.read (addr);
addr = addr + 1.
αν (c == 'y') {
EEPROM.get (addr, n_pr);
addr + = μέγεθοςof (float);
EEPROM.get (addr, b_pr);
}}
// Serial.begin (9600);
}}
κενός βρόχος (κενός) {
byte i;
byte present = 0.
byte type_s;
δεδομένα byte [12].
byte addr [8].
float celsius;
αν (! ds.search (addr)) {
ds.reset_search ();
καθυστέρηση (250);
επιστροφή
}}
αν (OneWire :: crc8 (addr, 7)! = addr [7]) {
επιστροφή
}}
// το πρώτο byte ROM υποδεικνύει ποιο τσιπ
διακόπτης (addr [0]) {
περίπτωση 0x10:
type_s = 1;
διάλειμμα.
περίπτωση 0x28:
type_s = 0;
διάλειμμα.
περίπτωση 0x22:
type_s = 0;
διάλειμμα.
προεπιλογή:
επιστροφή
}}
ds.reset ();
ds.select (addr);
ds.write (0x44, 1). // έναρξη μετατροπής, με παράσιτο στο τέλος
enc_A = digitalRead (pin_A);
enc_A_prev = enc_A;
τρέχουσα τιμή = millis ();
ενώ ((millis () - currentTime) <2000) {
button1.scanState ();
αν (button1.flagClick == true) {
// έγινε κλικ σε ένα κουμπί
button1.flagClick = false; // επαναφορά χαρακτηριστικού κλικ
knopka ();
}}
}}
// καθυστέρηση (1000); // ίσως 750ms είναι αρκετό, ίσως όχι
// θα μπορούσαμε να κάνουμε ένα ds.depower () εδώ, αλλά το reset θα το φροντίσει.
present = ds.reset ();
ds.select (addr);
ds.write (0xBE); // Διαβάστε το Scratchpad
για (i = 0, i <9; i ++) {// χρειαζόμαστε 9 bytes
τα δεδομένα [i] = ds.read ();
}}
// Μετατροπή των δεδομένων σε πραγματική θερμοκρασία
// επειδή το αποτέλεσμα είναι ένας ακέραιος αριθμός 16 υπογεγραμμένος, θα πρέπει
// να αποθηκεύονται σε έναν τύπο "int16_t", ο οποίος είναι πάντα 16 bit
// ακόμη και όταν έχει καταρτιστεί σε επεξεργαστή 32 bit.
int16_t raw = (δεδομένα [1] << 8) δεδομένα [0].
αν (type_s) {
ωμή = ακατέργαστη << 3; // προεπιλεγμένη ανάλυση 9 bit
αν (δεδομένα [7] == 0x10) {
// "μετράει παραμένει" δίνει πλήρη ανάλυση 12 bit
ωμή = (ακατέργαστη & 0xFFF0) + 12 - δεδομένα [6];
}}
} else {
byte cfg = (δεδομένα [4] & 0x60).
// σε χαμηλότερη res, τα χαμηλά bits είναι απροσδιόριστα, οπότε ας μηδενίσουμε τα
αν (cfg == 0x00) raw = ακατέργαστο & ~ 7; // ανάλυση 9 bit, 93,75 ms
else if (cfg == 0x20) raw = ακατέργαστο & ~ 3; // 10 bit res, 187,5 ms
else if (cfg == 0x40) raw = ακατέργαστο & ~ 1; // 11 bit res, 375 ms
//// default είναι ανάλυση 12 bit, χρόνος μετατροπής 750 ms
}}
celsius = (float) ακατέργαστο / 16,0;
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (celsius);
εάν (priz) {
lcd.setCursor (0,1);
lcd.print ('*');
}}
αν (n_pr! = b_pr) {
αν (celsius b_pr) {
ψηφιακή γραφή (11, χαμηλή);
priz = false;
}}
}}
}}
// μέθοδος ελέγχου της κατάστασης κουμπιού
// flagPress = true-clicked
// flagPress = false - πατημένο
// flagClick = true - έγινε κλικ (κλικ)
κενό κουμπί :: scanState () {
αν (flagPress == (! digitalRead (_pin))) {
// η κατάσταση σήματος παραμένει η ίδια
_buttonCount = 0; // επαναφέρετε τον μετρητή κατάστασης σήματος
}}
αλλού {
// η κατάσταση σήματος έχει αλλάξει
_buttonCount ++; // +1 προς τον μετρητή κατάστασης σήματος
αν (_buttonCount> = _timeButton) {
// η κατάσταση σήματος δεν άλλαξε τον καθορισμένο χρόνο
// κατάσταση σήματος έχει γίνει σταθερή
flagPress =! flagPress; // αντίστροφη της ένδειξης κατάστασης
_buttonCount = 0; // επαναφέρετε τον μετρητή κατάστασης σήματος
αν (flagPress == true) flagClick = true; // σημάδι κλικ με κλικ
}}
}}
}}
// μέθοδος για τον καθορισμό του αριθμού εξόδου και του χρόνου επιβεβαίωσης
κενό κουμπί :: setPinTime (byte pin, byte timeButton) {
_pin = καρφίτσα;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // ορίστε την έξοδο ως είσοδο
}}
// περιγραφή του κατασκευαστή της κλάσης Button
Πλήκτρο :: Κουμπί (byte pin, byte timeButton) {
_pin = καρφίτσα;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // ορίστε την έξοδο ως είσοδο
}}