Sisällysluettelo:

Autostat: kauko -termostaatti: 8 vaihetta (kuvilla)
Autostat: kauko -termostaatti: 8 vaihetta (kuvilla)

Video: Autostat: kauko -termostaatti: 8 vaihetta (kuvilla)

Video: Autostat: kauko -termostaatti: 8 vaihetta (kuvilla)
Video: KAKSILMÄKAMERA Yllättyi PÄIVITYKSEN JÄLKEEN!!! 2024, Marraskuu
Anonim
Autostat: kauko -termostaatti
Autostat: kauko -termostaatti

Luultavasti kysyttävä kysymys on "miksi teet toisen etätermostaatin?"

Vastaus tähän kysymykseen on, minun täytyi, ja markkinoiden älykkäät termostaatit ovat liian kalliita.

Oikea varoitus, tämä on "konseptin todiste" -rakenne, joka vaatisi muutaman ylimääräisen lähdön termostaatin ohjaamiseen, mutta ydin on paikallaan ja sitä voidaan muokata olosuhteidesi mukaan. Lisäksi tämä on vielä kesken, joten odota muutamia päivityksiä ja muutoksia (erityisesti Matlab -koodiin)

Aluksi haluan varoittaa sinua, tämä vaatii kolme ohjelmaa (yksi niistä on melko kallista), useita kirjastoja ja ohjelmien tukipaketteja, ja sinun on saatava ne kaikki puhumaan keskenään. Se on päänsärky. Kun tämä varoitus on poissa tieltä, voit aloittaa materiaalien käytön.

Laitteisto

  • arduino nano
  • arduino uno (tai toinen nano, käytin juuri unoa, koska minulla oli yksi makaamassa)
  • valikoituja hyppyjohtoja, jotkut uros/uros ja kaksi sarjaa kolmesta yhdistetystä uros/naarashyppääjästä
  • 433 MHz: n radiotaajuusvastaanotin, käytin MX-05V: tä
  • 433MHz RF-lähetin, käytin MX-FS-03V
  • DHT11 korkean tarkkuuden lämpömittari ja kosteusanturi (käyttämäni on asennettu kolmipiikkiseen siruun ja tarvittavat vastukset on jo asennettu)
  • leipälauta (jos et halua juottaa tätä kaikkea yhdessä)
  • puhelin, jossa on GPS (tässä tapauksessa iPhone 8, mutta olen käyttänyt myös Galaxy S8: ta)
  • 3D -tulostettu säiliö (ei todellakaan tarpeellinen, mikä tahansa säiliö toimii tai ei ollenkaan)

Ohjelmisto

  • Matlab MathWorksista (minulla on 2018a-versio, mutta olen käyttänyt myös 2017a-b-versioita)
  • Matlab mobile on asennettu puhelimeesi
  • arduino -tukipaketti Matlabille
  • iPhone -anturipaketti Matlabille
  • arduino IDE
  • RadioHead -tukipaketit ja arduino IDE: n kirjastot
  • DHT11 -kirjasto arduino IDE: lle
  • python 3.7 (varmista, että pyserial -kirjasto tai sarjakirjasto on asennettu, mikä sen pitäisi olla versiolle 3.4 tai uudemmalle)

Vaihe 1: Yhdistä kaikki

Kokonaisuuden yhdistäminen
Kokonaisuuden yhdistäminen
Kokonaisuuden yhdistäminen
Kokonaisuuden yhdistäminen
Kokonaisuuden yhdistäminen
Kokonaisuuden yhdistäminen

Ensinnäkin ehdotan, että teet muutamia arduino -opetusohjelmia RF -lähettimien kanssa vain varmistaaksesi, että osat toimivat ja johdotus on oikein. Esimerkkejä on runsaasti, ja koodi on mukana (niille meistä, jotka eivät tiedä juurikaan mitään C: stä ja C ++: sta).

Noudata alla olevia kytkentäkaavioita saadaksesi arduino ja anturit koottua. Yksi asia, joka on pidettävä mielessä kytkettäessä arduinot, on se, että käyttämiäni tietoportteja ei vaadita, mutta ne ovat suositeltavia.

JOS päätät muuttaa käyttämiäsi tietoportteja, sinun on vain määritettävä nastat koodissasi. Henkilökohtaisesti mielestäni on helpompi noudattaa oletusportteja, jotka arduino -kirjastot tunnistavat.

Ja vain selvyyden vuoksi, nano ja uno ovat vaihdettavissa, mutta käytin nanoa projektin lähettimen puolella pienentämään lämpötilamittarin kokoa.

Sivuhuomautus: vihreä nanorakenne on 3D -tulostettu säiliö.

Vaihe 2: Vastaanotin

Vastaanotin
Vastaanotin

Vaihe 3: Lähetin

Lähetin
Lähetin

Vaihe 4: Koodi

Kun johdotus on valmis, sinun on saatava kaikki ohjelmat käyntiin ja kirjastot asennettavaksi (jos et ole jo tehnyt sitä), oletan vain, että sinulla on, sinun on käynnistettävä Matlab ja suoritettava iPhonen tukipaketti. Sekä puhelimesi että Matlabin on oltava tässä vaiheessa samassa wifi -verkossa.

Kirjoita Matlabin komentoikkunaan:

liitin päällä

Tämä kehottaa sinua antamaan viisinumeroisen salasanan, jota käytät muodostamaan yhteyden iPhoneen. Muista salasana. Kun olet antanut salasanan, Matlab näyttää joitakin tietoja, kuten IP -osoitteesi. Käytä tätä seuraavassa vaiheessa, joka tulee Matlab mobile -laitteen "Aloittaminen antureilla" -valikon ohjeista.

  • Lähetä anturitiedot MathWorks Cloudiin tai tietokoneeseen seuraavasti:
  • Jos lähetät anturitietoja tietokoneelle ja jos sitä ei ole jo asennettu, lataa ja asenna MATLAB -tukipaketti Apple iOS -sensoreille MATLABissa.
  • Yhdistä MATLAB Mobile MathWorks Cloudiin tai tietokoneeseen Asetusten avulla.
  • Luo mobiledev -objekti MATLABissa (tietokoneellasi), esimerkiksi: >> m = mobiledev
  • Valitse yksi tai useampi anturi ja napauta Käynnistä.

Kirjaa anturitiedot paikallisesti laitteellesi seuraavasti:

  • Valitse Anturit -näytöstä anturit, joista haluat kerätä tietoja.
  • Valitse Loki.
  • Napauta Käynnistä -painiketta.
  • Kun olet kerännyt tiedot, napauta Stop -painiketta.
  • Kirjoita ponnahdusikkunaan anturilokin nimi.
  • Toista vaiheet 1-5 tarvittaessa.

Tähän osioon viitataan osassa 4, joten tietojen keräämistä ei tarvitse vielä aloittaa. Pidä vain puhelin käden ulottuvilla ja Matlab mobile valmiina.

Nyt sinun on luotava kansio jonnekin tietokoneeseesi Matlab -kooditiedostojen tallentamiseksi. Sinulla on neljä erillistä tiedostoa, kaksi taustatoimintoja (.m -tiedostot) ja yksi Matlab -kooditiedosto käyttöliittymälle (.mlapp).

Ensimmäinen on talosi ilman massalaskenta (tämä kertoo Matlabille, kuinka kauan talosi lämmittäminen/jäähdyttäminen kestää)

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

runCalc = 0; Tmp_start = T_ins; time_start = kello; time_end = 0 runCalc <= 1 if T_ins == (Tmp_start+(7*Chng_dir)) time_end = clock; PwrCntr = 0; runCalc = 0; muuten PwrCntr = P_out; runCalc = runCalc+0,1 päättymisaika_diag = time_end-time_start Mass = (P_out*time_diag) /7.035

Ja toinen:

function [aikaleimat, pwr_usage] = dist_cntrl (Lat_in, Lon_in, P_out, r_pref, speed, T_pref, mass)

AutoStat = 1; i = 1; kun AutoStat == 1 time_start = kello; m = mobiledev; t = csvread ('arvot.csv', 0, 1); t = t (i); aikaleimat = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i+1; muoto pitkä; %hasrsine-kaava etäisyyden laskemiseen leveysasteen ja %longintude a_hav = (sind ((m. Latitude-Lat_in)./ 2)).^2+cosd (Lat_in).*cosd (m. leveysaste).*(sind ((m. pituuspiiri-pitkä)./2)).^2; c_hav = 2.*atan2d (sqrt (a_hav), sqrt (1-a_hav)); d_hav = 6371.*c_hav; Dist = d_hav.*1000; %arvioi aikaasi palata time_rtn = (Dist-r_pref)./ speed; %laskee tarvittavan termostaatin asetuksen perustuen %ilmastointilaitteen ja kodin ilmamassan virrankatkaisuun. calcTmp_set = ((--**P_out.*time_rtn)./ (massa.*(1.005)))+T_pref; %määrittää, onko termostaatin nykyistä asetusta muutettava, jos pyöreä (calcTmp_set) ~ = pyöreä (t) timeACon = kello; PwrCntr = P_out; timeACon = timeACon + clock-time_start; cost = P_out*timeACon*rate; muuten PwrCntr = 0 lopun aikaleimaa (loppu+1, [1: 6]) = kello; pwr_usage (loppu+1, 1) = PwrCntr; tauko (5) loppu

Molemmat tiedostot ovat Matlab -toimintoja. Sinun ei tarvitse käyttää niitä, ellet aio muuttaa niitä tiettyjen tarpeiden mukaan, koska soitat heille GUI: sta. Tallenna molemmat tiedostot erikseen, ensimmäinen CalcMass.m ja toinen dist_cntrl.m, nämä ovat nimet, joita GUI -koodi käyttää toimintojen kutsumiseen, joten ellet halua muokata jäljellä olevaa koodia, pysy nimeämiskäytäntö.

Ennen kuin pääset GUI -koodiin, sinun on avattava Matlabin sovellusten suunnittelija, jonka voit avata navigoimalla Matlab -valikkorivillä tai suosikkimenetelmälläni, joka kirjoittaa seuraavan komennon Matlab -komentoikkunaan:

sovellusten suunnittelija

Kun sovellusten suunnittelija on auki, avaa uusi sovellustiedosto (.mlapp) ja poista kaikki oletuskoodi koodi -ikkunasta. Korvaa sitten kaikki seuraavilla ja paina suorituspainiketta.

classdef Control_1 <matlab.apps. AppBase % Ominaisuudet, jotka vastaavat sovellusosien ominaisuuksia (Access = public) UIFigure matlab.ui. Figure TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton matlab.ui.control. painike 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. 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. Mittarin säästöTab matlab.ui.container. Tab UIAxes matlab.ui.control. UIAxes ThisMonthCostEditFieldLabel matlab.ui.control. Label ThisMonthCostEditField matlab.ui.control. NumericEditField TotalSavingsEditFieldLield.lab.

menetelmät (Access = yksityinen)

% Arvo muutettu toiminto: tempnow

toiminto tempnowValueChanged (sovellus, tapahtuma) temp = app.tempnow. Value; temp = randi ([60, 90], 1, 50) app. Gauge. Value = 0, kun i = pituus (temp) app. Gauge. Value = temp (i) pause (1) end end

% Arvon muuttunut toiminto: TemperatureDirectionSwitch

function TemperatureDirectionSwitchValueChanged (sovellus, tapahtuma) way = app. TemperatureDirectionSwitch. Value; tapa = uint8 (tapa) tapa = pituus (tapa) jos tapa == 4 Chng_dir = -1; muu Chng_dir = 1; loppu Chng_dir; loppuun

% Arvon muuttunut toiminto: DDFH

toiminto DDFHValueChanged (sovellus, tapahtuma) r_pref = app. DDFH. Value; loppuun

% Arvon muutettu toiminto: AvgLocalSpeedEditField

function AvgLocalSpeedEditFieldValueChanged (sovellus, tapahtuma) speed = app. AvgLocalSpeedEditField. Value; loppuun

% Arvon muuttunut toiminto: PowerOutputRatingEditField

function PowerOutputRatingEditFieldValueChanged (sovellus, tapahtuma) value = app. PowerOutputRatingEditField. Value; loppuun

% Arvon muuttunut toiminto: EnergyEfficiencyRatingEditField

function EnergyEfficiencyRatingEditFieldValueChanged (sovellus, tapahtuma) value = app. EnergyEfficiencyRatingEditField. Value; loppuun

% Painike painettu: RunDiagnosticButton

toiminto RunDiagnosticButtonPushed (sovellus, tapahtuma) way = app. TemperatureDirectionSwitch. Value; tapa = uint8 (tapa) tapa = pituus (tapa) jos tapa == 4 Chng_dir = -1; muu Chng_dir = 1; end T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)

loppuun

% Arvon muuttunut toiminto: Temperature1Spinner

toiminto Temperature1SpinnerValueChanged (app, event) value = app. Temperature1Spinner. Value; loppuun

% Arvon muuttunut toiminto: Temperature2Spinner

toiminto Temperature2SpinnerValueChanged (app, event) value = app. Temperature2Spinner. Value; loppuun

% Arvo muutettu toiminto: Kytkin

toiminto SwitchValueChanged (sovellus, tapahtuma) m = mobiledev; Lat_in = m. Latitude Lon_in = m. Longitude P_out = 0; r_pref = app. DDFH. Value; T_pref = app. Temperature1Spinner. Value; nopeus = m.nopeus; massa = 200; nopeus = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, speed, mass) end end

% Sovelluksen alustus ja rakentaminen

menetelmät (Access = yksityinen)

% Luo UIFigure ja komponentit

function createComponents (sovellus)

% Luo UIFigure

app. UIFigure = uifigure; app. UIFigure. Position = [100100640480]; app. UIFigure. Name = 'Käyttöliittymän kuva';

% Luo välilehtiryhmä

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

% Luo SetupTab

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

% Luo RunDiagnosticButton

app. RunDiagnosticButton = uibutton (app. SetupTab, 'push'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn (sovellus, @RunDiagnosticButtonPushed, true); app. RunDiagnosticButton. FontWeight = 'lihavoitu'; app. RunDiagnosticButton. Position = [465 78103 23]; app. RunDiagnosticButton. Text = 'Suorita diagnostiikka';

% Luo EnergyEfficiencyRatingEditFieldLabel

app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'oikea'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Energiatehokkuusluokitus';

% Luo EnergyEfficiencyRatingEditField

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

% Luo PowerOutputRatingEditFieldLabel

app. PowerOutputRatingEditFieldLabel = uilabel (app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'oikea'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'Teholähtöluokitus';

% Luo PowerOutputRatingEditField

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

% Luo AvgLocalSpeedEditFieldLabel

app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'oikea'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Keskim. Paikallinen nopeus”;

% Luo AvgLocalSpeedEditField

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

% Luo DesiredDistancefromHouseEditFieldLabel

app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'oikea'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24129100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'Haluttu etäisyys'; 'talolta'};

% Luo DDFH

app. DDFH = uieditfield (app. SetupTab, 'numeerinen'); app. DDFH. Limits = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn (sovellus, @DDFHValueChanged, true); app. DDFH. HorizontalAlignment = 'keskus'; app. DDFH. Position = [139 135100 22];

% Luo TemperatureDirectionSwitchLabel

app. TemperatureDirectionSwitchLabel = uilabel (app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'keskusta'; app. TemperatureDirectionSwitchLabel. Position = [410343124 22]; app. TemperatureDirectionSwitchLabel. Text = 'Lämpötilan suunta';

% Luo TemperatureDirectionSwitch

app. TemperatureDirectionSwitch = uiswitch (app. SetupTab, 'liukusäädin'); app. TemperatureDirectionSwitch. Items = {'Ylös', 'Alas'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn (sovellus, @TemperatureDirectionSwitchValueChanged, true); app. TemperatureDirectionSwitch. Position = [449380 45 20]; app. TemperatureDirectionSwitch. Value = 'Ylös';

% Luo TempSettingsTab

app. TempSettingsTab = uitab (app. TabGroup); app. TempSettingsTab. Title = 'Lämpötila Asetukset';

% Luo Temperature1SpinnerLabel

app. Temperature1SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature1SpinnerLabel. HorizontalAlignment = 'keskus'; app. Temperature1SpinnerLabel. Position = [66363 76 28]; app. Temperature1SpinnerLabel. Text = {'Lämpötila'; '#1'};

% Luo Temperature1Spinner

app. Temperature1Spinner = uispinner (app. TempSettingsTab); app. Temperature1Spinner. Limits = [60 90]; app. Temperature1Spinner. ValueChangedFcn = createCallbackFcn (sovellus, @Temperature1SpinnerValueChanged, true); app. Temperature1Spinner. Position = [157 346 100 68]; app. Temperature1Spinner. Value = 60;

% Luo Temperature2SpinnerLabel

app. Temperature2SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature2SpinnerLabel. HorizontalAlignment = 'keskus'; app. Temperature2SpinnerLabel. Position = [66 248 76 28]; app. Temperature2SpinnerLabel. Text = {'Lämpötila'; '#2'};

% Luo Temperature2Spinner

app. Temperature2Spinner = uispinner (app. TempSettingsTab); app. Temperature2Spinner. Limits = [60 90]; app. Temperature2Spinner. ValueChangedFcn = createCallbackFcn (sovellus, @Temperature2SpinnerValueChanged, true); app. Temperature2Spinner. Position = [157 230 100 70]; app. Temperature2Spinner. Value = 60;

% Luo kytkin

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

% Luo EditFieldLabel

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

% Luo väliaika

app.tempnow = uieditfield (app. TempSettingsTab, 'numeerinen'); app.tempnow. Limits = [60 89]; app.tempnow. ValueChangedFcn = createCallbackFcn (sovellus, @tempnowValueChanged, true); app.tempnow. HorizontalAlignment = 'keskus'; app.tempnow. FontSize = 26; app.tempnow. Position = [409230133117]; app.tempnow. Value = 60;

% Luo GaugeLabel

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

% Luo mittari

app. Gauge = uigauge (app. TempSettingsTab, 'circular'); app. Gauge. Limits = [60 90]; app. Gauge. MajorTicks = [60 65 70 75 80 85 90]; app. Gauge. Position = [185 6912020]; app. Gauge. Value = 60;

% Luo säästövälilehti

app. SavingsTab = uitab (app. TabGroup); app. SavingsTab. Title = 'Säästöt';

% Luo UIAxeja

app. UIAxes = uiaxes (app. SavingsTab); title (app. UIAxes, 'Savings') xlabel (app. UIAxes, 'Month and Year') ylabel (app. UIAxes, 'Money') app. UIAxes. PlotBoxAspectRatio = [1 0.60666666666666 0.606666666666667]; app. UIAxes. Color = [0,9412 0,9412 0,9412]; app. UIAxes. Position = [146 219 348 237];

% Luo ThisMonthCostEditFieldLabel

app. This kuukausihintaEditKenttäLabel = uilabel (app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'keskusta'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'Tämän kuukauden hinta';

% Luo ThisMonthCostEditField

app. ThisMonthCostEditField = uieditfield (app. SavingsTab, 'numeerinen'); app. ThisMonthCostEditField. Limits = [0 Inf]; app. ThisMonthCostEditField. ValueDisplayFormat = '$%7.2f'; app. ThisMonthCostEditField. HorizontalAlignment = 'keskusta'; app. ThisMonthCostEditField. Position = [417 39137 58];

% Luo TotalSavingsEditFieldLabel

app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'oikea'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Yhteensä säästöt';

% Luo TotalSavingsEditField

app. TotalSavingsEditField = uieditfield (app. SavingsTab, 'numeerinen'); app. TotalSavingsEditField. Limits = [0 Inf]; app. TotalSavingsEditField. ValueDisplayFormat = '$%9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'keskusta'; app. TotalSavingsEditField. Position = [88 39137 58]; loppu loppu

menetelmät (Access = public)

% Rakenna sovellus

function app = Control_1

% Luo ja määritä komponentteja

createComponents (sovellus)

% Rekisteröi sovellus App Designerilla

registerApp (sovellus, sovellus. UIFigure)

jos nargout == 0

selkeä sovelluksen loppu

% Koodi, joka suoritetaan ennen sovelluksen poistamista

toiminto poista (sovellus)

% Poista UIFigure, kun sovellus poistetaan

poista (app. UIFigure) loppu loppu

Saat todennäköisesti virheen, mikä ei ole ongelma. Sulje vain käyttöliittymä, joka luotiin suorituksen painamisen jälkeen, keräämme loput tarvittavat ohjelmat ja tiedot hetkessä.

Koska Matlab on asennettu, voimme siirtyä pythoniin. Suorita ensin python -ohjelma joko komentoriviltä (Windows) tai käyttämällä.exe -tiedostoa python -kansiossasi. Varmista, että kaikki asianmukaiset kirjastot on asennettu käyttämällä import -komentoa.

tuoda sarja

tuonti aika tuonti csv

Nämä ovat kolme kirjastoa, jotka sinun on aloitettava, vaikka teemme pian oman kirjaston. Jos näissä komennoissa tapahtui jonkinlainen virhe, palaa takaisin ja varmista, että kirjastot on asennettu ja että ne ovat python -kansion Lib -kansiossa. Seuraavaksi luomme pythonlogger -kirjaston. Tämä nimi ei ole välttämätön, voit kutsua sitä miten haluat, se on vain luomasi python -tiedoston (.py) nimi.

Avaa tekstieditori, käytän Sublime3: ta, mutta muistilehtiö toimii hienosti, ja kirjoita tämä koodi.

def pythonprint ():

tuonti pythonlogger tuonti sarjatuonnin aika tuonti csv ser = serial. Serial ('COM8') # COM8 on arduino -sarjaportti, tämä on todennäköisesti erilainen jokaiselle käyttäjälle, ts. tarkista sarjaporttisi arduino IDE ser.flushInput () Totta: try: ser_bytes = ser.readline () print (ser_bytes) with open ("test_data.csv", "a") kuten f: írtaja = csv.writer (f, erotin = ",") # asettaa tiedot kirjoitetaan pilkuilla erotettuna kirjoittajana.kirjoittaja ([aika.aika (), ser_bytes]) #kirjoittaa tiedot kohteeseen test_data.csv paitsi: print ("Virhe tapahtui") break

Tallenna teksti "lisää haluamasi kirjaston nimi".py Lib -kansioon. Huomaa myös, että def pythonprint () -rivi määrittää sen toiminnon nimen, jota aiot kutsua, joten voit muuttaa sen def "lisää toiminnolle haluamasi nimi" (). Kun kirjasto on tallennettu, voimme siirtyä arduino -koodiin.

Avaa arduino IDE ja avaa kaksi uutta luonnosikkunaa. Tallenna nämä kaksi luonnostiedostoa jonnekin kätevään paikkaan, näiden tiedostojen nimellä ei ole väliä. Poista sitten kaikki oletuskoodit ja korvaa ne seuraavalla.

Vastaanottava arduino:

#sisältää

#include #include #include // tätä ei käytetä, mutta sitä tarvitaan RH_ASK -ohjaimen kääntämiseen; structure dataStruct {float temp; } myData; void setup () {Serial.begin (9600); // Virheenkorjaus vain, jos (! Driver.init ()) Serial.println ("init epäonnistui"); } void loop () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof (buf); if (driver.recv (buf, & buflen)) // Ei-estävä {int i; // Viesti, jolla on hyvä tarkistussumma, vastaanotettu. //driver.printBuffer("Got: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Sarjajälki (myData.temp); }}

P. S. //driver.printBuffer ……. jne. rivi on testikoodi. Sinun ei tarvitse huolehtia siitä, ellet tee diagnooseja ja haluat selvittää, vastaanotatko todella tietoja.

Lähettimelle arduino

#sisältää

#include #include #include // tätä ei käytetä, mutta sitä tarvitaan kääntämiseen #include #include int pin = 4; DHT11 dht11 (nasta); RH_ASK -ohjain; structure dataStruct {float temp; } myData; tavu tx_buf [sizeof (omat tiedot)] = {0}; // Argumentit ovat siis bittinopeutta, lähetysnasta (tx), // vastaanottotappi (rx), ppt -nasta, isInverse. Kahta viimeistä ei käytetä.void setup () {Serial.begin (9600); // Virheenkorjaus vain, jos (! Driver.init ()) Serial.println ("init epäonnistui"); } void loop () {int err; kelluva lämpötila, humi; uint8_t viesti; jos ((err = dht11.read (humi, temp)) == 0) myData.temp = temp; memcpy (tx_buf, & myData, sizeof (myData)); tavu zize = sizeof (myData); {Serial.println (myData.temp); driver.send ((uint8_t *) tx_buf, zize); driver.waitPacketSent (); // keskeytä suoritus, kunnes kaikki tiedot on lähetetty viive (2000); // odota 2 sekuntia}}

Sisällytyskomentojen pitäisi riittää, mutta jos sinulla on myöhemmin ongelmia tiedonsiirron kanssa, sinun kannattaa etsiä RadioHead -kirjaston kansio ja sisällyttää loput tiedostonimet samassa muodossa.

Vaihe 5: Tee se toimivaksi

Saada se toimimaan
Saada se toimimaan
Saada se toimimaan
Saada se toimimaan
Saada se toimimaan
Saada se toimimaan

Nyt kun meillä on kaikki koodit yhdessä ja arduino on koottu, voimme kytkeä arduinon tietokoneeseesi ja ladata koodin. Varmista, että lähetät oikean koodin vastaanottaville ja lähettäville mikro -ohjaimille. Voit kytkeä molemmat arduinot tietokoneeseen, kun tämä on käynnissä, mutta sinun on varmistettava, että oikea portti on valittu eteenpäin, tai voit irrottaa lähettävän arduinon ja kytkeä sen virran toisesta lähteestä, kun koodi on ladattu.

Tästä syystä sinun pitäisi valita IDE -työkaluvalikosta portti, joka on liitetty vastaanottavaan arduinoosi, ja suorittaa python.

Älä avaa sarjamonitoria, kun teet tämän, python ei voi lukea sarjaa näytön ollessa auki. Kun python on auki, kutsu pythonprint -toiminto seuraavasti.

pythonlogger.pythonprint ()

Tämä aloittaa tiedonkeruun arduino -sarjaportista. Jos avaat python -kansion nyt, näet, että on luotu uusi.csv -tiedosto nimeltä "test_data.csv", joka sisältää kaikki aika- ja lämpötilatiedot. Tämä on tiedosto, johon Matlab käyttää kaikkia laskelmiaan ja ohjauksiaan.

Toinen varoitus: älä avaa test_data.csv, kun tietoja käytetään tai kirjoitetaan. Jos teet niin, python ja/tai Matlab -koodi kaatuu ja lähettää takaisin virheen

Jos päätät avata.csv -tiedoston myöhemmin, huomaat, että aika -sarake on vain suuri numerojono. Tämä johtuu siitä, että time.time () -komento kirjoittaa sekuntien määrän 1. tammikuuta 1970 jälkeen.

Tässä vaiheessa python tulostaa sarjaportista lukemansa lämpötilatiedot. Sen pitäisi näyttää tältä:

b'25.03 '/r/n

Älä välitä ylimääräisistä merkeistä, Matlab -koodi indeksoi.csv -tiedoston toisen sarakkeen viisi keskimmäistä arvoa.

Nyt kun kaikki tukiohjelmat toimivat ja tietoja kerätään, voimme aloittaa GPS -tietojen keräämisen aiemmin määritetystä Matlab -mobiilisovelluksesta ja suorittaa Matlab GUI -koodin. Kun olet Matlab mobilen anturivälilehdessä, valitse GPS ja paina käynnistyspainiketta.

Jos olet uusi Matlab -mobiililaite, palaa vaiheeseen 4 ja katso yllä olevat kuvakaappaukset. Jos sinulla on edelleen ongelmia, varmista, että olet yhteydessä tietokoneeseen, jonka valitsit aiemmin (asetusvälilehdessä), ja käytä "connector on" -komennon linkkiä tarkistaaksesi, että Matlab on online -tilassa.

Vaihe 6: Ohjelman käyttö

Ohjelman käyttäminen
Ohjelman käyttäminen

Tässä järjestelmässä tapahtuu useita asioita taustalla. Arduino ja pyton keräävät ja kirjaavat lämpötilatietoja, Matlab kerää GPS -tietoja puhelimestasi ja suorittaa laskelmia nähdäkseen, kuinka kaukana olet kotoasi, ja asettaa termostaatin kaikkien näiden tietojen perusteella. Paikka, jossa tulet, tarjoaa mieltymyksesi.

Suorita Matlab GUI -koodi. Avaa.mlapp -tiedosto ja katso ensimmäinen välilehti. Sinun on kerättävä tiedot itse, lämmitys-/jäähdytysyksikön tehokkuus ja teholuokitus löytyvät yleensä itse laitteesta, ja keskinopeutesi on vain hyvä arvio ajon nopeudesta. Kun arvot on syötetty, paina "Suorita diagnostiikka" -painiketta ja ohjelma ohjaa termostaattiasi kerätäksesi tietoja talostasi.

Siirry seuraavaan valikkoon.

Vaihe 7: Lämpötilan säätö

Lämpötilan säätö
Lämpötilan säätö

Tämän valikon avulla voit valita haluamasi lämpötilan kotona ja poissa. Aseta lämpötila #1 mukavaan lämpötilaasi ja lämpötila #2 korkeaan tai matalaan arvoon, joka on turvallinen kotillesi (varmista, ettet aseta sitä 100 asteeseen, kun sinulla on koiria kotona jne.).

Vaihe 8: Historialliset tiedot

Historiatiedot
Historiatiedot

Lopuksi voit katsoa, kuinka paljon rahaa säästät automaattisen ohjauksen avulla. Tämä arvioi olennaisesti sen, kuinka paljon energiaa käytettäisiin, jos termostaatti asetettaisiin haluttuun lämpötilaan 24/7, ja vähennetään sitten todellinen käytetty energia.

Onnea rakentamiseen.

Suositeltava: