Mundarija:
- 1 -qadam: Hammasini bir joyga to'plash
- 2 -qadam: qabul qiluvchi
- 3 -qadam: uzatuvchi
- 4 -qadam: Kod
- 5 -qadam: uni ishga tushirish
- 6 -qadam: Dasturdan foydalanish
- 7 -qadam: haroratni nazorat qilish
- 8 -qadam: Tarixiy ma'lumotlar
Video: Avtostat: masofali termostat: 8 qadam (rasmlar bilan)
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:26
Siz so'rayotgan savol: "nega siz boshqa masofali termostatni qilyapsiz?"
Bu savolga javob berish kerak edi va bozorning aqlli termostatlari juda qimmat.
Adolatli ogohlantirish, bu "kontseptsiyaning isboti", bu sizning termostatni nazorat qilish uchun bir nechta qo'shimcha chiqimlarni talab qiladi, lekin yadro o'z joyida va sizning holatingizga qarab o'zgartirilishi mumkin. Bundan tashqari, bu hali ham davom etayotgan ish, shuning uchun bir nechta yangilanishlar va o'zgarishlarni kuting (ayniqsa Matlab kodiga)
Ishni boshlash uchun men sizni ogohlantirmoqchiman, buning uchun uchta dastur kerak (ulardan bittasi juda qimmat), juda ko'p kutubxonalar va dasturlarni qo'llab -quvvatlash paketlari, va siz ularni bir -biri bilan gaplashishingiz kerak. Bu bosh og'rig'i. Ushbu ogohlantirish bilan, materiallardan boshlaylik.
Uskuna
- arduino nano
- arduino uno (yoki boshqa nano, men uno -ni ishlatardim, chunki menda yotar edi)
- turli xil o'tish kabellari, ba'zi erkak/erkak va ikkita birlashtirilgan erkak/ayol o'tish moslamasining ikkita to'plami
- 433 MGts chastotali radio chastotali (RF) qabul qilgich, men MX-05V dan foydalanardim
- 433 MGts chastotali RF uzatuvchi, men MX-FS-03V dan foydalanardim
- DHT11 yuqori aniqlikdagi termometr va namlik sensori (men foydalangan uchburchakli chipga o'rnatilgan, kerakli rezistorlar o'rnatilgan)
- non paneli (agar siz bularning barchasini lehimlashni xohlamasangiz)
- GPS bilan telefon (bu holda iPhone 8, lekin men ham Galaxy S8 dan foydalanganman)
- 3D bosilgan konteyner (kerak emas, har qanday konteyner ishlaydi yoki umuman yo'q)
Dasturiy ta'minot
- MathWorks-dan Matlab (menda 2018a nashri bor, lekin men 2017a-b nashrlarini ham ishlatganman)
- Telefoningizga Matlab mobile o'rnatilgan
- Matlab uchun arduino qo'llab -quvvatlash to'plami
- Matlab uchun iPhone sensor to'plami
- arduino IDE
- RadioHead arduino IDE to'plamlari va kutubxonalarini qo'llab -quvvatlaydi
- Arduino IDE uchun DHT11 kutubxonasi
- python 3.7 (pyserial kutubxonasi yoki ketma -ket kutubxona o'rnatilganligiga ishonch hosil qiling, u 3.4 yoki undan keyingi versiya uchun bo'lishi kerak)
1 -qadam: Hammasini bir joyga to'plash
Birinchidan, men sizning qismlaringiz ishlayotgani va simlarning to'g'ri ekanligiga ishonch hosil qilish uchun RF transmitterlari bilan shug'ullanadigan bir nechta arduino darslarini bajarishni taklif qilaman. Kod mavjud bo'lgan ko'plab misollar mavjud (C va C ++ haqida deyarli hech narsa bilmaydiganlar uchun).
Arduino va datchiklarni yig'ish uchun quyidagi ulanish sxemalariga amal qiling. Arduinolarni ulashda yodda tutish kerak bo'lgan narsa shundaki, men foydalangan ma'lumotlar portlari talab qilinmaydi, lekin tavsiya etiladi.
Agar siz foydalanadigan ma'lumotlar portlarini o'zgartirishga qaror qilsangiz, kodingizdagi pinlarni aniqlashingiz kifoya. Shaxsan menimcha, arduino kutubxonalari tan oladigan standart portlarga rioya qilish osonroq.
Va aniq bo'lish uchun, nano va uno bir -birining o'rnini bosadi, lekin men harorat monitorining hajmini kamaytirish uchun loyihaning uzatuvchi tomoni uchun nanodan foydalandim.
Yon eslatma: nanoni ushlab turgan yashil kontrast 3D bosilgan konteynerdir.
2 -qadam: qabul qiluvchi
3 -qadam: uzatuvchi
4 -qadam: Kod
Ulanish tugagandan so'ng, siz barcha dasturlarni ishga tushirishingiz va kutubxonalarni o'rnatishingiz kerak (agar siz hali o'rnatmagan bo'lsangiz), menimcha, sizda Matlabni ishga tushirish va iPhone qo'llab -quvvatlash paketini ishga tushirish kerak. Bu vaqtda telefoningiz ham, Matlab ham bitta wifi tarmog'ida bo'lishi kerak.
Matlab buyruqlar oynasida yozing:
ulagich yoqilgan
Bu sizga iPhone -ga ulanish uchun ishlatiladigan besh xonali parolni kiritishni taklif qiladi. Parolni eslaganingizga ishonch hosil qiling. Parolni kiritganingizda Matlab ba'zi ma'lumotlarni, shu jumladan sizning IP manzilingizni ko'rsatadi. Buni Matlab mobile -dagi "Sensorlarni ishga tushirish" yordam menyusidagi ko'rsatmalardan keladigan keyingi bosqichda qo'llang.
- Sensor ma'lumotlarini MathWorks Cloud yoki kompyuterga yuborish uchun quyidagi amallarni bajaring.
- Agar siz sensorli ma'lumotlarni kompyuterga yuborsangiz va u hali o'rnatilmagan bo'lsa, MATLAB -da Apple iOS sensorlari uchun MATLAB qo'llab -quvvatlash paketini yuklab oling va o'rnating.
- Sozlamalar yordamida MATLAB Mobile -ni MathWorks Cloud yoki kompyuterga ulang.
- MATLAB -da (kompyuteringizda) mobiledev ob'ektini yarating, masalan: >> m = mobiledev
- Bir yoki bir nechta sensorni tanlang va "Ishga tushirish" ga teging.
Sensor ma'lumotlarini qurilmangizda mahalliy qayd qilish uchun quyidagi amallarni bajaring:
- Sensorlar ekranida ma'lumotlarni yig'moqchi bo'lgan sensorlarni tanlang.
- Jurnal -ni tanlang.
- Boshlash tugmasini bosing.
- Ma'lumot yig'ish tugagach, To'xtatish tugmasini bosing.
- Ochilgan oynada sensorlar jurnalining nomini kiriting.
- Agar kerak bo'lsa, 1-5 bosqichlarni takrorlang.
Bu bo'lim 4 -qismda ko'rib chiqiladi, shuning uchun hozircha ma'lumotlarni yig'ishni boshlashning hojati yo'q. Telefonni qo'lda ushlab turing va Matlab mobil telefonini tayyor turing.
Endi siz Matlab kod fayllarini saqlash uchun kompyuterning biron bir joyida papka yaratishingiz kerak. Sizda to'rtta alohida fayl bo'ladi, ikkitasi fon funktsiyalari uchun (.m fayllar) va GUI (.mlapp) uchun bitta Matlab kodli fayl.
Birinchidan, sizning uyingizdagi havo uchun massa hisobi (bu Matlabga uyingizni isitish/sovutish uchun qancha vaqt kerakligini bilish imkonini beradi)
funktsiya [Mass] = CalcMass (T_ins, P_out, Chng_dir)
runCalc = 0; Tmp_start = T_ins; time_start = soat; time_end = 0 runCalc <= 1 bo'lsa T_ins == (Tmp_start+(7*Chng_dir)) time_end = soat; PwrCntr = 0; runCalc = 0; boshqa PwrCntr = P_out; runCalc = runCalc+0.1 tugash vaqti_diag = time_end-time_start Mass = (P_out*time_diag) /7.035
Va ikkinchisi:
funktsiya [vaqt belgilari, pwr_usage] = dist_cntrl (Lat_in, Lon_in, P_out, r_pref, tezlik, T_pref, massa)
AutoStat = 1; i = 1; AutoStat == 1 time_start = soat; m = mobiledev; t = csvread ('qadriyatlar.csv', 0, 1); t = t (i); vaqt belgilari = [0, 0, 0, 0, 0, 0]; pwr_usage = 0; i = i+1; longg formati; Kenglik va %longintude a_hav = (sind ((m. Latitude-Lat_in)./ 2)) ga asoslangan masofani hisoblash uchun %haversine formulasi. (m. Uzunlik-Lon_in)./ 2)).^2; c_hav = 2.*atan2d (sqrt (a_hav), sqrt (1-a_hav)); d_hav = 6371.*c_hav; Dist = d_hav.*1000; %sizning vaqtingizni taxmin qiladi time_rtn = (Dist-r_pref)./ tezlik; %uy konditsioneri va havo massasining %quvvatsizlanishiga qarab kerakli termostatni sozlashni hisoblab chiqadi. calcTmp_set = ((-1.*P_out.*time_rtn)./ (massa.*(1.005)))+T_pref; %dumaloq (calcTmp_set) ~ = round (t) timeACon = soat bo'lsa, joriy termostatni sozlamalarini o'zgartirish kerakligini aniqlaydi; PwrCntr = P_out; timeACon = timeACon + clock-time_start; xarajat = P_out*timeACon*stavkasi; else PwrCntr = 0 tugash vaqt tamg'asi (oxiri+1, [1: 6]) = soat; pwr_usage (oxiri+1, 1) = PwrCntr; pauza (5) oxiri oxiri
Bu ikkala fayl ham Matlab funktsiyalari. Agar siz ularni maxsus ehtiyojlar uchun o'zgartirishni rejalashtirmasangiz, ularga kirishingiz shart emas, chunki siz ularni GUIdan chaqirasiz. Ikkala faylni ham alohida saqlang, birinchisi CalcMass.m, ikkinchisi dist_cntrl.m, bu GUI kodi funktsiyalarni chaqirish uchun foydalanadigan ismlar, shuning uchun agar siz quyidagi kodning qolgan qismini tahrir qilmoqchi bo'lmasangiz. nomlash qoidasi.
GUI kodiga kirishdan oldin, siz Matlab uchun dasturlar konstruktorini ochishingiz kerak, uni Matlab menyu satrida yoki Matlab buyruqlar oynasida quyidagi buyruqni kirgizish orqali ochish mumkin:
dasturchi
Ilova dizayneri ochilgandan so'ng, yangi dastur faylini (.mlapp) oching va kod oynasidan barcha standart kodni o'chirib tashlang. Keyin hammasini quyidagilar bilan almashtiring va ishga tushirish tugmasini bosing.
classdef Control_1 <matlab.apps. AppBase % App komponentalari xususiyatlariga mos keladigan xususiyatlar (Access = public) UIFigure matlab.ui. Figure TabGroup matlab.ui.container. TabGroup SetupTab matlab.ui.container. Tab RunDiagnosticButton matlab.ui.control. Tugma 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 TemperDirectionSwitchLabel matlab.ui.control. Label TemperatureDirectionSwitch ui.control. Spinner harorati2SpinnerLabel matlab.ui.cont rol. Label harorati Matib.ui.container. Tab UIAxes Matlab.ui.control. Label ThisMonthCostEditField matlab.ui.control. NumericEditField TotalSavingsField. Faydlari.
usullar (kirish = shaxsiy)
% O'zgartirilgan funktsiya: vaqt
tempnowValueChanged funktsiyasi (ilova, hodisa) temp = app.tempnow. Value; temp = randi ([60, 90], 1, 50) app. Gauge. Value = 0 for i = length (temp) app. Gauge. Value = temp (i) pauza (1) oxiri
% Qiymat o'zgargan funksiya: TemperatureDirectionSwitch
funktsiya TemperatureDirectionSwitchValueChanged (app, event) way = app. TemperatureDirectionSwitch. Value; way = uint8 (way) way = length (way) if way == 4 Chng_dir = -1; boshqa Chng_dir = 1; tugatish Chng_dir; oxiri
% Qiymat o'zgargan funksiya: DDFH
funktsiya DDFHValueChanged (ilova, hodisa) r_pref = app. DDFH. Value; oxiri
% Qiymat o'zgargan funksiya: AvgLocalSpeedEditField
funktsiya AvgLocalSpeedEditFieldValueChanged (ilova, hodisa) tezlik = app. AvgLocalSpeedEditField. Value; oxiri
% Qiymat o'zgargan funktsiya: PowerOutputRatingEditField
PowerOutputRatingEditFieldValueChanged funktsiyasi (ilova, hodisa) qiymati = app. PowerOutputRatingEditField. Value; oxiri
% Qiymat o'zgargan funksiya: EnergyEfficiencyRatingEditField
funktsiyasi EnergyEfficiencyRatingEditFieldValueChanged (app, event) value = app. EnergyEfficiencyRatingEditField. Value; oxiri
% Tugma bosilgan funksiya: RunDiagnosticButton
RunDiagnosticButtonPushed funktsiyasi (ilova, hodisa) usuli = app. TemperatureDirectionSwitch. Value; way = uint8 (way) way = length (way) if way == 4 Chng_dir = -1; boshqa Chng_dir = 1; end T_ins = app.tempnow. Value P_out = app. PowerOutputRatingEditField. Value CalcMass1 (T_ins, P_out, Chng_dir)
oxiri
% Qiymat o'zgargan funksiya: Harorat1Spinner
funktsiya Temperature1SpinnerValueChanged (ilova, hodisa) qiymati = app. Temperature1Spinner. Value; oxiri
% Qiymat o'zgargan funksiya: Temperature2Spinner
funktsiya Temperature2SpinnerValueChanged (ilova, hodisa) qiymati = app. Temperature2Spinner. Value; oxiri
% Qiymat o'zgargan funksiya: almashtirish
SwitchValueChanged funktsiyasi (ilova, hodisa) m = mobiledev; Lat_in = m. Latitude Lon_in = m. L uzunlik P_out = 0; r_pref = app. DDFH. Value; T_pref = app. Temperature1Spinner. Value; tezlik = m Tezlik; massa = 200; tezlik = app. AvgLocalSpeedEditField. Value; Auto_Stat = app. Switch. Value; dist_cntrl (Lat_in, Lon_in, P_out, r_pref, T_pref, tezlik, massa) oxiri
% Ilovani ishga tushirish va qurish
usullar (kirish = shaxsiy)
% UIFigure va komponentlarini yarating
createComponents funksiyasi (ilova)
% UIFigure yaratish
app. UIFigure = uifigure; app. UIFigure. Position = [100 100 640 480]; app. UIFigure. Name = 'UI rasm';
% TabGroup yaratish
app. TabGroup = uitabgroup (app. UIFigure); app. TabGroup. Position = [1 1 640 480];
% SetupTab yaratish
app. SetupTab = uitab (app. TabGroup); app. SetupTab. Title = 'O'rnatish';
% RunDiagnosticButton yarating
app. RunDiagnosticButton = uibutton (app. SetupTab, 'push'); app. RunDiagnosticButton. ButtonPushedFcn = createCallbackFcn (ilova, @RunDiagnosticButtonPushed, rost); app. RunDiagnosticButton. FontWeight = 'qalin'; app. RunDiagnosticButton. Position = [465 78 103 23]; app. RunDiagnosticButton. Text = 'Diagnostikani ishga tushirish';
% EnergyEfficiencyRatingEditFieldLabel yaratish
app. EnergyEfficiencyRatingEditFieldLabel = uilabel (app. SetupTab); app. EnergyEfficiencyRatingEditFieldLabel. HorizontalAlignment = 'o'ng'; app. EnergyEfficiencyRatingEditFieldLabel. Position = [8 425 135 22]; app. EnergyEfficiencyRatingEditFieldLabel. Text = 'Energiya samaradorligi reytingi';
% EnergyEfficiencyRatingEditField yaratish
app. EnergyEfficiencyRatingEditField = uieditfield (app. SetupTab, 'raqamli'); app. EnergyEfficiencyRatingEditField. Limits = [0 100]; app. EnergyEfficiencyRatingEditField. ValueChangedFcn = createCallbackFcn (app, @EnergyEfficiencyRatingEditFieldValueChanged, rost); app. EnergyEfficiencyRatingEditField. HorizontalAlignment = 'markaz'; app. EnergyEfficiencyRatingEditField. Position = [158 425 100 22];
% PowerOutputRatingEditFieldLabel yaratish
app. PowerOutputRatingEditFieldLabel = uilabel (app. SetupTab); app. PowerOutputRatingEditFieldLabel. HorizontalAlignment = 'o'ng'; app. PowerOutputRatingEditFieldLabel. Position = [18 328 118 22]; app. PowerOutputRatingEditFieldLabel. Text = 'Quvvat chiqishi reytingi';
% PowerOutputRatingEditField yarating
app. PowerOutputRatingEditField = uieditfield (app. SetupTab, 'raqamli'); app. PowerOutputRatingEditField. Limits = [0 Inf]; app. PowerOutputRatingEditField. ValueChangedFcn = createCallbackFcn (app, @PowerOutputRatingEditFieldValueChanged, rost); app. PowerOutputRatingEditField. HorizontalAlignment = 'markaz'; app. PowerOutputRatingEditField. Position = [151 328 100 22];
% AvgLocalSpeedEditFieldLabel yaratish
app. AvgLocalSpeedEditFieldLabel = uilabel (app. SetupTab); app. AvgLocalSpeedEditFieldLabel. HorizontalAlignment = 'o'ng'; app. AvgLocalSpeedEditFieldLabel. Position = [27 231 100 22]; app. AvgLocalSpeedEditFieldLabel. Text = 'O'rtacha. Mahalliy tezlik ';
% AvgLocalSpeedEditField yarating
app. AvgLocalSpeedEditField = uieditfield (app. SetupTab, 'raqamli'); app. AvgLocalSpeedEditField. Limits = [0 70]; app. AvgLocalSpeedEditField. ValueChangedFcn = createCallbackFcn (app, @AvgLocalSpeedEditFieldValueChanged, rost); app. AvgLocalSpeedEditField. HorizontalAlignment = 'markaz'; app. AvgLocalSpeedEditField. Position = [142 231 100 22];
% DesiredDistancefromHouseEditFieldLabel yaratish
app. DesiredDistancefromHouseEditFieldLabel = uilabel (app. SetupTab); app. DesiredDistancefromHouseEditFieldLabel. HorizontalAlignment = 'o'ng'; app. DesiredDistancefromHouseEditFieldLabel. Position = [24 129 100 28]; app. DesiredDistancefromHouseEditFieldLabel. Text = {'Kerakli masofa'; 'Uydan'};
% DDFH yaratish
app. DDFH = uieditfield (app. SetupTab, 'raqamli'); app. DDFH. Limits = [0 50]; app. DDFH. ValueChangedFcn = createCallbackFcn (ilova, @DDFHValueChanged, rost); app. DDFH. HorizontalAlignment = 'markaz'; app. DDFH. Pozitsiya = [139 135 100 22];
% TemperatureDirectionSwitchLabel yaratish
app. TemperatureDirectionSwitchLabel = uilabel (app. SetupTab); app. TemperatureDirectionSwitchLabel. HorizontalAlignment = 'markaz'; app. TemperatureDirectionSwitchLabel. Pozitsiya = [410 343 124 22]; app. TemperatureDirectionSwitchLabel. Text = 'Harorat yo'nalishi';
% TemperatureDirectionSwitch yaratish
app. TemperatureDirectionSwitch = uiswitch (app. SetupTab, 'slayder'); app. TemperatureDirectionSwitch. Items = {'Yuqoriga', 'Pastga'}; app. TemperatureDirectionSwitch. ValueChangedFcn = createCallbackFcn (app, @TemperatureDirectionSwitchValueChanged, rost); app. TemperatureDirectionSwitch. Position = [449 380 45 20]; app. TemperatureDirectionSwitch. Value = 'Yuqoriga';
TempSettingsTab yaratish
app. TempSettingsTab = uitab (app. TabGroup); app. TempSettingsTab. Title = 'Harorat. Sozlamalar ';
Haroratni yaratish 1SpinnerLabel
app. Temperature1SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature1SpinnerLabel. HorizontalAlignment = 'markaz'; app. Temperature1SpinnerLabel. Position = [66 363 76 28]; app. Temperature1SpinnerLabel. Text = {'Harorat'; '#1'};
Haroratni yaratish 1Spinner
app. Temperature1Spinner = uispinner (app. TempSettingsTab); app. Temperature1Spinner. Limits = [60 90]; app. Temperature1Spinner. ValueChangedFcn = createCallbackFcn (ilova, @Temperature1SpinnerValueChanged, rost); app. Temperature1Spinner. Pozitsiya = [157 346 100 68]; app. Temperature1Spinner. Value = 60;
% Temperatur2SpinnerLabel yaratish
app. Temperature2SpinnerLabel = uilabel (app. TempSettingsTab); app. Temperature2SpinnerLabel. HorizontalAlignment = 'markaz'; app. Temperature2SpinnerLabel. Pozitsiya = [66 248 76 28]; app. Temperature2SpinnerLabel. Text = {'Harorat'; '#2'};
% Temperatur2Spinner yaratish
app. Temperature2Spinner = uispinner (app. TempSettingsTab); app. Temperature2Spinner. Limits = [60 90]; app. Temperature2Spinner. ValueChangedFcn = createCallbackFcn (ilova, @Temperature2SpinnerValueChanged, rost); app. Temperature2Spinner. Pozitsiya = [157 230 100 70]; app. Temperature2Spinner. Value = 60;
% Kalit yaratish
app. Switch = uiswitch (app. TempSettingsTab, 'slayder'); app. Switch. Items = {'1', '0'}; app. Switch. ValueChangedFcn = createCallbackFcn (app, @SwitchValueChanged, rost); app. Switch. FontName = 'Nyala'; app. Switch. FontSize = 28; app. Switch. Position = [522 21 74 32]; app. Switch. Value = '0';
% EditFieldLabel yaratish
app. EditFieldLabel = uilabel (app. TempSettingsTab); app. EditFieldLabel. HorizontalAlignment = 'o'ng'; app. EditFieldLabel. Position = [374 291 25 22]; app. EditFieldLabel. Text = '';
% Vaqtinchalik vaqt yaratish
app.tempnow = uieditfield (app. TempSettingsTab, "raqamli"); app.tempnow. Limits = [60 89]; app.tempnow. ValueChangedFcn = createCallbackFcn (dastur, @tempnowValueChanged, rost); app.tempnow. HorizontalAlignment = 'markaz'; app.tempnow. FontSize = 26; app.tempnow. Position = [409 230 133 117]; app.tempnow. Value = 60;
GaugeLabel yaratish
app. GaugeLabel = uilabel (app. TempSettingsTab); app. GaugeLabel. HorizontalAlignment = 'markaz'; app. GaugeLabel. Position = [225 32 42 22]; app. GaugeLabel. Text = 'o'lchov';
O'lchagich yaratish
app. Gauge = uigauge (app. TempSettingsTab, 'aylana'); 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 yaratish
app. SavingsTab = uitab (app. TabGroup); app. SavingsTab. Title = 'tejash';
% UIAxes yarating
app. UIAxes = uiaxes (app. SavingsTab); title (app. UIAxes, 'tejash') xlabel (app. UIAxes, 'Oy va yil') ylabel (app. UIAxes, 'Pul') ilova. UIAxes. PlotBoxAspectRatio = [1 0.606666666666667 0.6066666666666667] app. UIAxes. Color = [0.9412 0.9412 0.9412]; app. UIAxes. Position = [146 219 348 237];
ThisMonthCostEditFieldLabel yaratish
app. ThisMonthCostEditFieldLabel = uilabel (app. SavingsTab); app. ThisMonthCostEditFieldLabel. HorizontalAlignment = 'markaz'; app. ThisMonthCostEditFieldLabel. Position = [439 96 94 22]; app. ThisMonthCostEditFieldLabel. Text = 'Bu oylik xarajat';
% ThisMonthCostEditField -ni yarating
app. ThisMonthCostEditField = uieditfield (app. SavingsTab, 'raqamli'); app. ThisMonthCostEditField. Limits = [0 Inf]; app. ThisMonthCostEditField. ValueDisplayFormat = '$%7.2f'; app. ThisMonthCostEditField. HorizontalAlignment = 'markaz'; app. ThisMonthCostEditField. Position = [417 39 137 58];
TotalSavingsEditFieldLabel yaratish
app. TotalSavingsEditFieldLabel = uilabel (app. SavingsTab); app. TotalSavingsEditFieldLabel. HorizontalAlignment = 'o'ng'; app. TotalSavingsEditFieldLabel. Position = [111 96 77 22]; app. TotalSavingsEditFieldLabel. Text = 'jami tejash';
TotalSavingsEditField yaratish
app. TotalSavingsEditField = uieditfield (app. SavingsTab, 'raqamli'); app. TotalSavingsEditField. Limits = [0 Inf]; app. TotalSavingsEditField. ValueDisplayFormat = '$%9.2f'; app. TotalSavingsEditField. HorizontalAlignment = 'markaz'; app. TotalSavingsEditField. Position = [88 39 137 58]; oxiri oxiri
usullar (kirish = ommaviy)
% Ilova tuzish
funktsiya ilovasi = Control_1
% Komponentlarni yaratish va sozlash
createComponents (ilova)
% App Designer -da ilovani ro'yxatdan o'tkazing
RegisterApp (ilova, ilova. UIF rasm)
agar nargout == 0 bo'lsa
ilovaning oxiri oxiri aniq
% Ilovani o'chirishdan oldin bajariladigan kod
funktsiyani o'chirish (dastur)
Ilova o'chirilganda % UIFigure -ni o'chirib tashlang
o'chirish (app. UIFigure) oxiri oxiri
Ehtimol sizda xato bo'ladi, bu muammo emas. Ishga tushirish tugmachasini bosgandan so'ng yaratilgan GUI -ni yoping, biz qolgan dasturlar va ma'lumotlarni bir zumda yig'amiz.
Matlab o'rnatilganligi sababli, biz pythonga o'tishimiz mumkin. Birinchidan, buyruq satridan (derazalarda) yoki python papkasidagi.exe faylini ishlatib, python dasturini ishga tushiring. Import buyrug'i yordamida barcha tegishli kutubxonalar o'rnatilganligiga ishonch hosil qiling.
serialni import qilish
import vaqti import csv
Bu uchta kutubxona, siz boshlashingiz kerak, lekin yaqinda biz o'z kutubxonamizni yaratamiz. Agar bu buyruqlar bilan qandaydir xato bo'lsa, orqaga qayting va kutubxonalar o'rnatilganligiga va python papkasidagi Lib papkasida ekanligiga ishonch hosil qiling. Keyin men pythonlogger kutubxonasi deb nomlangan narsani yaratamiz. Bu nom shart emas, siz xohlagan narsaga qo'ng'iroq qilishingiz mumkin, bu faqat siz yaratgan python faylining nomi (.py).
Matn muharririni oching, men Sublime3 dan foydalanaman, lekin bloknot yaxshi ishlaydi va bu kodni kiriting.
def pythonprint ():
import pythonlogger import ketma -ket import vaqti csv ser = serial. Serial ('COM8') # COM8 - bu arduino ketma -ket port, bu har bir foydalanuvchi uchun har xil bo'lishi mumkin, ya'ni ketma -ket portingizni arduino IDE ser.flushInput () da tekshiring. To'g'ri: harakat qilib ko'ring: ser_bytes = ser.readline () chop etish (ser_bytes) bilan ochiq ("test_data.csv", "a") f: yozuvchi = csv.writer (f, ajratuvchi = ",") # sifatida ma'lumotlarni o'rnatadi yozuvchi vergul bilan ajratiladi.
Matnni Lib papkasida "kerakli kutubxona nomini kiriting".py sifatida saqlang. Shuni ham yodda tutingki, def pythonprint () liniyasi siz qo'ng'iroq qilmoqchi bo'lgan funksiyaning nomini belgilaydi, shuning uchun siz uni "funktsiyangiz uchun kerakli ismni kiritish" () ga o'zgartirishingiz mumkin. Kutubxona saqlanganda biz arduino kodiga o'tamiz.
Arduino IDE -ni oching va ikkita yangi eskiz oynasini oching. Bu ikkita eskiz faylini qulay joyda saqlang, bu fayllarning nomi muhim emas. Keyin barcha standart kodni o'chirib tashlang va uni quyidagilar bilan almashtiring.
Qabul qiluvchi arduino uchun:
#qo'shing
#include #include #include // bu ishlatilmaydi, lekin RH_ASK drayverini kompilyatsiya qilish uchun kerak; struct dataStruct {float temp; } myData; void setup () {Serial.begin (9600); // Nosozliklarni tuzatish faqat (! Driver.init ()) Serial.println ("init muvaffaqiyatsiz") bo'lsa; } void loop () {uint8_t buf [RH_ASK_MAX_MESSAGE_LEN]; uint8_t buflen = sizeof (buf); if (driver.recv (buf, & buflen)) // bloklanmagan {int i; // Yaxshi nazorat summasi bo'lgan xabar qabul qilindi, uni tashlab yuboring. //driver.printBuffer("Got: ", buf, buflen); memcpy (& myData, buf, sizeof (myData)); Serial.println (""); Serial.print (myData.temp); }}
P. S. //driver.printBuffer …. etc qatori test kodidir. Agar siz tashxis qo'ymasangiz va siz haqiqatan ham ma'lumot olayotganingizni bilmoqchi bo'lsangiz, bu haqda tashvishlanishga hojat yo'q.
Arduino uzatuvchi uchun
#qo'shing
#include #include #include // bu ishlatilmaydi, lekin kompilyatsiya qilish uchun kerak #include #include int pin = 4; DHT11 dht11 (pin); RH_ASK haydovchi; struct dataStruct {float temp; } myData; bayt tx_buf [sizeof (myData)] = {0}; // Demak, dalillar bit tezligi, uzatish pin (tx), // qabul qilish pin (rx), ppt pin, isInverse. Oxirgi 2 ishlatilmaydi.void setup () {Serial.begin (9600); // Nosozliklarni tuzatish faqat (! Driver.init ()) Serial.println ("init muvaffaqiyatsiz") bo'lsa; } void loop () {int err; float temp, humi; uint8_t xabar; if ((err = dht11.read (humi, temp)) == 0) myData.temp = temp; memcpy (tx_buf, & myData, sizeof (myData)); bayt zize = sizeof (myData); {Serial.println (myData.temp); driver.send ((uint8_t *) tx_buf, zize); driver.waitPacketSent (); // barcha ma'lumotlar kechiktirilgunga qadar bajarishni to'xtatish (2000); // 2 soniya kuting}}
Qo'shish buyruqlari etarli bo'lishi kerak, lekin agar sizda keyinchalik ma'lumot uzatish bilan bog'liq muammolar bo'lsa, siz RadioHead kutubxonasi papkasida qidirishni va qolgan fayl nomlarini bir xil formatga kiritishni xohlashingiz mumkin.
5 -qadam: uni ishga tushirish
Endi bizda barcha kodlar bor va arduino yig'ilgan, biz arduino -ni kompyuteringizga ulashimiz va kodni yuklashimiz mumkin. To'g'ri kodni qabul qiluvchi va uzatuvchi mikrokontrollerlarga yuborganingizga ishonch hosil qiling. Siz ishlayotgan vaqtda siz ikkala arduinoni ham kompyuterga ulashingiz mumkin, lekin siz oldinga siljigan to'g'ri portni tanlaganingizga ishonch hosil qilishingiz kerak, yoki siz uzatuvchi arduino -ni uzib, kodni boshqa manbadan quvvatlantirishingiz mumkin. yuklangan.
Bu haqda gapirganda, siz IDE asboblar menyusidan qabul qiluvchi arduino bilan bog'langan portni tanlashingiz va pythonni ishga tushirishingiz kerak.
Buni qilayotganda ketma -ket monitorni ochmang, monitor ochilganda python serialni o'qiy olmaydi. Python ochilgach, pythonprint funktsiyasini quyidagicha chaqiring.
pythonlogger.pythonprint ()
Bu arduino ketma -ket portidan ma'lumotlarni yig'ishni boshlaydi. Agar siz hozirda python papkasini ochsangiz, "test_data.csv" deb nomlangan yangi.csv fayli yaratilganligini ko'rasiz, u vaqt va harorat haqidagi barcha ma'lumotlarni o'z ichiga oladi. Bu Matlab barcha hisob -kitoblar va boshqaruvlarni amalga oshirish uchun kiradigan fayl bo'ladi.
Yana bir ogohlantirish: ma'lumotlarga kirish yoki yozish paytida test_data.csv faylini ochmang. Agar shunday qilsangiz, python va/yoki Matlab kodi qulab tushadi va xatoni qaytaradi
Agar siz keyinroq.csv faylini ochishga qaror qilsangiz, vaqt ustunining juda katta sonlar qatorini ko'rasiz. Buning sababi, time.time () buyrug'i 1970 yil 1 yanvardan boshlab soniya sonini yozadi.
Bu vaqtda python ketma -ket portdan o'qiyotgan harorat ma'lumotlarini chop etishi kerak. Bu shunday bo'lishi kerak:
b'25.03 '/r/n
Qo'shimcha belgilar haqida tashvishlanmang, Matlab kodi.csv faylining ikkinchi ustunidagi o'rta beshta qiymat uchun indekslar.
Endi barcha qo'llab -quvvatlovchi dasturlar ishlayapti va ma'lumotlar yig'ilmoqda, biz ilgari o'rnatilgan Matlab mobil dasturidan GPS ma'lumotlarini yig'ishni boshlashimiz va Matlab GUI kodini ishga tushirishimiz mumkin. Matlab Mobile -ning sensorli yorlig'iga kirganingizdan so'ng, GPS -ni tanlang va ishga tushirish tugmasini bosing.
Agar siz Matlab mobile -da yangi bo'lsangiz, 4 -bosqichga qayting va yuqoridagi skrinshotlarga qarang. Agar siz hali ham muammolarga duch kelsangiz, ilgari tanlangan kompyuterga ulanganligingizga ishonch hosil qiling (sozlamalar ko'rinishida) va "ulagich yoqilgan" buyrug'i yordamida Matlab onlayn ekanligini tekshiring.
6 -qadam: Dasturdan foydalanish
Bu tizimda fonda bir nechta narsalar sodir bo'ladi. Harorat ma'lumotlari arduino va pyton tomonidan to'planadi va qayd qilinadi, Matlab telefoningizdan GPS ma'lumotlarini yig'adi va sizning uyingizdan qanchalik uzoqda ekanligingizni bilish uchun hisob -kitoblarni amalga oshiradi va bu ma'lumotlarga asoslanib termostatni o'rnatadi. Siz kirgan joy sizning afzalliklaringizni taqdim etadi.
Matlab GUI kodini ishga tushiring.. Mlapp faylini oching va birinchi tabga qarang. Buning uchun ma'lumotni o'zingiz to'plashingiz kerak bo'ladi, odatda isitish/sovutish moslamasining samaradorligi va quvvat ko'rsatkichini qurilmaning o'zida topish mumkin, va sizning o'rtacha tezligingiz - siz mashinani qanchalik tez haydashingizni yaxshi baholaydi. Qiymatlar kiritilgandan so'ng, "Diagnostikani ishga tushirish" tugmasini bosing va dastur sizning uyingiz haqida ma'lumot to'plash uchun termostatni boshqaradi.
Keyingi menyuga o'ting.
7 -qadam: haroratni nazorat qilish
Bu menyu sizga uy sharoitida ham, tashqarida ham istalgan haroratni tanlash imkonini beradi. Harorat #1 ni o'zingizga qulay haroratga, No2 haroratni esa uyingiz uchun xavfsiz bo'lgan yuqori yoki past qiymatga qo'ying (uyda itlar bo'lsa, uni 100 darajaga qo'ymasligingizga ishonch hosil qiling).
8 -qadam: Tarixiy ma'lumotlar
Nihoyat, avtomatik boshqaruv yordamida qancha pul tejashingizni ko'rishingiz mumkin. Bu, agar sizning termostatingiz 24/7 siz istagan haroratga o'rnatilsa, qancha energiya sarflanishini taxmin qiladi, so'ngra ishlatilgan haqiqiy energiyani olib tashlaydi.
Qurilishda omad.
Tavsiya:
Ijtimoiy masofali Hallowen konfet roboti: 7 qadam (rasmlar bilan)
Ijtimoiy masofali Xellouin konfet roboti: Agar siz bu yilgi Xellouin hiyla-nayranglari bilan muloqot qilishning qiziqarli usulini qidirmoqchi bo'lsangiz va siz ushbu loyiha olib keladigan qiyinchiliklarga tayyor bo'lsangiz, o'zingizni ishga soling! Bu ijtimoiy uzoqlashtiruvchi robot hiyla-nayrangni "ko'radi"
Uzoq masofali, 1,8 km, Arduino-Arduino-HC-12 bilan simsiz aloqa: 6 qadam (rasmlar bilan)
Uzoq masofali, 1,8 km, Arduino-Arduino-HC-12 bilan simsiz aloqa. Bu yo'riqnomada siz Arduino bilan ochiq havoda 1,8 kmgacha uzoq masofada qanday muloqot qilishni o'rganasiz. HC-12-simsiz ketma-ket port. juda foydali, juda kuchli va ishlatish uchun qulay bo'lgan aloqa moduli. Avval siz yugurasiz
Tezkor reaktsiya o'yini: masofali versiya: 5 qadam (rasmlar bilan)
Tezkor reaktsiya o'yini: masofali versiya: Salom. Bu sizning reaktsiya vaqtingizni ham, masofani ham sezadigan o'yinni qanday yaratish bo'yicha ko'rsatma. Bu loyiha men o'ynagan ikkita eski o'yinchi ishtirokidagi eski loyihaga asoslangan bo'lib, tugmachani bosish orqali kim tezroq reaktsiya qilganini ko'rish uchun musobaqalashdi
Uzoq masofali WiFi skaneri ESP8266 yordamida: 6 qadam (rasmlar bilan)
Uzoq masofali WiFi skaneri ESP8266 yordamida: Bu ko'rsatmada men uy tarmog'im uchun qaysi kanal yaxshiroq ekanligini aniqlash uchun ishlatiladigan batareyali, 2,5 diapazonli, WiFi tarmoqli skaner qurilmasini ishlab chiqaraman. Bundan tashqari, u yo'lda ochiq Wi -Fi kirish nuqtalarini topish uchun ishlatilishi mumkin. Ishlab chiqarish narxi: taxminan 25 dollar
Yuqori masofali simsiz quvvat: 9 qadam (rasmlar bilan)
Yuqori diapazonli simsiz quvvat: Lampochkani quvvatlantiradigan yoki telefonni 2 metrgacha zaryadlaydigan simsiz quvvat uzatish tizimini yarating! Bu magnit maydonlarni uzatuvchi lasanlardan qabul qiluvchi lasanlarga yuborish uchun rezonansli lasan tizimidan foydalanadi. Biz buni demo sifatida ishlatardik