Innholdsfortegnelse:

Autostat: en ekstern termostat: 8 trinn (med bilder)
Autostat: en ekstern termostat: 8 trinn (med bilder)

Video: Autostat: en ekstern termostat: 8 trinn (med bilder)

Video: Autostat: en ekstern termostat: 8 trinn (med bilder)
Video: 👍Thermostat Wiring for BEGINNERS !!! 2024, Juli
Anonim
Autostat: en ekstern termostat
Autostat: en ekstern termostat

Spørsmålet du sannsynligvis stiller er "hvorfor lager du en annen fjerntermostat?"

Svaret på det spørsmålet er, jeg måtte, og markedets smarte termostater er for dyre.

Rettferdig advarsel, dette er en "proof-of-concept" -konstruksjon som vil kreve noen ekstra utganger for å faktisk kontrollere termostaten din, men kjernen er på plass og kan endres avhengig av din spesifikke omstendighet. Dette er også fremdeles et arbeid som pågår, så forvent noen oppdateringer og endringer (spesielt i Matlab -koden)

For å komme i gang vil jeg advare deg, dette krever tre programmer (ett av dem er ganske dyrt), ganske mange biblioteker og støttepakker for programmene, og du må la dem alle snakke med hverandre. Det er hodepine. Med den advarselen ute av veien kan vi komme i gang med materialene.

Maskinvare

  • arduino nano
  • arduino uno (eller en annen nano, jeg brukte bare unoen fordi jeg hadde en liggende)
  • diverse hoppekabler, noen hann/hann og to sett med tre sammenføyte hann/hun hoppere
  • 433MHz radiofrekvens (RF) mottaker, jeg brukte MX-05V
  • 433MHz RF-sender, jeg brukte MX-FS-03V
  • DHT11 termometer og fuktighetssensor med høy nøyaktighet (den jeg brukte er installert på en trekantet brikke med de nødvendige motstandene allerede installert)
  • brødbrett (hvis du ikke vil lodde alt sammen)
  • en telefon med GPS (iPhone 8 i dette tilfellet, men jeg har også brukt en Galaxy S8)
  • 3D -trykt beholder (egentlig ikke nødvendig, hvilken som helst beholder fungerer eller ingen i det hele tatt)

Programvare

  • Matlab fra MathWorks (jeg har 2018a-utgaven, men jeg har også brukt 2017a-b-utgavene)
  • Matlab mobil installert på telefonen
  • arduino støttepakke for Matlab
  • iPhone -sensorpakke for Matlab
  • arduino IDE
  • RadioHead -støttepakker og biblioteker til arduino IDE
  • DHT11 -bibliotek for arduino IDE
  • python 3.7 (sørg for at det pyserielle biblioteket eller det serielle biblioteket er installert, som det bør være for versjon 3.4 eller nyere)

Trinn 1: Sett alt sammen

Sette alt sammen
Sette alt sammen
Sette alt sammen
Sette alt sammen
Sette alt sammen
Sette alt sammen

Først av alt vil jeg foreslå at du gjør noen få arduino -opplæringsprogrammer om RF -sendere bare for å være sikker på at delene dine fungerer og ledningene er riktige. Det er mange eksempler tilgjengelig, med koden inkludert (for de av oss der ute som vet lite eller ingenting om C og C ++).

Følg koblingsskjemaene nedenfor for å få montert arduino og sensorer. En ting å huske på når du kobler til arduinoene er at dataportene jeg brukte ikke er påkrevd, men anbefales.

HVIS du bestemmer deg for å endre dataportene du bruker, trenger du bare å definere pinnene i koden din. Personlig tror jeg det er lettere å holde fast ved standardportene som arduino -bibliotekene kjenner igjen.

Og bare for å være tydelig, er nano og uno utskiftbare, men jeg brukte nano for sendersiden av prosjektet for å redusere størrelsen på temperaturmonitoren.

Sidemerk: den grønne kontakten som holder nano er den 3D -trykte beholderen.

Trinn 2: Mottaker

Mottaker
Mottaker

Trinn 3: Sender

Sender
Sender

Trinn 4: Koden

Når ledningen er ferdig må du få alle programmene til å kjøre og bibliotekene installert (hvis du ikke allerede har gjort det). Jeg antar at du har det. Du må starte Matlab og kjøre støttepakken for iPhone. Både telefonen og Matlab må være på samme wifi -nettverk på dette tidspunktet.

I kommandovinduet til Matlab skriver du:

kontakten på

Dette vil be deg om å skrive inn et femsifret passord som du vil bruke til å koble til på iPhone. Sørg for at du husker passordet. Når du har angitt passordet vil Matlab vise litt informasjon, inkludert din IP -adresse. Bruk dette i neste trinn, som kommer fra instruksjonene fra hjelpemenyen "Komme i gang med sensorer" i Matlab mobile.

  • Følg disse trinnene for å sende sensordata til MathWorks Cloud eller en datamaskin:
  • Hvis du sender sensordata til en datamaskin, og hvis den ikke allerede er installert, kan du laste ned og installere MATLAB -støttepakken for Apple iOS -sensorer i MATLAB.
  • Koble MATLAB Mobile til MathWorks Cloud eller en datamaskin ved hjelp av Innstillinger.
  • Lag mobiledev -objekt i MATLAB (på datamaskinen din), for eksempel: >> m = mobiledev
  • Velg en eller flere sensorer, og trykk på Start.

Følg disse trinnene for å logge sensordata lokalt på enheten:

  • På sensorskjermbildet velger du sensorene du vil samle data fra.
  • Velg Logg.
  • Trykk på Start -knappen.
  • Når du er ferdig med å samle inn data, trykker du på Stopp -knappen.
  • I popup-vinduet skriver du inn navnet på sensorloggen.
  • Gjenta trinn 1-5 om nødvendig.

Denne delen vil bli referert tilbake til i del 4, så du trenger ikke å begynne å samle inn data enda. Bare hold telefonen din tilgjengelig og Matlab mobil klar.

Nå må du opprette en mappe et sted i datamaskinen for å huse Matlab -kodefilene. Du har fire separate filer, to for bakgrunnsfunksjonene (.m -filer) og en Matlab -kodefil for GUI (.mlapp),.

Først er masseberegningen for luften i huset ditt (dette lar Matlab vite hvor lang tid det tar å varme/avkjøle huset ditt)

funksjon [Mass] = CalcMass (T_ins, P_out, Chng_dir)

runCalc = 0; Tmp_start = T_ins; time_start = klokke; time_end = 0 mens runCalc <= 1 if T_ins == (Tmp_start+(7*Chng_dir)) time_end = clock; PwrCntr = 0; runCalc = 0; ellers PwrCntr = P_out; runCalc = runCalc+0.1 sluttidstid_diag = time_end-time_start Mass = (P_out*time_diag) /7.035

Og den andre:

funksjon [tidsstempler, pwr_usage] = dist_cntrl (Lat_in, Lon_in, P_out, r_pref, speed, T_pref, masse)

AutoStat = 1; i = 1; mens AutoStat == 1 time_start = klokke; m = mobiledev; t = csvread ('values.csv', 0, 1); t = t (i); tidsstempler = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i+1; format longg; %haversineformel for å beregne avstand basert på breddegrad og %longintude a_hav = (sind ((m. Latitude-Lat_in)./ 2)).^2+cosd (Lat_in).*cosd (m. breddegrad).*(sind ((m. Lengdegrad-Lon_in)./ 2)).^2; c_hav = 2.*atan2d (sqrt (a_hav), sqrt (1-a_hav)); d_hav = 6371.*c_hav; Dist = d_hav.*1000; %anslår tiden din for å returnere time_rtn = (Dist-r_pref)./ speed; %beregner den nødvendige termostatinnstillingen basert på strømavbrudd av %klimaanlegg og husets luftmasse. calcTmp_set = ((-1.*P_out.*time_rtn)./ (masse.*(1.005))))+T_pref; %bestemmer om den nåværende termostatinnstillingen må endres hvis runde (calcTmp_set) ~ = runde (t) tidACon = klokke; PwrCntr = P_out; timeACon = timeACon + clock-time_start; cost = P_out*timeACon*rate; ellers PwrCntr = 0 sluttidsstempler (slutt+1, [1: 6]) = klokke; pwr_usage (end+1, 1) = PwrCntr; pause (5) slutten slutt

Begge disse filene er Matlab -funksjoner. Du trenger ikke å få tilgang til dem med mindre du har tenkt å endre dem for spesifikke behov, siden du vil ringe dem fra GUI. Lagre begge filene separat, den første som CalcMass.m og den andre som dist_cntrl.m, det vil være navnene som GUI -koden bruker for å kalle funksjonene, så med mindre du vil redigere resten av koden nedenfor, hold deg til navnekonvensjonen.

Før du går inn i GUI -koden, må du åpne appdesigneren for Matlab, som du kan åpne ved å navigere i Matlab -menylinjen, eller med min favorittmetode som angir følgende kommando i Matlab -kommandovinduet:

appdesigner

Når appdesigneren er åpen, åpner du en ny appfil (.mlapp) og sletter all standardkoden fra kodevinduet. Deretter erstatter du alt med følgende og trykker på run -knappen.

classdef Control_1 <matlab.apps. AppBase % Egenskaper som tilsvarer appkomponentegenskaper (Access = public) UIFigure matlab.ui. Figur 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.kontroll. Switch TempSettingsTab matlab.ui.container. Tab. 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 TotalSavl. Ellit. Field. Selv. Elite. Selv.

metoder (tilgang = privat)

% Verdi endret funksjon: tempnow

funksjon tempnowValueChanged (app, hendelse) 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) ende ende

% Verdi endret funksjon: TemperatureDirectionSwitch

function TemperatureDirectionSwitchValueChanged (app, event) way = app. TemperatureDirectionSwitch. Value; way = uint8 (way) way = length (way) if way == 4 Chng_dir = -1; annet Chng_dir = 1; avslutte Chng_dir; slutt

% Verdi endret funksjon: DDFH

funksjon DDFHValueChanged (app, hendelse) r_pref = app. DDFH. Value; slutt

% Verdi endret funksjon: AvgLocalSpeedEditField

function AvgLocalSpeedEditFieldValueChanged (app, event) speed = app. AvgLocalSpeedEditField. Value; slutt

% Verdi endret funksjon: PowerOutputRatingEditField

funksjon PowerOutputRatingEditFieldValueChanged (app, hendelse) verdi = app. PowerOutputRatingEditField. Value; slutt

% Verdi endret funksjon: EnergyEfficiencyRatingEditField

function EnergyEfficiencyRatingEditFieldValueChanged (app, event) value = app. EnergyEfficiencyRatingEditField. Value; slutt

% Button pushed function: RunDiagnosticButton

funksjon RunDiagnosticButtonPushed (app, hendelse) måte = app. TemperatureDirectionSwitch. Value; way = uint8 (way) way = length (way) if way == 4 Chng_dir = -1; annet Chng_dir = 1; ende T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)

slutt

% Verdi endret funksjon: Temperatur1Spinner

funksjon Temperatur1SpinnerValueChanged (app, hendelse) verdi = app. Temperature1Spinner. Value; slutt

% Verdi endret funksjon: Temperature2Spinner

funksjon Temperature2SpinnerValueChanged (app, hendelse) verdi = app. Temperature2Spinner. Value; slutt

% Verdi endret funksjon: Bryter

funksjon SwitchValueChanged (app, hendelse) m = mobiledev; Lat_in = m. Latitude Lon_in = m. Lengdegrad P_out = 0; r_pref = app. DDFH. Value; T_pref = app. Temperature1Spinner. Value; hastighet = m. hastighet; masse = 200; speed = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, speed, masse) ende ende

% Initialisering og konstruksjon av apper

metoder (tilgang = privat)

% Lag UIFigure og komponenter

function createComponents (app)

% Lag UIFigure

app. UIFigure = uifigure; app. UIFigure. Position = [100100640 480]; app. UIFigure. Name = 'UI -figur';

% Opprett TabGroup

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

% Lag SetupTab

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

% Lag RunDiagnosticButton

app. RunDiagnosticButton = uibutton (app. SetupTab, 'push'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn (app, @RunDiagnosticButtonPushed, true); app. RunDiagnosticButton. FontWeight = 'fet'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Kjør diagnostikk';

% Lag EnergyEfficiencyRatingEditFieldLabel

app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'right'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Energy Efficiency Rating';

% Lag EnergyEfficiencyRatingEditField

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

% Lag PowerOutputRatingEditFieldLabel

app. PowerOutputRatingEditFieldLabel = uilabel (app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'høyre'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'Power Output Rating';

% Lag PowerOutputRatingEditField

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

% Lag AvgLocalSpeedEditFieldLabel

app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'høyre'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Gj.sn. Lokal hastighet ';

% Opprett AvgLocalSpeedEditField

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

% Opprett DesiredDistancefromHouseEditFieldLabel

app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'right'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'Ønsket avstand'; 'from House'};

% Opprett DDFH

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

% Lag TemperatureDirectionSwitchLabel

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

% Lag TemperatureDirectionSwitch

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

% Opprett TempSettingsTab

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

% Lag Temperature1SpinnerLabel

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

% Lag 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;

% Lag Temperature2SpinnerLabel

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

% Lag 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;

% Lag bryter

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

% Lag EditFieldLabel

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

% Opprett tempnow

app.tempnow = uieditfield (app. TempSettingsTab, 'numerisk'); 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;

% Lag GaugeLabel

app. GaugeLabel = uilabel (app. TempSettingsTab); app. GaugeLabel. HorizontalAlignment = 'center'; app. GaugeLabel. Position = [225 32 42 22]; app. GaugeLabel. Text = 'Måler';

% Lag måler

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

% Lag SavingsTab

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

% Opprett UIAxes

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

% Lag ThisMonthCostEditFieldLabel

app. ThisMonthCostEditFieldLabel = uilabel (app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'center'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'Denne månedskostnaden';

% Lag ThisMonthCostEditField

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

% Lag TotalSavingsEditFieldLabel

app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'høyre'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Totale besparelser';

% Lag TotalSavingsEditField

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

metoder (Access = public)

% Konstruer app

funksjonsapp = Control_1

% Opprett og konfigurer komponenter

createComponents (app)

% Registrer appen med App Designer

registerApp (app, app. UIFigure)

hvis nargout == 0

klar app slutten slutten

% Kode som kjøres før app sletting

sletting av funksjoner (app)

Slett UIFigure når appen er slettet

slett (app. UIFigure) slutten slutten slutten

Du får sannsynligvis en feil, noe som ikke er noe problem. Bare lukk GUI -en som ble generert etter at du trykket på run, vi samler resten av nødvendige programmer og data om et øyeblikk.

Siden Matlab er satt opp, kan vi gå videre til python. Kjør først python -programmet enten fra ledeteksten (på Windows) eller ved å bruke.exe -filen i python -mappen. Sørg for at alle de aktuelle bibliotekene er installert ved å bruke importkommandoen.

importer serie

importtid import csv

Dette er de tre bibliotekene du trenger for å starte, selv om vi snart lager vårt eget bibliotek. Hvis det var en slags feil med disse kommandoene, gå tilbake og kontroller at bibliotekene er installert og er i Lib -mappen i python -mappen. Deretter genererer vi det jeg har kalt pythonlogger -biblioteket. Dette navnet er ikke nødvendig, du kan kalle det hva du vil, det er bare navnet på python -filen (.py) du lager.

Åpne et tekstredigeringsprogram, jeg bruker Sublime3, men notisblokk fungerer helt fint, og skriv inn denne koden.

def pythonprint ():

import pythonlogger import seriell importtid import csv ser = serial. Serial ('COM8') # COM8 er arduino seriell port, dette vil sannsynligvis være forskjellig for hver bruker, dvs. sjekk den serielle porten i arduino IDE ser.flushInput () mens Sant: prøv: ser_bytes = ser.readline () print (ser_bytes) med åpen ("test_data.csv", "a") som f: writer = csv.writer (f, delimiter = ",") # setter dataene til skriv inn som kommaseparert writer.writerow ([time.time (), ser_bytes]) #writes data til test_data.csv unntatt: print ("feil oppstod") pause

Lagre teksten som "sett inn navnet på biblioteket du ønsker".py i Lib -mappen. Vær også oppmerksom på at def pythonprint () -linjen definerer navnet på funksjonen du skal ringe, så du kan endre det til å definere "sett inn navn du vil ha for funksjonen din" (). Når biblioteket er lagret kan vi gå videre til arduino -koden.

Åpne arduino IDE og åpne to nye skissevinduer. Lagre de to skissefilene et sted som er praktisk, navnet på disse filene spiller ingen rolle. Slett deretter all standardkoden og erstatt den med følgende.

For den mottakende arduinoen:

#inkludere

#include #include #include // dette brukes ikke, men er nødvendig for å kompilere RH_ASK -driveren; struct dataStruct {float temp; } myData; ugyldig oppsett () {Serial.begin (9600); // Debugging bare hvis (! Driver.init ()) Serial.println ("init mislyktes"); } void loop () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof (buf); if (driver.recv (buf, & buflen)) // Ikke-blokkerende {int i; // Melding med god kontrollsum mottatt, dump den. //driver.printBuffer("Got: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serial.print (myData.temp); }}

P. S. // driver.printBuffer…. etc -linjen er testkoden. Du trenger ikke å bekymre deg for det med mindre du gjør diagnoser og vil finne ut om du faktisk mottar data.

For senderen arduino

#inkludere

#include #include #include // dette brukes ikke, men er nødvendig for å kompilere #include #include int pin = 4; DHT11 dht11 (pin); RH_ASK driver; struct dataStruct {float temp; } myData; byte tx_buf [sizeof (myData)] = {0}; // Så argumenter er bitrate, overføringspinne (tx), // mottak pin (rx), ppt pin, isInverse. De to siste brukes ikke. Ugyldig oppsett () {Serial.begin (9600); // Debugging bare hvis (! Driver.init ()) Serial.println ("init mislyktes"); } void loop () {int err; flyte temp, humi; uint8_t msg; hvis ((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 (); // stoppe kjøringen til alle data er sendt forsinkelse (2000); // vent 2 sekunder}}

Inkluder -kommandoene bør være nok, men hvis du senere har problemer med dataoverføringen, vil du kanskje se i RadioHead -bibliotekmappen og inkludere resten av filnavnene i samme format.

Trinn 5: Få det til å fungere

Få det til å fungere
Få det til å fungere
Få det til å fungere
Få det til å fungere
Få det til å fungere
Få det til å fungere

Nå som vi har all koden samlet og arduinoen er samlet, kan vi koble arduinoen til datamaskinen din og laste inn koden. Sørg for at du sender den riktige koden til de mottakende og overførende mikrokontrollerne. Du kan ha begge arduinoene koblet til datamaskinen din mens denne kjører, men du må sørge for at du har valgt riktig port fremover, eller du kan koble fra sendende arduino og koble den fra en annen kilde når koden er lastet opp.

Når vi snakker om det, bør du velge porten som er koblet til din mottagende arduino fra IDE -verktøymenyen nå og kjøre python.

Ikke åpne den serielle skjermen mens du gjør dette, python kan ikke lese serien mens skjermen er åpen. Når python er åpen, kaller du pythonprint -funksjonen som følger.

pythonlogger.pythonprint ()

Dette vil starte datainnsamlingen fra den arduino serielle porten. Hvis du åpner python -mappen din nå, ser du at en ny.csv -fil er opprettet som heter "test_data.csv", som inneholder all informasjon om tid og temperatur. Dette vil være filen Matlab får tilgang til for å gjøre alle beregninger og kontroller.

En annen advarsel: ikke åpne test_data.csv mens dataene er tilgjengelig eller skrevet. Hvis du gjør det, krasjer python og/eller Matlab -koden og sender tilbake en feil

Hvis du bestemmer deg for å åpne.csv senere, vil du legge merke til at tidskolonnen bare er en veldig stor tallrekke. Det er fordi kommandoen time.time () skriver antall sekunder siden 1. januar 1970.

På dette tidspunktet bør python skrive ut temperaturdataene den leser fra den serielle porten. Det skal se ut omtrent som:

b'25.03 '/r/n

Ikke bekymre deg for de ekstra tegnene, Matlab -kodeindeksene for de fem midterste verdiene i den andre kolonnen i CSV -filen.

Nå som alle støtteprogrammene fungerer og data samles inn, kan vi begynne å samle GPS -data fra Matlab -mobilprogrammet som ble konfigurert tidligere og kjøre Matlab GUI -koden. Når du er i sensorfanen på Matlab mobile, velger du GPS og trykker på startknappen.

Hvis du er ny på Matlab mobile, går du tilbake til trinn 4 og ser på skjermbildene ovenfor. Hvis du fortsatt har problemer, må du kontrollere at du er koblet til datamaskinen du valgte tidligere (i kategorien Innstillinger) og bruke lenken fra kommandoen "tilkobling på" for å kontrollere at Matlab er tilkoblet.

Trinn 6: Bruke programmet

Bruke programmet
Bruke programmet

Det er flere ting som skjer i bakgrunnen i dette systemet. Temperaturdata blir samlet inn og logget av arduino og pyton, Matlab samler inn GPS -data fra telefonen og kjører beregninger for å se hvor langt du er fra huset ditt og setter termostaten din basert på all den informasjonen. Hvor du kommer inn er å gi dine preferanser.

Kjør Matlab GUI -koden. Åpne.mlapp -filen og se på den første kategorien. Du må samle informasjonen for dette selv. Effektiviteten og effektverdien til varme-/kjøleenheten din finner du vanligvis på selve enheten, og gjennomsnittshastigheten er bare et godt estimat på hvor fort du kjører. Når verdiene er lagt inn, trykker du på "Run Diagnostic" -knappen og programmet styrer termostaten din for å samle informasjon om huset ditt.

Gå videre til neste meny.

Trinn 7: Temperaturkontroll

Temperatur kontroll
Temperatur kontroll

Denne menyen lar deg velge ønsket temperatur mens du er hjemme og borte. Sett temperatur nr. 1 til komfortabel temperatur og temperatur nr. 2 til høy eller lav verdi som er trygg for hjemmet ditt (pass på at du ikke setter den til 100 grader mens du har hunder hjemme osv.).

Trinn 8: Historiske data

Historisk data
Historisk data

Til slutt kan du se hvor mye penger du sparer ved å bruke den automatiske kontrollen. Dette anslår i hovedsak hvor mye energi som ville bli brukt hvis termostaten din var satt til din foretrukne temperatur 24/7, og trekker deretter den faktiske energien du bruker.

Lykke til med å bygge.

Anbefalt: