Inhoudsopgave:

Autostat: een externe thermostaat - Ajarnpa
Autostat: een externe thermostaat - Ajarnpa

Video: Autostat: een externe thermostaat - Ajarnpa

Video: Autostat: een externe thermostaat - Ajarnpa
Video: Round Wireless als temperatuuropnemer voor een nieuwe zone | Honeywell Home 2024, Juli-
Anonim
Autostat: een thermostaat op afstand
Autostat: een thermostaat op afstand

De vraag die je waarschijnlijk stelt is "waarom maak je nog een thermostaat op afstand?"

Het antwoord op die vraag is: ik moest wel, en de slimme thermostaten op de markt zijn te duur.

Eerlijke waarschuwing, dit is een "proof-of-concept" -constructie waarvoor een paar extra uitgangen nodig zijn om je thermostaat daadwerkelijk te bedienen, maar de kern is op zijn plaats en kan worden aangepast afhankelijk van je specifieke omstandigheden. Dit is ook nog een werk in uitvoering, dus verwacht een paar updates en wijzigingen (vooral aan de Matlab-code)

Om te beginnen wil ik je waarschuwen, dit vereist drie programma's (een daarvan is behoorlijk duur), nogal wat bibliotheken en ondersteuningspakketten voor de programma's, en je moet ze allemaal met elkaar laten praten. Het is hoofdpijn. Met die waarschuwing uit de weg gaan we aan de slag met de materialen.

Hardware

  • arduino nano
  • arduino uno (of een andere nano, ik heb de uno gewoon gebruikt omdat ik er een had liggen)
  • diverse startkabels, enkele mannelijke/mannelijke en twee sets van drie gekoppelde mannelijke/vrouwelijke jumpers
  • 433MHz radiofrequentie (RF) ontvanger, ik gebruikte de MX-05V
  • 433MHz RF-zender, ik gebruikte de MX-FS-03V
  • DHT11-thermometer en vochtigheidssensor met hoge nauwkeurigheid (degene die ik heb gebruikt, is geïnstalleerd op een chip met drie pinnen met de vereiste weerstanden al geïnstalleerd)
  • breadboard (als je dit niet allemaal aan elkaar wilt solderen)
  • een telefoon met GPS (iPhone 8 in dit geval, maar ik heb ook een Galaxy S8)
  • 3D-geprinte container (niet echt nodig, elke container werkt of helemaal geen)

Software

  • Matlab van MathWorks (ik heb de 2018a-editie, maar ik heb ook de 2017a-b-edities gebruikt)
  • Matlab mobiel geïnstalleerd op je telefoon
  • arduino-ondersteuningspakket voor Matlab
  • iPhone-sensorpakket voor Matlab
  • arduino IDE
  • RadioHead-ondersteuningspakketten en bibliotheken van de arduino IDE
  • DHT11-bibliotheek voor arduino IDE
  • python 3.7 (zorg ervoor dat de pyserial-bibliotheek of seriële bibliotheek is geïnstalleerd, wat het zou moeten zijn voor versie 3.4 of nieuwer)

Stap 1: Alles samenbrengen

Alles bij elkaar zetten
Alles bij elkaar zetten
Alles bij elkaar zetten
Alles bij elkaar zetten
Alles bij elkaar zetten
Alles bij elkaar zetten

Allereerst zou ik willen voorstellen dat je een paar arduino-tutorials over de RF-zenders doet om er zeker van te zijn dat je onderdelen werken en dat de bedrading correct is. Er zijn tal van voorbeelden beschikbaar, inclusief de code (voor degenen onder ons die weinig tot niets weten over C en C++).

Volg de onderstaande bedradingsschema's om de Arduino en sensoren in elkaar te zetten. Een ding om in gedachten te houden bij het bekabelen van de Arduino's is dat de datapoorten die ik heb gebruikt niet vereist maar aanbevolen zijn.

ALS u besluit de datapoorten die u gebruikt te wijzigen, hoeft u alleen de pinnen in uw code te definiëren. Persoonlijk denk ik dat het gemakkelijker is om vast te houden aan de standaardpoorten die de arduino-bibliotheken herkennen.

En voor de duidelijkheid, de nano en uno zijn uitwisselbaar, maar ik heb de nano gebruikt voor de zenderkant van het project om de temperatuurmonitor te verkleinen.

Kanttekening: het groene ding dat de nano vasthoudt, is de 3D-geprinte container.

Stap 2: Ontvanger

Ontvanger
Ontvanger

Stap 3: Zender

Zender
Zender

Stap 4: De code

Zodra de bedrading klaar is, moet je alle programma's laten draaien en de bibliotheken installeren (als je dat nog niet hebt gedaan), ik neem gewoon aan dat je Matlab moet opstarten en het iPhone-ondersteuningspakket moet uitvoeren. Zowel je telefoon als Matlab moeten op dit moment op hetzelfde wifi-netwerk zijn aangesloten.

Schrijf in het opdrachtvenster van Matlab:

connector aan

Dit zal u vragen om een vijfcijferig wachtwoord in te voeren dat u zult gebruiken om verbinding te maken op uw iPhone. Zorg ervoor dat u het wachtwoord onthoudt. Als je het wachtwoord hebt ingevoerd, zal Matlab wat informatie tonen, waaronder je IP-adres. Gebruik dit in de volgende stap, die afkomstig is van de instructies uit het helpmenu "Aan de slag met sensoren" in Matlab mobiel.

  • Volg deze stappen om sensorgegevens naar MathWorks Cloud of een computer te sturen:
  • Als u sensorgegevens naar een computer verzendt en deze nog niet is geïnstalleerd, download en installeer dan het MATLAB-ondersteuningspakket voor Apple iOS-sensoren in MATLAB.
  • Verbind MATLAB Mobile met MathWorks Cloud of een computer via Instellingen.
  • Maak een mobiledev-object in MATLAB (op uw computer), bijvoorbeeld: >> m = mobiledev
  • Selecteer een of meer sensoren en tik op Start.

Volg deze stappen om sensorgegevens lokaal op uw apparaat te loggen:

  • Selecteer op het scherm Sensoren de sensoren waarvan u gegevens wilt verzamelen.
  • Selecteer Logboek.
  • Tik op de Start-knop.
  • Als u klaar bent met het verzamelen van gegevens, tikt u op de knop Stoppen.
  • Voer in de pop-up de naam van het sensorlogboek in.
  • Herhaal stap 1-5 indien nodig.

Dit gedeelte wordt in deel 4 terugverwezen, dus het is nog niet nodig om daadwerkelijk te beginnen met het verzamelen van gegevens. Houd gewoon je telefoon bij de hand en Matlab mobiel klaar.

Nu moet je ergens op je computer een map maken om de Matlab-codebestanden te huisvesten. Je hebt vier afzonderlijke bestanden, twee voor de achtergrondfuncties (.m-bestanden) en één Matlab-codebestand voor de GUI (.mlapp),.

De eerste is de massaberekening voor de lucht in uw huis (hierdoor weet Matlab hoelang het duurt om uw huis te verwarmen/koelen)

functie [Massa]= CalcMass (T_ins, P_out, Chng_dir)

runCalc=0; Tmp_start=T_ins; time_start=klok; time_end = 0 while runCalc <= 1 if T_ins==(Tmp_start+(7*Chng_dir)) time_end=clock; PwrCntr = 0; runCalc=0; anders PwrCntr = P_out; runCalc=runCalc+0.1 eind eindtijd_diag= time_end-time_start Mass=(P_out*time_diag)/7.035

En de tweede:

functie [tijdstempels, pwr_usage]= dist_cntrl (Lat_in, Lon_in, P_out, r_pref, snelheid, T_pref, massa)

AutoStat = 1; ik = 1; terwijl AutoStat == 1 time_start=clock; m = mobieldev; t = csvread('waarden.csv', 0, 1); t= t(i); tijdstempels = [0, 0, 0, 0, 0, 0]; pwr_gebruik = 0; ik = ik+1; formaat lang; %haversine-formule voor het berekenen van afstand op basis van breedtegraad en %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; %schat uw tijd om terug te keren time_rtn=(Dist-r_pref)./speed; %berekent de benodigde thermostaatinstelling op basis van het vermogen van %airconditioner en luchtmassa van het huis. calcTmp_set=((-1.*P_out.*time_rtn)./(massa.*(1.005)))+T_pref; % bepaalt of de huidige thermostaatinstelling moet worden gewijzigd als round(calcTmp_set) ~= round(t) timeACon = clock; PwrCntr = P_uit; timeACon= timeACon + clock-time_start; kosten=P_out*timeACon*rate; anders PwrCntr = 0 eindtijdstempels (eind+1, [1:6]) = klok; pwr_usage(end+1, 1)= PwrCntr; pauze(5) einde einde

Beide bestanden zijn Matlab-functies. U hoeft ze niet te openen, tenzij u van plan bent ze aan te passen voor specifieke behoeften, aangezien u ze vanuit de GUI aanroept. Sla beide bestanden afzonderlijk op, de eerste als CalcMass.m en de tweede als dist_cntrl.m, dat zijn de namen die de GUI-code gebruikt om de functies aan te roepen, dus tenzij je de rest van de onderstaande code wilt bewerken, blijf bij de naamgevingsconventie.

Voordat je in de GUI-code komt, moet je de app-ontwerper voor Matlab openen, die je kunt openen door in de Matlab-menubalk te navigeren, of door mijn favoriete methode, namelijk het invoeren van de volgende opdracht in het Matlab-opdrachtvenster:

appdesigner

Zodra de app-ontwerper is geopend, opent u een nieuw app-bestand (.mlapp) en verwijdert u alle standaardcode uit het codevenster. Vervang dan alles door het volgende en druk op de knop Uitvoeren.

classdef Control_1 < matlab.apps. AppBase % Eigenschappen die overeenkomen met eigenschappen van app-componenten (Access = public) UIFiguur matlab.ui. Figuur 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 PowerOutputRatingFieldLabel matlab.ui.control. Label PowerOutputRatingEditField matlab.ui.control. NumericEditFieldui. 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. NumericEditField TotalSavingsEditFieldLabel matlab.ui.control. Label TotalSavings.uicontroleld.

methoden (Toegang = privé)

% Waarde gewijzigde functie: tempnow

functie tempnowValueChanged(app, event) 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

% Waarde gewijzigde functie: TemperatureDirectionSwitch

functie TemperatureDirectionSwitchValueChanged(app, event) way = app. TemperatureDirectionSwitch. Value; way= uint8(way) way = lengte(way) if way == 4 Chng_dir = -1; anders Chng_dir = 1; einde Chng_dir; einde

% Waarde gewijzigde functie: DDFH

functie DDFHValueChanged(app, event) r_pref = app. DDFH. Value; einde

% Waarde gewijzigde functie: AvgLocalSpeedEditField

functie AvgLocalSpeedEditFieldValueChanged(app, event) speed = app. AvgLocalSpeedEditField. Value; einde

% Waarde gewijzigde functie: PowerOutputRatingEditField

functie PowerOutputRatingEditFieldValueChanged(app, event) value = app. PowerOutputRatingEditField. Value; einde

% Waarde gewijzigde functie: EnergyEfficiencyRatingEditField

functie EnergyEfficiencyRatingEditFieldValueChanged(app, event) value = app. EnergyEfficiencyRatingEditField. Value; einde

% Knop ingedrukt functie: RunDiagnosticButton

functie RunDiagnosticButtonPushed(app, event) way = app. TemperatureDirectionSwitch. Value; way= uint8(way) way = lengte(way) if way == 4 Chng_dir = -1; anders Chng_dir = 1; end T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1(T_ins, P_out, Chng_dir)

einde

% Waarde gewijzigde functie: Temperatuur1Spinner

functie Temperature1SpinnerValueChanged(app, event) value = app. Temperature1Spinner. Value; einde

% Waarde gewijzigde functie: Temperature2Spinner

functie Temperature2SpinnerValueChanged(app, event) value = app. Temperature2Spinner. Value; einde

% Waarde gewijzigde functie: Schakelaar

functie SwitchValueChanged(app, event) m = mobiledev; Lat_in = m. Latitude Lon_in = m. Longitude P_out = 0; r_pref = app. DDFH. Waarde; T_pref = app. Temperatuur1Spinner. Waarde; snelheid = m. Snelheid; massa = 200; snelheid = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl(Lat_in, Lon_in, P_out, r_pref, T_pref, snelheid, massa) end end

% App-initialisatie en constructie

methoden (Toegang = privé)

% UIFiguur en componenten maken

functie createComponents(app)

% Creëer UIFiguur

app. UIFiguur = uifiguur; app. UIFiguur. Positie = [100 100 640 480]; app. UIFiguur. Name = 'UI-figuur';

% Tabgroep maken

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

% Maak SetupTabblad

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

% Creëer RunDiagnosticButton

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

% Energie-efficiëntie creërenRatingEditFieldLabel

app. EnergyEfficiencyRatingEditFieldLabel = uilabel(app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'rechts'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Energie-efficiëntieclassificatie';

% Energie-efficiëntie creërenRatingEditField

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

% PowerOutputRating makenEditFieldLabel

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

% PowerOutputRatingEditField maken

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

% Maak AvgLocalSpeedEditFieldLabel

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

% Maak AvgLocalSpeedEditField

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

% Creëer gewenste afstand van huis EditFieldLabel

app. DesiredDistancefromHouseEditFieldLabel = uilabel(app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'rechts'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'Gewenste afstand '; 'van Huis'};

% DDFH aanmaken

app. DDFH = uieditfield(app. SetupTab, 'numeriek'); app. DDFH. Grenzen = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn(app, @DDFHValueChanged, true); app. DDFH. HorizontalAlignment = 'midden'; app. DDFH. Positie = [139 135 100 22];

% Creëer TemperatureDirectionSwitchLabel

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

% Creëer TemperatureDirectionSwitch

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

% Creëer TempSettingsTab

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

% Creëer Temperature1SpinnerLabel

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

% Creëer Temperature1Spinner

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;

% Creëer Temperature2SpinnerLabel

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

% Creëer 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;

% Schakelaar maken

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

% Aanmaken EditFieldLabel

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

% Tempnow maken

app.tempnow = uieditfield(app. TempSettingsTab, 'numeriek'); app.tempnow. Limits = [60 89]; app.tempnow. ValueChangedFcn = createCallbackFcn(app, @tempnowValueChanged, true); app.tempnow. HorizontalAlignment = 'midden'; app.tempnow. FontSize = 26; app.tempnow. Positie = [409 230 133 117]; app.tempnow. Waarde = 60;

% Maak een meterlabel

app. GaugeLabel = uilabel (app. TempSettingsTab); app. GaugeLabel. HorizontalAlignment = 'midden'; app. GaugeLabel. Position = [225 32 42 22]; app. GaugeLabel. Text = 'Meter';

% Aanmaken Meter

app. Gauge = uigauge(app. TempSettingsTab, 'circulair'); app. Gauge. Limits = [60 90]; app. Gauge. MajorTicks = [60 65 70 75 80 85 90]; app. Gauge. Positie = [185 69 120 120]; app. Gauge. Waarde = 60;

% Spaartabblad maken

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

% UIAxes maken

app. UIAxes = uiaxes(app. SavingsTab); title(app. UIAxes, 'Savings') 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];

% Maak deze maandKostenBewerkveldLabel

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

% Maak deze maandKostenBewerkveld

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];

% Creëer TotalSavingsEditFieldLabel

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

% Creëer TotalSavingsEditField

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

methoden (Toegang = openbaar)

% Construct-app

functie app = Control_1

% Componenten maken en configureren

createComponents(app)

% Registreer de app bij App Designer

registerApp(app, app. UIFiguur)

als nagoet == 0

einde app wissen

% Code die wordt uitgevoerd voordat de app wordt verwijderd

functie verwijderen (app)

% UIFiguur verwijderen wanneer app wordt verwijderd

delete (app. UIFiguur) einde einde einde

U krijgt waarschijnlijk een foutmelding, wat geen probleem is. Sluit gewoon de GUI die is gegenereerd nadat je op uitvoeren hebt gedrukt, we zullen zo meteen de rest van de benodigde programma's en gegevens verzamelen.

Nu Matlab is opgezet, kunnen we overgaan op python. Voer eerst het python-programma uit vanaf uw opdrachtprompt (in Windows) of door het.exe-bestand in uw python-map te gebruiken. Zorg ervoor dat alle juiste bibliotheken zijn geïnstalleerd met behulp van de importopdracht.

serieel importeren

import tijd import csv

Dit zijn de drie bibliotheken die je nodig hebt om te beginnen, hoewel we binnenkort onze eigen bibliotheek zullen maken. Als er een fout is opgetreden met deze opdrachten, ga dan terug en zorg ervoor dat de bibliotheken zijn geïnstalleerd en zich in de Lib-map in de python-map bevinden. Vervolgens genereren we wat ik de pythonlogger-bibliotheek heb genoemd. Deze naam is niet nodig, je kunt het noemen wat je wilt, het is gewoon de naam van het python-bestand (.py) dat je maakt.

Open een teksteditor, ik gebruik Sublime3 maar kladblok werkt prima, en voer deze code in.

def pythonprint():

import pythonlogger import serieel import tijd import csv ser = serial. Serial('COM8') # COM8 is de arduino seriële poort, dit zal waarschijnlijk voor elke gebruiker anders zijn, dwz controleer je seriële poort in de arduino IDE ser.flushInput() terwijl True: probeer: ser_bytes = ser.readline() print(ser_bytes) met open("test_data.csv", "a") als f: writer = csv.writer(f, delimiter=", ") # stelt de gegevens in op worden ingevoerd als door komma's gescheiden writer.writerow([time.time(), ser_bytes]) #schrijft gegevens naar test_data.csv behalve: print("Error Occured") break

Sla de tekst op als "voeg de naam van de gewenste bibliotheek in".py in de Lib-map. Merk ook op dat de def pythonprint() regel de naam definieert van de functie die je gaat aanroepen, dus je kunt dat veranderen om "voeg naam in die je wilt voor je functie"() te definiëren. Wanneer de bibliotheek is opgeslagen, kunnen we doorgaan naar de Arduino-code.

Open de arduino IDE en open twee nieuwe schetsvensters. Bewaar die twee schetsbestanden ergens handig, de naam van deze bestanden doet er niet toe. Verwijder vervolgens alle standaardcode en vervang deze door het volgende.

Voor de ontvangende arduino:

#erbij betrekken

#include #include #include // dit wordt niet gebruikt maar is nodig om het RH_ASK-stuurprogramma te compileren; struct dataStruct{ float temp; }mijn data; void setup() { Serial.begin(9600); // Alleen foutopsporing als (!driver.init()) Serial.println("init mislukt"); } void loop() { uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof(buf); if (driver.recv(buf, &buflen)) // Niet-blokkerend { int i; // Bericht met een goede controlesom ontvangen, dump het. //driver.printBuffer ("Gekregen:", buf, buflen); memcpy(&myData, buf, sizeof(myData)); Serieel.println(""); Serial.print(mijnData.temp); } }

PS de //driver.printBuffer…. etc regel is testcode. U hoeft zich er geen zorgen over te maken, tenzij u diagnoses uitvoert en wilt weten of u daadwerkelijk gegevens ontvangt.

Voor de zender arduino

#erbij betrekken

#include #include #include // dit wordt niet gebruikt maar is nodig om te compileren#include #include int pin=4; DHT11 dht11(pin); RH_ASK-stuurprogramma; struct dataStruct{ float temp; }mijn data; byte tx_buf[sizeof(myData)] = {0}; // Dus argumenten zijn bitrate, zendpin (tx), // ontvang pin (rx), ppt pin, isInverse. De laatste 2 worden niet gebruikt.void setup() { Serial.begin(9600); // Alleen foutopsporing als (!driver.init()) Serial.println("init mislukt"); } void loop() { int err; vlottertemperatuur, humi; uint8_t bericht; if((err=dht11.read(humi, temp))==0) myData.temp = temp; memcpy(tx_buf, &myData, sizeof(myData)); byte zize=groottevan(mijngegevens); { Serial.println(myData.temp); driver.send((uint8_t *)tx_buf, zize); stuurprogramma.waitPacketSent(); // stop de uitvoering totdat alle gegevens zijn verzonden vertraging (2000); // wacht 2 seconden } }

De include-commando's zouden voldoende moeten zijn, maar als je later problemen hebt met de gegevensoverdracht, wil je misschien in de RadioHead-bibliotheekmap kijken en de rest van de bestandsnamen in hetzelfde formaat opnemen.

Stap 5: Het laten werken

Het laten werken
Het laten werken
Het laten werken
Het laten werken
Het laten werken
Het laten werken

Nu we alle code bij elkaar hebben en de arduino's gemonteerd zijn, kunnen we de arduino op je computer aansluiten en de code laden. Zorg ervoor dat u de juiste code naar de ontvangende en verzendende microcontrollers stuurt. Je kunt beide arduino's op je computer aansluiten terwijl dit actief is, maar je moet ervoor zorgen dat je de juiste poort hebt geselecteerd om verder te gaan, of je kunt de verzendende arduino loskoppelen en van een andere bron voorzien zodra de code is geüpload.

Daarover gesproken, je moet nu de poort selecteren die is verbonden met je ontvangende arduino in het menu IDE-tools en python uitvoeren.

Open de seriële monitor niet terwijl u dit doet, python kan de seriële monitor niet lezen terwijl de monitor open is. Zodra python is geopend, roept u de pythonprint-functie als volgt aan.

pythonlogger.pythonprint()

Hiermee wordt de gegevensverzameling gestart vanaf de arduino seriële poort. Als u nu uw python-map opent, ziet u dat er een nieuw.csv-bestand is gemaakt met de naam "test_data.csv", dat alle tijd- en temperatuurinformatie bevat. Dit is het bestand dat Matlab gebruikt om al zijn berekeningen en controles uit te voeren.

Nog een waarschuwing: open test_data.csv niet terwijl de gegevens worden geopend of geschreven. Als je dat doet, zal de python en/of de Matlab-code crashen en een foutmelding terugsturen

Als u later besluit om het.csv-bestand te openen, zult u merken dat de tijdkolom slechts een zeer grote reeks getallen is. Dat komt omdat het time.time() commando het aantal seconden schrijft sinds 1 januari 1970.

Op dit punt zou python de temperatuurgegevens moeten afdrukken die het van de seriële poort leest. Het zou er ongeveer zo uit moeten zien:

b'25.03'/r/n

Maak je geen zorgen over de extra tekens, de Matlab-code indexeert voor de middelste vijf waarden in de tweede kolom van het.csv-bestand.

Nu alle ondersteunende programma's werken en gegevens worden verzameld, kunnen we beginnen met het verzamelen van GPS-gegevens van het Matlab mobiele programma dat eerder was ingesteld en de Matlab GUI-code uitvoeren. Zodra u zich in het sensortabblad van Matlab mobile bevindt, selecteert u GPS en drukt u op de startknop.

Als je nieuw bent bij Matlab Mobile, ga dan terug naar stap 4 en bekijk de screenshots hierboven. Als je nog steeds problemen ondervindt, zorg er dan voor dat je verbonden bent met de computer die je eerder hebt geselecteerd (op het tabblad instellingen) en gebruik de link van de "connector aan"-opdracht om te controleren of Matlab online is.

Stap 6: Het programma gebruiken

Het programma gebruiken
Het programma gebruiken

Er zijn meerdere dingen gaande op de achtergrond in dit systeem. Temperatuurgegevens worden verzameld en geregistreerd door arduino en pyton, Matlab verzamelt GPS-gegevens van je telefoon en voert berekeningen uit om te zien hoe ver je van je huis bent en stelt je thermostaat in op basis van al die informatie. Waar u binnenkomt, is het verstrekken van uw voorkeuren.

Voer de Matlab GUI-code uit. Open het.mlapp-bestand en kijk naar het eerste tabblad. De informatie hiervoor moet je zelf verzamelen, het rendement en het vermogen van je verwarmings-/koelunit vind je meestal op de unit zelf en je gemiddelde snelheid is slechts een goede schatting van hoe hard je rijdt. Zodra de waarden zijn ingevoerd, drukt u op de knop "Diagnose uitvoeren" en het programma bestuurt uw thermostaat om informatie over uw huis te verzamelen.

Ga naar het volgende menu.

Stap 7: Temperatuurregeling

Temperatuurregeling
Temperatuurregeling

Met dit menu kunt u uw voorkeurstemperatuur selecteren terwijl u thuis en onderweg bent. Stel Temperatuur #1 in op uw comfortabele temperatuur en Temperatuur #2 op een hoge of lage waarde die veilig is voor uw huis (zorg ervoor dat u deze niet op 100 graden instelt terwijl u honden in huis hebt, enz.).

Stap 8: Historische gegevens

Historische gegevens
Historische gegevens

Eindelijk kunt u zien hoeveel geld u bespaart door gebruik te maken van de automatische besturing. Dit schat in wezen hoeveel energie er zou worden gebruikt als je thermostaat 24/7 op je gewenste temperatuur was ingesteld, en trekt vervolgens je werkelijke verbruikte energie af.

Succes met bouwen.

Aanbevolen: