Innehållsförteckning:

Autostat: en fjärrtermostat: 8 steg (med bilder)
Autostat: en fjärrtermostat: 8 steg (med bilder)

Video: Autostat: en fjärrtermostat: 8 steg (med bilder)

Video: Autostat: en fjärrtermostat: 8 steg (med bilder)
Video: Обзор приложения AutoStat. Подсчёт расходов на авто, в одном удобном месте! 2024, Juli
Anonim
Autostat: en fjärrtermostat
Autostat: en fjärrtermostat

Frågan du förmodligen ställer är "varför gör du en annan fjärrtermostat?"

Svaret på den frågan är, jag var tvungen, och marknadens smarta termostater är för dyra.

Rätt varning, detta är "proof-of-concept" -byggnad som skulle kräva några extra utgångar för att faktiskt styra din termostat, men kärnan är på plats och kan ändras beroende på din specifika omständighet. Detta är också fortfarande på gång, så förvänta dig några uppdateringar och ändringar (särskilt i Matlab -koden)

För att komma igång vill jag varna dig, detta kräver tre program (ett av dem är ganska dyrt), en hel del bibliotek och supportpaket för programmen, och du måste ha dem alla att tala med varandra. Det är huvudvärk. Med den varningen ur vägen kan vi börja med materialen.

Hårdvara

  • arduino nano
  • arduino uno (eller en annan nano, jag använde bara uno eftersom jag hade en som låg runt)
  • diverse bygelkablar, några hanar/hanar och två uppsättningar med tre sammanfogade manliga/kvinnliga hoppare
  • 433MHz radiofrekvens (RF) mottagare, jag använde MX-05V
  • 433MHz RF-sändare, jag använde MX-FS-03V
  • DHT11 termometer och luftfuktighetssensor med hög noggrannhet (den jag använde är installerad på ett trepinnar med nödvändiga motstånd redan installerade)
  • brödbräda (om du inte vill lödda allt detta tillsammans)
  • en telefon med GPS (iPhone 8 i det här fallet, men jag har också använt en Galaxy S8)
  • 3D -tryckt behållare (egentligen inte nödvändigt, någon behållare fungerar eller ingen alls)

programvara

  • Matlab från MathWorks (jag har 2018a-upplagan, men jag har också använt 2017a-b-utgåvor)
  • Matlab -mobil installerad på din telefon
  • arduino supportpaket för Matlab
  • iPhone -sensorpaket för Matlab
  • arduino IDE
  • RadioHead -supportpaket och bibliotek för arduino IDE
  • DHT11 -bibliotek för arduino IDE
  • python 3.7 (se till att pyserialbiblioteket eller det seriella biblioteket är installerat, vilket det bör vara för version 3.4 eller senare)

Steg 1: Sätta ihop allt

Få alltid att falla på plats
Få alltid att falla på plats
Få alltid att falla på plats
Få alltid att falla på plats
Få alltid att falla på plats
Få alltid att falla på plats

Först och främst skulle jag föreslå att du gör några arduinohandledning om RF -sändarna bara för att se till att dina delar fungerar och kablarna är korrekta. Det finns gott om exempel, med koden inkluderad (för oss där ute som inte vet mycket om ingenting om C och C ++).

Följ kopplingsscheman nedan för att få ihop arduino och sensorer. En sak att tänka på när du kopplar upp arduinoerna är att de dataporter jag använde inte krävs men rekommenderas.

OM du bestämmer dig för att ändra dataportarna du använder behöver du bara definiera stiften i din kod. Personligen tror jag att det är lättare att hålla fast vid standardportarna som arduino -biblioteken känner igen.

Och bara för att vara tydlig, nano och uno är utbytbara, men jag använde nano för sändarsidan av projektet för att minska storleken på temperaturmonitorn.

Sidnotering: den gröna kontakten som håller nano är den 3D -tryckta behållaren.

Steg 2: Mottagare

Mottagare
Mottagare

Steg 3: Sändare

Sändare
Sändare

Steg 4: Koden

När kabeldragningen är klar måste du köra alla program och biblioteken installerade (om du inte redan har gjort det), jag antar bara att du har det, du måste starta Matlab och köra iPhone -supportpaketet. Både din telefon och Matlab måste vara på samma wifi -nätverk vid denna tidpunkt.

I kommandofönstret i Matlab skriver du:

kontakten på

Detta uppmanar dig att ange ett femsiffrigt lösenord som du kommer att använda för att ansluta till din iPhone. Se till att du kommer ihåg lösenordet. När du har angett lösenordet kommer Matlab att visa lite information, inklusive din IP -adress. Använd detta i nästa steg, som kommer från instruktionerna från hjälpmenyn "Komma igång med sensorer" i Matlab mobile.

  • Följ dessa steg för att skicka sensordata till MathWorks Cloud eller en dator:
  • Om du skickar sensordata till en dator och om den inte redan är installerad kan du ladda ner och installera MATLAB -supportpaketet för Apple iOS -sensorer i MATLAB.
  • Anslut MATLAB Mobile till MathWorks Cloud eller en dator med Inställningar.
  • Skapa mobiledev -objekt i MATLAB (på din dator), till exempel: >> m = mobiledev
  • Välj en eller flera sensorer och tryck på Start.

Följ dessa steg för att logga sensordata lokalt på din enhet:

  • Välj sensorerna på skärmen Sensors som du vill samla in data från.
  • Välj Logg.
  • Tryck på Start -knappen.
  • När du är klar med att samla in data trycker du på knappen Stopp.
  • Ange namnet på sensorloggen i popup-fönstret.
  • Upprepa steg 1-5 vid behov.

Detta avsnitt kommer att hänvisas tillbaka till i del 4, så du behöver inte börja samla in data ännu. Håll bara telefonen till hands och Matlab mobil redo.

Nu måste du skapa en mapp någonstans i din dator för att rymma Matlab -kodfilerna. Du har fyra separata filer, två för bakgrundsfunktionerna (.m -filer) och en Matlab -kodfil för GUI (.mlapp),.

Först är massberäkningen för luften i ditt hus (detta låter Matlab veta hur lång tid det tar att värma/kyla ditt hus)

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

runCalc = 0; Tmp_start = T_ins; time_start = klocka; time_end = 0 medan runCalc <= 1 if T_ins == (Tmp_start+(7*Chng_dir)) time_end = clock; PwrCntr = 0; runCalc = 0; annars PwrCntr = P_out; runCalc = runCalc+0,1 slutslutstid_diag = time_end-time_start Mass = (P_out*time_diag)/7,035

Och den andra:

function [tidsstämplar, pwr_usage] = dist_cntrl (Lat_in, Lon_in, P_out, r_pref, speed, T_pref, massa)

AutoStat = 1; i = 1; medan AutoStat == 1 time_start = klocka; m = mobiledev; t = csvread ('values.csv', 0, 1); t = t (i); tidsstämplar = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i+1; format longg; %haversineformel för beräkning av avstånd baserat på latitud och %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; %uppskattar din tid att återvända time_rtn = (Dist-r_pref)./ speed; %beräknar den nödvändiga termostatinställningen baserat på strömavbrott från %luftkonditionering och husets luftmassa. calcTmp_set = ((-1.*P_out.*time_rtn)./ (massa.*(1.005))))+T_pref; %avgör om den aktuella termostatinställningen behöver ändras om round (calcTmp_set) ~ = round (t) timeACon = clock; PwrCntr = P_out; timeACon = timeACon + clock-time_start; kostnad = P_out*timeACon*rate; annars PwrCntr = 0 sluttidsstämplar (slut+1, [1: 6]) = klocka; pwr_usage (slutet+1, 1) = PwrCntr; paus (5) slutet slut

Båda dessa filer är Matlab -funktioner. Du behöver inte komma åt dem om du inte planerar att ändra dem för specifika behov, eftersom du kommer att ringa dem från GUI. Spara båda filerna separat, den första som CalcMass.m och den andra som dist_cntrl.m, det är namnen som GUI -koden använder för att anropa funktionerna, så om du inte vill redigera resten av koden nedan, håll fast vid namnkonventionen.

Innan du går in i GUI -koden måste du öppna appdesignern för Matlab, som du kan öppna genom att navigera i Matlab -menyraden, eller med min favoritmetod som anger följande kommando i Matlab -kommandofönstret:

appdesigner

