Obsah:

Autostat: vzdálený termostat: 8 kroků (s obrázky)
Autostat: vzdálený termostat: 8 kroků (s obrázky)

Video: Autostat: vzdálený termostat: 8 kroků (s obrázky)

Video: Autostat: vzdálený termostat: 8 kroků (s obrázky)
Video: Top 20 tipů a triků pro Windows 10 2024, Červenec
Anonim
Autostat: vzdálený termostat
Autostat: vzdálený termostat

Otázka, kterou si pravděpodobně kladete, je „proč vyrábíte další dálkový termostat?“

Odpověď na tuto otázku je, že jsem musel, a inteligentní termostaty na trhu jsou příliš drahé.

Spravedlivé varování, jedná se o sestavu „proof-of-concept“, která by ke skutečnému ovládání vašeho termostatu vyžadovala několik dalších výstupů, ale jádro je na svém místě a lze jej upravit v závislosti na vašich konkrétních okolnostech. Také se stále pracuje, takže očekávejte několik aktualizací a změn (zejména v kódu Matlabu)

Chcete -li začít, chci vás varovat, to vyžaduje tři programy (jeden z nich je dost drahý), několik knihoven a podpůrných balíků pro tyto programy a musíte je nechat všechny mluvit mezi sebou. Bolí to hlava. S tímto varováním mimo cestu můžeme začít s materiály.

Hardware

  • arduino nano
  • arduino uno (nebo jiné nano, právě jsem použil uno, protože jsem měl kolem sebe jeden)
  • různé propojovací kabely, několik zástrček/zástrček a dvě sady tří propojených zástrček pro muže a ženy
  • Rádiofrekvenční (RF) přijímač 433 MHz, použil jsem MX-05V
  • RF vysílač 433 MHz, použil jsem MX-FS-03V
  • Vysoce přesný teploměr a snímač vlhkosti DHT11 (ten, který jsem použil, je nainstalován na tříčipovém čipu s již nainstalovanými požadovanými odpory)
  • prkénko (pokud to všechno nechcete pájet dohromady)
  • telefon s GPS (v tomto případě iPhone 8, ale také jsem použil Galaxy S8)
  • 3D vytištěný kontejner (není to opravdu nutné, jakýkoli kontejner bude fungovat nebo žádný)

Software

  • Matlab od MathWorks (mám edici 2018a, ale použil jsem i verze 2017a-b)
  • V telefonu je nainstalován Matlab mobile
  • balíček podpory arduino pro Matlab
  • Balíček senzorů pro iPhone pro Matlab
  • arduino IDE
  • Balíčky podpory a knihovny RadioHead arduino IDE
  • Knihovna DHT11 pro arduino IDE
  • python 3.7 (ujistěte se, že je nainstalována knihovna nebo sériová knihovna, což by mělo být pro verzi 3.4 nebo novější)

Krok 1: Dát to všechno dohromady

Dát to všechno dohromady
Dát to všechno dohromady
Dát to všechno dohromady
Dát to všechno dohromady
Dát to všechno dohromady
Dát to všechno dohromady

Nejprve bych vám doporučil udělat několik arduino tutoriálů týkajících se RF vysílačů, abyste se ujistili, že vaše části fungují a zapojení je správné. K dispozici je spousta příkladů, včetně kódu (pro ty z nás, kteří o C a C ++ vědí jen málo).

Při sestavování arduina a senzorů postupujte podle níže uvedených schémat zapojení. Při zapojování arduinos je třeba mít na paměti jednu věc: datové porty, které jsem použil, nejsou povinné, ale doporučené.

Pokud se rozhodnete změnit datové porty, které používáte, stačí definovat piny v kódu. Osobně si myslím, že je snazší držet se výchozích portů, které knihovny arduino rozpoznávají.

A aby bylo jasno, nano a uno jsou zaměnitelné, ale použil jsem nano pro stranu vysílače projektu, abych zmenšil velikost monitoru teploty.

Boční poznámka: zelená mašinka držící nano je 3D vytištěný kontejner.

Krok 2: Přijímač

Přijímač
Přijímač

Krok 3: Vysílač

Vysílač
Vysílač

Krok 4: Kód

Jakmile je zapojení dokončeno, musíte spustit všechny programy a nainstalovat knihovny (pokud jste to ještě neudělali), budu předpokládat, že ano, musíte spustit Matlab a spustit balíček podpory pro iPhone. V tuto chvíli musí být váš telefon i Matlab ve stejné síti Wi -Fi.

Do příkazového okna Matlabu napište:

konektor zapnutý

Zobrazí se výzva k zadání pětimístného hesla, které budete používat k připojení k zařízení iPhone. Heslo si nezapomeňte zapamatovat. Když zadáte heslo, Matlab zobrazí některé informace, včetně vaší IP adresy. To použijte v dalším kroku, který vychází z pokynů z nabídky nápovědy „Začínáme se senzory“v Matlab mobile.

  • Chcete -li odeslat data ze senzoru do cloudu MathWorks nebo do počítače, postupujte takto:
  • Pokud odesíláte data ze senzoru do počítače a pokud již nejsou nainstalována, stáhněte si a nainstalujte si balíček podpory MATLAB pro senzory Apple iOS do MATLABu.
  • Připojte MATLAB Mobile k MathWorks Cloud nebo počítači pomocí Nastavení.
  • Vytvořte objekt mobiledev v MATLABu (na vašem počítači), například: >> m = mobiledev
  • Vyberte jeden nebo více senzorů a klepněte na Start.

Chcete -li lokálně protokolovat data senzorů na vašem zařízení, postupujte takto:

  • Na obrazovce Senzory vyberte senzory, ze kterých chcete shromažďovat data.
  • Vyberte Protokol.
  • Klepněte na tlačítko Start.
  • Až budete se shromažďováním dat hotovi, klepněte na tlačítko Zastavit.
  • Ve vyskakovacím okně zadejte název protokolu senzorů.
  • V případě potřeby opakujte kroky 1-5.

Na tuto část se bude odkazovat v části 4, takže zatím není třeba skutečně sbírat data. Mějte svůj telefon vždy po ruce a připravený pro mobilní telefon Matlab.

Nyní musíte někde ve svém počítači vytvořit složku pro uložení souborů kódu Matlab. Budete mít čtyři samostatné soubory, dva pro funkce na pozadí (soubory.m) a jeden soubor kódu Matlab pro grafické uživatelské rozhraní (.mlapp),.

Nejprve je výpočet hmotnosti vzduchu ve vašem domě (to umožňuje Matlabu vědět, jak dlouho trvá vytápění/chlazení vašeho domu)

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

runCalc = 0; Tmp_start = T_ins; time_start = hodiny; time_end = 0 while runCalc <= 1 if T_ins == (Tmp_start+(7*Chng_dir)) time_end = hodiny; PwrCntr = 0; runCalc = 0; else PwrCntr = P_out; runCalc = runCalc+0,1 konec konce time_diag = time_end-time_start Mass = (P_out*time_diag) /7,035

A ten druhý:

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

AutoStat = 1; i = 1; zatímco AutoStat == 1 time_start = hodiny; m = mobiledev; t = csvread ('values.csv', 0, 1); t = t (i); časová razítka = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i+1; formát dlouhý; Vzorec %haversine pro výpočet vzdálenosti na základě zeměpisné šířky a %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; %odhaduje váš čas na návrat time_rtn = (Dist-r_pref)./ speed; %vypočítá potřebné nastavení termostatu na základě spotřeby energie %klimatizace a vzduchové hmoty v domácnosti. calcTmp_set = ((-1.*P_out.*time_rtn)./ (hmotnost.*(1,005)))+T_pref; %určuje, zda je třeba změnit aktuální nastavení termostatu, pokud kolo (calcTmp_set) ~ = kolo (t) timeACon = hodiny; PwrCntr = P_out; timeACon = timeACon + clock-time_start; cena = P_out*timeACon*sazba; else PwrCntr = 0 koncová časová razítka (konec+1, [1: 6]) = hodiny; pwr_usage (end+1, 1) = PwrCntr; pauza (5) konec konec

Oba tyto soubory jsou funkce Matlabu. K nim nebudete muset přistupovat, pokud je neplánujete upravit pro konkrétní potřeby, protože jim budete volat z grafického uživatelského rozhraní. Uložte oba soubory samostatně, první jako CalcMass.m a druhý jako dist_cntrl.m, to budou názvy, která kód GUI používá k volání funkcí, takže pokud nebudete chtít upravit zbytek níže uvedeného kódu, držte se konvence pojmenování.

Než se dostanete do kódu GUI, musíte otevřít návrháře aplikací pro Matlab, který můžete otevřít navigací v pruhu nabídky Matlab, nebo mou oblíbenou metodou, která zadává následující příkaz v okně příkazu Matlab:

designér aplikací

Jakmile je návrhář aplikace otevřený, otevřete nový soubor aplikace (.mlapp) a z okna kódu odstraňte veškerý výchozí kód. Poté vše nahraďte následujícím a stiskněte tlačítko Spustit.

classdef Control_1 <matlab.apps. AppBase % Vlastnosti, které odpovídají vlastnostem komponent aplikace (Access = public) UIFigure matlab.ui. Figure TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton matlab.ui.control. tlačítko 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 ui.control. Spinner Temperature2SpinnerLabel matlab.ui.cont roll. 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. Ukazatel SavingsTab matlab.ui.container. Tab UIAxes matlab.ui.control. UIAxes ThisMonthCostEditFieldLabel matlab.ui.control. Label ThisMonthCostEditField matlab.ui.control. NumericEditField TotalSavingsEditLebel. Lib

metody (Přístup = soukromé)

% Změněná hodnota funkce: tempnow

funkce tempnowValueChanged (aplikace, událost) temp = app.tempnow. Value; temp = randi ([60, 90], 1, 50) app. Gauge. Value = 0 pro i = délka (temp) app. Gauge. Value = temp (i) pause (1) end end

% Funkce změněné hodnoty: TemperatureDirectionSwitch

funkce TemperatureDirectionSwitchValueChanged (aplikace, událost) způsob = app. TemperatureDirectionSwitch. Value; cesta = uint8 (cesta) cesta = délka (cesta) if cesta == 4 Chng_dir = -1; else Chng_dir = 1; konec Chng_dir; konec

% Změněná hodnota funkce: DDFH

funkce DDFHValueChanged (aplikace, událost) r_pref = app. DDFH. Value; konec

% Změněná hodnota funkce: AvgLocalSpeedEditField

funkce AvgLocalSpeedEditFieldValueChanged (aplikace, událost) rychlost = app. AvgLocalSpeedEditField. Value; konec

% Funkce změněná hodnoty: PowerOutputRatingEditField

funkce PowerOutputRatingEditFieldValueChanged (app, event) hodnota = app. PowerOutputRatingEditField. Value; konec

% Změněná hodnota funkce: EnergyEfficiencyRatingEditField

funkce EnergyEfficiencyRatingEditFieldValueChanged (app, event) hodnota = app. EnergyEfficiencyRatingEditField. Value; konec

% Funkce stisknutí tlačítka: RunDiagnosticButton

funkce RunDiagnosticButtonPushed (aplikace, událost) způsob = app. TemperatureDirectionSwitch. Value; cesta = uint8 (cesta) cesta = délka (cesta) if cesta == 4 Chng_dir = -1; else Chng_dir = 1; end T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)

konec

% Funkce změněné hodnoty: Teplota1Spinner

funkce Temperature1SpinnerValueChanged (aplikace, událost) hodnota = app. Temperature1Spinner. Value; konec

% Změněná hodnota funkce: Temperature2Spinner

funkce Temperature2SpinnerValueChanged (aplikace, událost) hodnota = app. Temperature2Spinner. Value; konec

% Funkce se změnou hodnoty: Přepínač

funkce SwitchValueChanged (aplikace, událost) m = mobiledev; Lat_in = m. Latitude Lon_in = m. Longitude P_out = 0; r_pref = app. DDFH. Value; T_pref = app. Temperature1Spinner. Value; rychlost = m. Speed; hmotnost = 200; speed = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, speed, mass) end end

% Inicializace a konstrukce aplikace

metody (Přístup = soukromé)

% Vytvořte UIFigure a komponenty

funkce createComponents (aplikace)

% Vytvořit UIFigure

app. UIFigure = uifigure; app. UIFigure. Position = [100 100 640 480]; app. UIFigure. Name = 'Obrázek uživatelského rozhraní';

% Vytvořit TabGroup

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

% Vytvořit záložku Setup

app. SetupTab = uitab (app. TabGroup); app. SetupTab. Title = 'Nastavení';

% Vytvořit RunDiagnosticButton

app. RunDiagnosticButton = uibutton (app. SetupTab, 'push'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn (app, @RunDiagnosticButtonPushed, true); app. RunDiagnosticButton. FontWeight = 'tučné'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Spustit diagnostiku';

% Vytvořit EnergyEfficiencyRatingEditFieldLabel

app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'vpravo'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Hodnocení energetické účinnosti';

% Vytvořit EnergyEfficiencyRatingEditField

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

% Vytvořit PowerOutputRatingEditFieldLabel

app. PowerOutputRatingEditFieldLabel = uilabel (app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'vpravo'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'Hodnocení výkonu';

% Vytvořit PowerOutputRatingEditField

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

% Vytvořit AvgLocalSpeedEditFieldLabel

app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'vpravo'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Prům. Místní rychlost ';

% Vytvořit AvgLocalSpeedEditField

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

% Vytvořit DesiredDistancefromHouseEditFieldLabel

app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'right'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'Požadovaná vzdálenost'; 'from House'};

% Vytvořit DDFH

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

% Vytvořit TemperatureDirectionSwitchLabel

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

% Vytvořit teplotní směrový přepínač

app. TemperatureDirectionSwitch = uiswitch (app. SetupTab, 'slider'); app. TemperatureDirectionSwitch. Items = {'Nahoru', 'Dolů'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn (app, @TemperatureDirectionSwitchValueChanged, true); app. TemperatureDirectionSwitch. Position = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'Nahoru';

% Vytvořit TempSettingsTab

app. TempSettingsTab = uitab (app. TabGroup); app. TempSettingsTab. Title = 'Teplota. Nastavení ';

% Vytvořit Temperature1SpinnerLabel

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

% Vytvořit Spínač teploty 1

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;

% Vytvořit Temperature2SpinnerLabel

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

% Vytvořte 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;

% Vytvořit přepínač

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

% Vytvořit EditFieldLabel

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

% Vytvořit tempnow

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

% Vytvořit GaugeLabel

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

% Vytvořit měřidlo

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

% Vytvořit záložku

app. SavingsTab = uitab (app. TabGroup); app. SavingsTab. Title = 'Úspory';

% Vytvořte 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];

% Create ThisMonthCostEditFieldLabel

app. ThisMonthCostEditFieldLabel = uilabel (app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'center'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'This Month Cost';

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

% Vytvořit TotalSavingsEditFieldLabel

app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'vpravo'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Celková úspora';

% Vytvořit TotalSavingsEditField

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

metody (Přístup = veřejné)

% Konstrukce aplikace

funkce aplikace = Control_1

% Vytvářejte a konfigurujte součásti

createComponents (aplikace)

% Zaregistrujte aplikaci u App Designer

registerApp (aplikace, aplikace. UIFigure)

pokud nargout == 0

vymazat konec aplikace

% Kód, který se spustí před odstraněním aplikace

odstranění funkce (aplikace)

% Odstranit UIFfigurovat při odstranění aplikace

odstranit (app. UIFigure) konec konec konec

Pravděpodobně se zobrazí chyba, což není problém. Stačí zavřít grafické uživatelské rozhraní, které bylo vygenerováno po stisknutí tlačítka Spustit, za chvíli shromáždíme zbytek potřebných programů a dat.

Protože je Matlab nastaven, můžeme přejít na python. Nejprve spusťte program python buď z příkazového řádku (ve Windows), nebo pomocí souboru.exe ve složce python. Pomocí příkazu import zajistěte, aby byly nainstalovány všechny příslušné knihovny.

importní seriál

doba importu import csv

Toto jsou tři knihovny, které budete potřebovat, i když brzy vytvoříme vlastní knihovnu. Pokud došlo k nějaké chybě u těchto příkazů, vraťte se zpět a ujistěte se, že jsou knihovny nainstalovány a jsou ve složce Lib ve složce python. Dále budeme generovat knihovnu pythonlogger, kterou jsem nazval. Toto jméno není nutné, můžete mu říkat, jak chcete, je to jen název souboru pythonu (.py), který vytvoříte.

Otevřete textový editor, používám Sublime3, ale poznámkový blok funguje dobře a zadejte tento kód.

def pythonprint ():

importovat pythonlogger importovat sériový čas importu importovat csv ser = serial. True: try: ser_bytes = ser.readline () print (ser_bytes) with open ("test_data.csv", "a") as f: writer = csv.writer (f, delimiter = ",") # sets the data to být zadán jako spisovatel oddělený čárkami.pisovatel

Uložte text jako „vložte název požadované knihovny“.py do složky Lib. Všimněte si také, že řádek def pythonprint () definuje název funkce, kterou budete volat, takže ji můžete změnit tak, aby definovala „vložte název, který chcete pro svou funkci“(). Když je knihovna uložena, můžeme přejít na kód arduino.

Otevřete arduino IDE a otevřete dvě nová okna skici. Uložte tyto dva soubory skic někam, kde je to vhodné, na názvu těchto souborů nezáleží. Poté odstraňte veškerý výchozí kód a nahraďte jej následujícím.

Pro přijímající arduino:

#zahrnout

#include #include #include // toto se nepoužívá, ale je potřeba ke kompilaci ovladače RH_ASK; struct dataStruct {float temp; } myData; neplatné nastavení () {Serial.begin (9600); // Ladění pouze pokud (! Driver.init ()) Serial.println ("inicializace se nezdařila"); } void loop () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof (buf); if (driver.recv (buf, & buflen)) // Neblokující {int i; // Byla přijata zpráva s dobrým kontrolním součtem, vyhoďte ji. //driver.printBuffer("Got: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serial.print (myData.temp); }}

P. S. //driver.printBuffer…. atd. řádek je testovací kód. Není třeba se o to starat, pokud děláte diagnositcs a nechcete zjistit, zda data skutečně přijímáte.

Pro vysílač arduino

#zahrnout

#include #include #include // toto se nepoužívá, ale je potřeba ke kompilaci #include #include int pin = 4; DHT11 dht11 (pin); Ovladač RH_ASK; struct dataStruct {float temp; } myData; byte tx_buf [sizeof (myData)] = {0}; // Argumenty jsou tedy přenosová rychlost, vysílací pin (tx), // přijímací pin (rx), ppt pin, isInverse. Poslední 2 se nepoužívají. Vyhněte se setup () {Serial.begin (9600); // Ladění pouze pokud (! Driver.init ()) Serial.println ("inicializace se nezdařila"); } void loop () {int err; float temp, humi; uint8_t msg; 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 (); // zastaví provádění, dokud nebudou odeslána všechna data zpoždění (2000); // počkejte 2 sekundy}}

Příkazy pro zahrnutí by měly stačit, ale pokud máte později problémy s přenosem dat, můžete se podívat do složky knihovny RadioHead a zahrnout zbývající názvy souborů ve stejném formátu.

Krok 5: Aby to fungovalo

Aby to fungovalo
Aby to fungovalo
Aby to fungovalo
Aby to fungovalo
Aby to fungovalo
Aby to fungovalo

Nyní, když máme veškerý kód pohromadě a arduino je sestaveno, můžeme připojit arduino k vašemu počítači a načíst kód. Ujistěte se, že odesíláte správný kód přijímajícím a vysílajícím mikrokontrolérům. Zatímco je spuštěn, můžete mít oba Arduiny připojené k počítači, ale budete se muset ujistit, že máte správný správný port, nebo můžete odpojit vysílací Arduino a napájet jej z jiného zdroje, jakmile je kód nahráno.

Když už mluvíme o tom, měli byste nyní vybrat port, který je připojen k vašemu přijímajícímu arduinu, z nabídky nástrojů IDE a spustit python.

Neotvírejte sériový monitor, když to děláte, python nemůže číst seriál, když je monitor otevřený. Jakmile je python otevřený, zavolejte funkci pythonprint následujícím způsobem.

pythonlogger.pythonprint ()

Tím se zahájí sběr dat ze sériového portu arduino. Pokud nyní otevřete složku python, uvidíte, že byl vytvořen nový soubor.csv s názvem „test_data.csv“, který obsahuje všechny informace o čase a teplotě. Toto bude soubor, ke kterému Matlab přistupuje, aby mohl provádět všechny své výpočty a ovládací prvky.

Další upozornění: neotevírejte test_data.csv, když se přistupuje k datům nebo se do nich zapisuje. Pokud tak učiníte, python a/nebo kód Matlab se zhroutí a odešlou zpět chybu

Pokud se rozhodnete otevřít.csv později, všimnete si, že časový sloupec je jen velmi velký řetězec čísel. Důvodem je, že příkaz time.time () zapisuje počet sekund od 1. ledna 1970.

V tomto okamžiku by měl python tisknout teplotní data, která čte ze sériového portu. Mělo by to vypadat nějak takto:

b'25,03 '/r/n

Nedělejte si starosti s nadbytečnými znaky, kód Matlabu indexuje prostředních pět hodnot ve druhém sloupci souboru.csv.

Nyní, když všechny podpůrné programy fungují a shromažďují se data, můžeme začít sbírat data GPS z mobilního programu Matlab, který byl nastaven dříve, a spustit kód Matlab GUI. Jakmile jste na kartě senzoru Matlab mobile, vyberte GPS a stiskněte tlačítko Start.

Pokud jste v Matlab mobile noví, vraťte se ke kroku 4 a podívejte se na snímky obrazovky výše. Pokud problémy přetrvávají, ujistěte se, že jste připojeni k počítači, který jste vybrali dříve (na kartě nastavení), a pomocí odkazu z příkazu „konektor na“zkontrolujte, zda je Matlab online.

Krok 6: Použití programu

Pomocí programu
Pomocí programu

V tomto systému se na pozadí děje více věcí. Údaje o teplotě shromažďují a zaznamenávají arduino a pyton, Matlab shromažďuje data GPS z vašeho telefonu a provádí výpočty, aby zjistil, jak daleko jste od svého domu, a nastavil termostat na základě všech těchto informací. To, kam přijdete, vám poskytne vaše preference.

Spusťte kód Matlab GUI. Otevřete soubor.mlapp a podívejte se na první kartu. K tomu budete muset shromáždit informace sami, účinnost a výkon vaší topné/chladicí jednotky lze obvykle zjistit na samotné jednotce a vaše průměrná rychlost je jen dobrým odhadem rychlosti jízdy. Jakmile jsou hodnoty zadány, stiskněte tlačítko „Spustit diagnostiku“a program ovládá váš termostat, aby shromáždil informace o vašem domě.

Přejít na další nabídku.

Krok 7: Regulace teploty

Regulace teploty
Regulace teploty

Toto menu vám umožňuje zvolit požadovanou teplotu, když jste doma a mimo domov. Nastavte teplotu č. 1 na vaši příjemnou teplotu a teplotu č. 2 na vysokou nebo nízkou hodnotu, která je pro váš domov bezpečná (ujistěte se, že ji nenastavíte na 100 stupňů, když máte doma psy atd.).

Krok 8: Historická data

Historická data
Historická data

Nakonec můžete pomocí automatického ovládání sledovat, kolik peněz ušetříte. To v podstatě odhaduje, kolik energie by bylo použito, kdyby byl váš termostat nastaven na vámi preferovanou teplotu 24/7, poté odečte vaši skutečnou spotřebovanou energii.

Hodně štěstí při stavbě.

Doporučuje: