Სარჩევი:
- ნაბიჯი 1: ყველაფერი ერთად ააწყვეთ
- ნაბიჯი 2: მიმღები
- ნაბიჯი 3: გადამცემი
- ნაბიჯი 4: კოდი
- ნაბიჯი 5: გახადე მუშაობა
- ნაბიჯი 6: პროგრამის გამოყენება
- ნაბიჯი 7: ტემპერატურის კონტროლი
- ნაბიჯი 8: ისტორიული მონაცემები
ვიდეო: Autostat: დისტანციური თერმოსტატი: 8 ნაბიჯი (სურათებით)
2024 ავტორი: John Day | [email protected]. ბოლოს შეცვლილი: 2024-01-30 10:19
თქვენ ალბათ სვამთ კითხვას "რატომ აკეთებთ სხვა დისტანციურ თერმოსტატს?"
ამ კითხვაზე პასუხი არის, მე მომიწია და ბაზრის ჭკვიანი თერმოსტატი ძალიან ძვირია.
სამართლიანი გაფრთხილება, ეს არის "კონცეფციის მტკიცებულება", რომელიც მოითხოვს დამატებით რამდენიმე შედეგს თქვენი თერმოსტატის რეალურად გასაკონტროლებლად, მაგრამ ბირთვი ადგილზეა და შეიძლება შეიცვალოს თქვენი კონკრეტული გარემოებიდან გამომდინარე. ასევე, ეს ჯერ კიდევ სამუშაოა, ასე რომ ველით რამდენიმე განახლებას და ცვლილებას (განსაკუთრებით Matlab კოდს)
დასაწყებად მინდა გაგაფრთხილოთ, ეს მოითხოვს სამ პროგრამას (ერთი მათგანი საკმაოდ ძვირია), საკმაოდ ბევრი ბიბლიოთეკა და პროგრამების დამხმარე პაკეტები და თქვენ უნდა გქონდეთ ყველა ერთმანეთის სალაპარაკო. ეს თავის ტკივილია. ამ გაფრთხილების გარეშე, მოდით დავიწყოთ მასალებით.
ტექნიკა
- არდუინო ნანო
- arduino uno (ან სხვა ნანო, მე მხოლოდ uno გამოვიყენე, რადგან მე მქონდა ერთი დასაგდები)
- მრავალფეროვანი მხტუნავი კაბელები, ზოგიერთი მამაკაცი/მამაკაცი და ორი კომპლექტი სამი შეუერთებული მამაკაცი/ქალი მხტუნავები
- 433MHz რადიოსიხშირული (RF) მიმღები, მე გამოვიყენე MX-05V
- 433MHz RF გადამცემი, მე გამოვიყენე MX-FS-03V
- DHT11 მაღალი სიზუსტის თერმომეტრი და ტენიანობის სენსორი (ის, რასაც მე ვიყენებ, დამონტაჟებულია სამკუთხა ჩიპზე, საჭირო რეზისტორებით უკვე დაყენებული)
- პურის დაფა (თუ არ გსურთ ამ ყველაფრის ერთად შედუღება)
- ტელეფონი GPS– ით (ამ შემთხვევაში iPhone 8, მაგრამ მე ასევე გამოვიყენე Galaxy S8)
- 3D დაბეჭდილი კონტეინერი (ნამდვილად არ არის საჭირო, ნებისმიერი კონტეინერი იმუშავებს ან საერთოდ არ იქნება)
პროგრამული უზრუნველყოფა
- Matlab MathWorks– დან (მე მაქვს 2018 ა გამოცემა, მაგრამ ასევე გამოვიყენე 2017 ა – ბ გამოცემებიც)
- თქვენს ტელეფონში დამონტაჟებულია Matlab მობილური
- arduino მხარდაჭერის პაკეტი Matlab– ისთვის
- iPhone სენსორული პაკეტი Matlab– ისთვის
- arduino IDE
- RadioHead– ის მხარდაჭერის პაკეტები და arduino IDE ბიბლიოთეკები
- DHT11 ბიბლიოთეკა arduino IDE– სთვის
- პითონი 3.7 (დარწმუნდით, რომ დამონტაჟებულია პიზერიული ბიბლიოთეკა ან სერიული ბიბლიოთეკა, რომელიც უნდა იყოს 3.4 ან უფრო ახალი ვერსიისთვის)
ნაბიჯი 1: ყველაფერი ერთად ააწყვეთ
უპირველეს ყოვლისა, მე გირჩევთ გააკეთოთ რამოდენიმე arduino გაკვეთილი, რომელიც ეხება RF გადამცემებს, რათა დარწმუნდეთ, რომ თქვენი ნაწილები მუშაობს და გაყვანილობა სწორია. უამრავი მაგალითია ხელმისაწვდომი, კოდი შეიცავს (ჩვენთვის, ვინც არაფერი იცის C და C ++).
მიჰყევით ქვემოთ მოცემულ გაყვანილობის დიაგრამებს, რომ მიიღოთ არდუინო და სენსორები. არდუინოების გაყვანილობისას ერთი რამ უნდა გახსოვდეთ, რომ მონაცემთა პორტები, რომლებიც მე გამოვიყენე, არ არის საჭირო, მაგრამ რეკომენდირებულია.
თუ თქვენ გადაწყვეტთ შეცვალოთ თქვენი მონაცემების პორტები, თქვენ უბრალოდ უნდა განსაზღვროთ ქინძისთავები თქვენს კოდში. პირადად მე, მე ვფიქრობ, რომ უფრო ადვილია შეინარჩუნო ნაგულისხმევი პორტები, რომლებსაც არდუინოს ბიბლიოთეკები აღიარებენ.
და მხოლოდ გასაგებად რომ ვთქვათ, ნანო და უნო ურთიერთშემცვლელნი არიან, მაგრამ მე გამოვიყენე ნანო პროექტის გადამცემი მხარისთვის ტემპერატურის მონიტორის ზომის შესამცირებლად.
გვერდითი შენიშვნა: მწვანე კონტრასტი, რომელსაც აქვს ნანო, არის 3D დაბეჭდილი კონტეინერი.
ნაბიჯი 2: მიმღები
ნაბიჯი 3: გადამცემი
ნაბიჯი 4: კოდი
გაყვანილობის დასრულების შემდეგ თქვენ უნდა გაუშვათ ყველა პროგრამა და დაინსტალირდეს ბიბლიოთეკები (თუ ეს უკვე არ გაქვთ), მე ვივარაუდებ, რომ გაქვთ, თქვენ უნდა გაუშვათ Matlab და გაუშვათ iPhone მხარდაჭერის პაკეტი. თქვენი ტელეფონი და Matlab ამ ეტაპზე უნდა იყოს ერთსა და იმავე wifi ქსელში.
Matlab ბრძანების ფანჯარაში ჩაწერეთ:
კონექტორი ჩართულია
ეს მოგთხოვთ შეიყვანოთ ხუთნიშნა პაროლი, რომელსაც გამოიყენებთ თქვენს iPhone– ზე დასაკავშირებლად. დარწმუნდით, რომ გახსოვთ პაროლი. პაროლის შეყვანისთანავე Matlab აჩვენებს ინფორმაციას, მათ შორის თქვენს IP მისამართს. გამოიყენეთ ეს მომდევნო ეტაპზე, რომელიც მოდის ინსტრუქციებში "სენსორების დაწყება" დახმარების მენიუდან Matlab მობილურში.
- მიჰყევით ამ ნაბიჯებს სენსორის მონაცემების გასაგზავნად MathWorks Cloud– ში ან კომპიუტერში:
- თუ თქვენ აგზავნით სენსორის მონაცემებს კომპიუტერში და თუ ის ჯერ არ არის დაინსტალირებული, ჩამოტვირთეთ და დააინსტალირეთ MATLAB მხარდაჭერის პაკეტი Apple iOS სენსორებისთვის MATLAB– ში.
- დააკავშირეთ MATLAB Mobile MathWorks Cloud– თან ან კომპიუტერთან პარამეტრების გამოყენებით.
- შექმენით mobiledev ობიექტი MATLAB– ში (თქვენს კომპიუტერში), მაგალითად: >> m = mobiledev
- აირჩიეთ ერთი ან მეტი სენსორი და შეეხეთ დაწყებას.
მიჰყევით ამ ნაბიჯებს სენსორის მონაცემების ლოკალურად შესასვლელად თქვენს მოწყობილობაზე:
- სენსორების ეკრანზე შეარჩიეთ სენსორები, რომელთაგან გსურთ მონაცემების შეგროვება.
- აირჩიეთ ჟურნალი.
- შეეხეთ დაწყების ღილაკს.
- მონაცემების შეგროვების დასრულების შემდეგ დააჭირეთ ღილაკს გაჩერება.
- ამომხტარი ფანჯარაში შეიყვანეთ სენსორის ჟურნალის სახელი.
- საჭიროების შემთხვევაში გაიმეორეთ 1-5 ნაბიჯები.
ეს განყოფილება გადატანილი იქნება მე –4 ნაწილში, ასე რომ ჯერ არ არის საჭირო მონაცემების შეგროვების დაწყება. უბრალოდ შეინახეთ ტელეფონი მოსახერხებელი და მზად Matlab მობილური.
ახლა თქვენ უნდა შექმნათ საქაღალდე სადმე თქვენს კომპიუტერში Matlab კოდის ფაილების შესანახად. თქვენ გექნებათ ოთხი ცალკეული ფაილი, ორი ფონის ფუნქციისთვის (.m ფაილი) და ერთი Matlab კოდის ფაილი GUI (.mlapp),.
პირველი არის მასის გაანგარიშება თქვენს სახლში ჰაერისთვის (ეს საშუალებას აძლევს Matlab- ს იცოდეს რამდენი დრო სჭირდება თქვენი სახლის გათბობას/გაგრილებას)
ფუნქცია [მასა] = CalcMass (T_ins, P_out, Chng_dir)
runCalc = 0; Tmp_start = T_ins; დროის_სტარტი = საათი; დრო_დასასრული = 0 გაშვებისას კალცი <= 1 თუ T_ins == (Tmp_start+(7*Chng_dir)) დრო_დასასრული = საათი; PwrCntr = 0; runCalc = 0; სხვაგან PwrCntr = P_out; runCalc = runCalc+0.1 დასასრულის დასრულების დრო_დიაგ = დრო_დასასრულებელი_დროის დაწყება მასა = (P_out*დრო_დიაგ) /7.035
და მეორე:
ფუნქცია [დროის ნიშნულები, pwr_usage] = dist_cntrl (Lat_in, Lon_in, P_out, r_pref, speed, T_pref, mass)
ავტო სტატისტიკა = 1; i = 1; ხოლო AutoStat == 1 time_start = საათი; m = mobiledev; t = csvread ('values.csv', 0, 1); t = t (i); დროის ნიშნულები = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i+1; ფორმატი longg; გრძედის გამოთვლის ფორმულა გრძედის საფუძველზე და %longintude a_hav = (sind ((m. Latitude-Lat_in)./ 2)).^2+cosd (Lat_in).*cosd (m.latitude).*(sind ((მ. გრძედი-ლონდონი)./ 2)).^2; c_hav = 2.*atan2d (sqrt (a_hav), sqrt (1-a_hav)); d_hav = 6371.*c_hav; Dist = d_hav.*1000; %აფასებს თქვენს დაბრუნების დროს_rtn = (Dist-r_pref)./ სიჩქარე; %ითვლის თერმოსტატის აუცილებელ პარამეტრს, რომელიც დაფუძნებულია სახლის კონდიციონერისა და ჰაერის მასის ენერგიაზე. calcTmp_set = ((--1.*P_out.*time_rtn)./ (მასა.*(1.005)))+T_pref; %განსაზღვრავს საჭიროა თუ არა თერმოსტატის მიმდინარე პარამეტრის შეცვლა, თუ რაუნდი (calcTmp_set) ~ = მრგვალი (t) დრო ACon = საათი; PwrCntr = P_out; timeACon = timeACon + საათი-დრო_დაწყება; ღირებულება = P_out*timeACon*განაკვეთი; else PwrCntr = 0 ბოლო დროის ნიშნულები (დასასრული+1, [1: 6]) = საათი; pwr_usage (დასასრული+1, 1) = PwrCntr; პაუზა (5) დასასრული დასასრული
ორივე ეს ფაილი არის Matlab ფუნქციები. თქვენ არ დაგჭირდებათ მათზე წვდომა, თუ არ აპირებთ მათ შეცვლას კონკრეტული საჭიროებისთვის, ვინაიდან თქვენ დარეკავთ მათ GUI– დან. შეინახეთ ორივე ფაილი ცალ -ცალკე, პირველი როგორც CalcMass.m და მეორე როგორც dist_cntrl.m, ეს იქნება სახელები, რომლებსაც GUI კოდი იყენებს ფუნქციების დასაძახებლად, ასე რომ, თუ არ გსურთ დანარჩენი კოდის შესწორება ქვემოთ დასახელების კონვენცია.
სანამ GUI კოდში შეხვალთ, თქვენ უნდა გახსნათ აპლიკაციის დიზაინერი Matlab– ისთვის, რომელიც შეგიძლიათ გახსნათ Matlab მენიუს ზოლში ნავიგაციით, ან ჩემი საყვარელი მეთოდით, რომელიც შეაქვს შემდეგ ბრძანებას Matlab ბრძანების ფანჯარაში:
დიზაინერი
პროგრამის დიზაინერის გახსნის შემდეგ გახსენით ახალი პროგრამის ფაილი (.mlapp) და წაშალეთ ყველა ნაგულისხმევი კოდი კოდის ფანჯრიდან. შემდეგ შეცვალეთ ეს ყველაფერი შემდეგით და დააჭირეთ გაშვების ღილაკს.
classdef Control_1 <matlab.apps. AppBase % თვისებები, რომლებიც შეესაბამება აპლიკაციის კომპონენტების თვისებებს (წვდომა = საჯარო) UIFigure matlab.ui. Figure TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton matlab.ui.control Button EnergyEfficiencyRatingEditFieldLabel matlab.ui.control. Label EnergyEfficiencyRatingEditField matlab.ui.control. NumericEditField PowerOutputRatingEditFieldLabel matlab.ui.control. Label PowerOutputRatingEditField matlab.ui.control. NumericEditField AvgLocalSpeedEditFieldLabel matlab.ui.control. Label AvgLocalSpeedEditField matlab.ui.control. NumericEditField DesiredDistancefromHouseEditFieldLabel matlab.ui.control. Label DDFH matlab.ui.control. NumericEditField TemperatureDirectionSwitchLabel matlab.ui.control. Label TemperatureDirectionSwitch matlab.ui.control. Switch TempSettingsTab matlaber Temerbabel.butter.ab.control.i.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.ai.control.ai.control.ai.control.ai.control.ai.control.ai.control.ai.control.ai.control.ai.control.ai.control.ai.control.ai.control.ai.control.ai.control.ai.control.ai.control.ai.control.ai.control.ai.control.ai.control.ai.control.ai.control.ai.ontont. ლიანდაგი SavingsTab matlab.ui.container. Tab UIAxes matlab.ui.control. UIAxes ThisMonthCostEditFieldLabel matlab.ui.control. Label ThisMonthCostEditField matlab.ui.control. NumericEditField TotalSavingsEditFieldLabel matlab.ui.control. Label TotalSavingsEditField matlab.ui.control. NumericEditField ბოლოს
მეთოდები (წვდომა = პირადი)
% ღირებულებამ შეცვალა ფუნქცია: tempnow
ფუნქცია tempnowValueChanged (აპლიკაცია, მოვლენა) temp = app.tempnow. Value; temp = randi ([60, 90], 1, 50) აპლიკაცია. Gauge. Value = 0 i = სიგრძის (temp) აპლიკაციისთვის. Gauge. Value = temp (i) პაუზა (1) დასასრული
% ღირებულებამ შეცვალა ფუნქცია: TemperatureDirectionSwitch
ფუნქცია TemperatureDirectionSwitchValueChanged (აპლიკაცია, მოვლენა) გზა = app. TemperatureDirectionSwitch. Value; გზა = uint8 (გზა) გზა = სიგრძე (გზა) თუ გზა == 4 Chng_dir = -1; სხვაგან Chng_dir = 1; დასრულება Chng_dir; დასასრული
% ღირებულებამ შეცვალა ფუნქცია: DDFH
ფუნქცია DDFHValueChanged (აპლიკაცია, მოვლენა) r_pref = app. DDFH. Value; დასასრული
% ღირებულებამ შეცვალა ფუნქცია: AvgLocalSpeedEditField
ფუნქცია AvgLocalSpeedEditFieldValueChanged (აპლიკაცია, მოვლენა) სიჩქარე = app. AvgLocalSpeedEditField. Value; დასასრული
% ღირებულებამ შეცვალა ფუნქცია: PowerOutputRatingEditField
ფუნქცია PowerOutputRatingEditFieldValueChanged (აპლიკაცია, მოვლენა) მნიშვნელობა = app. PowerOutputRatingEditField. Value; დასასრული
% ღირებულებამ შეცვალა ფუნქცია: EnergyEfficiencyRatingEditField
ფუნქცია EnergyEfficiencyRatingEditFieldValueChanged (აპლიკაცია, მოვლენა) მნიშვნელობა = app. EnergyEfficiencyRatingEditField. Value; დასასრული
ღილაკმა დააჭირა ფუნქცია: RunDiagnosticButton
ფუნქცია RunDiagnosticButtonPushed (აპლიკაცია, მოვლენა) გზა = app. TemperatureDirectionSwitch. Value; გზა = uint8 (გზა) გზა = სიგრძე (გზა) თუ გზა == 4 Chng_dir = -1; სხვაგან Chng_dir = 1; დასრულება T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)
დასასრული
% ღირებულებამ შეცვალა ფუნქცია: Temperature1Spinner
ფუნქცია Temperature1SpinnerValueChanged (აპლიკაცია, მოვლენა) მნიშვნელობა = app. Temperature1Spinner. Value; დასასრული
% ღირებულებამ შეცვალა ფუნქცია: Temperature2Spinner
ფუნქცია Temperature2SpinnerValueChanged (აპლიკაცია, მოვლენა) მნიშვნელობა = app. Temperature2Spinner. Value; დასასრული
% მნიშვნელობა შეიცვალა ფუნქცია: გადართვა
ფუნქცია SwitchValueChanged (აპლიკაცია, ღონისძიება) m = mobiledev; Lat_in = m. გრძედი Lon_in = m. გრძედი P_out = 0; r_pref = app. DDFH.value; T_pref = app. Temperature1Spinner. Value; სიჩქარე = მ. სიჩქარე; მასა = 200; სიჩქარე = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, სიჩქარე, მასა) დასასრული
აპლიკაციის ინიციალიზაცია და მშენებლობა
მეთოდები (წვდომა = პირადი)
შექმენით UIFigure და კომპონენტები
ფუნქცია createComponents (აპლიკაცია)
შექმენით UIFigure
app. UIFigure = uifigure; app. UIFigure. Position = [100 100 640 480]; app. UIFigure. Name = 'ინტერფეისის ფიგურა';
% შექმნა TabGroup
app. TabGroup = uitabgroup (app. UIFigure); app. TabGroup. Position = [1 1 640 480];
% SetupTab- ის შექმნა
app. SetupTab = uitab (app. TabGroup); app. SetupTab. Title = 'დაყენება';
შექმენით RunDiagnosticButton
app. RunDiagnosticButton = uibutton (app. SetupTab, 'ბიძგი'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn (აპლიკაცია, @RunDiagnosticButtonPushed, ჭეშმარიტი); app. RunDiagnosticButton. FontWeight = 'თამამი'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'დიაგნოსტიკის გაშვება';
შექმნა EnergyEfficiencyRatingEditFieldLabel
app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'მარჯვნივ'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'ენერგოეფექტურობის რეიტინგი';
შექმნა EnergyEfficiencyRatingEditField
app. EnergyEfficiencyRatingEditField = uieditfield (app. SetupTab, 'რიცხვითი'); app. EnergyEfficiencyRatingEditField. Limits = [0 100]; app. EnergyEfficiencyRatingEditField. ValueChangedFcn = createCallbackFcn (აპლიკაცია, @EnergyEfficiencyRatingEditFieldValueChanged, true); app. EnergyEfficiencyRatingEditField. HorizontalAlignment = 'ცენტრი'; app. EnergyEfficiencyRatingEditField. Position = [158 425 100 22];
შექმენით PowerOutputRatingEditFieldLabel
app. PowerOutputRatingEditFieldLabel = uilabel (app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'მარჯვნივ'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'დენის გამომუშავების რეიტინგი';
შექმენით PowerOutputRatingEditField
app. PowerOutputRatingEditField = uieditfield (app. SetupTab, 'რიცხვითი'); app. PowerOutputRatingEditField. Limits = [0 ინფ]; app. PowerOutputRatingEditField. ValueChangedFcn = createCallbackFcn (აპლიკაცია, @PowerOutputRatingEditFieldValueChanged, true); app. PowerOutputRatingEditField. HorizontalAlignment = 'ცენტრი'; app. PowerOutputRatingEditField. Position = [151 328 100 22];
% შექმნა AvgLocalSpeedEditFieldLabel
app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'მარჯვნივ'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'საშუალო ადგილობრივი სიჩქარე ';
შექმენით AvgLocalSpeedEditField
app. AvgLocalSpeedEditField = uieditfield (app. SetupTab, 'რიცხვითი'); app. AvgLocalSpeedEditField. Limits = [0 70]; app. AvgLocalSpeedEditField. ValueChangedFcn = createCallbackFcn (აპლიკაცია, @AvgLocalSpeedEditFieldValueChanged, true); app. AvgLocalSpeedEditField. HorizontalAlignment = 'ცენტრი'; app. AvgLocalSpeedEditField. Position = [142 231 100 22];
შექმენით DesiredDistancefromHouseEditFieldLabel
app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'მარჯვნივ'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'სასურველი მანძილი'; 'სახლიდან'};
შექმენით DDFH
app. DDFH = uieditfield (app. SetupTab, 'რიცხვითი'); app. DDFH. Limits = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn (აპლიკაცია, @DDFHValueChanged, ჭეშმარიტი); app. DDFH. HorizontalAlignment = 'ცენტრი'; app. DDFH. პოზიცია = [139 135 100 22];
% შექმნა TemperatureDirectionSwitchLabel
app. TemperatureDirectionSwitchLabel = uilabel (app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'ცენტრი'; app. TemperatureDirectionSwitchLabel. Position = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Text = 'ტემპერატურის მიმართულება';
შექმნა TemperatureDirectionSwitch
app. TemperatureDirectionSwitch = uiswitch (app. SetupTab, 'სლაიდერი'); app. TemperatureDirectionSwitch. Items = {'ზემოთ', 'ქვემოთ'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn (აპლიკაცია, @TemperatureDirectionSwitchValueChanged, true); app. TemperatureDirectionSwitch. Position = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'მაღლა';
% შექმნა TempSettingsTab
app. TempSettingsTab = uitab (app. TabGroup); app. TempSettingsTab. Title = 'ტემპი. პარამეტრები ';
% შექმნა Temperature1SpinnerLabel
app. Temperature1SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature1SpinnerLabel. HorizontalAlignment = 'ცენტრი'; app. Temperature1SpinnerLabel. Position = [66 363 76 28]; app. Temperature1SpinnerLabel. Text = {'ტემპერატურა'; '#1'};
შექმნა Temperature1Spinner
app. Temperature1Spinner = uispinner (app. TempSettingsTab); app. Temperature1Spinner. Limits = [60 90]; app. Temperature1Spinner. ValueChangedFcn = createCallbackFcn (აპლიკაცია, @Temperature1SpinnerValueChanged, true); app. Temperature1Spinner. Position = [157 346 100 68]; app. Temperature1Spinner. Value = 60;
შექმნა Temperature2SpinnerLabel
app. Temperature2SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature2SpinnerLabel. HorizontalAlignment = 'ცენტრი'; app. Temperature2SpinnerLabel. Position = [66 248 76 28]; app. Temperature2SpinnerLabel. Text = {'ტემპერატურა'; '#2'};
შექმნა Temperature2Spinner
app. Temperature2Spinner = uispinner (app. TempSettingsTab); app. Temperature2Spinner. Limits = [60 90]; app. Temperature2Spinner. ValueChangedFcn = createCallbackFcn (აპლიკაცია, @Temperature2SpinnerValueChanged, true); app. Temperature2Spinner. Position = [157 230 100 70]; app. Temperature2Spinner. Value = 60;
შექმენით შეცვლა
app. Switch = uiswitch (app. TempSettingsTab, 'სლაიდერი'); app. Switch. Items = {'1', '0'}; app. Switch. ValueChangedFcn = createCallbackFcn (აპლიკაცია, @SwitchValueChanged, ჭეშმარიტი); app. Switch. FontName = 'ნიალა'; app. Switch. FontSize = 28; app. Switch. Position = [522 21 74 32]; app. Switch. Value = '0';
% შექმნა EditFieldLabel
app. EditFieldLabel = uilabel (app. TempSettingsTab); app. EditFieldLabel. HorizontalAlignment = 'მარჯვნივ'; app. EditFieldLabel. Position = [374 291 25 22]; app. EditFieldLabel. Text = ";
შექმენით tempnow
app.tempnow = uieditfield (app. TempSettingsTab, 'რიცხვითი'); app.tempnow. Limits = [60 89]; app.tempnow. ValueChangedFcn = createCallbackFcn (აპლიკაცია, @tempnowValueChanged, ჭეშმარიტი); app.tempnow. HorizontalAlignment = 'ცენტრი'; app.tempnow. FontSize = 26; app.tempnow. Position = [409 230 133 117]; app.tempnow. Value = 60;
შექმნა GaugeLabel
app. GaugeLabel = uilabel (app. TempSettingsTab); app. GaugeLabel. HorizontalAlignment = 'ცენტრი'; app. GaugeLabel. Position = [225 32 42 22]; app. GaugeLabel. Text = 'ლიანდაგი';
შექმნა Gauge
app. Gauge = uigauge (app. TempSettingsTab, 'წრიული'); 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;
შექმნა SavingsTab
app. SavingsTab = uitab (app. TabGroup); app. SavingsTab. Title = 'შემნახველი';
შექმნა UIAxes
app. UIAxes = uiaxes (app. SavingsTab); title (app. UIAxes, 'Savings') xlabel (app. UIAxes, 'თვე და წელი') 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];
% CreateMonthCostEditFieldLabel
app. ThisMonthCostEditFieldLabel = uilabel (app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'ცენტრი'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'ამ თვის ღირებულება';
% CreateMonthCostEditField
app. ThisMonthCostEditField = uieditfield (app. SavingsTab, 'რიცხვითი'); app. ThisMonthCostEditField. Limits = [0 ინფ]; app. ThisMonthCostEditField. ValueDisplayFormat = '$%7.2f'; app. ThisMonthCostEditField. HorizontalAlignment = 'ცენტრი'; app. ThisMonthCostEditField. Position = [417 39 137 58];
შექმენით TotalSavingsEditFieldLabel
app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'მარჯვნივ'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'მთლიანი დანაზოგი';
შექმენით TotalSavingsEditField
app. TotalSavingsEditField = uieditfield (app. SavingsTab, 'რიცხვითი'); app. TotalSavingsEditField. Limits = [0 ინფ]; app. TotalSavingsEditField. ValueDisplayFormat = '$%9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'ცენტრი'; app. TotalSavingsEditField. Position = [88 39 137 58]; დასასრული დასასრული
მეთოდები (წვდომა = საჯარო)
% ააშენე აპლიკაცია
ფუნქციის აპლიკაცია = Control_1
კომპონენტების შექმნა და კონფიგურაცია
კომპონენტების შექმნა (აპლიკაცია)
რეგისტრაცია app ერთად App დიზაინერი
registerApp (აპლიკაცია, აპლიკაცია. UIFigure)
თუ ნარგუტი == 0
სუფთა პროგრამის დასასრული
% კოდი, რომელიც მუშაობს პროგრამის წაშლამდე
ფუნქციის წაშლა (აპლიკაცია)
% წაშლა UIFigure როდესაც აპლიკაცია წაიშლება
წაშლა (app. UIFigure) დასასრული დასასრული დასასრული
თქვენ ალბათ მიიღებთ შეცდომას, რაც არ არის პრობლემა. უბრალოდ დახურეთ GUI, რომელიც შეიქმნა მას შემდეგ, რაც თქვენ დააწკაპუნეთ გაშვებაზე, ჩვენ ერთ მომენტში შევაგროვებთ დანარჩენ საჭირო პროგრამებსა და მონაცემებს.
მას შემდეგ, რაც Matlab შეიქმნა, ჩვენ შეგვიძლია გადავიდეთ პითონზე. პირველი, გაუშვით პითონის პროგრამა თქვენი ბრძანების სტრიქონიდან (Windows- ში) ან.exe ფაილის გამოყენებით თქვენს პითონის საქაღალდეში. დარწმუნდით, რომ ყველა შესაბამისი ბიბლიოთეკა დაინსტალირებულია იმპორტის ბრძანების გამოყენებით.
სერიული იმპორტი
იმპორტის დრო იმპორტი csv
ეს არის სამი ბიბლიოთეკა, რომელიც დაგჭირდებათ დასაწყებად, თუმცა ჩვენ მალე შევქმნით საკუთარ ბიბლიოთეკას. თუ ამ ბრძანებებში იყო რაიმე სახის შეცდომა, დაბრუნდით და დარწმუნდით, რომ ბიბლიოთეკები დაინსტალირებულია და არის Lib საქაღალდეში პითონის საქაღალდეში. შემდეგი ჩვენ შევქმნით იმას, რასაც მე ვუწოდებ pythonlogger ბიბლიოთეკას. ეს სახელი არ არის აუცილებელი, შეგიძლიათ დაარქვათ ის, რაც გსურთ, ეს მხოლოდ პითონის ფაილის სახელია (.py), რომელსაც თქვენ ქმნით.
გახსენით ტექსტური რედაქტორი, მე ვიყენებ Sublime3– ს, მაგრამ რვეული კარგად მუშაობს და შეიყვანეთ ეს კოდი.
def pythonprint ():
იმპორტი pythonlogger იმპორტი სერიული იმპორტი დრო იმპორტი csv ser = serial. სერიული ('COM8') # COM8 არის arduino სერიული პორტი, ეს სავარაუდოდ განსხვავებული იქნება თითოეული მომხმარებლისთვის, ანუ შეამოწმეთ თქვენი სერიული პორტი arduino IDE ser.flushInput () ხოლო მართალია: სცადეთ: ser_bytes = ser.readline () ბეჭდვა (ser_bytes) ღია ("test_data.csv", "a") როგორც f: writer = csv.writer (f, delimiter = ",") # ადგენს მონაცემებს ჩაწერეთ მძიმით გამოყოფილი მწერალი.writerow ([time.time (), ser_bytes]) #ჩაწერს მონაცემებს test_data.csv გარდა: print ("Error Occident") შესვენების
შეინახეთ ტექსტი როგორც "ჩაწერეთ ბიბლიოთეკის სახელი".py Lib საქაღალდეში. ასევე გაითვალისწინეთ, რომ def pythonprint () ხაზი განსაზღვრავს იმ ფუნქციის სახელს, რომლის დარეკვასაც აპირებთ, ასე რომ თქვენ შეგიძლიათ შეცვალოთ ის def "ჩასვით სახელი, რომელიც გსურთ თქვენი ფუნქციისთვის" (). ბიბლიოთეკის შენახვისას შეგვიძლია გადავიდეთ არდუინოს კოდზე.
გახსენით arduino IDE და გახსენით ორი ახალი ესკიზის ფანჯარა. შეინახეთ ეს ორი ესკიზის ფაილი სადმე მოსახერხებელ ადგილას, ამ ფაილების სახელს მნიშვნელობა არ აქვს. შემდეგ წაშალეთ ყველა ნაგულისხმევი კოდი და შეცვალეთ იგი შემდეგით.
მიმღები არდუინოსთვის:
#ჩართეთ
#მოიცავს #მოიცავს #მოიცავს // ეს არ გამოიყენება, მაგრამ საჭიროა RH_ASK დრაივერის შესადგენად; struct dataStruct {float temp; } myData; void setup () {Serial.begin (9600); // გამართვა მხოლოდ იმ შემთხვევაში, თუ (! Driver.init ()) Serial.println ("init ვერ მოხერხდა"); } void loop () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = ზომა (buf); if (driver.recv (buf, & buflen)) // არაბლოკირება {int i; // შეტყობინება მიღებული კარგი შემოწმებით, გადაყარეთ იგი. //driver.printBuffer("Got: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serial.print (myData.temp); }}
პ.ს. // მძღოლი. ბეჭდვა ბუფერი …… ა.შ. ხაზი არის სატესტო კოდი. არ უნდა ინერვიულოთ, სანამ არ აკეთებთ დიაგნოზს და არ გსურთ გაარკვიოთ, ნამდვილად იღებთ თუ არა მონაცემებს.
გადამცემი არდუინოსთვის
#ჩართეთ
#ჩართეთ #ჩართეთ #ჩართეთ // ეს არ გამოიყენება, მაგრამ საჭიროა შედგენისთვის #include #include int pin = 4; DHT11 dht11 (პინი); RH_ASK მძღოლი; struct dataStruct {float temp; } myData; ბაიტი tx_buf [sizeof (myData)] = {0}; // ასე რომ, არგუმენტები არის ბიტრეიტი, გადასცემს pin (tx), // იღებს pin (rx), ppt pin, isInverse. ბოლო 2 არ არის გამოყენებული. მოხსნა კონფიგურაცია () {Serial.begin (9600); // გამართვა მხოლოდ იმ შემთხვევაში, თუ (! Driver.init ()) Serial.println ("init ვერ მოხერხდა"); } 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)); ბაიტი zize = sizeof (myData); {Serial.println (myData.temp); driver.send ((uint8_t *) tx_buf, zize); driver.waitPacketSent (); // შეაჩეროს შესრულება მანამ, სანამ ყველა მონაცემი არ გაიგზავნება დაგვიანებით (2000); // დაელოდე 2 წამი}}
ჩართვის ბრძანებები საკმარისი უნდა იყოს, მაგრამ თუ მონაცემთა გადაცემასთან დაკავშირებით რაიმე პრობლემა შეგექმნებათ, შეიძლება დაგჭირდეთ RadioHead ბიბლიოთეკის საქაღალდეში გადახედვა და ფაილის სახელების დარჩენილი ნაწილის შეტანა იმავე ფორმატში.
ნაბიჯი 5: გახადე მუშაობა
ახლა, როდესაც ჩვენ გვაქვს ყველა კოდი ერთად და arduino არის აწყობილი, ჩვენ შეგვიძლია დავუკავშიროთ arduino თქვენს კომპიუტერს და ჩავტვირთოთ კოდი. დარწმუნდით, რომ თქვენ უგზავნით სწორ კოდს მიმღებ და გადამცემ მიკროკონტროლებს. თქვენ შეგიძლიათ ჩართოთ ორივე არდუინო თქვენს კომპიუტერთან მუშაობის დროს, მაგრამ თქვენ უნდა დარწმუნდეთ, რომ სწორი პორტი არჩეული გაქვთ წინ, ან შეგიძლიათ გათიშოთ გადამცემი არდუინო და ჩართოთ იგი სხვა წყაროდან კოდის მიღების შემდეგ აიტვირთა.
საუბრისას, თქვენ უნდა აირჩიოთ პორტი, რომელიც დაკავშირებულია თქვენს მიმღებ arduino– სთან IDE ინსტრუმენტების მენიუდან და გაუშვით პითონი.
არ გახსნათ სერიული მონიტორი სანამ ამას აკეთებთ, პითონი ვერ კითხულობს სერიალს სანამ მონიტორი ღიაა. როდესაც პითონი ღიაა, დარეკეთ პითონპრინტის ფუნქცია შემდეგნაირად.
pythonlogger.pythonprint ()
ეს დაიწყებს მონაცემთა შეგროვებას arduino სერიული პორტიდან. თუ ახლა გახსნით თქვენს პითონის საქაღალდეს, დაინახავთ, რომ შეიქმნა ახალი.csv ფაილი სახელწოდებით "test_data.csv", რომელიც შეიცავს ყველა დროის და ტემპერატურის ინფორმაციას. ეს იქნება ფაილი, რომელსაც Matlab წვდომა აქვს თავისი ყველა გამოთვლისა და კონტროლის შესასრულებლად.
კიდევ ერთი გაფრთხილება: არ გახსნათ test_data.csv სანამ მონაცემები წვდება ან იწერება. თუ ასეა, პითონი და/ან Matlab კოდი დაიშლება და უკან გამოაგზავნის შეცდომას
თუ თქვენ გადაწყვეტთ.csv მოგვიანებით გახსნას, შეამჩნევთ, რომ დროის სვეტი არის რიცხვების ძალიან დიდი სტრიქონი. ეს იმიტომ ხდება, რომ time.time () ბრძანება წერს წამების რაოდენობას 1970 წლის 1 იანვრიდან.
ამ დროს პითონი უნდა დაბეჭდოს ტემპერატურის მონაცემები, რომელსაც კითხულობს სერიული პორტიდან. გარეგნულად უნდა გამოიყურებოდეს:
b'25.03 '/რ/ნ
არ ინერვიულოთ ზედმეტი სიმბოლოების გამო. Matlab კოდი ინდექსირებს.csv ფაილის მეორე სვეტში საშუალო ხუთ მნიშვნელობას.
ახლა, როდესაც ყველა დამხმარე პროგრამა მუშაობს და მონაცემები გროვდება, ჩვენ შეგვიძლია დავიწყოთ GPS მონაცემების შეგროვება Matlab მობილური პროგრამიდან, რომელიც ადრე იყო დაყენებული და გაუშვით Matlab GUI კოდი. მას შემდეგ რაც შეხვალთ Matlab მობილური ტელეფონის სენსორების ჩანართში, აირჩიეთ GPS და დააჭირეთ დაწყების ღილაკს.
თუ თქვენ ახალი ხართ Matlab– ის მობილურზე, დაუბრუნდით მე –4 ნაბიჯს და გადახედეთ ეკრანის სურათებს ზემოთ. თუ თქვენ ჯერ კიდევ გაქვთ პრობლემები, დარწმუნდით, რომ დაკავშირებული ხართ ადრე შერჩეულ კომპიუტერთან (პარამეტრების ჩანართში) და გამოიყენეთ ბმული "კონექტორი ჩართული" ბრძანებიდან, რომ შეამოწმოთ Matlab არის ონლაინ რეჟიმში.
ნაბიჯი 6: პროგრამის გამოყენება
ამ სისტემაში ბევრი რამ ხდება ფონზე. ტემპერატურის მონაცემები გროვდება და იწერება arduino და pyton– ით, Matlab აგროვებს GPS მონაცემებს თქვენი ტელეფონიდან და აწარმოებს გამოთვლებს იმის დასადგენად, თუ რამდენად შორს ხართ თქვენი სახლიდან და ადგენს თქვენს თერმოსტატს ამ ინფორმაციის საფუძველზე. სადაც მოდიხართ, აძლევთ თქვენს პრეფერენციებს.
გაუშვით Matlab GUI კოდი. გახსენით.mlapp ფაილი და გადახედეთ პირველ ჩანართს. თქვენ თვითონ უნდა შეაგროვოთ ინფორმაცია ამის შესახებ, თქვენი გათბობის/გაგრილების ერთეულის ეფექტურობა და სიმძლავრე, როგორც წესი, შეგიძლიათ იხილოთ თავად მოწყობილობაზე და თქვენი საშუალო სიჩქარე მხოლოდ კარგი შეფასებაა იმისა, თუ რამდენად სწრაფად მართავთ მანქანას. მნიშვნელობების შეყვანის შემდეგ დააჭირეთ ღილაკს "გაუშვით დიაგნოსტიკა" და პროგრამა აკონტროლებს თქვენს თერმოსტატს თქვენი სახლის შესახებ ინფორმაციის შეგროვების მიზნით.
გადადით შემდეგ მენიუში.
ნაბიჯი 7: ტემპერატურის კონტროლი
ეს მენიუ საშუალებას გაძლევთ აირჩიოთ თქვენთვის სასურველი ტემპერატურა სახლში და შორს ყოფნისას. დააყენეთ ტემპერატურა #1 თქვენს კომფორტულ ტემპერატურაზე, ხოლო ტემპერატურა #2 მაღალ ან დაბალ მნიშვნელობაზე, რომელიც უსაფრთხოა თქვენი სახლისთვის (დარწმუნდით, რომ არ დააყენებთ მას 100 გრადუსზე, სანამ ძაღლები გყავთ სახლში და ა.შ.).
ნაბიჯი 8: ისტორიული მონაცემები
დაბოლოს, თქვენ შეგიძლიათ ნახოთ რამდენ ფულს დაზოგავთ ავტომატური კონტროლის გამოყენებით. ეს არსებითად აფასებს რამდენ ენერგიას გამოიყენებდა, თუ თქვენი თერმოსტატი თქვენს სასურველ ტემპერატურაზე დაყენდებოდა 24/7, შემდეგ გამოაკლებდა თქვენს რეალურ გამოყენებულ ენერგიას.
წარმატებებს გისურვებთ მშენებლობაში.
გირჩევთ:
გააკეთეთ თქვენი საკუთარი გათბობის თერმოსტატი და დაზოგეთ გათბობით: 53 ნაბიჯი (სურათებით)
გააკეთეთ თქვენი საკუთარი გათბობის თერმოსტატი და დაზოგეთ გათბობით: რა არის მიზანი? გაზარდეთ კომფორტი თქვენი სახლის გათბობით ზუსტად ისე, როგორც გსურთ, დაზოგეთ და შეამცირეთ სათბურის გაზების ემისია თქვენი სახლის გათბობით მხოლოდ მაშინ, როდესაც ეს გჭირდებათ, გააკონტროლეთ თქვენი გათბობა სადაც არ უნდა იყოთ ამაყობთ, რომ ეს გააკეთეთ
ტელევიზია დისტანციური ხდება RF დისტანციური -- NRF24L01+ გაკვეთილი: 5 ნაბიჯი (სურათებით)
ტელევიზია დისტანციური ხდება RF დისტანციური || NRF24L01+ სახელმძღვანელო: ამ პროექტში მე გაჩვენებთ, თუ როგორ გამოვიყენე პოპულარული nRF24L01+ RF IC ტელევიზორის დისტანციური მართვის სამი უსარგებლო ღილაკის უკაბელოდ LED ზოლის სიკაშკაშის შესაცვლელად. Დავიწყოთ
სმარტ თერმოსტატი ESP8266: 6 ნაბიჯი (სურათებით)
ჭკვიანი თერმოსტატი ESP8266: Bienvenue sur ce nouvel სტატია. On se retrouve aujourd'hui pour un projet que j'ai réalisé durant tout ce temps libre que m'a offert le confinement. ეს არის პროგნოზირება, რომელიც ემსახურება ერთ დროს, როდესაც თქვენ იყენებთ déménager dans une vieille maison et l
Olympus Evolt E510 დისტანციური კაბელის გამოშვება (ვერსია 2 დისტანციური ავტოფოკუსით): 6 ნაბიჯი (სურათებით)
Olympus Evolt E510 დისტანციური კაბელის გამოშვება (ვერსია 2 ავტომატური დისტანციური მართვის საშუალებით): გუშინ მე ავაშენე მარტივი ერთი ღილაკიანი დისტანციური მართვა ჩემი Olympus E510– ისთვის. კამერების უმეტესობას აქვს ჩამკეტის გამოშვების ღილაკი (ის, რომელსაც თქვენ უბიძგებთ სურათის გადასაღებად), რომელსაც აქვს ორი რეჟიმი. თუ ღილაკი ნაზად არის დაჭერილი, კამერა ავტომატურად ფოკუსირდება და გაზომავს შუქს
დისტანციური დისტანციური მართვა: 11 ნაბიჯი (სურათებით)
დისტანციური მართვა: მე მყავს ახალშობილი ბავშვი და ის არ ფიქრობს, რომ მან უნდა დაიძინოს მანამ, სანამ მე და ჩემმა ცოლმა მასაც ვუსურვოთ. ერთი რამ, რაც მას ბედნიერს ხდის თავის საწოლში არის მობილური, რომელიც მის თავზეა ჩამოკიდებული. ასე რომ, როდესაც ის გაიღვიძებს, თუ ჩვენ გვჭირდება კიდევ 25 წუთი ან მეტი