När appdesignern är öppen öppnar du en ny appfil (.mlapp) och raderar all standardkod från kodfönstret. Ersätt sedan allt med följande och tryck på körknappen.

classdef Control_1 <matlab.apps. AppBase % Egenskaper som motsvarar 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.control. Switch TempSettings Tab tablett 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. NumericEditFieldTel. Field. Server. Ellit. Field. Server. Ellit. Field. Server. Ellit. Field. Server. Ellit. Field. Server. Ellit. Field. Server. Ellit. Fabrik. Lån.

metoder (åtkomst = privat)

% Värde ändrad funktion: tempnow

funktion tempnowValueChanged (app, händelse) temp = app.tempnow. Value; temp = randi ([60, 90], 1, 50) app. Gauge. Value = 0 för i = längd (temp) app. Gauge. Value = temp (i) paus (1) slutet

% Värde ändrad funktion: TemperatureDirectionSwitch

function TemperatureDirectionSwitchValueChanged (app, event) sätt = app. TemperatureDirectionSwitch. Value; sätt = uint8 (sätt) sätt = längd (väg) om sätt == 4 Chng_dir = -1; annars Chng_dir = 1; avsluta Chng_dir; slutet

% Värdeförändrad funktion: DDFH

funktion DDFHValueChanged (app, händelse) r_pref = app. DDFH. Value; slutet

% Värde ändrad funktion: AvgLocalSpeedEditField

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

% Värde ändrad funktion: PowerOutputRatingEditField

funktion PowerOutputRatingEditFieldValueChanged (app, händelse) värde = app. PowerOutputRatingEditField. Value; slutet

% Värdeförändrad funktion: EnergyEfficiencyRatingEditField

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

% Button push -funktion: RunDiagnosticButton

funktion RunDiagnosticButtonPushed (app, händelse) sätt = app. TemperatureDirectionSwitch. Value; sätt = uint8 (sätt) sätt = längd (väg) om sätt == 4 Chng_dir = -1; annars Chng_dir = 1; slutet T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)

slutet

% Värdeförändrad funktion: Temperature1Spinner

function Temperature1SpinnerValueChanged (app, event) value = app. Temperature1Spinner. Value; slutet

% Värdeförändrad funktion: Temperature2Spinner

funktion Temperature2SpinnerValueChanged (app, händelse) värde = app. Temperature2Spinner. Value; slutet

% Värde ändrad funktion: Brytare

funktion SwitchValueChanged (app, händelse) m = mobiledev; Lat_in = m. Latitud Lon_in = m. Längdgrad P_out = 0; r_pref = app. DDFH. Värde; T_pref = app. Temperature1Spinner. Value; hastighet = m. hastighet; massa = 200; speed = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, speed, massa) slutet

% Appinitialisering och konstruktion

metoder (åtkomst = privat)

% Skapa UIFigure och komponenter

function createComponents (app)

% Skapa UIFigure

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

% Skapa TabGroup

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

% Skapa SetupTab

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

% Skapa 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 = 'Kör diagnos';

% Skapa EnergyEfficiencyRatingEditFieldLabel

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

% Skapa EnergyEfficiencyRatingEditField

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

% Skapa PowerOutputRatingEditFieldLabel

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

% Skapa PowerOutputRatingEditField

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

% Skapa AvgLocalSpeedEditFieldLabel

app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'right'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Snitt Lokal hastighet ';

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

% Skapa DesiredDistancefromHouseEditFieldLabel

app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'right'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'Önskat avstånd'; 'from House'};

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

% Skapa TemperatureDirectionSwitchLabel

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

% Skapa TemperatureDirectionSwitch

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

% Skapa TempSettingsTab

app. TempSettingsTab = uitab (app. TabGroup); app. TempSettingsTab. Title = 'Temp. Inställningar';

% Skapa Temperature1SpinnerLabel

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

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

% Skapa Temperature2SpinnerLabel

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

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

% Skapa switch

app. Switch = uiswitch (app. TempSettingsTab, 'skjutreglage'); 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';

% Skapa EditFieldLabel

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

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

% Skapa GaugeLabel

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

% Skapa mätare

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

% Skapa SavingsTab

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

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

% Skapa ThisMonthCostEditFieldLabel

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

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

% Skapa TotalSavingsEditFieldLabel

app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'right'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Totala besparingar';

% Skapa TotalSavingsEditField

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

metoder (Access = public)

% Konstruera app

funktionsapp = Control_1

% Skapa och konfigurera komponenter

createComponents (app)

% Registrera appen med App Designer

registerApp (app, app. UIFigure)

om nargout == 0

rensa app slutet slut

% Kod som körs innan app tas bort

ta bort funktion (app)

Ta bort UIFigure när appen raderas

ta bort (app. UIFigure) slutet slutet slutet

Du får förmodligen ett fel, vilket inte är något problem. Stäng bara GUI som genererades efter att du tryckte på run, vi samlar resten av nödvändiga program och data på ett ögonblick.

Eftersom Matlab är konfigurerat kan vi gå vidare till python. Kör först python -programmet antingen från kommandotolken (i Windows) eller genom att använda.exe -filen i din python -mapp. Se till att alla lämpliga bibliotek installeras med hjälp av kommandot import.

importera serie

importtid import csv

Det här är de tre biblioteken du behöver för att börja, även om vi snart kommer att skapa ett eget bibliotek. Om det fanns något fel med dessa kommandon, gå tillbaka och se till att biblioteken är installerade och finns i mappen Lib i python -mappen. Därefter genererar vi det jag har kallat pythonlogger -biblioteket. Det här namnet är inte nödvändigt, du kan kalla det vad du vill, det är bara namnet på python -filen (.py) som du skapar.

Öppna en textredigerare, jag använder Sublime3 men anteckningsblock fungerar alldeles utmärkt, och ange den här koden.

def pythonprint ():

import pythonlogger import seriell import tid import csv ser = serial. Serial ('COM8') # COM8 är arduino seriell port, detta kommer sannolikt att vara annorlunda för varje användare, dvs kontrollera din seriella port i arduino IDE ser.flushInput () medan Sant: försök: ser_bytes = ser.readline () print (ser_bytes) med öppen ("test_data.csv", "a") som f: writer = csv.writer (f, delimiter = ",") # ställer in data till skrivs in som kommaseparerad writer.writerow ([time.time (), ser_bytes]) #writes data till test_data.csv utom: print ("Fel uppstod") paus

Spara texten som "infoga namnet på det bibliotek du vill ha".py i mappen Lib. Observera också att def pythonprint () -linjen definierar namnet på funktionen du ska ringa, så du kan ändra det till def "insert name you want for your function" (). När biblioteket är sparat kan vi gå vidare till arduino -koden.

Öppna arduino IDE och öppna två nya skissfönster. Spara de två skissfilerna någonstans bekvämt, namnet på dessa filer spelar ingen roll. Radera sedan all standardkod och ersätt den med följande.

För den mottagande arduino:

#omfatta

#include #include #include // detta används inte men behövs för att sammanställa RH_ASK -drivrutin; struct dataStruct {float temp; }min data; void setup () {Serial.begin (9600); // Felsökning endast om (! Driver.init ()) Serial.println ("init misslyckades"); } void loop () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof (buf); if (driver.recv (buf, & buflen)) // Icke-blockerande {int i; // Meddelande med en bra kontrollsumma mottagen, dumpa den. //driver.printBuffer("Got: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serial.print (myData.temp); }}

P. S. //driver.printBuffer…. etc -raden är testkod. Du behöver inte oroa dig för det om du inte gör diagnoser och vill ta reda på om du faktiskt tar emot data.

För sändaren arduino

#omfatta

#include #include #include // detta används inte men behövs för att sammanställa #include #include int pin = 4; DHT11 dht11 (stift); RH_ASK -drivrutin; struct dataStruct {float temp; }min data; byte tx_buf [sizeof (myData)] = {0}; // Så argumenten är bithastighet, överföringsstift (tx), // mottagningsstift (rx), ppt -stift, isInverse. De två sista används inte. Void setup () {Serial.begin (9600); // Felsökning endast om (! Driver.init ()) Serial.println ("init misslyckades"); } void loop () {int err; flyta temp, humi; uint8_t msg; om ((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 (); // stoppa körningen tills all data har skickats fördröjning (2000); // vänta 2 sekunder}}

Inkludera -kommandona borde vara tillräckligt, men om du senare har problem med dataöverföringen kanske du vill titta i biblioteksmappen RadioHead och inkludera resten av filnamnen i samma format.

Steg 5: Få det att fungera

Få det att fungera
Få det att fungera
Få det att fungera
Få det att fungera
Få det att fungera
Få det att fungera

Nu när vi har all koden tillsammans och arduinoen är monterad kan vi ansluta arduino till din dator och ladda koden. Se till att du skickar rätt kod till de mottagande och sändande mikrokontrollerna. Du kan ha båda arduinoerna anslutna till din dator medan den körs, men du måste se till att du har rätt port vald framåt, eller så kan du koppla bort den arduino som sänder och driva den från någon annan källa när koden är laddat upp.

På tal om detta, bör du välja porten som är ansluten till din mottagande arduino från IDE -verktygsmenyn nu och köra python.

Öppna inte seriemonitorn medan du gör detta, python kan inte läsa serien medan skärmen är öppen. När python är öppen, ring pythonprint -funktionen enligt följande.

pythonlogger.pythonprint ()

Detta kommer att starta datainsamlingen från den arduino seriella porten. Om du öppnar din python -mapp nu ser du att en ny.csv -fil har skapats som heter "test_data.csv", som innehåller all tid- och temperaturinformation. Det här är filen som Matlab har åtkomst till för att göra alla dess beräkningar och kontroller.

En annan varning: öppna inte test_data.csv medan data öppnas eller skrivs. Om du gör det, kraschar python och/eller Matlab -koden och skickar tillbaka ett fel

Om du bestämmer dig för att öppna.csv senare kommer du att märka att tidskolumnen bara är en mycket stor sträng med siffror. Det beror på att kommandot time.time () skriver antalet sekunder sedan 1 januari 1970.

Vid denna tidpunkt bör python skriva ut temperaturdata som den läser från serieporten. Det ska se ut ungefär så här:

b'25.03 '/r/n

Oroa dig inte för de extra tecknen, Matlab -kodindex för de fem mellersta värdena i den andra kolumnen i CSV -filen.

Nu när alla stödprogrammen fungerar och data samlas in kan vi börja samla GPS -data från Matlab -mobilprogrammet som installerades tidigare och köra Matlab GUI -koden. När du väl är på sensorfliken på Matlab mobile väljer du GPS och trycker på startknappen.

Om du är ny på Matlab mobile, gå tillbaka till steg 4 och titta på skärmdumparna ovan. Om du fortfarande har problem kontrollerar du att du är ansluten till den dator du valde tidigare (på fliken inställningar) och använder länken från kommandot "connector on" för att kontrollera att Matlab är online.

Steg 6: Använda programmet

Använda programmet
Använda programmet

Det finns flera saker som händer i bakgrunden i detta system. Temperaturdata samlas in och loggas av arduino och pyton, Matlab samlar in GPS -data från din telefon och kör beräkningar för att se hur långt du är från ditt hus och ställa in din termostat baserat på all den informationen. Var du kommer in är att ge dina preferenser.

Kör Matlab GUI -koden. Öppna.mlapp -filen och titta på den första fliken. Du måste själv samla in informationen för detta. Effektiviteten och effektvärdet för din värme-/kylenhet kan vanligtvis hittas på själva enheten, och din genomsnittliga hastighet är bara en bra uppskattning av hur snabbt du kör. När värdena har matats in trycker du på knappen "Kör diagnos" och programmet styr din termostat för att samla information om ditt hus.

Gå vidare till nästa meny.

Steg 7: Temperaturkontroll

Temperaturkontroll
Temperaturkontroll

Denna meny låter dig välja önskad temperatur när du är hemma och borta. Ställ in temperatur #1 på din bekväma temperatur och temperatur #2 till ett högt eller lågt värde som är säkert för ditt hem (se till att du inte ställer in den på 100 grader medan du har hundar hemma etc.).

Steg 8: Historiska data

Historisk data
Historisk data

Slutligen kan du se hur mycket pengar du sparar genom att använda den automatiska kontrollen. Detta uppskattar i huvudsak hur mycket energi som skulle användas om din termostat var inställd på din önskade temperatur dygnet runt, och subtraherar sedan din faktiska energiförbrukning.

Lycka till med att bygga.

Rekommenderad: