Obsah:

Autostat: diaľkový termostat: 8 krokov (s obrázkami)
Autostat: diaľkový termostat: 8 krokov (s obrázkami)

Video: Autostat: diaľkový termostat: 8 krokov (s obrázkami)

Video: Autostat: diaľkový termostat: 8 krokov (s obrázkami)
Video: Обзор приложения AutoStat. Подсчёт расходов на авто, в одном удобном месте! 2024, Júl
Anonim
Autostat: diaľkový termostat
Autostat: diaľkový termostat

Otázka, ktorú si pravdepodobne kladiete, je „prečo vyrábate ďalší diaľkový termostat?“

Odpoveď na túto otázku je, že som musel a inteligentné termostaty na trhu sú príliš drahé.

Spravodlivé varovanie, toto je zostava „dôkazu koncepcie“, ktorá by na skutočné ovládanie vášho termostatu vyžadovala niekoľko ďalších výstupov, ale jadro je na svojom mieste a je možné ho upraviť v závislosti od vašich konkrétnych okolností. Tiež sa stále pracuje, takže očakávajte niekoľko aktualizácií a zmien (najmä v kóde Matlab)

Na začiatok vás chcem varovať, že to vyžaduje tri programy (jeden z nich je dosť drahý), niekoľko knižníc a podporné balíky k programom a musíte ich nechať medzi sebou hovoriť. Bolí to hlava. S týmto varovaním mimo cesty začneme s materiálmi.

Hardvér

  • arduino nano
  • arduino uno (alebo iné nano, práve som použil uno, pretože som mal okolo seba jedno)
  • rôzne prepojovacie káble, niekoľko mužských/mužských a dve sady troch spojených prepojok medzi mužmi a ženami
  • Rádiofrekvenčný (RF) prijímač 433 MHz, použil som MX-05V
  • RF vysielač 433 MHz, použil som MX-FS-03V
  • Vysoko presný teplomer a snímač vlhkosti DHT11 (ten, ktorý som použil, je nainštalovaný na trojcípom čipe s už nainštalovanými požadovanými odpormi)
  • breadboard (ak to nechcete celé spájkovať)
  • telefón s GPS (v tomto prípade iPhone 8, ale používal som aj Galaxy S8)
  • 3D tlačený kontajner (nie je to vôbec potrebné, akýkoľvek kontajner bude fungovať alebo žiadny)

Softvér

  • Matlab od MathWorks (mám edíciu 2018a, ale použil som aj verzie 2017a-b)
  • V telefóne je nainštalovaný Matlab mobile
  • balík podpory arduino pre Matlab
  • Balíček senzorov pre iPhone pre Matlab
  • arduino IDE
  • Balíky podpory a knižnice RadioHead arduino IDE
  • Knižnica DHT11 pre arduino IDE
  • python 3.7 (uistite sa, že je nainštalovaná knižnica alebo sériová knižnica, ktorá by mala byť pre verziu 3.4 alebo novšiu)

Krok 1: Dajte to všetko dohromady

Dávať to všetko dokopy
Dávať to všetko dokopy
Dávať to všetko dokopy
Dávať to všetko dokopy
Dávať to všetko dokopy
Dávať to všetko dokopy

Najprv by som vám odporučil urobiť niekoľko arduino návodov týkajúcich sa RF vysielačov, aby ste sa uistili, že vaše súčiastky fungujú a zapojenie je správne. K dispozícii je veľa príkladov vrátane kódu (pre tých z nás, ktorí o C a C ++ nevedia takmer nič).

Pri zostavovaní arduina a senzorov postupujte podľa nižšie uvedených schém zapojenia. Pri zapájaní arduinosu je potrebné mať na pamäti jednu vec - dátové porty, ktoré som použil, nie sú povinné, ale odporúčané.

AK sa rozhodnete zmeniť používané dátové porty, stačí definovať piny vo svojom kóde. Osobne si myslím, že je jednoduchšie držať sa predvolených portov, ktoré arduino knižnice rozpoznávajú.

A aby bolo jasné, nano a uno sú zameniteľné, ale nano som použil na strane vysielača projektu na zníženie veľkosti monitora teploty.

Bočná poznámka: Zelená mašinka držiaca nano je 3D tlačený kontajner.

Krok 2: Prijímač

Prijímač
Prijímač

Krok 3: Vysielač

Vysielač
Vysielač

Krok 4: Kód

Akonáhle je zapojenie dokončené, musíte spustiť všetky programy a nainštalovať knižnice (ak ste to ešte neurobili), budem predpokladať, že máte, musíte spustiť Matlab a spustiť balík podpory pre iPhone. Váš telefón aj Matlab musia byť v tomto mieste v rovnakej sieti Wi -Fi.

Do príkazového okna programu Matlab napíšte:

zapnutý konektor

Zobrazí sa výzva na zadanie päťciferného hesla, ktoré použijete na pripojenie k zariadeniu iPhone. Heslo si zapamätajte. Po zadaní hesla Matlab zobrazí niekoľko informácií vrátane vašej IP adresy. Využite to v nasledujúcom kroku, ktorý vychádza z pokynov z ponuky pomocníka „Začíname so senzormi“v Matlab mobile.

  • Ak chcete odoslať údaje senzorov do cloudu MathWorks alebo do počítača, postupujte takto:
  • Ak odosielate údaje senzorov do počítača a ak ešte nie sú nainštalované, stiahnite si a nainštalujte balík podpory MATLAB pre senzory Apple iOS do programu MATLAB.
  • Pripojte MATLAB Mobile k MathWorks Cloud alebo k počítaču pomocou Nastavenia.
  • Vytvorte objekt mobiledev v programe MATLAB (na počítači), napríklad: >> m = mobiledev
  • Vyberte jeden alebo viac senzorov a klepnite na Spustiť.

Ak chcete lokálne zaznamenávať údaje senzora do svojho zariadenia, postupujte takto:

  • Na obrazovke Senzory vyberte senzory, z ktorých chcete zhromažďovať údaje.
  • Vyberte položku Denník.
  • Klepnite na tlačidlo Štart.
  • Keď ste so zhromažďovaním údajov hotoví, klepnite na tlačidlo Zastaviť.
  • V kontextovom okne zadajte názov denníka senzorov.
  • V prípade potreby zopakujte kroky 1-5.

Na túto sekciu sa bude odkazovať v časti 4, takže ešte nie je potrebné začať zbierať údaje. Majte svoj telefón vždy poruke a mobil Matlab pripravený.

Teraz musíte niekde vo svojom počítači vytvoriť priečinok, do ktorého sa budú ukladať súbory s kódom Matlab. Budete mať štyri samostatné súbory, dva pre funkcie na pozadí (súbory.m) a jeden súbor kódu Matlab pre grafické rozhranie (.mlapp),.

Najprv je výpočet hmotnosti vzduchu vo vašom dome (to umožňuje Matlabu vedieť, ako dlho trvá vykurovanie/chladenie vášho domu)

funkcia [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 koniec konca time_diag = time_end-time_start Mass = (P_out*time_diag) /7,035

A ten druhý:

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

AutoStat = 1; i = 1; zatiaľ čo AutoStat == 1 time_start = hodiny; m = mobiledev; t = csvread ('values.csv', 0, 1); t = t (i); časové pečiatky = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i+1; formát dlhý; Vzorec %haversine na výpočet vzdialenosti na základe zemepisnej šírky 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čítava potrebné nastavenie termostatu na základe spotreby elektrickej energie %klimatizácie a hmotnosti vzduchu v domácnosti. calcTmp_set = ((-1.*P_out.*time_rtn)./ (hmotnosť.*(1,005)))+T_pref; %určuje, či je potrebné zmeniť aktuálne nastavenie termostatu, ak zaokrúhlený (calcTmp_set) ~ = okrúhly (t) timeACon = hodiny; PwrCntr = P_out; timeACon = timeACon + clock-time_start; cena = P_out*timeACon*sadzba; else PwrCntr = 0 časových pečiatok konca (koniec+1, [1: 6]) = hodiny; pwr_usage (end+1, 1) = PwrCntr; pauza (5) koniec koniec

Oba tieto súbory sú funkciami Matlab. K nim nebudete potrebovať prístup, pokiaľ ich neplánujete upraviť pre konkrétne potreby, pretože im budete volať z grafického rozhrania. Uložte oba súbory oddelene, prvý ako CalcMass.m a druhý ako dist_cntrl.m, to budú názvy, ktoré kód GUI používa na volanie funkcií, takže pokiaľ nebudete chcieť upraviť zvyšok nižšie uvedeného kódu, držte sa konvencia pomenovania.

Predtým, ako sa dostanete do kódu GUI, musíte otvoriť návrhára aplikácií pre Matlab, ktorý môžete otvoriť navigáciou na paneli s ponukami programu Matlab alebo mojou obľúbenou metódou, ktorou je zadanie nasledujúceho príkazu do príkazového okna Matlab:

návrhár aplikácií

Keď je návrhár aplikácií otvorený, otvorte nový súbor aplikácie (.mlapp) a z okna kódu odstráňte všetok predvolený kód. Potom všetko vymeňte za nasledujúce a kliknite na tlačidlo Spustiť.

classdef Control_1 <matlab.apps. AppBase % Vlastnosti, ktoré zodpovedajú vlastnostiam komponentov aplikácie (Access = public) UIFigure matlab.ui. Figure TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton matlab.ui.control. tlačidlo 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. Meradlo SavingsTab matlab.ui.container. Tab UIAxes matlab.ui.control. UIAxes ThisMonthCostEditFieldLabel matlab.ui.control. Label ThisMonthCostEditField matlab.ui.control. NumericEditField TotalSavingsEditLebel. Label

metódy (Prístup = súkromné)

% Hodnota zmenená funkcia: tempnow

funkcia tempnowValueChanged (aplikácia, udalosť) temp = app.tempnow. Value; temp = randi ([60, 90], 1, 50) app. Gauge. Value = 0 pre i = dĺžka (temp) app. Gauge. Value = temp (i) pause (1) end end

% Hodnota zmenená funkcia: TemperatureDirectionSwitch

funkcia TemperatureDirectionSwitchValueChanged (aplikácia, udalosť) spôsob = app. TemperatureDirectionSwitch. Value; cesta = uint8 (cesta) cesta = dĺžka (cesta) ak cesta == 4 Chng_dir = -1; else Chng_dir = 1; koniec Chng_dir; koniec

% Hodnota zmenená funkcia: DDFH

funkcia DDFHValueChanged (aplikácia, udalosť) r_pref = app. DDFH. Value; koniec

% Hodnota zmenená funkcia: AvgLocalSpeedEditField

funkcia AvgLocalSpeedEditFieldValueChanged (aplikácia, udalosť) rýchlosť = app. AvgLocalSpeedEditField. Value; koniec

% Hodnota zmenená funkcia: PowerOutputRatingEditField

funkcia hodnota PowerOutputRatingEditFieldValueChanged (app, event) = app. PowerOutputRatingEditField. Value; koniec

% Hodnota zmenená funkcia: EnergyEfficiencyRatingEditField

funkcia EnergyEfficiencyRatingEditFieldValueChanged (app, event) hodnota = app. EnergyEfficiencyRatingEditField. Value; koniec

% Funkcia stlačenia tlačidla: RunDiagnosticButton

funkcia RunDiagnosticButtonPushed (app, event) way = app. TemperatureDirectionSwitch. Value; cesta = uint8 (cesta) cesta = dĺžka (cesta) ak 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)

koniec

% Funkcia zmenenej hodnoty: Teplota1Spinner

funkcia Temperature1SpinnerValueChanged (aplikácia, udalosť) hodnota = app. Temperature1Spinner. Value; koniec

% Hodnota zmenená funkcia: Temperature2Spinner

funkcia Temperature2SpinnerValueChanged (app, event) hodnota = app. Temperature2Spinner. Value; koniec

% Funkcia zmenenej hodnoty: Prepínač

funkcia SwitchValueChanged (aplikácia, udalosť) m = mobiledev; Lat_in = m. Latitude Lon_in = m. Longitude P_out = 0; r_pref = app. DDFH. Value; T_pref = app. Temperature1Spinner. Value; rýchlosť = m. Speed; hmotnosť = 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

% Inicializácia a konštrukcia aplikácie

metódy (Prístup = súkromné)

% Vytvorte obrázok UIF a komponenty

function createComponents (aplikácia)

% Vytvoriť UIFfiguráciu

app. UIFigure = uifigure; app. UIFigure. Position = [100 100 640 480]; app. UIFigure. Name = 'Obrázok používateľského rozhrania';

% Vytvoriť TabGroup

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

% Vytvoriť záložku Setup

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

% Vytvorte 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 = 'Spustiť diagnostiku';

% Create EnergyEfficiencyRatingEditFieldLabel

app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'vpravo'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Hodnotenie energetickej účinnosti';

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

% Vytvoriť PowerOutputRatingEditFieldLabel

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

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

% Create AvgLocalSpeedEditFieldLabel

app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'vpravo'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Priem. Miestna rýchlosť “;

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

% Create DesiredDistancefromHouseEditFieldLabel

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

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

% Vytvoriť TemperatureDirectionSwitchLabel

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

% Vytvoriť prepínač TemperatureDirectionSwitch

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

% Vytvoriť TempSettingsTab

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

% Vytvorte Temperature1SpinnerLabel

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

% Vytvorte teplotu1Spinner

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;

% Vytvorte Temperature2SpinnerLabel

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

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

% Vytvoriť prepí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';

% Vytvoriť EditFieldLabel

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

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

% Vytvorte GaugeLabel

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

% Vytvoriť rozchod

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;

% Vytvoriť záložku

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

% Vytvorte 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 = 'Náklady na tento mesiac';

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

% Create TotalSavingsEditFieldLabel

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

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

metódy (Prístup = verejné)

% Construct app

funkcia app = Control_1

% Vytvorte a nakonfigurujte komponenty

createComponents (aplikácia)

% Zaregistrujte aplikáciu v App Designer

registerApp (app, app. UIFigure)

ak sa nargout == 0

vymazať koniec aplikácie

% Kód, ktorý sa spustí pred odstránením aplikácie

vymazanie funkcie (aplikácia)

% Delete UIFigure when app is deleted

odstrániť (app. UIFigure) koniec koniec koniec

Pravdepodobne sa zobrazí chyba, čo nie je problém. Stačí zavrieť grafické rozhranie, ktoré bolo vygenerované po stlačení tlačidla Spustiť, o chvíľu zhromaždíme ostatné potrebné programy a údaje.

Keď je Matlab nastavený, môžeme prejsť na python. Najprv spustite program python z príkazového riadka (v systéme Windows) alebo pomocou súboru.exe v priečinku python. Uistite sa, že sú nainštalované všetky príslušné knižnice pomocou príkazu import.

importný seriál

čas importu import csv

Toto sú tri knižnice, ktoré budete potrebovať na začiatku, aj keď čoskoro vytvoríme vlastnú knižnicu. Ak sa pri týchto príkazoch vyskytla nejaká chyba, vráťte sa a uistite sa, že sú knižnice nainštalované a nachádzajú sa v priečinku Lib v priečinku python. Ďalej budeme generovať to, čo som nazval knižnica pythonlogger. Tento názov nie je potrebný, môžete ho nazvať, ako chcete, je to iba názov súboru python (.py), ktorý vytvoríte.

Otvorte textový editor, používam Sublime3, ale poznámkový blok funguje dobre a zadajte tento kód.

def pythonprint ():

import pythonlogger import sériového času importu import csv ser = serial. Sériový ('COM8') # COM8 je sériový port arduino, ktorý bude pravdepodobne pre každého používateľa iný, tj skontrolujte svoj sériový port v arduino IDE ser.flushInput (), zatiaľ čo Pravda: skúste: ser_bytes = ser.readline () print (ser_bytes) with open ("test_data.csv", "a") as f: writer = csv.writer (f, delimiter = ",") # sets the data to byť zadaný ako zapisovač oddelený čiarkami.pisovateľ

Uložte text ako „vložte názov požadovanej knižnice“.py do priečinka Lib. Všimnite si tiež, že riadok def pythonprint () definuje názov funkcie, ktorú budete volať, takže to môžete zmeniť tak, aby definoval „vložte meno, ktoré chcete pre svoju funkciu“(). Keď je knižnica uložená, môžeme prejsť na kód arduino.

Otvorte arduino IDE a otvorte dve nové okná náčrtu. Uložte tieto dva súbory náčrtu na praktické miesto, na názve týchto súborov nezáleží. Potom odstráňte všetok predvolený kód a nahraďte ho nasledujúcim.

Prijímajúce arduino:

#zahrnúť

#include #include #include // toto sa nepoužíva, ale je potrebné na kompiláciu ovládača RH_ASK; struct dataStruct {float temp; } myData; void setup () {Serial.begin (9600); // Ladenie iba vtedy, ak (! Driver.init ()) Serial.println ("init failed"); } prázdna slučka () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof (buf); if (driver.recv (buf, & buflen)) // Neblokujúce {int i; // Bola doručená správa s dobrým kontrolným súčtom, vyhoďte ju. //driver.printBuffer("Got: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serial.print (myData.temp); }}

P. S. //driver.printBuffer…. atď. je testovací kód. Ak robíte diagnositcs a chcete zistiť, či skutočne prijímate údaje, nemusíte si s tým robiť starosti.

Pre vysielač arduino

#zahrnúť

#include #include #include // toto sa nepoužíva, ale je potrebné na kompiláciu #include #include int pin = 4; DHT11 dht11 (kolík); Ovládač RH_ASK; struct dataStruct {float temp; } myData; bajt tx_buf [sizeof (myData)] = {0}; // Takže argumenty sú bitrate, vysielací pin (tx), // prijímací pin (rx), ppt pin, isInverse. Posledné 2 sa nepoužívajú. Vyhnite sa setup () {Serial.begin (9600); // Ladenie iba vtedy, ak (! Driver.init ()) Serial.println ("init failed"); } 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 (); // zastavenie vykonávania, kým nebudú odoslané všetky údaje oneskorenie (2000); // počkajte 2 sekundy}}

Príkaz na zahrnutie by mal stačiť, ale ak máte neskôr problémy s prenosom údajov, môžete sa pozrieť do priečinka knižnice RadioHead a zahrnúť ostatné názvy súborov v rovnakom formáte.

Krok 5: Aby to fungovalo

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

Teraz, keď máme všetok kód pohromade a arduino je zostavené, môžeme pripojiť arduino k vášmu počítaču a načítať kód. Uistite sa, že odosielate správny kód do prijímacieho a vysielacieho mikrokontroléra. Kým je tento beží, môžete mať k počítaču pripojené oba Arduino, ale budete sa musieť uistiť, že máte vpred zvolený správny port, alebo môžete odpojiť vysielacie Arduino a napájať ho z iného zdroja, akonáhle bude kód nahrané.

Keď už hovoríme o tom, mali by ste teraz vybrať port, ktorý je pripojený k vášmu prijímajúcemu arduinu, z ponuky nástrojov IDE a spustiť python.

Neotvárajte sériový monitor, keď to robíte, python nemôže čítať seriál, kým je monitor otvorený. Keď je python otvorený, zavolajte funkciu pythonprint nasledovne.

pythonlogger.pythonprint ()

Spustí sa zber údajov zo sériového portu arduino. Ak teraz otvoríte priečinok python, uvidíte, že bol vytvorený nový súbor.csv s názvom „test_data.csv“, ktorý obsahuje všetky informácie o čase a teplote. Toto bude súbor, ku ktorému Matlab pristupuje, aby mohol vykonávať všetky svoje výpočty a kontroly.

Ďalšie upozornenie: neotvárajte test_data.csv, kým sa pristupuje k údajom alebo sa do nich zapisuje. Ak tak urobíte, kód python a/alebo Matlab sa zrúti a pošle späť chybu

Ak sa rozhodnete otvoriť súbor.csv neskôr, všimnete si, že časový stĺpec je iba veľmi veľkým reťazcom čísel. Dôvodom je, že príkaz time.time () zapisuje počet sekúnd od 1. januára 1970.

V tomto mieste by mal python tlačiť údaje o teplote, ktoré číta, zo sériového portu. Malo by to vyzerať asi takto:

b'25,03 '/r/n

Nerobte si starosti s nadbytočnými znakmi, kód Matlab indexuje stredných päť hodnôt v druhom stĺpci súboru.csv.

Teraz, keď všetky podporné programy fungujú a zhromažďujú sa údaje, môžeme začať zbierať údaje GPS z mobilného programu Matlab, ktorý bol predtým nastavený, a spustiť kód Matlab GUI. Keď ste na karte senzorov mobilného telefónu Matlab, vyberte GPS a kliknite na tlačidlo Štart.

Ak ste v Matlab mobile noví, vráťte sa na krok 4 a pozrite sa na snímky obrazovky vyššie. Ak problémy stále pretrvávajú, uistite sa, že ste pripojení k počítaču, ktorý ste vybrali predtým (na karte nastavení), a pomocou odkazu z príkazu „konektor zapnutý“skontrolujte, či je Matlab online.

Krok 6: Používanie programu

Použitie programu
Použitie programu

V tomto systéme sa na pozadí deje niekoľko vecí. Údaje o teplote zhromažďujú a zaznamenávajú arduino a pyton, Matlab zhromažďuje údaje GPS z vášho telefónu a spúšťa výpočty, aby zistil, ako ďaleko ste od domu, a na základe všetkých týchto informácií nastavuje termostat. Vstúpite a poskytnete svoje preferencie.

Spustite Matlab GUI kód. Otvorte súbor.mlapp a pozrite sa na prvú kartu. Informácie k tomu budete musieť zhromaždiť sami, účinnosť a výkon vašej vykurovacej/chladiacej jednotky sa zvyčajne dajú nájsť na samotnej jednotke a priemerná rýchlosť je len dobrým odhadom rýchlosti jazdy. Po zadaní hodnôt kliknite na tlačidlo „Spustiť diagnostiku“a program ovláda váš termostat, aby zhromaždil informácie o vašom dome.

Prejdite do ďalšej ponuky.

Krok 7: Regulácia teploty

Ovládanie teploty
Ovládanie teploty

Toto menu vám umožňuje zvoliť požadovanú teplotu, keď ste doma a mimo domu. Nastavte teplotu č. 1 na svoju príjemnú teplotu a teplotu č. 2 na vysokú alebo nízku hodnotu, ktorá je bezpečná pre váš domov (uistite sa, že pokiaľ máte doma psa, nenastavujte ho na 100 stupňov atď.).

Krok 8: Historické údaje

Historické dáta
Historické dáta

Nakoniec môžete pomocou automatického ovládania sledovať, koľko peňazí ušetríte. Toto v podstate odhaduje, koľko energie by sa spotrebovalo, keby bol váš termostat nastavený na požadovanú teplotu 24/7, a potom odpočíta vašu skutočnú použitú energiu.

Veľa šťastia pri stavbe.

Odporúča: