Indholdsfortegnelse:
- Trin 1: Sæt det hele sammen
- Trin 2: Modtager
- Trin 3: Senderen
- Trin 4: Koden
- Trin 5: Få det til at fungere
- Trin 6: Brug af programmet
- Trin 7: Temperaturkontrol
- Trin 8: Historiske data
Video: Autostat: en fjerntermostat: 8 trin (med billeder)
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:28
Det spørgsmål, du sandsynligvis stiller, er "hvorfor laver du en anden fjerntermostat?"
Svaret på det spørgsmål er, jeg var nødt til det, og markedets smarte termostater er for dyre.
Retfærdig advarsel, dette er en "proof-of-concept" -bygning, der ville kræve et par ekstra output for faktisk at styre din termostat, men kernen er på plads og kan ændres afhængigt af din specifikke omstændighed. Dette er også stadig i gang, så forvent et par opdateringer og ændringer (især i Matlab -koden)
For at komme i gang vil jeg advare dig, dette kræver tre programmer (et af dem er ret dyrt), en del biblioteker og supportpakker til programmerne, og du skal have dem alle til at tale til hinanden. Det er hovedpine. Med den advarsel ude af vejen kan vi komme i gang med materialerne.
Hardware
- arduino nano
- arduino uno (eller en anden nano, jeg har lige brugt uno, fordi jeg havde en liggende)
- assorterede springkabler, nogle han/han og to sæt med tre sammenføjede han/hun -jumpere
- 433MHz radiofrekvens (RF) modtager, jeg brugte MX-05V
- 433MHz RF-sender, jeg brugte MX-FS-03V
- DHT11 termometer og fugtighedsføler med høj nøjagtighed (den jeg brugte er installeret på en trekantet chip med de nødvendige modstande allerede installeret)
- brødbræt (hvis du ikke vil lodde alt sammen)
- en telefon med GPS (iPhone 8 i dette tilfælde, men jeg har også brugt en Galaxy S8)
- 3D -printet beholder (egentlig ikke nødvendig, enhver beholder fungerer eller slet ingen)
Software
- Matlab fra MathWorks (jeg har 2018a-udgaven, men jeg har også brugt 2017a-b-udgaver)
- Matlab mobil installeret på din telefon
- arduino supportpakke til Matlab
- iPhone -sensorpakke til Matlab
- arduino IDE
- RadioHead -supportpakker og biblioteker i arduino IDE
- DHT11 -bibliotek til arduino IDE
- python 3.7 (sørg for, at det pyserielle bibliotek eller det serielle bibliotek er installeret, hvilket det skal være til version 3.4 eller nyere)
Trin 1: Sæt det hele sammen
Først og fremmest vil jeg foreslå, at du laver et par arduino -tutorials om RF -sendere bare for at sikre, at dine dele fungerer, og ledningerne er korrekte. Der er masser af eksempler til rådighed, med koden inkluderet (for dem af os derude, der ved lidt til ingenting om C og C ++).
Følg ledningsdiagrammerne nedenfor for at få arduinoen og sensorerne samlet. En ting at huske på, når du tilslutter arduinoerne, er, at de dataporte, jeg brugte, ikke er nødvendige, men anbefales.
Hvis du beslutter dig for at ændre de dataporte, du bruger, skal du bare definere benene i din kode. Personligt synes jeg, at det er lettere at holde fast ved de standardporte, som arduino -bibliotekerne genkender.
Og for at være klar, så er nano og uno udskiftelige, men jeg brugte nano'en til sendersiden af projektet til at reducere størrelsen på temperaturmonitoren.
Sidebemærkning: den grønne anordning, der holder nanoen, er den 3D -trykte beholder.
Trin 2: Modtager
Trin 3: Senderen
Trin 4: Koden
Når ledningerne er færdige, skal du få alle programmerne til at køre og bibliotekerne installeret (hvis du ikke allerede har gjort det), jeg går bare ud fra, at du har det, du skal starte Matlab og køre iPhone -supportpakken. Både din telefon og Matlab skal være på det samme wifi -netværk på dette tidspunkt.
I kommandovinduet i Matlab skriver du:
stikket på
Dette vil bede dig om at indtaste en femcifret adgangskode, som du vil bruge til at oprette forbindelse til din iPhone. Sørg for at huske adgangskoden. Når du har indtastet adgangskoden, viser Matlab nogle oplysninger, herunder din IP -adresse. Brug dette i det næste trin, som kommer fra instruktionerne fra hjælpemenuen "Kom godt i gang med sensorer" i Matlab mobile.
- Følg disse trin for at sende sensordata til MathWorks Cloud eller en computer:
- Hvis du sender sensordata til en computer, og hvis det ikke allerede er installeret, skal du downloade og installere MATLAB -supportpakken til Apple iOS -sensorer i MATLAB.
- Tilslut MATLAB Mobile til MathWorks Cloud eller en computer ved hjælp af Indstillinger.
- Opret mobiledev -objekt i MATLAB (på din computer), for eksempel: >> m = mobiledev
- Vælg en eller flere sensorer, og tryk på Start.
Følg disse trin for at logge sensordata lokalt på din enhed:
- På skærmen Sensorer skal du vælge de sensorer, du vil indsamle data fra.
- Vælg Log.
- Tryk på knappen Start.
- Når du er færdig med at indsamle data, skal du trykke på knappen Stop.
- Indtast navnet på sensorloggen i pop op-vinduet.
- Gentag trin 1-5, hvis det er nødvendigt.
Dette afsnit vil blive refereret tilbage til i del 4, så det er ikke nødvendigt at begynde at indsamle data endnu. Bare hold din telefon ved hånden og Matlab mobil klar.
Nu skal du oprette en mappe et sted i din computer for at huse Matlab -kodefilerne. Du har fire separate filer, to til baggrundsfunktionerne (.m -filer) og en Matlab -kodefil til GUI (.mlapp),.
Først er masseberegningen for luften i dit hus (dette lader Matlab vide, hvor lang tid det tager at opvarme/afkøle dit hus)
funktion [Mass] = CalcMass (T_ins, P_out, Chng_dir)
runCalc = 0; Tmp_start = T_ins; time_start = ur; time_end = 0 mens runCalc <= 1 hvis T_ins == (Tmp_start+(7*Chng_dir)) time_end = ur; PwrCntr = 0; runCalc = 0; ellers PwrCntr = P_out; runCalc = runCalc+0.1 slut sluttid_diag = time_end-time_start Mass = (P_out*time_diag) /7.035
Og den anden:
funktion [tidsstempler, pwr_usage] = dist_cntrl (Lat_in, Lon_in, P_out, r_pref, speed, T_pref, masse)
AutoStat = 1; i = 1; mens AutoStat == 1 time_start = ur; m = mobiledev; t = csvread ('værdier.csv', 0, 1); t = t (i); tidsstempler = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i+1; format longg; %haversine formel til beregning af afstand baseret på breddegrad og %longintude a_hav = (sind ((m. Latitude-Lat_in)./ 2)).^2+cosd (Lat_in).*cosd (m. breddegrad).*(sind ((m. Længdegrad-Lon_in)./ 2)).^2; c_hav = 2.*atan2d (sqrt (a_hav), sqrt (1-a_hav)); d_hav = 6371.*c_hav; Dist = d_hav.*1000; %anslår din tid til at returnere time_rtn = (Dist-r_pref)./ hastighed; %beregner den nødvendige termostatindstilling baseret på strømafbrydelse fra %klimaanlæg og husets luftmasse. calcTmp_set = ((-1.*P_out.*time_rtn)./ (masse.*(1.005))))+T_pref; %bestemmer, om den aktuelle termostatindstilling skal ændres, hvis runde (calcTmp_set) ~ = runde (t) timeACon = ur; PwrCntr = P_out; timeACon = timeACon + clock-time_start; cost = P_out*timeACon*rate; ellers PwrCntr = 0 sluttidsstempler (slut+1, [1: 6]) = ur; pwr_usage (ende+1, 1) = PwrCntr; pause (5) slut ende
Begge disse filer er Matlab -funktioner. Du behøver ikke at få adgang til dem, medmindre du planlægger at ændre dem til specifikke behov, da du vil ringe til dem fra GUI. Gem begge filer separat, den første som CalcMass.m og den anden som dist_cntrl.m, det er de navne, som GUI -koden bruger til at kalde funktionerne, så medmindre du vil redigere resten af koden herunder, skal du holde dig til navnekonventionen.
Inden du går ind i GUI -koden, skal du åbne appdesigneren til Matlab, som du kan åbne ved at navigere i Matlab -menulinjen eller ved min yndlingsmetode, der indtaster følgende kommando i Matlab -kommandovinduet:
appdesigner
Når appdesigneren er åben, skal du åbne en ny appfil (.mlapp) og slette alle standardkoder fra kodevinduet. Udskift derefter det hele med følgende, og tryk på knappen Kør.
classdef Control_1 <matlab.apps. AppBase % Egenskaber, der svarer til appkomponentegenskaber (Access = public) UIFigure matlab.ui. Figur TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton matlab.ui.control. Knap 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 Temperatur1Spindel. Tab.temperatur1Spiller. Tab. ui.control. Spinner Temperature2SpinnerLabel matlab.ui.cont rol. Label Temperature2Spinner matlab.ui.control. Spinner Switch matlab.ui.control. Switch EditFieldLabel matlab.ui.control. Label tempnow matlab.ui.control. NumericEditField GaugeLabel matlab.ui.control. Label Gauge matlab.ui.control. Gauge SavingsTab matlab.ui.container. Tab UIAxes matlab.ui.control. UIAxes ThisMonthCostEditFieldLabel matlab.ui.control. Label ThisMonthCostEditField matlab.ui.control. NumericEditField TotalSav. Ellit. Field. Server. Edit. Field. Server. Edit. Field. Server. Elite. Control. Elite. Control. Elite. Control. Elite. Control. Elite. Control. Elite. Control. Elite. Control. Elite. Control. Elite. Control. Elite. Control. Elite.
metoder (Adgang = privat)
% Værdi ændret funktion: tempnow
funktion tempnowValueChanged (app, hændelse) temp = app.tempnow. Value; temp = randi ([60, 90], 1, 50) app. Gauge. Value = 0 for i = length (temp) app. Gauge. Value = temp (i) pause (1) ende ende
% Værdi ændret funktion: TemperatureDirectionSwitch
funktion TemperatureDirectionSwitchValueChanged (app, hændelse) måde = app. TemperatureDirectionSwitch. Value; måde = uint8 (vej) måde = længde (vej) hvis vej == 4 Chng_dir = -1; ellers Chng_dir = 1; afslutte Chng_dir; ende
% Værdi ændret funktion: DDFH
funktion DDFHValueChanged (app, hændelse) r_pref = app. DDFH. Value; ende
% Værdi ændret funktion: AvgLocalSpeedEditField
funktion AvgLocalSpeedEditFieldValueChanged (app, event) speed = app. AvgLocalSpeedEditField. Value; ende
% Værdi ændret funktion: PowerOutputRatingEditField
funktion PowerOutputRatingEditFieldValueChanged (app, hændelse) value = app. PowerOutputRatingEditField. Value; ende
% Værdi ændret funktion: EnergyEfficiencyRatingEditField
funktion EnergyEfficiencyRatingEditFieldValueChanged (app, event) value = app. EnergyEfficiencyRatingEditField. Value; ende
% Knap skubbet funktion: RunDiagnosticButton
funktion RunDiagnosticButtonPushed (app, hændelse) måde = app. TemperatureDirectionSwitch. Value; måde = uint8 (vej) måde = længde (vej) hvis vej == 4 Chng_dir = -1; ellers Chng_dir = 1; slut T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)
ende
% Værdi ændret funktion: Temperatur1Spinner
funktion Temperatur1SpinnerValueChanged (app, hændelse) value = app. Temperature1Spinner. Value; ende
% Værdi ændret funktion: Temperature2Spinner
funktion Temperature2SpinnerValueChanged (app, event) value = app. Temperature2Spinner. Value; ende
% Værdi ændret funktion: Kontakt
funktion SwitchValueChanged (app, event) m = mobiledev; Lat_in = m. Latitude Lon_in = m. Længdegrad P_out = 0; r_pref = app. DDFH. Værdi; T_pref = app. Temperature1Spinner. Value; hastighed = m. hastighed; masse = 200; speed = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, speed, masse) ende ende
% Appinitialisering og konstruktion
metoder (Adgang = privat)
% Opret UIFigure og komponenter
funktion createComponents (app)
% Opret UIFigure
app. UIFigure = uifigure; app. UIFigure. Position = [100100640 480]; app. UIFigure. Name = 'UI -figur';
% Opret TabGroup
app. TabGroup = uitabgroup (app. UIFigure); app. TabGroup. Position = [1 1 640 480];
% Opret SetupTab
app. SetupTab = uitab (app. TabGroup); app. SetupTab. Title = 'Opsætning';
% Opret RunDiagnosticButton
app. RunDiagnosticButton = uibutton (app. SetupTab, 'push'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn (app, @RunDiagnosticButtonPushed, sand); app. RunDiagnosticButton. FontWeight = 'fed'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Kør diagnostik';
% Opret EnergyEfficiencyRatingEditFieldLabel
app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'right'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Energy Efficiency Rating';
% Opret EnergyEfficiencyRatingEditField
app. EnergyEfficiencyRatingEditField = uieditfield (app. SetupTab, 'numerisk'); app. EnergyEfficiencyRatingEditField. Limits = [0 100]; app. EnergyEfficiencyRatingEditField. ValueChangedFcn = createCallbackFcn (app, @EnergyEfficiencyRatingEditFieldValueChanged, true); app. EnergyEfficiencyRatingEditField. HorizontalAlignment = 'center'; app. EnergyEfficiencyRatingEditField. Position = [158 425 100 22];
% Opret PowerOutputRatingEditFieldLabel
app. PowerOutputRatingEditFieldLabel = uilabel (app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'right'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'Power Output Rating';
% Opret PowerOutputRatingEditField
app. PowerOutputRatingEditField = uieditfield (app. SetupTab, 'numerisk'); app. PowerOutputRatingEditField. Limits = [0 inf]; app. PowerOutputRatingEditField. ValueChangedFcn = createCallbackFcn (app, @PowerOutputRatingEditFieldValueChanged, true); app. PowerOutputRatingEditField. HorizontalAlignment = 'center'; app. PowerOutputRatingEditField. Position = [151 328 100 22];
% Opret AvgLocalSpeedEditFieldLabel
app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'right'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'Gns. Lokal hastighed ';
% Opret 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];
% Opret DesiredDistancefromHouseEditFieldLabel
app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'right'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'Ønsket afstand'; 'fra hus'};
% Opret DDFH
app. DDFH = uieditfield (app. SetupTab, 'numerisk'); app. DDFH. Limits = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn (app, @DDFHValueChanged, sand); app. DDFH. HorizontalAlignment = 'center'; app. DDFH. Position = [139 135 100 22];
% Opret TemperatureDirectionSwitchLabel
app. TemperatureDirectionSwitchLabel = uilabel (app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'center'; app. TemperatureDirectionSwitchLabel. Position = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Text = 'Temperaturretning';
% Opret TemperatureDirectionSwitch
app. TemperatureDirectionSwitch = uiswitch (app. SetupTab, 'skyder'); app. TemperatureDirectionSwitch. Items = {'Op', 'Ned'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn (app, @TemperatureDirectionSwitchValueChanged, true); app. TemperatureDirectionSwitch. Position = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'Op';
% Opret TempSettingsTab
app. TempSettingsTab = uitab (app. TabGroup); app. TempSettingsTab. Title = 'Temp. Indstillinger ';
% Opret Temperature1SpinnerLabel
app. Temperature1SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature1SpinnerLabel. HorizontalAlignment = 'center'; app. Temperature1SpinnerLabel. Position = [66 363 76 28]; app. Temperature1SpinnerLabel. Text = {'Temperatur'; '#1'};
% Opret 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;
% Opret Temperature2SpinnerLabel
app. Temperature2SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature2SpinnerLabel. HorizontalAlignment = 'center'; app. Temperature2SpinnerLabel. Position = [66 248 76 28]; app. Temperature2SpinnerLabel. Text = {'Temperatur'; '#2'};
% Opret 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;
% Opret switch
app. Switch = uiswitch (app. TempSettingsTab, 'skyder'); app. Switch. Items = {'1', '0'}; app. Switch. ValueChangedFcn = createCallbackFcn (app, @SwitchValueChanged, sand); app. Switch. FontName = 'Nyala'; app. Switch. FontSize = 28; app. Switch. Position = [522 21 74 32]; app. Switch. Value = '0';
% Opret EditFieldLabel
app. EditFieldLabel = uilabel (app. TempSettingsTab); app. EditFieldLabel. HorizontalAlignment = 'right'; app. EditFieldLabel. Position = [374 291 25 22]; app. EditFieldLabel. Text = '';
% Opret 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;
% Opret GaugeLabel
app. GaugeLabel = uilabel (app. TempSettingsTab); app. GaugeLabel. HorizontalAlignment = 'center'; app. GaugeLabel. Position = [225 32 42 22]; app. GaugeLabel. Text = 'Måler';
% Opret måler
app. Gauge = uigauge (app. TempSettingsTab, 'cirkulær'); app. Gauge. Limits = [60 90]; app. Måler. MajorTicks = [60 65 70 75 80 85 90]; app. Måler. Position = [185 69 120 120]; app. Gauge. Value = 60;
% Opret SavingsTab
app. SavingsTab = uitab (app. TabGroup); app. SavingsTab. Title = 'Besparelser';
% Opret 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];
% Opret ThisMonthCostEditFieldLabel
app. ThisMonthCostEditFieldLabel = uilabel (app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'center'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'Denne måneds pris';
% Opret ThisMonthCostEditField
app. ThisMonthCostEditField = uieditfield (app. SavingsTab, 'numerisk'); app. ThisMonthCostEditField. Limits = [0 Inf]; app. ThisMonthCostEditField. ValueDisplayFormat = '$%7.2f'; app. ThisMonthCostEditField. HorizontalAlignment = 'center'; app. ThisMonthCostEditField. Position = [417 39 137 58];
% Opret TotalSavingsEditFieldLabel
app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'right'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'Samlede besparelser';
% Opret TotalSavingsEditField
app. TotalSavingsEditField = uieditfield (app. SavingsTab, 'numerisk'); app. TotalSavingsEditField. Limits = [0 Inf]; app. TotalSavingsEditField. ValueDisplayFormat = '$%9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'center'; app. TotalSavingsEditField. Position = [88 39 137 58]; ende ende
metoder (Adgang = offentlig)
% Konstruer app
funktionsapp = Control_1
% Opret og konfigurer komponenter
createComponents (app)
% Registrer appen med App Designer
registerApp (app, app. UIFigure)
hvis nargout == 0
ryd app end ende
% Kode, der udføres før app -sletning
slet funktion (app)
% Slet UIFigure, når appen slettes
slet (app. UIFigure) ende ende ende
Du får sandsynligvis en fejl, hvilket ikke er noget problem. Bare luk den GUI, der blev genereret, efter du havde trykket på run, vi samler resten af de nødvendige programmer og data på et øjeblik.
Da Matlab er oprettet, kan vi gå videre til python. Først skal du køre python -programmet enten fra din kommandoprompt (på Windows) eller ved hjælp af.exe -filen i din python -mappe. Sørg for, at alle de relevante biblioteker er installeret ved hjælp af importkommandoen.
import seriel
importtid import csv
Dette er de tre biblioteker, du skal starte med, selvom vi snart laver vores eget bibliotek. Hvis der var en form for fejl med disse kommandoer, skal du gå tilbage og sørge for, at bibliotekerne er installeret og er i mappen Lib i python -mappen. Dernæst genererer vi det, jeg har kaldt pythonlogger -bibliotek. Dette navn er ikke nødvendigt, du kan kalde det, hvad du vil, det er bare navnet på den python -fil (.py), du opretter.
Åbn en teksteditor, jeg bruger Sublime3, men notesblok fungerer fint, og indtast denne kode.
def pythonprint ():
import pythonlogger import seriel import tid import csv ser = serial. Serial ('COM8') # COM8 er arduino seriel port, dette vil sandsynligvis være forskelligt for hver bruger, dvs. tjek din serielle port i arduino IDE ser.flushInput () mens Sandt: prøv: ser_bytes = ser.readline () print (ser_bytes) med åben ("test_data.csv", "a") som f: writer = csv.writer (f, delimiter = ",") # indstiller dataene til indtastes som kommasepareret writer.writerow ([time.time (), ser_bytes]) #skriver data til test_data.csv undtagen: print ("Fejl opstået") pause
Gem teksten som "indsæt navnet på det bibliotek, du ønsker".py i mappen Lib. Bemærk også, at def pythonprint () -linjen definerer navnet på den funktion, du skal kalde, så du kan ændre det til at definere "indsæt navn, du vil have til din funktion" (). Når biblioteket er gemt, kan vi gå videre til arduino -koden.
Åbn arduino IDE, og åbn to nye skitsevinduer. Gem de to skitsefiler et sted, der er praktisk, navnet på disse filer er ligegyldigt. Slet derefter al standardkoden, og erstat den med følgende.
Til den modtagende arduino:
#omfatte
#include #include #include // dette bruges ikke, men er nødvendigt for at kompilere RH_ASK -driver; struct dataStruct {float temp; } myData; ugyldig opsætning () {Serial.begin (9600); // Debugging kun hvis (! Driver.init ()) Serial.println ("init mislykkedes"); } void loop () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof (buf); if (driver.recv (buf, & buflen)) // Ikke-blokerende {int i; // Besked med en god checksum modtaget, dump den. //driver.printBuffer("Fik: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serial.print (myData.temp); }}
P. S. // driver.printBuffer…. etc linje er testkode. Du behøver ikke bekymre dig om det, medmindre du laver diagnoser og vil finde ud af, om du rent faktisk modtager data.
Til senderen arduino
#omfatte
#include #include #include // dette bruges ikke, men er nødvendigt for at kompilere #include #include int pin = 4; DHT11 dht11 (pin); RH_ASK driver; struct dataStruct {float temp; } myData; byte tx_buf [sizeof (myData)] = {0}; // Så argumenter er bitrate, transmitter pin (tx), // modtage pin (rx), ppt pin, isInverse. De sidste 2 bruges ikke. Ugyldig opsætning () {Serial.begin (9600); // Debugging kun hvis (! Driver.init ()) Serial.println ("init mislykkedes"); } void loop () {int err; flyde temp, humi; uint8_t msg; hvis ((err = dht11.read (humi, temp)) == 0) myData.temp = temp; memcpy (tx_buf, & myData, sizeof (myData)); byte zize = sizeof (myData); {Serial.println (myData.temp); driver.send ((uint8_t *) tx_buf, zize); driver.waitPacketSent (); // standse udførelsen, indtil alle data er sendt forsinkelse (2000); // vent 2 sekunder}}
Inkluder -kommandoerne burde være nok, men hvis du senere har problemer med dataoverførslen, vil du måske se i biblioteksmappen RadioHead og inkludere resten af filnavnene i samme format.
Trin 5: Få det til at fungere
Nu hvor vi har hele koden samlet og arduinoen er samlet, kan vi tilslutte arduinoen til din computer og indlæse koden. Sørg for at sende den korrekte kode til de modtagende og transmitterende mikrokontrollere. Du kan have begge arduinoerne forbundet til din computer, mens denne kører, men du skal sørge for, at du har valgt den korrekte port fremad, eller du kan afbryde den transmitterende arduino og tænde den fra en anden kilde, når koden er uploadet.
Når vi taler om det, skal du vælge den port, der er forbundet til din modtagende arduino fra IDE -værktøjsmenuen nu og køre python.
Åbn ikke den serielle skærm, mens du gør dette, python kan ikke læse serien, mens skærmen er åben. Når python er åben, kalder du pythonprint -funktionen som følger.
pythonlogger.pythonprint ()
Dette starter dataindsamlingen fra arduino serielle port. Hvis du åbner din python -mappe nu, vil du se, at der er blevet oprettet en ny.csv -fil kaldet "test_data.csv", der indeholder alle oplysninger om tid og temperatur. Dette vil være den fil, Matlab har adgang til for at udføre alle sine beregninger og kontroller.
En anden advarsel: åbn ikke test_data.csv, mens dataene åbnes eller skrives. Hvis du gør det, vil python og/eller Matlab -koden gå ned og sende en fejl tilbage
Hvis du beslutter dig for at åbne.csv senere, vil du bemærke, at tidskolonnen bare er en meget stor række tal. Det er fordi kommandoen time.time () skriver antallet af sekunder siden 1. januar 1970.
På dette tidspunkt skal python udskrive de temperaturdata, den læser fra den serielle port. Det skal se sådan ud:
b'25.03 '/r/n
Du skal ikke bekymre dig om de ekstra tegn, Matlab -kodeindekserne for de fem midterste værdier i den anden kolonne i.csv -filen.
Nu hvor alle de understøttende programmer fungerer, og data indsamles, kan vi begynde at indsamle GPS -data fra Matlab -mobilprogrammet, der blev konfigureret tidligere, og køre Matlab GUI -koden. Når du er i sensorfanen på Matlab mobil, skal du vælge GPS og trykke på startknappen.
Hvis du er ny i Matlab mobile, skal du gå tilbage til trin 4 og se på skærmbillederne ovenfor. Hvis du stadig har problemer, skal du sørge for at have forbindelse til den computer, du valgte tidligere (i fanen Indstillinger) og bruge linket fra kommandoen "stik til" til at kontrollere, at Matlab er online.
Trin 6: Brug af programmet
Der sker flere ting i baggrunden i dette system. Temperaturdata indsamles og logges af arduino og pyton, Matlab indsamler GPS -data fra din telefon og kører beregninger for at se, hvor langt væk du er fra dit hus og indstiller din termostat baseret på alle disse oplysninger. Hvor du kommer ind er at give dine præferencer.
Kør Matlab GUI -koden. Åbn.mlapp -filen, og se på den første fane. Du skal selv indsamle oplysningerne til dette, effektiviteten og effektværdien af din varme-/køleenhed kan normalt findes på selve enheden, og din gennemsnitshastighed er bare et godt skøn over, hvor hurtigt du kører. Når værdierne er indtastet, skal du trykke på knappen "Kør diagnostik", og programmet styrer din termostat for at indsamle oplysninger om dit hus.
Gå videre til den næste menu.
Trin 7: Temperaturkontrol
Denne menu giver dig mulighed for at vælge den foretrukne temperatur, mens du er hjemme og ude. Indstil temperatur #1 til din behagelige temperatur, og temperatur #2 til en høj eller lav værdi, der er sikker for dit hjem (sørg for at du ikke indstiller den til 100 grader, mens du har hunde hjemme osv.).
Trin 8: Historiske data
Endelig kan du se, hvor mange penge du sparer ved at bruge den automatiske kontrol. Dette estimerer i det væsentlige, hvor meget energi der ville blive brugt, hvis din termostat var indstillet til din foretrukne temperatur 24/7, og fratrækker derefter din faktiske energiforbrug.
Held og lykke med at bygge.
Anbefalede:
Sådan gør du: Installation af Raspberry PI 4 Headless (VNC) med Rpi-imager og billeder: 7 trin (med billeder)
Sådan gør du: Installation af Raspberry PI 4 Headless (VNC) med Rpi-imager og billeder: Jeg planlægger at bruge denne Rapsberry PI i en masse sjove projekter tilbage i min blog. Tjek det gerne ud. Jeg ville tilbage til at bruge min Raspberry PI, men jeg havde ikke et tastatur eller en mus på min nye placering. Det var et stykke tid siden jeg konfigurerede en hindbær
Arduino Halloween Edition - Pop -out -skærm med zombier (trin med billeder): 6 trin
Arduino Halloween Edition - Zombies Pop -out -skærm (trin med billeder): Vil du skræmme dine venner og lave skrigende støj i Halloween? Eller vil du bare lave en god sjov? Denne pop-out-skærm fra Zombies kan gøre det! I denne Instructable vil jeg lære dig, hvordan du nemt laver jump-out zombier ved hjælp af Arduino. HC-SR0
Sådan adskilles en computer med nemme trin og billeder: 13 trin (med billeder)
Sådan adskilles en computer med nemme trin og billeder: Dette er en instruktion om, hvordan du adskiller en pc. De fleste af de grundlæggende komponenter er modulopbyggede og nemme at fjerne. Det er dog vigtigt, at du er organiseret omkring det. Dette hjælper med at forhindre dig i at miste dele og også ved at lave genmonteringen til
Ciclop 3d Scanner My Way Trin for trin: 16 trin (med billeder)
Ciclop 3d Scanner My Way Step by Step: Hej alle sammen, jeg kommer til at indse den berømte Ciclop 3D -scanner.Alle trin, der er godt forklaret på det originale projekt, er ikke til stede.Jeg lavede nogle rettelser for at forenkle processen, først Jeg udskriver basen, og end jeg genstarter printkortet, men fortsæt
Sådan styrer du husholdningsapparater med fjernsyn med fjernbetjening med timerfunktion: 7 trin (med billeder)
Sådan styrer du husholdningsapparater med fjernsyn med fjernbetjening med timerfunktion: Selv efter 25 års introduktion til forbrugermarkedet er infrarød kommunikation stadig meget relevant i de seneste dage. Uanset om det er dit 55 tommer 4K -fjernsyn eller dit billydsystem, har alt brug for en IR -fjernbetjening for at reagere på vores