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

Autostat: ένας απομακρυσμένος θερμοστάτης: 8 βήματα (με εικόνες)
Autostat: ένας απομακρυσμένος θερμοστάτης: 8 βήματα (με εικόνες)

Βίντεο: Autostat: ένας απομακρυσμένος θερμοστάτης: 8 βήματα (με εικόνες)

Βίντεο: Autostat: ένας απομακρυσμένος θερμοστάτης: 8 βήματα (με εικόνες)
Βίντεο: Gemini συναγερμος αυτοκινητου-car alarm 861 www.korbos.gr 2024, Ιούλιος
Anonim
Autostat: ένας απομακρυσμένος θερμοστάτης
Autostat: ένας απομακρυσμένος θερμοστάτης

Το ερώτημα που πιθανώς ρωτάτε είναι "γιατί φτιάχνετε έναν άλλο τηλεχειριστήριο από απόσταση;"

Η απάντηση σε αυτήν την ερώτηση είναι, έπρεπε, και οι έξυπνοι θερμοστάτες της αγοράς είναι πολύ ακριβοί.

Δίκαιη προειδοποίηση, αυτή είναι μια κατασκευή "απόδειξης ιδέας" που θα απαιτούσε μερικές επιπλέον εξόδους για να ελέγξετε πραγματικά τον θερμοστάτη σας, αλλά ο πυρήνας είναι στη θέση του και μπορεί να τροποποιηθεί ανάλογα με τη συγκεκριμένη περίσταση. Επίσης, αυτό είναι ακόμα σε εξέλιξη, οπότε περιμένετε μερικές ενημερώσεις και αλλαγές (ειδικά στον κώδικα Matlab)

Για να ξεκινήσετε θέλω να σας προειδοποιήσω, αυτό απαιτεί τρία προγράμματα (ένα από αυτά είναι αρκετά ακριβά), αρκετές βιβλιοθήκες και πακέτα υποστήριξης για τα προγράμματα και πρέπει να τα έχετε όλα να μιλούν μεταξύ τους. Είναι πονοκέφαλος. Με αυτήν την προειδοποίηση εκτός δρόμου, ας ξεκινήσουμε με τα υλικά.

Σκεύη, εξαρτήματα

  • arduino nano
  • arduino uno (ή άλλο nano, μόλις χρησιμοποίησα το uno επειδή είχα ένα στρώσιμο)
  • διάφορα καλώδια με άλτες, μερικά αρσενικά/αρσενικά και δύο σετ τριών ενωμένων ανδρών/γυναικών άλτες
  • Δέκτης ραδιοσυχνοτήτων 433MHz (RF), χρησιμοποίησα το MX-05V
  • Πομπός RF 433MHz, χρησιμοποίησα το MX-FS-03V
  • Θερμόμετρο υψηλής ακρίβειας DHT11 και αισθητήρας υγρασίας (αυτό που χρησιμοποίησα είναι εγκατεστημένο σε τσιπ τριών ακίδων με τις απαιτούμενες αντιστάσεις ήδη εγκατεστημένες)
  • breadboard (αν δεν θέλετε να τα κολλήσετε όλα μαζί)
  • ένα τηλέφωνο με GPS (iPhone 8 σε αυτήν την περίπτωση, αλλά έχω χρησιμοποιήσει επίσης ένα Galaxy S8)
  • 3D εκτυπωμένο δοχείο (δεν είναι πραγματικά απαραίτητο, οποιοδήποτε δοχείο θα λειτουργήσει ή καθόλου)

Λογισμικό

  • Matlab από το MathWorks (έχω την έκδοση 2018a, αλλά έχω χρησιμοποιήσει και τις εκδόσεις 2017a-b)
  • Το κινητό Matlab είναι εγκατεστημένο στο τηλέφωνό σας
  • πακέτο υποστήριξης arduino για το Matlab
  • Πακέτο αισθητήρα iPhone για το Matlab
  • arduino IDE
  • Πακέτα υποστήριξης RadioHead και βιβλιοθήκες του arduino IDE
  • Βιβλιοθήκη DHT11 για arduino IDE
  • python 3.7 (βεβαιωθείτε ότι έχει εγκατασταθεί η βιβλιοθήκη ή η σειριακή βιβλιοθήκη, η οποία θα πρέπει να είναι για την έκδοση 3.4 ή νεότερη)

Βήμα 1: Το βάζουμε όλα μαζί

Το βάζουμε όλα μαζί
Το βάζουμε όλα μαζί
Το βάζουμε όλα μαζί
Το βάζουμε όλα μαζί
Το βάζουμε όλα μαζί
Το βάζουμε όλα μαζί

Πρώτα απ 'όλα θα σας πρότεινα να κάνετε μερικά σεμινάρια arduino σχετικά με τους πομπούς RF για να βεβαιωθείτε ότι τα μέρη σας λειτουργούν και ότι η καλωδίωση είναι σωστή. Υπάρχουν πολλά διαθέσιμα παραδείγματα, με τον κωδικό που περιλαμβάνεται (για όσους από εμάς εκεί έξω γνωρίζουμε ελάχιστα έως τίποτα για C και C ++).

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

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

Και για να είμαι σαφής, το nano και το uno είναι εναλλάξιμα, αλλά χρησιμοποίησα το nano για την πλευρά του πομπού του έργου για να μειώσω το μέγεθος της οθόνης θερμοκρασίας.

Πλευρική σημείωση: το πράσινο υπόστρωμα που κρατά το νανο είναι το δοχείο με 3D εκτύπωση.

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

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

Βήμα 3: Πομπός

Πομπός
Πομπός

Βήμα 4: Ο κώδικας

Μόλις ολοκληρωθεί η καλωδίωση, πρέπει να εκτελέσετε όλα τα προγράμματα και να εγκαταστήσετε τις βιβλιοθήκες (αν δεν το έχετε κάνει ήδη), απλώς υποθέστε ότι έχετε, πρέπει να ξεκινήσετε το Matlab και να εκτελέσετε το πακέτο υποστήριξης iPhone. Τόσο το τηλέφωνό σας όσο και το Matlab πρέπει να βρίσκονται στο ίδιο δίκτυο wifi σε αυτό το σημείο.

Στο παράθυρο εντολών του Matlab γράψτε:

συνδετήρας ενεργοποιημένος

Αυτό θα σας ζητήσει να εισαγάγετε έναν πενταψήφιο κωδικό πρόσβασης που θα χρησιμοποιήσετε για να συνδεθείτε στο iPhone σας. Βεβαιωθείτε ότι θυμάστε τον κωδικό πρόσβασης. Όταν εισαγάγετε τον κωδικό πρόσβασης, το Matlab θα εμφανίσει ορισμένες πληροφορίες, συμπεριλαμβανομένης της διεύθυνσής σας IP. Χρησιμοποιήστε αυτό στο επόμενο βήμα, το οποίο προέρχεται από τις οδηγίες από το μενού βοήθειας "Ξεκινώντας με αισθητήρες" στο κινητό Matlab.

  • Ακολουθήστε αυτά τα βήματα για να στείλετε δεδομένα αισθητήρα στο MathWorks Cloud ή σε έναν υπολογιστή:
  • Εάν στέλνετε δεδομένα αισθητήρα σε υπολογιστή και εάν δεν είναι ήδη εγκατεστημένα, κάντε λήψη και εγκαταστήστε το πακέτο υποστήριξης MATLAB για αισθητήρες Apple iOS στο MATLAB.
  • Συνδέστε το MATLAB Mobile με το MathWorks Cloud ή έναν υπολογιστή χρησιμοποιώντας τις Ρυθμίσεις.
  • Δημιουργήστε αντικείμενο mobiledev στο MATLAB (στον υπολογιστή σας), για παράδειγμα: >> m = mobiledev
  • Επιλέξτε έναν ή περισσότερους αισθητήρες και πατήστε Έναρξη.

Ακολουθήστε αυτά τα βήματα για να καταγράψετε τοπικά δεδομένα αισθητήρα στη συσκευή σας:

  • Στην οθόνη Αισθητήρες, επιλέξτε τους αισθητήρες από τους οποίους θέλετε να συλλέξετε δεδομένα.
  • Επιλέξτε Αρχείο καταγραφής.
  • Πατήστε το κουμπί Έναρξη.
  • Όταν ολοκληρώσετε τη συλλογή δεδομένων, πατήστε το κουμπί Διακοπή.
  • Στο αναδυόμενο παράθυρο, εισαγάγετε το όνομα του ημερολογίου αισθητήρα.
  • Επαναλάβετε τα βήματα 1-5 εάν χρειάζεται.

Αυτή η ενότητα θα παραπεμφθεί στο Μέρος 4, οπότε δεν χρειάζεται να ξεκινήσετε ακόμα τη συλλογή δεδομένων. Απλά κρατήστε το τηλέφωνό σας βολικό και το κινητό Matlab έτοιμο.

Τώρα πρέπει να δημιουργήσετε ένα φάκελο κάπου στον υπολογιστή σας για να στεγάσετε τα αρχεία κώδικα Matlab. Θα έχετε τέσσερα ξεχωριστά αρχεία, δύο για τις λειτουργίες φόντου (αρχεία.m) και ένα αρχείο κώδικα Matlab για το GUI (.mlapp),.

Πρώτα είναι ο υπολογισμός μάζας για τον αέρα στο σπίτι σας (αυτό ενημερώνει το Matlab πόσο χρόνο χρειάζεται για να ζεσταθεί/δροσίσει το σπίτι σας)

συνάρτηση [Mass] = CalcMass (T_ins, P_out, Chng_dir)

runCalc = 0; Tmp_start = T_ins; time_start = ρολόι? time_end = 0 ενώ εκτελείταιCalc <= 1 εάν T_ins == (Tmp_start+(7*Chng_dir)) time_end = ρολόι? PwrCntr = 0; runCalc = 0; else PwrCntr = P_out; runCalc = runCalc+0.1 λήξη time_diag = time_end-time_start Mass = (P_out*time_diag) /7.035

Και το δεύτερο:

λειτουργία [timestamps, pwr_usage] = dist_cntrl (Lat_in, Lon_in, P_out, r_pref, speed, T_pref, mass)

AutoStat = 1; i = 1; ενώ AutoStat == 1 time_start = ρολόι? m = mobiledev; t = csvread ('values.csv', 0, 1); t = t (i); timestamps = [0, 0, 0, 0, 0, 0]? pwr_usage = 0; i = i+1; μορφή longg; %τύπος haversine για τον υπολογισμό της απόστασης με βάση το γεωγραφικό πλάτος και το %longintude a_hav = (sind ((m. Latitude-Lat_in)./ 2)).^2+cosd (Lat_in).*cosd (m.latitude).*(sind ((m. Longitude-Lon_in)./ 2)).^2; c_hav = 2.*atan2d (sqrt (a_hav), sqrt (1-a_hav)); d_hav = 6371.*c_hav; Dist = d_hav.*1000; %υπολογίζει το χρόνο σας για επιστροφή time_rtn = (Dist-r_pref)./ ταχύτητα; Το %υπολογίζει την απαραίτητη ρύθμιση του θερμοστάτη με βάση την τροφοδοσία του κλιματιστικού και της μάζας του σπιτιού. calcTmp_set = ((-1.*P_out.*time_rtn)./ (μάζα.*(1.005)))+T_pref; %καθορίζει εάν η τρέχουσα ρύθμιση του θερμοστάτη πρέπει να αλλάξει εάν στρογγυλή (calcTmp_set) ~ = στρογγυλή (t) ώραACon = ρολόι. PwrCntr = P_out; timeACon = timeACon + clock-time_start; κόστος = ποσοστό P_out*timeACon* else PwrCntr = 0 χρονικές σφραγίδες λήξης (τέλος+1, [1: 6]) = ρολόι. pwr_usage (τέλος+1, 1) = PwrCntr; παύση (5) τέλος τέλος

Και τα δύο αυτά αρχεία είναι συναρτήσεις Matlab. Δεν θα χρειαστεί να έχετε πρόσβαση σε αυτά, εκτός εάν σκοπεύετε να τα τροποποιήσετε για συγκεκριμένες ανάγκες, αφού θα τα καλείτε από το GUI. Αποθηκεύστε και τα δύο αρχεία ξεχωριστά, το πρώτο ως CalcMass.m και το δεύτερο ως dist_cntrl.m, αυτά θα είναι τα ονόματα που χρησιμοποιεί ο κώδικας GUI για να καλέσει τις συναρτήσεις, επομένως, εκτός εάν θέλετε να επεξεργαστείτε τον υπόλοιπο παρακάτω κώδικα, τη σύμβαση ονοματοδοσίας.

Πριν μπείτε στον κώδικα GUI, πρέπει να ανοίξετε τον σχεδιαστή εφαρμογών για το Matlab, τον οποίο μπορείτε να ανοίξετε μεταβαίνοντας στη γραμμή μενού Matlab ή με την αγαπημένη μου μέθοδο που εισάγει την ακόλουθη εντολή στο παράθυρο εντολών Matlab:

appdesigner

Μόλις ανοίξει ο σχεδιαστής εφαρμογής, ανοίξτε ένα νέο αρχείο εφαρμογής (.mlapp) και διαγράψτε όλο τον προεπιλεγμένο κώδικα από το παράθυρο κώδικα. Στη συνέχεια, αντικαταστήστε το με το ακόλουθο και πατήστε το κουμπί εκτέλεσης.

classdef Control_1 <matlab.apps. AppBase % Ιδιότητες που αντιστοιχούν σε ιδιότητες στοιχείων εφαρμογής (Access = public) UIFigure matlab.ui. Figure TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton matlab.ui.control κουμπί EnergyEfficiencyRatingEditFieldLabel matlab.ui.control. Label EnergyEfficiencyRatingEditField matlab.ui.control. NumericEditField PowerOutputRatingEditFieldLabel matlab.ui.control. Label PowerOutputRatingEditField matlab.ui.control. NumericEditField AvgLocalSpeedEditFieldLabel matlab.ui.control. Label AvgLocalSpeedEditField matlab.ui.control. NumericEditField DesiredDistancefromHouseEditFieldLabel matlab.ui.control. Label DDFH matlab.ui.control. NumericEditField TemperatureDirectionSwitchLabel matlab.ui.control. Label TemperatureDirectionSwitch matlab.ui.control. Switch TempSettingsTab matlaber1babel1babel.control.cabel.control.bl/control.control.cabel.exe ui.control. Spinner Temperature2SpinnerLabel matlab.ui.cont rol. Label Temperature2Spinner matlab.ui.control. Spinner Switch matlab.ui.control. Switch EditFieldLabel matlab.ui.control. Label tempnow matlab.ui.control. NumericEditField GaugeLabel matlab.ui.control.abontrol.abrontrol.abrontrol. Lontel.abr. Gauge SavingsTab matlab.ui.container. Tab UIAxes matlab.ui.control. UIAxes ThisMonthCostEditFieldLabel matlab.ui.control. Label ThisMonthCostEditField matlab.ui.control. NumericEditField TotalSavingsEditFieldLabel matlab.ui.control. Label TotalSavingsEditField matlab.ui.control. NumericEditField τέλος

μέθοδοι (Πρόσβαση = ιδιωτικό)

% Αλλαγή τιμής συνάρτησης: tempnow

συνάρτηση tempnowValueChanged (εφαρμογή, συμβάν) temp = app.tempnow. Value; temp = randi ([60, 90], 1, 50) app. Gauge. Value = 0 για i = μήκος (temp) app. Gauge. Value = temp (i) pause (1) end end

% Value άλλαξε τη λειτουργία: TemperatureDirectionSwitch

λειτουργία TemperatureDirectionSwitchValueChanged (εφαρμογή, συμβάν) τρόπος = app. TemperatureDirectionSwitch. Value; τρόπος = uint8 (τρόπος) τρόπος = μήκος (τρόπος) εάν τρόπος == 4 Chng_dir = -1; αλλιώς Chng_dir = 1; τέλος Chng_dir; τέλος

% Λειτουργία αλλαγής τιμής: DDFH

συνάρτηση DDFHValueChanged (εφαρμογή, συμβάν) r_pref = app. DDFH. Value; τέλος

% Αλλαγή τιμής λειτουργίας: AvgLocalSpeedEditField

συνάρτηση AvgLocalSpeedEditFieldValueChanged (εφαρμογή, συμβάν) ταχύτητα = app. AvgLocalSpeedEditField. Value; τέλος

% Αλλαγή τιμής λειτουργίας: PowerOutputRatingEditField

λειτουργία PowerOutputRatingEditFieldValueChanged (εφαρμογή, συμβάν) value = app. PowerOutputRatingEditField. Value; τέλος

% Αλλαγή τιμής λειτουργίας: EnergyEfficiencyRatingEditField

λειτουργία EnergyEfficiencyRatingEditFieldValueChanged (εφαρμογή, συμβάν) value = app. EnergyEfficiencyRatingEditField. Value; τέλος

% Σπρωγμένη λειτουργία κουμπιού: RunDiagnosticButton

λειτουργία RunDiagnosticButtonPushed (εφαρμογή, συμβάν) way = app. TemperatureDirectionSwitch. Value; τρόπος = uint8 (τρόπος) τρόπος = μήκος (τρόπος) εάν τρόπος == 4 Chng_dir = -1; αλλιώς Chng_dir = 1; τέλος T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)

τέλος

% Αλλαγή τιμής λειτουργίας: Temperature1Spinner

συνάρτηση Temperature1SpinnerValueChanged (εφαρμογή, συμβάν) value = app. Temperature1Spinner. Value; τέλος

% Λειτουργία αλλαγής τιμής: Temperature2Spinner

συνάρτηση Temperature2SpinnerValueChanged (εφαρμογή, συμβάν) value = app. Temperature2Spinner. Value; τέλος

% Αλλαγή τιμής λειτουργίας: Αλλαγή

λειτουργία SwitchValueChanged (εφαρμογή, συμβάν) m = mobiledev; Lat_in = m. Latitude Lon_in = m. Γεωγραφικό μήκος P_out = 0; r_pref = app. DDFH. Value; T_pref = app. Temperature1Spinner. Value; ταχύτητα = m. Ταχύτητα; μάζα = 200; speed = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, speed, mass) τέλος τέλος

% Εκκίνηση και κατασκευή εφαρμογής

μέθοδοι (Πρόσβαση = ιδιωτικό)

% Δημιουργία UIFigure και στοιχείων

λειτουργία createComponents (εφαρμογή)

% Δημιουργία UIFigure

app. UIFigure = uifigure; app. UIFigure. Position = [100 100 640 480]; app. UIFigure. Name = 'Εικόνα διεπαφής χρήστη';

% Δημιουργία ομάδας καρτέλας

app. TabGroup = uitabgroup (app. UIFigure); app. TabGroup. Position = [1 1 640 480];

% Δημιουργία SetupTab

app. SetupTab = uitab (app. TabGroup); app. SetupTab. Title = 'Ρύθμιση';

% Δημιουργία κουμπιού RunDiagnosticBut

app. RunDiagnosticButton = uibutton (app. SetupTab, 'push'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn (εφαρμογή, @RunDiagnosticButtonPushed, true); app. RunDiagnosticButton. FontWeight = 'έντονη'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Εκτέλεση διαγνωστικού';

% Δημιουργία EnergyEfficiencyRatingEditFieldLabel

app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'δεξιά'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Αξιολόγηση ενεργειακής απόδοσης';

% Δημιουργία EnergyEfficiencyRatingEditField

app. EnergyEfficiencyRatingEditField = uieditfield (app. SetupTab, «αριθμητικό»); app. EnergyEfficiencyRatingEditField. Limits = [0 100]; app. EnergyEfficiencyRatingEditField. ValueChangedFcn = createCallbackFcn (εφαρμογή, @EnergyEfficiencyRatingEditFieldValueChanged, true); app. EnergyEfficiencyRatingEditField. HorizontalAlignment = 'κέντρο'; app. EnergyEfficiencyRatingEditField. Position = [158 425 100 22];

% Δημιουργία PowerOutputRatingEditFieldLabel

app. PowerOutputRatingEditFieldLabel = uilabel (app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'δεξιά'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'Βαθμολογία εξόδου ισχύος';

% Δημιουργία PowerOutputRatingEditField

app. PowerOutputRatingEditField = uieditfield (app. SetupTab, «αριθμητικό»); app. PowerOutputRatingEditField. Limits = [0 Inf]; app. PowerOutputRatingEditField. ValueChangedFcn = createCallbackFcn (εφαρμογή, @PowerOutputRatingEditFieldValueChanged, true); app. PowerOutputRatingEditField. HorizontalAlignment = 'κέντρο'; app. PowerOutputRatingEditField. Position = [151 328 100 22];

% Δημιουργία AvgLocalSpeedEditFieldLabel

app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'δεξιά'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Μέσος όρος Τοπική ταχύτητα '

% Δημιουργία AvgLocalSpeedEditField

app. AvgLocalSpeedEditField = uieditfield (app. SetupTab, «αριθμητικό»); app. AvgLocalSpeedEditField. Limits = [0 70]; app. AvgLocalSpeedEditField. ValueChangedFcn = createCallbackFcn (εφαρμογή, @AvgLocalSpeedEditFieldValueChanged, true); app. AvgLocalSpeedEditField. HorizontalAlignment = 'κέντρο'; app. AvgLocalSpeedEditField. Position = [142 231 100 22];

% Δημιουργία DesiredDistancefromHouseEditFieldLabel

app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'δεξιά'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'Επιθυμητή Απόσταση'; 'από το Σπίτι'};

% Δημιουργία DDFH

app. DDFH = uieditfield (app. SetupTab, «αριθμητικό»); app. DDFH. Limits = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn (εφαρμογή, @DDFHValueChanged, true); app. DDFH. HorizontalAlignment = 'κέντρο'; app. DDFH. Position = [139 135 100 22];

% Δημιουργία TemperatureDirectionSwitchLabel

app. TemperatureDirectionSwitchLabel = uilabel (app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'κέντρο'; app. TemperatureDirectionSwitchLabel. Position = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Text = 'Κατεύθυνση θερμοκρασίας';

% Create TemperatureDirectionSwitch

app. TemperatureDirectionSwitch = uiswitch (app. SetupTab, 'ρυθμιστικό'); app. TemperatureDirectionSwitch. Items = {'Πάνω', 'Κάτω'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn (εφαρμογή, @TemperatureDirectionSwitchValueChanged, true); app. TemperatureDirectionSwitch. Position = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'Επάνω';

% Δημιουργία TempSettingsTab

app. TempSettingsTab = uitab (app. TabGroup); app. TempSettingsTab. Title = 'Temp. Ρυθμίσεις';

% Δημιουργία θερμοκρασίας1SpinnerLabel

app. Temperature1SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature1SpinnerLabel. HorizontalAlignment = 'κέντρο'; app. Temperature1SpinnerLabel. Position = [66 363 76 28]; app. Temperature1SpinnerLabel. Text = {'Θερμοκρασία'; '#1'};

% Δημιουργία θερμοκρασίας1Spinner

app. Temperature1Spinner = uispinner (app. TempSettingsTab); app. Temperature1Spinner. Limits = [60 90]; app. Temperature1Spinner. ValueChangedFcn = createCallbackFcn (εφαρμογή, @Temperature1SpinnerValueChanged, true); app. Temperature1Spinner. Position = [157 346 100 68]; app. Temperature1Spinner. Value = 60;

% Δημιουργία Temperature2SpinnerLabel

app. Temperature2SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature2SpinnerLabel. HorizontalAlignment = 'κέντρο'; app. Temperature2SpinnerLabel. Position = [66 248 76 28]; app. Temperature2SpinnerLabel. Text = {'Θερμοκρασία'; '#2'};

% Δημιουργία Temperature2Spinner

app. Temperature2Spinner = uispinner (app. TempSettingsTab); app. Temperature2Spinner. Limits = [60 90]; app. Temperature2Spinner. ValueChangedFcn = createCallbackFcn (app, @Temperature2SpinnerValueChanged, true); app. Temperature2Spinner. Position = [157 230 100 70]; app. Temperature2Spinner. Value = 60;

% Δημιουργία διακόπτη

app. Switch = uiswitch (app. TempSettingsTab, 'ρυθμιστικό'); app. Switch. Items = {'1', '0'}; app. Switch. ValueChangedFcn = createCallbackFcn (εφαρμογή, @SwitchValueChanged, true); app. Switch. FontName = 'Nyala'; app. Switch. FontSize = 28; app. Switch. Position = [522 21 74 32]; app. Switch. Value = '0';

% Δημιουργία EditFieldLabel

app. EditFieldLabel = uilabel (app. TempSettingsTab); app. EditFieldLabel. HorizontalAlignment = 'δεξιά'; app. EditFieldLabel. Position = [374 291 25 22]; app. EditFieldLabel. Text = ";

% Δημιουργία tempnow

app.tempnow = uieditfield (app. TempSettingsTab, «αριθμητικό»); app.tempnow. Limits = [60 89]; app.tempnow. ValueChangedFcn = createCallbackFcn (εφαρμογή, @tempnowValueChanged, true); app.tempnow. HorizontalAlignment = 'κέντρο'; app.tempnow. FontSize = 26; app.tempnow. Position = [409 230 133 117]; app.tempnow. Value = 60;

% Δημιουργία GaugeLabel

app. GaugeLabel = uilabel (app. TempSettingsTab); app. GaugeLabel. HorizontalAlignment = 'κέντρο'; app. GaugeLabel. Position = [225 32 42 22]; app. GaugeLabel. Text = 'Gauge';

% Δημιουργία μετρητή

app. Gauge = uigauge (app. TempSettingsTab, "κυκλικό"); app. Gauge. Limits = [60 90]; app. Gauge. MajorTicks = [60 65 70 75 80 85 90]; app. Gauge. Position = [185 69 120 120]; app. Gauge. Value = 60;

% Δημιουργία SavingsTab

app. SavingsTab = uitab (app. TabGroup); app. SavingsTab. Title = 'Εξοικονόμηση';

% Δημιουργία UIAxes

app. UIAxes = uiaxes (app. SavingsTab); τίτλος (app. UIAxes, «Εξοικονόμηση») xlabel (app. UIAxes, «Month and Year») ylabel (app. UIAxes, «Money») app. UIAxes. PlotBoxAspectRatio = [1 0.606666666666667 0.606666666666667]; app. UIAxes. Color = [0,9412 0,9412 0,9412]; app. UIAxes. Position = [146 219 348 237];

% Δημιουργία ThisMonthCostEditFieldLabel

app. ThisMonthCostEditFieldLabel = uilabel (app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'κέντρο'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'Κόστος αυτού του μήνα';

% Δημιουργία ThisMonthCostEditField

app. ThisMonthCostEditField = uieditfield (app. SavingsTab, «αριθμητικό»); app. ThisMonthCostEditField. Limits = [0 Inf]; app. ThisMonthCostEditField. ValueDisplayFormat = '$%7.2f'; app. ThisMonthCostEditField. HorizontalAlignment = 'κέντρο'; app. ThisMonthCostEditField. Position = [417 39 137 58];

% Δημιουργία TotalSavingsEditFieldLabel

app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'δεξιά'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Συνολικές εξοικονομήσεις';

% Δημιουργία TotalSavingsEditField

app. TotalSavingsEditField = uieditfield (app. SavingsTab, «αριθμητικό»); app. TotalSavingsEditField. Limits = [0 Inf]; app. TotalSavingsEditField. ValueDisplayFormat = '$%9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'κέντρο'; app. TotalSavingsEditField. Position = [88 39 137 58]; τέλος τέλος

μέθοδοι (Πρόσβαση = δημόσια)

% Κατασκευή εφαρμογής

εφαρμογή εφαρμογής = Control_1

% Δημιουργία και διαμόρφωση στοιχείων

createComponents (εφαρμογή)

% Εγγραφή της εφαρμογής στο App Designer

registerApp (εφαρμογή, εφαρμογή. UIFigure)

αν nargout == 0

σαφές τέλος τέλους εφαρμογής

% Κωδικός που εκτελείται πριν από τη διαγραφή της εφαρμογής

διαγραφή λειτουργίας (εφαρμογή)

% Διαγραφή UIFigure όταν διαγράφεται η εφαρμογή

διαγραφή (app. UIFigure) τέλος τέλος τέλος

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

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

σειρά εισαγωγής

χρόνος εισαγωγής εισαγωγή csv

Αυτές είναι οι τρεις βιβλιοθήκες που θα χρειαστείτε για να ξεκινήσετε, αν και σύντομα θα φτιάξουμε τη δική μας βιβλιοθήκη. Εάν υπήρχε κάποιο είδος σφάλματος με αυτές τις εντολές, επιστρέψτε και βεβαιωθείτε ότι οι βιβλιοθήκες είναι εγκατεστημένες και βρίσκονται στο φάκελο Lib στον φάκελο python. Στη συνέχεια θα δημιουργήσουμε αυτό που έχω ονομάσει βιβλιοθήκη pythonlogger. Αυτό το όνομα δεν είναι απαραίτητο, μπορείτε να το ονομάσετε όπως θέλετε, είναι μόνο το όνομα του αρχείου python (.py) που δημιουργείτε.

Ανοίξτε έναν επεξεργαστή κειμένου, χρησιμοποιώ το Sublime3 αλλά το σημειωματάριο λειτουργεί μια χαρά και εισαγάγετε αυτόν τον κωδικό.

def pythonprint ():

εισαγωγή pythonlogger εισαγωγή σειριακού χρόνου εισαγωγής csv ser = serial. Serial ('COM8') # COM8 είναι η σειριακή θύρα arduino, αυτή πιθανότατα θα είναι διαφορετική για κάθε χρήστη, δηλαδή ελέγξτε τη σειριακή σας θύρα στο arduino IDE ser.flushInput () ενώ True: try: ser_bytes = ser.readline () print (ser_bytes) with open ("test_data.csv", "a") as f: writer = csv.writer (f, delimiter = ",") # ορίζει τα δεδομένα σε να καταχωρηθεί ως διαχωρισμένο με κόμμα author.writerow ([time.time (), ser_bytes]) #γράφει δεδομένα στο test_data.csv εκτός από: διακοπή εκτύπωσης ("Παρουσιάστηκε σφάλμα")

Αποθηκεύστε το κείμενο ως "εισαγάγετε το όνομα της βιβλιοθήκης που θέλετε".py στο φάκελο Lib. Σημειώστε επίσης ότι η γραμμή def pythonprint () ορίζει το όνομα της συνάρτησης που πρόκειται να καλέσετε, ώστε να μπορείτε να την αλλάξετε σε def "εισαγωγή ονόματος που θέλετε για τη συνάρτηση σας" (). Όταν αποθηκευτεί η βιβλιοθήκη μπορούμε να προχωρήσουμε στον κώδικα arduino.

Ανοίξτε το arduino IDE και ανοίξτε δύο νέα παράθυρα σκίτσων. Αποθηκεύστε αυτά τα δύο αρχεία σκίτσου κάπου βολικά, το όνομα αυτών των αρχείων δεν έχει σημασία. Στη συνέχεια, διαγράψτε όλο τον προεπιλεγμένο κωδικό και αντικαταστήστε τον με τον ακόλουθο.

Για το arduino που λαμβάνει:

#περιλαμβάνω

#include #include #include // αυτό δεν χρησιμοποιείται αλλά χρειάζεται για την μεταγλώττιση του προγράμματος οδήγησης RH_ASK. struct dataStruct {float temp; }τα δεδομένα μου; void setup () {Serial.begin (9600); // Αποσφαλμάτωση μόνο εάν (! Driver.init ()) Serial.println ("η αποτυχία του init"); } void loop () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof (buf); if (driver.recv (buf, & buflen)) // Μη αποκλεισμός {int i; // Μήνυμα με ένα καλό άθροισμα ελέγχου, απορρίψτε το. //driver.printBuffer("Got: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serial.print (myData.temp); }}

ΥΣΤΕΡΟΓΡΑΦΟ. το //driver.printBuffer ……. Η γραμμή κλπ είναι κωδικός δοκιμής. Δεν χρειάζεται να ανησυχείτε για αυτό, εκτός εάν κάνετε διαγνωστικές εντολές και θέλετε να καταλάβετε εάν λαμβάνετε πραγματικά δεδομένα.

Για τον πομπό arduino

#περιλαμβάνω

#include #include #include // αυτό δεν χρησιμοποιείται αλλά χρειάζεται για μεταγλώττιση #include #include int pin = 4; DHT11 dht11 (pin); RH_ASK πρόγραμμα οδήγησης. struct dataStruct {float temp; }τα δεδομένα μου; byte tx_buf [sizeof (myData)] = {0}; // Επομένως, τα ορίσματα είναι bitrate, μεταδίδουν pin (tx), // λαμβάνουν pin (rx), ppt pin, isInverse. Τα 2 τελευταία δεν χρησιμοποιούνται.void setup () {Serial.begin (9600); // Αποσφαλμάτωση μόνο εάν (! Driver.init ()) Serial.println ("η αποτυχία του init"); } void loop () {int err; float temp, humi? uint8_t msg; εάν ((err = dht11.read (humi, temp)) == 0) myData.temp = temp; memcpy (tx_buf, & myData, sizeof (myData)); byte zize = sizeof (myData); {Serial.println (myData.temp); driver.send ((uint8_t *) tx_buf, zize); driver.waitPacketSent (); // διακοπή εκτέλεσης έως ότου αποσταλούν όλα τα δεδομένα καθυστέρηση (2000). // περιμένετε 2 δευτερόλεπτα}}

Οι εντολές συμπερίληψης θα πρέπει να είναι αρκετές, αλλά αν αντιμετωπίζετε προβλήματα αργότερα με τη μεταφορά δεδομένων, ίσως θέλετε να αναζητήσετε το φάκελο της βιβλιοθήκης RadioHead και να συμπεριλάβετε τα υπόλοιπα ονόματα αρχείων, στην ίδια μορφή.

Βήμα 5: Κάνοντας το να λειτουργήσει

Κάνοντας το να λειτουργήσει
Κάνοντας το να λειτουργήσει
Κάνοντας το να λειτουργήσει
Κάνοντας το να λειτουργήσει
Κάνοντας το να λειτουργήσει
Κάνοντας το να λειτουργήσει

Τώρα που έχουμε όλο τον κώδικα μαζί και το arduino είναι συναρμολογημένο, μπορούμε να συνδέσουμε το arduino στον υπολογιστή σας και να φορτώσουμε τον κώδικα. Βεβαιωθείτε ότι έχετε στείλει τον σωστό κωδικό στους μικροελεγκτές λήψης και μετάδοσης. Μπορείτε να έχετε και τα δύο arduinos συνδεδεμένα με τον υπολογιστή σας ενώ εκτελείται, αλλά θα πρέπει να βεβαιωθείτε ότι έχετε επιλέξει τη σωστή θύρα για να προχωρήσετε ή μπορείτε να αποσυνδέσετε το arduino που εκπέμπει και να το τροφοδοτήσετε από κάποια άλλη πηγή μόλις ο κωδικός είναι ανέβηκε.

Μιλώντας για αυτό, θα πρέπει να επιλέξετε τη θύρα που είναι συνδεδεμένη στο arduino λήψης από το μενού εργαλείων IDE και να εκτελέσετε python.

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

pythonlogger.pythonprint ()

Αυτό θα ξεκινήσει τη συλλογή δεδομένων από τη σειριακή θύρα arduino. Εάν ανοίξετε τον φάκελο python τώρα, θα δείτε ότι έχει δημιουργηθεί ένα νέο αρχείο.csv που ονομάζεται "test_data.csv", το οποίο περιέχει όλες τις πληροφορίες για την ώρα και τη θερμοκρασία. Αυτό θα είναι το αρχείο στο οποίο έχει πρόσβαση το Matlab για να κάνει όλους τους υπολογισμούς και τα στοιχεία ελέγχου του.

Μια άλλη προειδοποίηση: μην ανοίξετε το test_data.csv ενώ γίνεται πρόσβαση ή εγγραφή στα δεδομένα. Εάν το κάνετε, ο κώδικας python ή/και Matlab θα καταρρεύσει και θα στείλει πίσω ένα σφάλμα

Εάν αποφασίσετε να ανοίξετε το.csv αργότερα, θα παρατηρήσετε ότι η στήλη ώρας είναι απλώς μια πολύ μεγάλη σειρά αριθμών. Αυτό συμβαίνει επειδή η εντολή time.time () γράφει τον αριθμό των δευτερολέπτων από την 1η Ιανουαρίου 1970.

Σε αυτό το σημείο, η python θα πρέπει να εκτυπώνει τα δεδομένα θερμοκρασίας που διαβάζει από τη σειριακή θύρα. Θα πρέπει να μοιάζει με:

β '25,03'/r/n

Μην ανησυχείτε για τους επιπλέον χαρακτήρες, ο κώδικας Matlab ευρετηριάζει τις μεσαίες πέντε τιμές στη δεύτερη στήλη του αρχείου.csv.

Τώρα που λειτουργούν όλα τα υποστηρικτικά προγράμματα και συλλέγονται δεδομένα, μπορούμε να ξεκινήσουμε τη συλλογή δεδομένων GPS από το πρόγραμμα κινητής τηλεφωνίας Matlab που είχε ρυθμιστεί νωρίτερα και να τρέξουμε τον κώδικα GUI του Matlab. Μόλις βρεθείτε στην καρτέλα αισθητήρων του Matlab mobile, επιλέξτε GPS και πατήστε το κουμπί έναρξης.

Εάν είστε νέοι στο Matlab mobile, επιστρέψτε στο βήμα 4 και δείτε τα πλάνα οθόνης παραπάνω. Εάν εξακολουθείτε να αντιμετωπίζετε προβλήματα, βεβαιωθείτε ότι είστε συνδεδεμένοι με τον υπολογιστή που επιλέξατε νωρίτερα (στην καρτέλα ρυθμίσεις) και χρησιμοποιήστε τον σύνδεσμο από την εντολή "συνδετήρας ενεργοποιημένος" για να ελέγξετε ότι το Matlab είναι συνδεδεμένο.

Βήμα 6: Χρήση του προγράμματος

Χρήση του Προγράμματος
Χρήση του Προγράμματος

Υπάρχουν πολλά πράγματα που συμβαίνουν στο παρασκήνιο σε αυτό το σύστημα. Τα δεδομένα θερμοκρασίας συλλέγονται και καταγράφονται από το arduino και το pyton, η Matlab συλλέγει δεδομένα GPS από το τηλέφωνό σας και εκτελεί υπολογισμούς για να δει πόσο μακριά είστε από το σπίτι σας και ρυθμίζει τον θερμοστάτη σας βάσει όλων αυτών των πληροφοριών. Εκεί που έρχεστε παρέχετε τις προτιμήσεις σας.

Εκτελέστε τον κώδικα GUI του Matlab. Ανοίξτε το αρχείο.mlapp και κοιτάξτε την πρώτη καρτέλα. Θα χρειαστεί να συλλέξετε τις πληροφορίες για αυτό, η απόδοση και η ισχύς της μονάδας θέρμανσης/ψύξης μπορείτε συνήθως να βρείτε στην ίδια τη μονάδα και η μέση ταχύτητά σας είναι απλώς μια καλή εκτίμηση του πόσο γρήγορα οδηγείτε. Μόλις εισαχθούν οι τιμές, πατήστε το κουμπί "Εκτέλεση διαγνωστικού" και το πρόγραμμα ελέγχει τον θερμοστάτη σας για να συλλέξει πληροφορίες σχετικά με το σπίτι σας.

Μεταβείτε στο επόμενο μενού.

Βήμα 7: Έλεγχος θερμοκρασίας

Ελεγχος θερμοκρασίας
Ελεγχος θερμοκρασίας

Αυτό το μενού σας επιτρέπει να επιλέξετε τη θερμοκρασία που προτιμάτε όσο βρίσκεστε στο σπίτι και εκτός. Ρυθμίστε τη θερμοκρασία #1 στην άνετη θερμοκρασία σας και τη θερμοκρασία #2 σε μια υψηλή ή χαμηλή τιμή που είναι ασφαλής για το σπίτι σας (βεβαιωθείτε ότι δεν τη ρυθμίζετε στους 100 βαθμούς ενώ έχετε σκύλους στο σπίτι κ.λπ.).

Βήμα 8: Ιστορικά δεδομένα

Ιστορικά δεδομένα
Ιστορικά δεδομένα

Τέλος, μπορείτε να παρακολουθήσετε πόσα χρήματα εξοικονομείτε χρησιμοποιώντας το αυτόματο χειριστήριο. Αυτό υπολογίζει ουσιαστικά πόση ενέργεια θα χρησιμοποιούσε εάν ο θερμοστάτης σας είχε ρυθμιστεί στην προτιμώμενη θερμοκρασία σας 24/7 και στη συνέχεια αφαιρεί την πραγματική σας ενέργεια που χρησιμοποιήσατε.

Καλή τύχη στο χτίσιμο.

Συνιστάται: