Inhaltsverzeichnis:

Autostat: ein Fernthermostat - Gunook
Autostat: ein Fernthermostat - Gunook

Video: Autostat: ein Fernthermostat - Gunook

Video: Autostat: ein Fernthermostat - Gunook
Video: Diese macOS Einstellungen solltest du SOFORT ändern (macOS Monterey)! | Nils-Hendrik Welk 2024, Juli
Anonim
Autostat: ein Fernthermostat
Autostat: ein Fernthermostat

Die Frage, die Sie sich wahrscheinlich stellen, lautet: "Warum stellen Sie einen anderen Fernthermostat her?"

Die Antwort auf diese Frage lautet: Ich musste, und die intelligenten Thermostate auf dem Markt sind zu teuer.

Faire Warnung, dies ist ein "Proof-of-Concept"-Build, der ein paar zusätzliche Ausgänge erfordern würde, um Ihren Thermostat tatsächlich zu steuern, aber der Kern ist vorhanden und kann je nach Ihren spezifischen Umständen geändert werden. Außerdem ist dies noch in Arbeit, also erwarten Sie ein paar Updates und Änderungen (insbesondere am Matlab-Code).

Zu Beginn möchte ich Sie warnen, dies erfordert drei Programme (eines davon ist ziemlich teuer), einige Bibliotheken und Support-Pakete für die Programme, und Sie müssen alle miteinander sprechen. Es ist ein Kopfschmerz. Wenn diese Warnung aus dem Weg ist, können wir mit den Materialien beginnen.

Hardware

  • Arduino-Nano
  • Arduino Uno (oder ein anderes Nano, ich habe nur das Uno verwendet, weil ich eines herumgelegt hatte)
  • verschiedene Überbrückungskabel, einige männlich/männlich und zwei Sätze von drei verbundenen männlichen/weiblichen Jumpern
  • 433MHz Radiofrequenz (RF) Empfänger, ich habe den MX-05V. verwendet
  • 433MHz HF-Sender, ich habe den MX-FS-03V. verwendet
  • DHT11 Hochpräzises Thermometer und Feuchtigkeitssensor (der von mir verwendete ist auf einem dreipoligen Chip mit den erforderlichen Widerständen bereits installiert)
  • Steckbrett (wenn Sie das nicht alles zusammenlöten möchten)
  • ein Telefon mit GPS (in diesem Fall iPhone 8, aber ich habe auch ein Galaxy S8 verwendet)
  • 3D-gedruckter Behälter (nicht wirklich notwendig, jeder Behälter funktioniert oder gar keiner)

Software

  • Matlab von MathWorks (ich habe die 2018a-Edition, aber ich habe auch 2017a-b-Editionen verwendet)
  • Matlab Mobile auf Ihrem Telefon installiert
  • Arduino-Supportpaket für Matlab
  • iPhone Sensorpaket für Matlab
  • Arduino-IDE
  • RadioHead Support-Pakete und Bibliotheken der arduino IDE
  • DHT11-Bibliothek für Arduino IDE
  • Python 3.7 (stellen Sie sicher, dass die pyserial-Bibliothek oder serielle Bibliothek installiert ist, was für Version 3.4 oder neuer sein sollte)

Schritt 1: Alles zusammenfügen

Alles zusammenfügen
Alles zusammenfügen
Alles zusammenfügen
Alles zusammenfügen
Alles zusammenfügen
Alles zusammenfügen

Zuallererst würde ich vorschlagen, dass Sie ein paar Arduino-Tutorials über die HF-Sender machen, um sicherzustellen, dass Ihre Teile funktionieren und die Verkabelung korrekt ist. Es gibt viele Beispiele mit enthaltenem Code (für diejenigen von uns da draußen, die wenig bis gar nichts über C und C++ wissen).

Befolgen Sie die folgenden Schaltpläne, um das Arduino und die Sensoren zusammenzubauen. Eine Sache, die Sie beim Verdrahten der Arduinos beachten sollten, ist, dass die von mir verwendeten Datenports nicht erforderlich, aber empfohlen werden.

Wenn Sie sich entscheiden, die von Ihnen verwendeten Datenports zu ändern, müssen Sie nur die Pins in Ihrem Code definieren. Persönlich denke ich, dass es einfacher ist, bei den Standardports zu bleiben, die die Arduino-Bibliotheken erkennen.

Und um es klarzustellen, Nano und Uno sind austauschbar, aber ich habe den Nano für die Senderseite des Projekts verwendet, um die Größe des Temperaturmonitors zu reduzieren.

Randnotiz: Der grüne Apparat, der den Nano hält, ist der 3D-gedruckte Behälter.

Schritt 2: Empfänger

Empfänger
Empfänger

Schritt 3: Sender

Sender
Sender

Schritt 4: Der Code

Sobald die Verkabelung abgeschlossen ist, müssen Sie alle Programme zum Laufen bringen und die Bibliotheken installieren (falls Sie dies noch nicht getan haben). Ich gehe einfach davon aus, dass Sie Matlab starten und das iPhone-Supportpaket ausführen müssen. Sowohl Ihr Telefon als auch Matlab müssen sich zu diesem Zeitpunkt im selben WLAN-Netzwerk befinden.

Schreiben Sie in das Befehlsfenster von Matlab:

Stecker ein

Dies fordert Sie auf, ein fünfstelliges Passwort einzugeben, mit dem Sie sich auf Ihrem iPhone verbinden. Merken Sie sich das Passwort. Wenn Sie das Passwort eingegeben haben, zeigt Matlab einige Informationen an, einschließlich Ihrer IP-Adresse. Verwenden Sie dies im nächsten Schritt, der aus den Anweisungen aus dem Hilfemenü "Erste Schritte mit Sensoren" in Matlab mobile stammt.

  • Führen Sie diese Schritte aus, um Sensordaten an die MathWorks Cloud oder einen Computer zu senden:
  • Wenn Sie Sensordaten an einen Computer senden und dieser noch nicht installiert ist, laden Sie das MATLAB Support Package für Apple iOS-Sensoren in MATLAB herunter und installieren Sie es.
  • Verbinden Sie MATLAB Mobile über die Einstellungen mit der MathWorks Cloud oder einem Computer.
  • Erstellen Sie ein mobiledev-Objekt in MATLAB (auf Ihrem Computer), zum Beispiel: >> m = mobiledev
  • Wählen Sie einen oder mehrere Sensoren aus und tippen Sie auf Start.

Befolgen Sie diese Schritte, um Sensordaten lokal auf Ihrem Gerät zu protokollieren:

  • Wählen Sie auf dem Bildschirm Sensoren die Sensoren aus, von denen Sie Daten erfassen möchten.
  • Wählen Sie Protokoll.
  • Tippen Sie auf die Schaltfläche Start.
  • Wenn Sie mit dem Sammeln der Daten fertig sind, tippen Sie auf die Schaltfläche Stopp.
  • Geben Sie im Popup den Namen des Sensorprotokolls ein.
  • Wiederholen Sie bei Bedarf die Schritte 1-5.

Auf diesen Abschnitt wird in Teil 4 zurückgegriffen, sodass Sie noch nicht mit der Datenerfassung beginnen müssen. Halten Sie einfach Ihr Telefon griffbereit und Matlab Mobile bereit.

Jetzt müssen Sie irgendwo auf Ihrem Computer einen Ordner erstellen, in dem die Matlab-Codedateien gespeichert werden. Sie haben vier separate Dateien, zwei für die Hintergrundfunktionen (.m-Dateien) und eine Matlab-Codedatei für die GUI (.mlapp),.

Zuerst die Massenberechnung für die Luft in Ihrem Haus (dies teilt Matlab mit, wie lange es dauert, Ihr Haus zu heizen/zu kühlen)

Funktion [Masse]= CalcMass(T_ins, P_out, Chng_dir)

runCalc=0; Tmp_start=T_ins; time_start=Uhr; time_end = 0 while runCalc <= 1 if T_ins==(Tmp_start+(7*Chng_dir)) time_end=clock; PwrCntr = 0; runCalc=0; sonst PwrCntr = P_out; runCalc=runCalc+0.1 end end time_diag= time_end-time_start Mass=(P_out*time_diag)/7.035

Und das zweite:

function [timestamps, pwr_usage]= dist_cntrl(Lat_in, Lon_in, P_out, r_pref, speed, T_pref, mass)

AutoStat = 1; ich = 1; while AutoStat == 1 time_start=clock; m = mobiledev; t = csvread('values.csv', 0, 1); t = t(i); Zeitstempel = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i+1; Format lang; %haversine Formel zur Berechnung der Entfernung basierend auf Breitengrad und %longintude a_hav=(sind((m. Latitude-Lat_in)./2)).^2+cosd(Lat_in).*cosd(m.latitude).*(sind((m. Länge-Lon_in)./2)).^2; c_hav= 2.*atan2d(sqrt(a_hav), sqrt(1-a_hav)); d_hav= 6371.*c_hav; Dist=d_hav.*1000; %schätzt Ihre Zeit für die Rückgabe time_rtn=(Dist-r_pref)./speed; %berechnet die erforderliche Thermostateinstellung basierend auf der Leistung der %Klimaanlage und der Luftmasse des Hauses. calcTmp_set=((-1.*P_out.*time_rtn)./(Masse.*(1.005)))+T_pref; % bestimmt, ob die aktuelle Thermostateinstellung geändert werden muss if round(calcTmp_set) ~= round(t) timeACon = clock; PwrCntr = P_out; timeACon= timeACon + clock-time_start; Kosten=P_out*timeACon*rate; else PwrCntr = 0 end timestamps(end+1, [1:6]) = clock; pwr_usage(end+1, 1)= PwrCntr; Pause(5) Ende Ende

Beide Dateien sind Matlab-Funktionen. Sie müssen nicht darauf zugreifen, es sei denn, Sie planen, sie für bestimmte Anforderungen zu ändern, da Sie sie über die GUI aufrufen. Speichern Sie beide Dateien separat, die erste als CalcMass.m und die zweite als dist_cntrl.m. Dies sind die Namen, die der GUI-Code zum Aufrufen der Funktionen verwendet. Wenn Sie also den Rest des folgenden Codes nicht bearbeiten möchten, bleiben Sie bei die Namenskonvention.

Bevor Sie in den GUI-Code einsteigen, müssen Sie den App-Designer für Matlab öffnen, den Sie durch die Navigation in der Matlab-Menüleiste oder durch meine Lieblingsmethode öffnen können, die den folgenden Befehl im Matlab-Befehlsfenster eingibt:

Appdesigner

Sobald der App-Designer geöffnet ist, öffnen Sie eine neue App-Datei (.mlapp) und löschen Sie den gesamten Standardcode aus dem Codefenster. Ersetzen Sie dann alles durch Folgendes und klicken Sie auf die Schaltfläche Ausführen.

classdef Control_1 < matlab.apps. AppBase % Eigenschaften, die den Eigenschaften von App-Komponenten entsprechen (Access = public) UIFigure matlab.ui. Figure TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton matlab.ui.control. Button 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 matlab.ui.container. Tab Temperature1SpinnerLabel matlab.ui.control. Label Temperature1Spinner matlab. 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. Label Gauge matlab.ui.control. Gauge SavingsTab matlab.ui.container. Tab UIAxes matlab.ui.control. UIAxes ThisMonthCostEditFieldLabel matlab.ui.control. Label ThisMonthCostEditField matlab.ui.control. NumericEditFieldNumericEditField TotalSavingsEditFieldLabel matField

Methoden (Zugriff = privat)

% Wert geändert Funktion: tempnow

Funktion tempnowValueChanged(App, Ereignis) temp = app.tempnow. Value; temp=randi([60, 90], 1, 50) app. Gauge. Value = 0 for i = length(temp) app. Gauge. Value= temp(i) pause(1) end end

% Wert geänderte Funktion: TemperatureDirectionSwitch

Funktion TemperatureDirectionSwitchValueChanged(app, event) way = app. TemperatureDirectionSwitch. Value; Weg= uint8(Weg) Weg = Länge(Weg) if Weg == 4 Chng_dir = -1; sonst Chng_dir = 1; end Chng_dir; Ende

% Wert geänderte Funktion: DDFH

Funktion DDFHValueChanged(App, Ereignis) r_pref = app. DDFH. Value; Ende

% Wert geänderte Funktion: AvgLocalSpeedEditField

Funktion AvgLocalSpeedEditFieldValueChanged(app, event) speed = app. AvgLocalSpeedEditField. Value; Ende

% Wert geänderte Funktion: PowerOutputRatingEditField

Funktion PowerOutputRatingEditFieldValueChanged(app, event) value = app. PowerOutputRatingEditField. Value; Ende

% Wert geänderte Funktion: EnergyEfficiencyRatingEditField

Funktion EnergyEfficiencyRatingEditFieldValueChanged(app, event) value = app. EnergyEfficiencyRatingEditField. Value; Ende

% Taste gedrückt Funktion: RunDiagnosticButton

Funktion RunDiagnosticButtonPushed(app, event) way = app. TemperatureDirectionSwitch. Value; Weg= uint8(Weg) Weg = Länge(Weg) if Weg == 4 Chng_dir = -1; sonst Chng_dir = 1; end T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1(T_ins, P_out, Chng_dir)

Ende

% Wert geänderte Funktion: Temperature1Spinner

Funktion Temperature1SpinnerValueChanged(app, event) value = app. Temperature1Spinner. Value; Ende

% Wert geänderte Funktion: Temperature2Spinner

Funktion Temperature2SpinnerValueChanged(app, event) value = app. Temperature2Spinner. Value; Ende

% Wert geändert Funktion: Schalter

Funktion SwitchValueChanged(App, Ereignis) m = mobiledev; Lat_in = m. Breitengrad Längen_in = m. Länge P_out = 0; r_pref = app. DDFH. Wert; T_pref = app. Temperature1Spinner. Value; Geschwindigkeit = m. Geschwindigkeit; Masse = 200; Geschwindigkeit = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl(Lat_in, Lon_in, P_out, r_pref, T_pref, Geschwindigkeit, Masse) end end

% App-Initialisierung und -Konstruktion

Methoden (Zugriff = privat)

% UIFigure und Komponenten erstellen

Funktion createComponents(App)

% UIFigure erstellen

app. UIFigure = uifigure; app. UIFigure. Position = [100 100 640 480]; app. UIFigure. Name = 'UI-Figur';

% TabGruppe erstellen

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

% Setup-Register erstellen

app. SetupTab = uitab(app. TabGroup); app. SetupTab. Title = 'Setup';

% RunDiagnosticButton erstellen

app. RunDiagnosticButton = uibutton(app. SetupTab, 'push'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn(app, @RunDiagnosticButtonPushed, true); app. RunDiagnosticButton. FontWeight = 'fett'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Diagnose ausführen';

% Erstellen Sie EnergieeffizienzBewertungEditFieldLabel

app. EnergyEfficiencyRatingEditFieldLabel = uilabel(app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'richtig'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Energieeffizienzbewertung';

% Erstellen Sie EnergieEffizienzBewertungBearbeitenFeld

app. EnergyEfficiencyRatingEditField = uieditfield(app. SetupTab, 'numerisch'); app. EnergyEfficiencyRatingEditField. Limits = [0 100]; app. EnergyEfficiencyRatingEditField. ValueChangedFcn = createCallbackFcn(app, @EnergyEfficiencyRatingEditFieldValueChanged, true); app. EnergyEfficiencyRatingEditField. HorizontalAlignment = 'center'; app. EnergyEfficiencyRatingEditField. Position = [158 425 100 22];

% PowerOutputRatingEditFieldLabel erstellen

app. PowerOutputRatingEditFieldLabel = uilabel(app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'rechts'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'Leistungsausgangsbewertung';

% PowerOutputRatingEditField erstellen

app. PowerOutputRatingEditField = uieditfield(app. SetupTab, 'numerisch'); app. PowerOutputRatingEditField. Limits = [0 Inf]; app. PowerOutputRatingEditField. ValueChangedFcn = createCallbackFcn(app, @PowerOutputRatingEditFieldValueChanged, true); app. PowerOutputRatingEditField. HorizontalAlignment = 'center'; app. PowerOutputRatingEditField. Position = [151 328 100 22];

% AvgLocalSpeedEditFieldLabel erstellen

app. AvgLocalSpeedEditFieldLabel = uilabel(app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'rechts'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Durchschn. Lokale Geschwindigkeit';

% AvgLocalSpeedEditField erstellen

app. AvgLocalSpeedEditField = uieditfield(app. SetupTab, 'numerisch'); app. AvgLocalSpeedEditField. Limits = [0 70]; app. AvgLocalSpeedEditField. ValueChangedFcn = createCallbackFcn(app, @AvgLocalSpeedEditFieldValueChanged, true); app. AvgLocalSpeedEditField. HorizontalAlignment = 'center'; app. AvgLocalSpeedEditField. Position = [142 231 100 22];

% Gewünschte Entfernung vom Haus erstellenFeldbeschriftung erstellen

app. DesiredDistancefromHouseEditFieldLabel = uilabel(app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'right'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'Gewünschte Distanz'; 'von Haus'};

% DDFH erstellen

app. DDFH = uieditfield(app. SetupTab, 'numerisch'); app. DDFH. Limits = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn(app, @DDFHValueChanged, true); app. DDFH. HorizontalAlignment = 'center'; app. DDFH. Position = [139 135 100 22];

% TemperaturDirectionSwitchLabel erstellen

app. TemperatureDirectionSwitchLabel = uilabel(app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'center'; app. TemperatureDirectionSwitchLabel. Position = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Text = 'Temperaturrichtung';

% TemperaturRichtungsschalter erstellen

app. TemperatureDirectionSwitch = uiswitch(app. SetupTab, 'Schieberegler'); app. TemperatureDirectionSwitch. Items = {'Up', 'Down'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn(app, @TemperatureDirectionSwitchValueChanged, true); app. TemperatureDirectionSwitch. Position = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'Up';

% TempSettingsTab erstellen

app. TempSettingsTab = uitab(app. TabGroup); app. TempSettingsTab. Title = 'Temp. Einstellungen';

% Temperatur1SpinnerLabel erstellen

app. Temperature1SpinnerLabel = uilabel(app. TempSettingsTab); app. Temperature1SpinnerLabel. HorizontalAlignment = 'center'; app. Temperature1SpinnerLabel. Position = [66 363 76 28]; app. Temperature1SpinnerLabel. Text = {'Temperatur'; '#1'};

% Temperatur1Spinner erstellen

app. Temperature1Spinner = uispinner(app. TempSettingsTab); app. Temperature1Spinner. Limits = [60 90]; app. Temperature1Spinner. ValueChangedFcn = createCallbackFcn(app, @Temperature1SpinnerValueChanged, true); app. Temperature1Spinner. Position = [157 346 100 68]; app. Temperature1Spinner. Value = 60;

% Temperatur2SpinnerLabel erstellen

app. Temperature2SpinnerLabel = uilabel(app. TempSettingsTab); app. Temperature2SpinnerLabel. HorizontalAlignment = 'center'; app. Temperature2SpinnerLabel. Position = [66 248 76 28]; app. Temperature2SpinnerLabel. Text = {'Temperatur'; '#2'};

% Temperatur2Spinner erstellen

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;

% Schalter erstellen

app. Switch = uiswitch(app. TempSettingsTab, 'Schieberegler'); app. Switch. Items = {'1', '0'}; app. Switch. ValueChangedFcn = createCallbackFcn(app, @SwitchValueChanged, true); app. Switch. FontName = 'Nyala'; app. Switch. FontSize = 28; App. Schalter. Position = [522 21 74 32]; app. Switch. Value = '0';

% EditFieldLabel erstellen

app. EditFieldLabel = uilabel(app. TempSettingsTab); app. EditFieldLabel. HorizontalAlignment = 'rechts'; app. EditFieldLabel. Position = [374 291 25 22]; app. EditFieldLabel. Text = '';

% Tempnow erstellen

app.tempnow = uieditfield(app. TempSettingsTab, 'numerisch'); app.tempnow. Limits = [60 89]; app.tempnow. ValueChangedFcn = createCallbackFcn(app, @tempnowValueChanged, true); app.tempnow. HorizontalAlignment = 'center'; app.tempnow. FontSize = 26; app.tempnow. Position = [409 230 133 117]; app.tempnow. Value = 60;

% GaugeLabel erstellen

app. GaugeLabel = uilabel(app. TempSettingsTab); app. GaugeLabel. HorizontalAlignment = 'center'; app. GaugeLabel. Position = [225 32 42 22]; app. GaugeLabel. Text = 'Messgerät';

% Messgerät erstellen

app. Gauge = uigauge(app. TempSettingsTab, 'rund'); 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;

% Sparen-Tab erstellen

app. SavingsTab = uitab(app. TabGroup); app. SavingsTab. Title = 'Einsparungen';

% UIAxes erstellen

app. UIAxes = uiaxes(app. SavingsTab); title(app. UIAxes, 'Savings') xlabel(app. UIAxes, 'Month and Year') ylabel(app. UIAxes, 'Money') app. UIAxes. PlotBoxAspectRatio = [1 0.6066666666666667 0.606666666666667]; app. UIAxes. Color = [0,9412 0,9412 0,9412]; app. UIAxes. Position = [146 219 348 237];

% Create ThisMonthCostEditFieldLabel

app. ThisMonthCostEditFieldLabel = uilabel(app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'center'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'Kosten dieses Monats';

% Create ThisMonthCostEditField

app. ThisMonthCostEditField = uieditfield(app. SavingsTab, 'numeric'); app. ThisMonthCostEditField. Limits = [0 Inf]; app. ThisMonthCostEditField. ValueDisplayFormat = '$%7.2f'; app. ThisMonthCostEditField. HorizontalAlignment = 'center'; app. ThisMonthCostEditField. Position = [417 39 137 58];

% TotalSavingsEditFieldLabel erstellen

app. TotalSavingsEditFieldLabel = uilabel(app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'rechts'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Gesamteinsparungen';

% TotalSavingsEditField erstellen

app. TotalSavingsEditField = uieditfield(app. SavingsTab, 'numerisch'); app. TotalSavingsEditField. Limits = [0 Inf]; app. TotalSavingsEditField. ValueDisplayFormat = '$%9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'center'; app. TotalSavingsEditField. Position = [88 39 137 58]; Ende Ende

Methoden (Zugriff = öffentlich)

% App erstellen

Funktions-App = Control_1

% Komponenten erstellen und konfigurieren

createComponents(App)

% Registrieren Sie die App beim App Designer

registerApp(app, app. UIFigure)

wenn Nargout == 0

App-Ende löschen

% Code, der vor dem Löschen der App ausgeführt wird

Funktion löschen (App)

% UIFigure löschen, wenn die App gelöscht wird

delete(app. UIFigure) Ende Ende Ende

Sie werden wahrscheinlich einen Fehler erhalten, was kein Problem ist. Schließen Sie einfach die GUI, die generiert wurde, nachdem Sie auf Ausführen gedrückt haben, wir werden in Kürze die restlichen erforderlichen Programme und Daten sammeln.

Da Matlab eingerichtet ist, können wir zu Python übergehen. Führen Sie zuerst das Python-Programm entweder über Ihre Eingabeaufforderung (unter Windows) oder mithilfe der.exe-Datei in Ihrem Python-Ordner aus. Stellen Sie sicher, dass alle entsprechenden Bibliotheken installiert sind, indem Sie den Importbefehl verwenden.

Seriennummer importieren

Importzeit CSV-Import

Dies sind die drei Bibliotheken, die Sie für den Anfang benötigen, obwohl wir bald unsere eigene Bibliothek erstellen werden. Wenn bei diesen Befehlen ein Fehler aufgetreten ist, gehen Sie zurück und stellen Sie sicher, dass die Bibliotheken installiert sind und sich im Ordner Lib im Ordner Python befinden. Als nächstes werden wir die so genannte Pythonlogger-Bibliothek generieren. Dieser Name ist nicht notwendig, Sie können ihn beliebig nennen, es ist nur der Name der Python-Datei (.py), die Sie erstellen.

Öffnen Sie einen Texteditor, ich verwende Sublime3, aber Notepad funktioniert einwandfrei, und geben Sie diesen Code ein.

def pythonprint():

import pythonlogger import serial import time import csv ser = serial. Serial('COM8') # COM8 ist der serielle arduino-Port, dies wird wahrscheinlich für jeden Benutzer unterschiedlich sein, dh überprüfen Sie Ihren seriellen Port in der arduino-IDE ser.flushInput() während True: try: ser_bytes = ser.readline() print(ser_bytes) with open("test_data.csv", "a") as f:writer = csv.writer(f, delimiter=", ") # setzt die Daten auf kommagetrennt eingegeben werden write.writerow([time.time(), ser_bytes]) #schreibt Daten in test_data.csv außer: print("Error Occured") break

Speichern Sie den Text als "den Namen der gewünschten Bibliothek einfügen".py im Lib-Ordner. Beachten Sie auch, dass die def pythonprint()-Zeile den Namen der Funktion definiert, die Sie aufrufen werden, also können Sie dies in def "Namen für Ihre Funktion einfügen"() ändern. Wenn die Bibliothek gespeichert ist, können wir zum Arduino-Code übergehen.

Öffnen Sie die Arduino-IDE und öffnen Sie zwei neue Skizzenfenster. Speichern Sie diese beiden Skizzendateien an einem geeigneten Ort, der Name dieser Dateien spielt keine Rolle. Löschen Sie dann den gesamten Standardcode und ersetzen Sie ihn durch den folgenden.

Für das empfangende Arduino:

#enthalten

#include #include #include // Dies wird nicht verwendet, aber zum Kompilieren des RH_ASK-Treibers benötigt; struct dataStruct{ float temp; }meine Daten; Void setup () { Serial.begin (9600); // Debuggen nur, wenn (!driver.init()) Serial.println("init fehlgeschlagen"); aufrechtzuerhalten. Void Schleife () { uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof(buf); if (driver.recv(buf, &buflen)) // Nicht blockierend { int i; // Nachricht mit einer guten Prüfsumme erhalten, entsorge sie. //driver.printBuffer("Got:", buf, buflen); memcpy(&myData, buf, sizeof(myData)); Serial.println(""); Serial.print (myData.temp); } }

PS der //driver.printBuffer…. usw. Zeile ist Testcode. Sie müssen sich keine Sorgen machen, es sei denn, Sie führen Diagnosen durch und möchten herausfinden, ob Sie tatsächlich Daten empfangen.

Für den Sender arduino

#enthalten

#include #include #include // Dies wird nicht verwendet, aber zum Kompilieren benötigt #include #include int pin=4; DHT11 dht11 (Stift); RH_ASK-Treiber; struct dataStruct{ float temp; }meine Daten; byte tx_buf[sizeof(myData)] = {0}; // Argumente sind also Bitrate, Sendepin (tx), // Empfangspin (rx), ppt-Pin, isInverse. Die letzten 2 werden nicht verwendet.void setup () { Serial.begin (9600); // Debuggen nur, wenn (!driver.init()) Serial.println("init failed"); aufrechtzuerhalten. Void Schleife () { int err; Schwimmertemperatur, Humi; uint8_t-Nachricht; if((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(); // Ausführung anhalten, bis alle Daten gesendet wurden delay (2000); // 2 Sekunden warten}}

Die Include-Befehle sollten ausreichen, aber wenn Sie später Probleme mit der Datenübertragung haben, sollten Sie im RadioHead-Bibliotheksordner nachsehen und den Rest der Dateinamen im gleichen Format einfügen.

Schritt 5: Damit es funktioniert

Damit es funktioniert
Damit es funktioniert
Damit es funktioniert
Damit es funktioniert
Damit es funktioniert
Damit es funktioniert

Jetzt, da wir den gesamten Code zusammen haben und das Arduino zusammengebaut ist, können wir das Arduino an Ihren Computer anschließen und den Code laden. Stellen Sie sicher, dass Sie den richtigen Code an die empfangenden und sendenden Mikrocontroller senden. Sie können beide Arduinos an Ihren Computer angeschlossen haben, während dies ausgeführt wird, aber Sie müssen sicherstellen, dass Sie den richtigen Port ausgewählt haben, oder Sie können das übertragende Arduino trennen und von einer anderen Quelle mit Strom versorgen, sobald der Code ist hochgeladen.

Apropos, Sie sollten jetzt den Port, der mit Ihrem empfangenden Arduino verbunden ist, aus dem IDE-Tools-Menü auswählen und Python ausführen.

Öffnen Sie den seriellen Monitor nicht, während Sie dies tun, Python kann die Serie nicht lesen, während der Monitor geöffnet ist. Sobald Python geöffnet ist, rufen Sie die Pythonprint-Funktion wie folgt auf.

pythonlogger.pythonprint()

Dadurch wird die Datenerfassung über den seriellen Arduino-Port gestartet. Wenn Sie jetzt Ihren Python-Ordner öffnen, sehen Sie, dass eine neue.csv-Datei namens "test_data.csv" erstellt wurde, die alle Zeit- und Temperaturinformationen enthält. Dies ist die Datei, auf die Matlab zugreift, um alle Berechnungen und Steuerungen durchzuführen.

Eine weitere Warnung: Öffnen Sie test_data.csv nicht, während auf die Daten zugegriffen oder geschrieben wird. Wenn Sie dies tun, stürzt der Python- und/oder der Matlab-Code ab und senden einen Fehler zurück

Wenn Sie die.csv-Datei später öffnen, werden Sie feststellen, dass die Zeitspalte nur eine sehr große Zahlenfolge ist. Das liegt daran, dass der Befehl time.time() die Anzahl der Sekunden seit dem 1. Januar 1970 schreibt.

An diesem Punkt sollte Python die Temperaturdaten drucken, die es von der seriellen Schnittstelle liest. Es sollte ungefähr so aussehen:

b'25.03'/r/n

Machen Sie sich keine Sorgen über die zusätzlichen Zeichen, der Matlab-Code indiziert für die mittleren fünf Werte in der zweiten Spalte der.csv-Datei.

Da nun alle unterstützenden Programme funktionieren und Daten gesammelt werden, können wir mit dem Sammeln von GPS-Daten aus dem zuvor eingerichteten Matlab-Mobilprogramm beginnen und den Matlab-GUI-Code ausführen. Sobald Sie sich im Sensor-Tab von Matlab Mobile befinden, wählen Sie GPS und klicken Sie auf die Starttaste.

Wenn Sie Matlab Mobile noch nicht kennen, gehen Sie zu Schritt 4 zurück und sehen Sie sich die Screenshots oben an. Wenn weiterhin Probleme auftreten, vergewissern Sie sich, dass Sie mit dem zuvor ausgewählten Computer verbunden sind (in der Registerkarte "Einstellungen") und verwenden Sie den Link vom Befehl "Connector on", um zu überprüfen, ob Matlab online ist.

Schritt 6: Verwenden des Programms

Verwenden des Programms
Verwenden des Programms

In diesem System laufen im Hintergrund mehrere Dinge ab. Temperaturdaten werden von Arduino und Python gesammelt und protokolliert, Matlab sammelt GPS-Daten von Ihrem Telefon und führt Berechnungen durch, um zu sehen, wie weit Sie von Ihrem Haus entfernt sind, und stellt Ihren Thermostat basierend auf all diesen Informationen ein. Wo Sie hereinkommen, geben Sie Ihre Präferenzen an.

Führen Sie den Matlab-GUI-Code aus. Öffnen Sie die.mlapp-Datei und sehen Sie sich die erste Registerkarte an. Die Angaben dazu müssen Sie selbst zusammentragen, Effizienz und Leistung Ihres Heiz-/Kühlgerätes finden Sie in der Regel am Gerät selbst und Ihre Durchschnittsgeschwindigkeit ist nur ein guter Schätzwert dafür, wie schnell Sie fahren. Sobald die Werte eingegeben sind, klicken Sie auf die Schaltfläche "Diagnose ausführen" und das Programm steuert Ihren Thermostat, um Informationen über Ihr Haus zu sammeln.

Weiter zum nächsten Menü.

Schritt 7: Temperaturkontrolle

Temperaturkontrolle
Temperaturkontrolle

In diesem Menü können Sie Ihre bevorzugte Temperatur zu Hause und unterwegs auswählen. Stellen Sie Temperatur Nr. 1 auf Ihre angenehme Temperatur und Temperatur Nr. 2 auf einen hohen oder niedrigen Wert ein, der für Ihr Zuhause sicher ist (stellen Sie sicher, dass Sie ihn nicht auf 100 Grad einstellen, wenn Sie Hunde zu Hause haben usw.).

Schritt 8: Historische Daten

Historische Daten
Historische Daten

Schließlich können Sie mit der automatischen Steuerung sehen, wie viel Geld Sie sparen. Dies schätzt im Wesentlichen, wie viel Energie verbraucht würde, wenn Ihr Thermostat rund um die Uhr auf Ihre bevorzugte Temperatur eingestellt wäre, und subtrahiert dann Ihre tatsächlich verbrauchte Energie.

Viel Glück beim Bauen.

Empfohlen: